【ARM+51单片机开发板套件试用体验】 5、DS18B20温度读取+数....

  • hehung
  • LV5工程师
  • |      2018-04-04 11:04:07
  • 浏览量 1284
  • 回复:1
本帖最后由 hehung 于 2018-4-4 11:07 编辑 今天心情好,所以后写了一个数码管显示温度的实验。有兴趣的小伙伴可以参考参考。 首先还是查看原理图: 从原理图中可以看到,DS18B20的引脚是P3.7 数码管接法:J12 --- P0 A --- P1.0 B --- P1.1 C --- P1.2 其中A,B,C是数码管的位选端口,在上一篇帖子里我已经说明了。 好了,连线知道了,现在可以开始进行程序的编写了。 本来向这种函数比较多的程序一般都是要写在不同的文件里面的,但是我了简单,我就写在了一个文件里。;P 我的代码还是写的比较规范的,注释也清楚,有需要的小伙伴直接拿去改下端口就可以用。:lol
#include



#define uchar unsigned char

#define uint unsigned int

#define SMG P0                //定义数码管的段选端口



//下述的A,B,C的信号进过译码器解码后可以控制8个数码管的显示

sbit LA=P1^0;                

sbit LB=P1^1;

sbit LC=P1^2;



sbit dq=P3^7;        //DS18B20的引脚



//下面的数组可以显示0-F

uchar code number={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};



//函数声明

void delay(int ms);                                                //延时函数

void change(int what);                                        //位选函数

void ds18b20_init();                                        //DS18B20初始化函数

void ds18b20_write_data(uchar dat);                //DS18B20写命令函数

uchar ds18b20_read_data();                                //DS18B20读数据函数

void ds18b20_read_temp(int *temp,int *xiao);        //DS18B20读温度函数

void display(int temp, int xiao);                //数码管显示函数

                                        

//主函数

void main()

{

        int temp,xiao;                //定义温度的整数和小数变量

        ds18b20_init();                //初始化

        

        while(1)

        {

                ds18b20_read_temp(&temp, &xiao);

                display(temp, xiao);

        }

}



//延时函数(短延时)

void delay(int ms)

{

        while(ms--);

}



//该函数可以选择某一个数码管显示

void change(int what)

{

        switch(what)

        {

                case 1:LC=0;LB=0;LA=0;break;

                case 2:LC=0;LB=0;LA=1;break;

                case 3:LC=0;LB=1;LA=0;break;

                case 4:LC=0;LB=1;LA=1;break;

                case 5:LC=1;LB=0;LA=0;break;

                case 6:LC=1;LB=0;LA=1;break;

                case 7:LC=1;LB=1;LA=0;break;

                case 8:LC=1;LB=1;LA=1;break;                

        }

}



//初始化函数

void ds18b20_init()

{

            dq=1;

         delay(5);

         dq=0;

         delay(400);

         dq=1;

         delay(300);

}

void ds18b20_write_data(uchar dat)

{

     uchar i;

         for(i=0;i<8;i++)

         {

             dq=0;

                 dq=dat&0x01;

                 delay(2);

                 dq=1;

                 dat>>=1;

         } 

         delay(4);    

}

uchar ds18b20_read_data()

{

          uchar i,v;

          for(i=0;i<8;i++)

          {

              dq=0;

                  v>>=1;

                  dq=1;

                  if(dq)

                     v|=0x80;

                  delay(4);

          }

          return v;

}

void ds18b20_read_temp(int *temp,int *xiao)

{          

         uchar a,b;

     ds18b20_init();

         ds18b20_write_data(0xcc);

         ds18b20_write_data(0x44);

         delay(200);



         ds18b20_init();

         ds18b20_write_data(0xcc);

         ds18b20_write_data(0xbe);                //读温度

         a=ds18b20_read_data();          //读出温度低位

         b=ds18b20_read_data();           //读出温度高位

         b<<=4;

         b+=(a&0xf0)>>4;

         *temp=b;                                //温度整数部分

         *xiao=a&0x0f;                        

         *xiao=*xiao/1.6;                //温度小数部分

}



void display(int temp, int xiao)

{

        change(1);

        SMG=number;

        delay(100);

        SMG = 0;

        delay(30);         //消除暗影



        change(2);

        SMG=number;

        delay(100);

        SMG = 0;

        delay(30);         //消除暗影



        change(3);

        SMG=~0x7f;

        delay(100);

        SMG = 0;

        delay(30);         //消除暗影



        change(4);

        SMG=number;

        delay(100);

        SMG = 0;

        delay(30);         //消除暗影

}

现在说说DS18B20的位置: 如图,在这个地方,很小的一个,有点像三极管。 这是数码管 最后放两张动图,再次声明一遍,手机像素差,拍的阴影比较严重,其实直接用肉眼看是完全看不到阴影的,我的消隐做的还是不错的。:lol PS:我是直接用手捏着DS18B20的,变化的很快,精度也挺高的。 ok,DS18B20温度的读取+数码管的显示试验就在这里,期望大家支持。:)
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:1
hehung 2018-04-04
忘了放附件了,这是Keil下编辑的程序:
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子