2022年温度采集显示代码借鉴 .pdf
系统程序主要包括C 程序主函数、 DS18B20复位函数、 DS18B20写字节函数、 DS18B20读字节函数、温度计算转换函数、显示函数等等。以下是 DS18B20 温度计 C 语言程序清单:/*/ / / DS18B20温度计 C 程序/ 2005.2.28通过调试/*/ /使用 AT89C2051单片机, 12MHZ 晶振,用共阳LED 数码管/P1 口输出段码, P3 口扫描/#pragma src(d:aa.asm) #include reg51.h #include intrins.h /_nop_(); 延时函数用#define Disdata P1 /段码输出口#define discan P3 /扫描口#define uchar unsigned char #define uint unsigned int sbit DQ=P37; /温度输入口sbit DIN=P17; /LED 小数点控制uint h; / / /* 温度小数部分用查表法*/ uchar code ditab16= 0 x00,0 x01,0 x01,0 x02,0 x03,0 x03,0 x04,0 x04,0 x05,0 x06,0 x06,0 x07,0 x08,0 x08,0 x09,0 x09; / uchar code dis_712=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90,0 xff,0 xbf; /* 共阳 LED 段码表0 1 2 3 4 5 6 7 8 9 不亮 - */ uchar code scan_con4=0 xfe,0 xfd,0 xfb,0 xf7; / 列扫描控制字uchar data temp_data2=0 x00,0 x00; / 读出温度暂放uchar data display5=0 x00,0 x00,0 x00,0 x00,0 x00;/显示单元数据 ,共 4 个数据 ,一个运算暂存用/ / / /*11微秒延时函数 */ / void delay(uint t) for(;t0;t-); / /* 显示扫描函数 */ scan() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 4 页 - - - - - - - - - char k; for(k=0;k0; i-) / DQ=1;_nop_();_nop_(); DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();/5us DQ = val&0 x01; /最低位移出delay(6); /66us val=val/2; /右移一位名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 4 页 - - - - - - - - - DQ = 1; delay(1); / /*18B20读 1 个字节函数 */ /从总线上读取一个字节uchar read_byte(void) uchar i; uchar value = 0; for (i=8;i0;i-) DQ=1;_nop_();_nop_(); value=1; DQ = 0; / _nop_();_nop_();_nop_();_nop_(); /4us DQ = 1;_nop_();_nop_();_nop_();_nop_(); /4us if(DQ)value|=0 x80; delay(6); /66us DQ=1; return(value); / /* 读出温度函数 */ / read_temp() ow_reset(); /总线复位write_byte(0 xCC); / 发 Skip ROM命令write_byte(0 xBE); / 发读命令temp_data0=read_byte(); /温度低 8 位temp_data1=read_byte(); /温度高 8 位ow_reset(); write_byte(0 xCC); / Skip ROM write_byte(0 x44); / 发转换命令 / /* 温度数据处理函数*/ work_temp() uchar n=0; / if(temp_data1127) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 4 页 - - - - - - - - - temp_data1=(256-temp_data1);temp_data0=(256-temp_data0);n=1;/负温度求补码display4=temp_data0&0 x0f;display0=ditabdisplay4; display4=(temp_data0&0 xf0)4)|(temp_data1&0 x0f)4);/ display3=display4/100; display1=display4%100; display2=display1/10; display1=display1%10; if(!display3)display3=0 x0A;if(!display2)display2=0 x0A;/最高位为0 时都不显示if(n)display3=0 x0B;/负温度时最高位显示- / / /* 主函数 */ main() Disdata=0 xff; /初始化端口discan=0 xff; for(h=0;h4;h+)displayh=8;/开机显示8888 ow_reset(); / 开机先转换一次write_byte(0 xCC); / Skip ROM write_byte(0 x44); / 发转换命令for(h=0;h500;h+) scan(); /开机显示 88882 秒while(1) read_temp(); /读出 18B20 温度数据work_temp(); /处理温度数据for(h=0;h500;h+) scan(); /显示温度值2 秒 / /*结束 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 4 页 - - - - - - - - -