1、无须外部器件;可通过数据线供电,电压范围为3.05.5;零待机功耗;温度以或位数字;用户可定义报警设置;报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;DS18B20采用脚PR35封装或脚SOIC封装,其内部结构框图如图2所示。64位ROM的结构开始位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器和,可通过软件写入户报警上下限。DS18B20温度传感器的内部存储器还包括一个高速暂存和一个非易失性的可电擦
2、除的EERAM。高速暂存RAM的结构为字节的存储器,结构如图3所示。头个字节包含测得的温度信息,第和第字节和的拷贝,是易失的,每次上电复位时被刷新。第个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图3所示。低位一直为,是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为,用户要去改动,R1和0决定温度转换的精度位数,来设置分率。由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间
3、权衡考虑。高速暂存的第、字节保留未用,表现为全逻辑。第字节读出前面所有字节的CRC码,可用来检验数据,从而保证通信数据的正确性。当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第、字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625LSB形式表示。当符号位时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据。DS18B20可以采用两种方式供电,一种是采用电源供
4、电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源供电方式,如图4 所示单片机端口接单线总线,为保证在有DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。1.2 LCD显示模块1602采用标准的16脚接口,其中:第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:RW为读写信号线,高电平时进行读操作,低电
5、平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第1516脚:空脚1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,下表是DM-162的内部显示地址.3 软件设计软件设计的主要任务是完成从DS18
6、B20中读出温度值,并在LCD上显示。四 电路仿真及仿真结果分析:将设计的电路图用proteus仿真,等到仿真结果如下:由仿真结果可以看出,本设计的功能可以得到满足,软件硬件设计基本没问题。五 设计方案和测试结果将此电路接上电源,LCD显示当前室温,当用手按住温度传感器时,可以看到温度逐渐上升,将手放开,温度逐渐下降。将此电路放在室温中一段时间,其温度基本保持不变,电路工作稳定,符合本次设计的目的。六 作品功能和使用说明 此温度传感器的测试范围是55125,考虑到通用单片机和通用LCD的工作温度的范围大致为055,但是若将此温度传感器单独放到被测物体中,仍可以满足测试要求。 考虑到此作品是为满
7、足一般日常生活要求而设计,为了充分利用单片机和LCD资源,接入一个时钟芯片,可以显示时间,还可完成定时闹钟的功能。七 心得体会通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。通过这次学习,让我对各种电路都有了大概的了解,所以说,坐而言不如立而行,对于这些电路还是应该自己动手实际
8、操作才会有深刻理解。在焊接过程中我曾将温度传感器的电源、地焊反啦,导致温度传感器急剧发热,后经观察和查询资料才得以改正。从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。八 参考文献【1】郭天祥 51单片机C语言教程 【M】 北京 电子工业出版社 2009【2】毛谦敏 单片机原理及应用系统设计 【M】国防工业出版社 2008附件完整源程序#includereg51.h1602.h18b20.h#define uchar unsigned ch
9、ar#define uint unsigned intuchar table=temperature:;void main() uchar ee,*p=table; intril(); /1602初始化函数 pos(0,0); /将数据指针定位到第一行第一列处 while(*p) /显示 senddata(*p); p+; while(1)pos(1,0); /将数据指针定位到第二行第一列 read(); /读转换的温度数据 if(flag=1)senddata(+); /温度大于0 显示“+” if(flag=0)senddata(- /温度小于0 显示“-” for(ee=0;ee0;t-
10、);uchar init18b20() /初始化函数 DQ=1; /DQ先置高 delay(8); /稍延时 DQ=0; /发送复位脉冲 delay(80); /延时(480us) /拉高数据线 delay(5); /等待(1560us) x=DQ; /用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1 delay(20); if(x=1) return 1; else return 0;void write18b20(uchar aa) /写字节uchar i=0; /数据线从高电平拉至低电平,15us之内将所需写的位送到数据线上, for(i=8;ii-) /在1560u
11、s之间对数据线进行采样,如果是高电平就写1,低写0发生。 DQ=0; /在开始另一个写周期前必须有1us以上的高电平恢复期。 DQ=aa&0x01; delay(5); DQ=1; aa=1; delay(4);uchar read18b20() /读字节 / 每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期 uchar d=0; for (i=8;i-) /一个字节有8位 delay(1); d if(DQ) d|=0x80; return d;void read() /读温度 unsigned int hh; while(init18b20(); /初始化
12、write18b20(0xcc); /跳过读序列号的操作 write18b20(0x44); /启动温度转换 delay(125); /转换需要一点时间,延时 /跳过读序列号的操作 write18b20(0xbe); /读温度寄存器(头两个值分别为温度的低位和高位) l=read18b20(); /读出温度的低位LSB h=read18b20(); /读出温度的高位MSB hh=l; if(h0x7f) flag=0; /温度小于0 h=h; l=l+1; else flag=1; h=h zhen=h|l; hh&=0x0f; hh*=625; disbuf0=zhen/100+0; /将温
13、度值转换,存储以便显示 if(zhen/100=0)disbuf0= disbuf1=zhen%100/10+ disbuf2=zhen%10+ disbuf3=. disbuf4=hh/1000+ /小数部分 disbuf5=hh/100%10+ disbuf6=0xdf; disbuf7=c#endif/防止被重定义#ifndef _l602_h#define _1602_h/函数声明void delay(uchar a);void senddata(uchar m);void sendcmd(uchar n);void pos(uchar i,uchar j); /i=0表示在第一行,i
14、=1表示在第二行void intril(); /定义通道sbit en=P26;sbit rw=P25;sbit rs=P24;void delayss(uchar a) /延时 1602显示时必须延时uchar i,j; for(i=a;i-) for(j=0;j248;j+);void senddata(uchar m) /送数据rw=0; rs=1;en=1; P0=m; delayss(5); en=0;void sendcmd(uchar n) /送地址命令 rs=0; en=1; P0=n; delayss(5); en=0;void pos(uchar i,uchar j) /定位是哪一行if(i) sendcmd(0xc0+j); else sendcmd(0x80+j);void intril()sendcmd(0x38); /显示模式设置 5*7点 sendcmd(0x0c); /开显示 光标不显示且不闪烁 sendcmd(0x06); /光标地址自动加一 sendcmd(0x01); /清屏 #endif
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1