《基于DS18B20STC89C52单片机LCD1602液晶显示测温系统C程序完整.docx》由会员分享,可在线阅读,更多相关《基于DS18B20STC89C52单片机LCD1602液晶显示测温系统C程序完整.docx(6页珍藏版)》请在三一办公上搜索。
1、基于DS18B20STC89C52单片机LCD1602液晶显示测温系统C程序完整基于ds18b20 STC89c52单片机测温系统LCD1602液晶显示 温度传感器的种类众多,在应用与高精度、高可靠性的场合时 DALLAS公司生产的 DS18B20 温度传感器当仁不让。超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得 DS18B20 更受欢迎。对于我们普通的电子爱好者来说,DS18B20 的优势更是我们学习单片机技术和开发温度相关的小产品的不二选择。了解其工作原理和应用可以拓宽您对单片机开发的思路。 如果要更全的资料请搜索“完整的ds18b20中文资料.pdf “。 DS18
2、B20 的主要特征: 全数字温度转换及输出。 先进的单总线数据通信。 最高 12 位分辨率,精度可达土 0.5摄氏度。 12 位分辨率时的最大工作周期为 750 毫秒。 可选择寄生工作方式。 检测温度范围为55C +125C (67F +257F) 内置 EEPROM,限温报警功能。 64 位光刻 ROM,内置产品序列号,方便多机挂接。 多样封装形式,适应不同硬件系统。 DS18B20 引脚功能: GND 电压地 DQ 单数据总线 VDD 电源电压 NC 空引脚 DS18B20 工作原理及应用: DS18B20 的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。其一个工作周期可分
3、为两个部分,即温度检测和数据处理。在讲解其工作流程之前我们有必要了解 18B20的内部存储器资源。18B20 共有2种形态的存储器资源,它们分别是: 1 ROM 只读存储器,用于存放 DS18B20ID 编码,其前 8 位是单线系列编码 ,后面48 位是芯片唯一的序列号,最后 8位是以上 56的位的 CRC码。数据在出产时设置不由用户更改。DS18B20 共 64 位 ROM。 2 RAM 数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20 共9 个字节 RAM,每个字节为 8 位。第1、2 个字节是温度转换后的数据值信息,第 3、4 个字节是用户 EEPROM的镜像。在上电
4、复位时其值将被刷新。第 5 个字节则是用户第 3 个 EEPROM的镜像。第 6、7、8 个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第 9 个字节为前 8个字节的 CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据, DS18B20共3位EEPROM,并在 RAM 都存在镜像,以方便用户操作。 下面是基于ds18b20 STC89c52单片机测温系统LCD1602液晶显示C程序 #include #define uchar unsigned char #define uint unsigned
5、 int sbit DQ=P37;/ds18b20与单片机连接口 sbit RS=P30; sbit RW=P31; sbit EN=P32; unsigned char code str1=temperature: ; unsigned char code str2= ; uchar data disdata5; uint tvalue;/温度值 uchar tflag;/温度正负标志 /*lcd1602程序*/ void delay1ms(unsigned int ms)/延时1毫秒 unsigned int i,j; for(i=0;ims;i+) for(j=0;j0; i-) DQ
6、= 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata=1; read_temp/*读取温度值并转换*/ uchar a,b; unsigned char dat = 0; for (i=8;i0;i-) DQ = 0; /给脉冲信号 return(dat); dat=1; DQ = 1; /给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); DQ = 1; /DQ复位 delay_18B20(4); /延时 DQ = 0; /DQ拉低 delay_18B20(100); /精确延时大于480us DQ = 1;
7、/拉高 delay_18B20(40); while(i-); ds1820rst; ds1820wr(0xcc);/*跳过读序列号*/ ds1820wr(0x44);/*启动温度转换*/ ds1820rst; ds1820wr(0xcc);/*跳过读序列号*/ ds1820wr(0xbe);/*读取温度*/ a=ds1820rd; b=ds1820rd; tvalue=b; tvalue=8; tvalue=tvalue|a; if(tvalue0x0fff) tflag=0; else tvalue=tvalue+1; tvalue=tvalue*(0.625);/温度值扩大10倍,精确到
8、1位小数 /*/ void ds1820disp/温度值显示 uchar flagdat; disdata0=tvalue/1000+0x30;/百位数 return(tvalue); tflag=1; disdata1=tvalue%1000/100+0x30;/十位数 disdata2=tvalue%100/10+0x30;/个位数 disdata3=tvalue%10+0x30;/小数位 if(tflag=0) flagdat=0x20;/正温度不显示符号 else flagdat=0x2d;/负温度显示负号:- if(disdata0=0x30) wr_com(0xc0); wr_da
9、t(flagdat);/显示符号位 disdata0=0x20;/如果百位为0,不显示 if(disdata1=0x30) disdata1=0x20;/如果百位为0,十位为0也不显示 wr_com(0xc1); wr_dat(disdata0);/显示百位 wr_com(0xc2); wr_dat(disdata1);/显示十位 wr_com(0xc3); wr_dat(disdata2);/显示个位 wr_com(0xc4); wr_dat(0x2e);/显示小数点 wr_com(0xc5); wr_dat(disdata3);/显示小数位 /*主程序*/ void main init_play;/初始化显示 while(1) read_temp;/读取温度 ds1820disp;/显示 Proteus仿真原理图