1、看了好多天单片机,找了好多资料想自己利用实验板上的DS18B20做个温度计(最近温度实在是太热了)。在网上找了好多关于这个的程序,结果发现对我的板子来说就这个好用,温度三十度不算高,因为我把它放到风扇下面了,现在和大家分享一下吧,不过里面我自己也改了一点点。希望高手不要见笑,红色的部分是我改的或者是后加上的。如果还有什么更好的建议或意见请 记得给我留言哦……
#include
2、P2^6; //数码管十位,位选 sbit PS1=P2^7; //数码管个位,段选 sbit P_L=P1^0; //测量指示 sbit DQ=P2^2; //DS18B20数据接口 void delay(uint); //延时函数 void DS18B20_init(void); //DS18B20初始化 void get_temper(void); //读取温度程序 void DS18B20_write(uchar in_data); //DS18B20写数据函数 uchar DS18B20_read(void); ////读取数据程序
3、 uchar htd(uchar a); //进制转换函数 void display(void); //显示函数 uchar temp; //温度寄存器 bit DS18B20; // 18B20存在标志,1---存在 0---不存在 uchar tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //字段转换表 void main(void) { uint a; while(1) { get_temper();
4、 //测量温度 for(a=0;a<200;a++) ;//显示,兼有延时的作用 display(); } } /****************************DS18B20读取温度函数**************************/ /*函数原型:void get_temper(void) /*函数功能:DS18B20读取温度 /*输入参数:无 /*输出参数:无 /*调用模块: /*建立时间:2005/11/14 /*作者:站长 /***********
5、/ void get_temper(void) { uchar k,T_sign,T_L,T_H; DS18B20_init(); //DS18B20初始化 if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回 { DS18B20_write(0xcc); // 跳过ROM匹配 DS18B20_write(0x44); //发出温
6、度转换命令 DS18B20_init(); //DS18B20初始化 if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回 { DS18B20_write(0xcc); //跳过ROM匹配 DS18B20_write(0xbe); //发出读温度命令 T_L=DS18B20_read(); //数据读出 T_H=DS18B20_read(); k=
7、T_H&0xf8; if(k==0xf8) T_sign=1; //温度是负数 else T_sign=0; //温度是正数 T_H=T_H&0x07; temp=(T_H*256+T_L)*0.0625; //温度转换常数 } } } /****************************DS18B20写数据函数*******************
8、/ /*函数原型:void DS18B20_write(uchar in_data) /*函数功能:DS18B20写数据 /*输入参数:要发送写入的数据 /*输出参数:无 /*调用模块:_cror_() /*建立时间:2005/11/14 /*作者:站长 /**********************************************************************/ void DS18B20_write(uchar in_data) //写DS18B20的子程序(有具体的时序要求) {
9、 uchar i,out_data,k; out_data=in_data; for(i=1;i<9;i++) //串行发送数据 { DQ=0; DQ=1; _nop_(); _nop_(); k=out_data&0x01; if(k==0x01) //判断数据 写1 { DQ=1; } el
10、se //写0 { DQ=0; } delay(4); //延时62us DQ=1; out_data=_cror_(out_data,1); //循环右移1位 } } /**************************DS18B20读函数**************************/ /*函数原型:void DS18B20_read() /*函数功能:DS18B20读数据 /*输入参数:
11、无 /*输出参数:读到的一字节内容 /*调用模块:delay() /*建立时间:2005/11/14 /*作者:站长 /******************************************************************/ uchar DS18B20_read() { uchar i,in_data,k; in_data=0; for(i=1;i<9;i++) //串行发送数据 { DQ=0; DQ=1;
12、 _nop_(); _nop_(); k=DQ; //读DQ端 if(k==1) //读到的数据是1 { in_data=in_data|0x01; } else { in_data=in_data|0x00; } delay(3); //延时51us DQ=1;
13、 in_data=_cror_(in_data,1); //循环左移1位 } return(in_data); } /**************************DS18B20初始化函数**************************/ /*函数原型:void DS18B20_init(void) /*函数功能:DS18B20初始化 /*输入参数:无 /*输出参数:无 /*调用模块:delay() /*建立时间:2005/11/14 /*作者:站长 /*****************
14、/ void DS18B20_init(void) { uchar a; DQ=1; //主机发出复位低脉冲 DQ=0; delay(44); //延时540US DQ=1; for(a=0;a<0x36&&DQ==1;a++) { //等待DS18B20回应 a++; a--; } if(DQ)
15、 DS18B20=0; //18B20不存在 else { DS18B20=1; // 18B20存在 delay(120); //复位成功!延时240US } } /**************************数码管显示函数**************************/ /*函数原型:void display(void) /*函数功能:数码管显示 /*输入参数:无 /*输出参数:无 /*调用模块:delay() /*建立时间
16、2005/11/14 /*作者:站长 /******************************************************************/ void display(void) { PS1=1; P0=0x01; PS1=0; PS2=1; P0=tab[htd(temp)>>4]; //转换成十进制输出 PS2=0; delay(200); PS1=1; P0=0x02; PS1=0; PS2=1; P0
17、tab[htd(temp)&0x0f]; //转换成十进制输出 PS2=0; delay(200); P_L=~DS18B20; } /*********************原显示函数*********************************** void display(void) { P0=tab[htd(temp)>>4]; //转换成十进制输出 PS2=1; PS1=0; delay(200); P0=tab[htd(temp)&0x0f]; //转换成
18、十进制输出 PS1=1; PS2=0; delay(200); P_L=~DS18B20; } *******************************************************/ /**************************十六进制转十进制函数**************************/ /*函数原型:uchar htd(uchar a) /*函数功能:十六进制转十进制 /*输入参数:要转换的数据 /*输出参数:转换后的数据 /*调用模块:无 /
19、建立时间:2005/11/14 /*作者:站长 /******************************************************************/ uchar htd(uchar a) { uchar b,c; b=a%10; c=b; a=a/10; b=a%10; c=c|b<<4; return c; } /*******************************延时函数**********
20、/ /*函数原型:delay(unsigned int delay_time) /*函数功能:延时函数 /*输入参数:delay_time (输入要延时的时间) /*输出参数:无 /*调用模块:无 /*建立时间:2005/10/21 /*作者:站长 /**********************************************************************/ void delay(unsigned int delay_time) //延时子程序 {for(;delay_time>0;delay_time--) {} }






