1、3.无需外部器件4.可通过数据线供电,电压围:3.05.5V5.测温围55125,在-10+85时精度为0.56.零待机功耗7.温度以9或12位数字量读出8.报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件9.负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作四:硬件电路原理框图由于本次实验是在学习板上做的,所以没有硬件接线图,原理主要讲解DS18B20的工作原理。1硬件设计1.单片机系统电路原理图图4.1 系统电路原理图2.DS18B20温度传感器电路设计电源供电方式如图,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。图4.2 DS18B20温度传感器
2、电路3.报警电路设计 报警电路是在测量温度大于上限或小于下限时提供报警功能的电路。该电路是由一个蜂鸣器组成,具体的电路如图所示图4.3 报警电路4.显示电路设计 显示电路是由四位一体的共阴数码管进行显示的2软件设计(1)DS18B20部结构 如图所示主要由4部分组成:64 位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。ROM中的64位序列号是出厂前被光刻好的,它可以看作 是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排的循环冗余校验码(CRC=X8X5X41)。 ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总
3、线上挂接多个DS18B20的目的。 DS18B20中的温度传感器完成对温度的测量,用16位二进制形式提供,形式表达,其中S为符号位。 DS18B20温度传感器主要用于对温度进行测量,数据可用16位符号扩展的二进制补码读数形式提供,并以0.0625LSB形式表示。表2是部分温度值对应的二进制温度表示数据。(2)DS18B20的工作时序 DS18B20的一线工作协议流程是:初始化ROM操作指令存储器操作指令数据传输初始化时序 主机首先发出一个480960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都
4、是高电平说明总线上无器件应答。做为从器件的DS18B20在一上电后就一直在检测总线上是否有480960微秒的低电平出现,如果有,在总线转为高电平后等待1560微秒后将总线电平拉低60240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。 接下来就是主机发出各种操作命令,但各种操作命令都是向DS18B20写0和写1组成的命令字节,接收数据时也是从DS18B20读取0或1的过程。因此首先要搞清主机是如何进行写0、写1、读0和读1的。 写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后若主机想写0,则继续拉低电平最少6
5、0微秒直至写周期结束,然后释放总线为高电平。若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。而做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期总线为高电平则为1,若采样期总线为低电平则为0。 对于读数据操作时序也分为读0时序和读1时序两个过程。读时隙是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微
6、秒后释放总线,然后在包括前面的拉低总线电平1微秒在的15微秒时间完成对总线进行采样检测,采样期总线为低电平则确认为0。采样期总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成让DS18B20进行一次温度的转换,那具体的操作就是:(1).主机先作个复位操作,(2).主机再写跳过ROM的操作(CCH)命令,(3).然后主机接着写个转换温度的操作命令,后面释放总线至少一秒,让DS18B20完成转换的操作。在这里要注意的是每个命令字节在写的时候都是低字节先写,例如CCH的二进制为11001100,在写到总线上时要从低位开始写,写的顺序是“零、零、壹、壹、零、零、壹、壹”。整个操作的总
7、线状态如下图。(3)初始化时序程序bit Init_DS18B20(void) bit flag; /储存DS18B20是否存在的标志,flag=0,存在;flag=1,不存在 DQ = 1; /先将数据线拉高 for(time=0;time2;time+) ; /略微延时约6微秒/再将数据线从高拉低,要求保持480960us DQ = 0;200; /略微延时约600微秒/以向DS18B20发出一持续480960us的低电平复位脉冲 /释放数据线(将数据线拉高) 10; /延时约30us(释放总线后需等待1560us让DS18B20输出存在脉冲) flag=DQ; /让单片机检测是否输出了存
8、在脉冲(DQ=0表示存在) /延时足够长时间,等待存在脉冲输出完毕 return (flag); /返回检测成功标志unsigned char ReadOneChar(void) unsigned char i=0; unsigned char dat; /储存读出的一个字节数据 for (i=0;i=1; if(DQ=1) dat|=0x80; /如果读到的数据是1,则将1存入dat else dat|=0x00; /如果读到的数据是0,则将0存入dat time+); /延时3us,两个读时序之间必须有大于1us的恢复期 return(dat); /返回读出的十六进制数据WriteOneC
9、har(unsigned char dat) i480usDQ拉高电平DQ为低电平?延时1560us N Y返回图5.3 DS18B20初始化子程序流程图DS18B20写字节和读字节子程序流程图:图5.4 DS18B20写字节子程序流程图 图5.5 DS18B20读字节子程序流程图六:调试(步骤,心得,结论) 优点:1线性好,精度适中,体积小,实用方便。2实时显示当前温度。缺点:温度传感器会有一定的时间延时,从而间接地影响了整个报警系统的灵敏性和准确性。(2)心得体会:在本次设计的过程中,我们发现了很多的问题,虽然以前也做过类似的课程设计,但是这次确实让我们学到了很多。我们不仅要选好元件,还要
10、把这些元件合理地组织起来,所以我们要学会如何寻找和搜索自己需要的资料。这一次,我们用了老师给的参考电路图,然后修改了一些地方,比如去掉了一个LED,再加入了几个电阻。虽然有些困难,但是经过努力,我们还是完成了电路的设计。经过本次的设计,我们学到了很多的知识,了解到了传感器能够把自然界的各种非电量转换为电信号的能量物理理念。从本次的实习设计中,我们意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识运用到实际当中,实践是检验真理的唯一标准。培养了一定的独立思考能力、解决问题的能力。同时也学到了和他人愉快合作的技巧。每当我们遇到问题时,我们学会了理性的分析,最终解决问题。同时在讨论问题时认
11、真聆听别人的思想和意见也很重要,在聆听的同时也会学到很多东西。所以这次实习让我们学到了很多的东西。七:附录(电路图,程序)#include reg51.hintrins.h /_nop_();延时函数用#define Disdata P0 /段码输出口#define discan P2 /扫描口#define uchar unsigned char#define uint unsigned intsbit DQ=P33; /温度输入口sbit DIN=P07; /LED小数点控制sbit buzzer=P36;uchar temp_buzzer;uchar up_alarm=20;uint h
12、;uint i;uchar flag;/*温度小数部分用查表法*/uchar code ditab16=0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09;/uchar code dis_712=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf;/共阳LED段码表 0 123456789不亮-uchar code scan_con=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe; /列扫
13、描控制字uchar data temp_data2=0x00,0x00; /读出温度暂放uchar data display8; /显示单元数据,共4个数据和一个运算暂用/*11微秒延时函数*/void ser_init() TMOD=0X20; SCON=0X50; TH1=0XFD; TL1=0XFD; TR1=1;void delay(uint t)for(;t0;t-);/*显示扫描函数*/scan()char k; for(k=0;k7;k+) /四位LED扫描控制/ Disdata=0xff; Disdata=dis_7displayk; if(k=4)DIN=0; discan=
14、scan_conk;delay(200); discan=0xff; void delayms(unsigned int xms) /延时函数 ,延时xms unsigned int i , j; for(i = 0; i xms; for(j = 0; j = 34) /温度报警限设置 for(i=0;20;buzzer=0; delayms(1);buzzer=1; /*18B20复位函数*/ow_reset(void)char presence=1;while(presence)DQ=1;_nop_();DQ=0; /delay(50); / 550usdelay(6); / 66usp
15、resence=DQ; / presence=0继续下一步delay(45); /延时500uspresence = DQ;/*18B20写命令函数*/向 1-WIRE 总线上写一个字节void write_byte(uchar val)uchar i;for (i=8; i i-) /DQ = 0;/5usDQ = val& /最低位移出 /66usval=val/2; /右移一位DQ = 1;delay(1);/*18B20读1个字节函数*/从总线上读取一个字节uchar read_byte(void)uchar value = 0;ii-)value /4usif(DQ)value|=0
16、x80;return(value);/*读出温度函数*/read_temp()ow_reset(); /总线复位write_byte(0xCC); / 发Skip ROM命令write_byte(0xBE); / 发读命令temp_data0=read_byte(); /温度低8位temp_data1=read_byte(); /温度高8位 / Skip ROMwrite_byte(0x44); / 发转换命令/*温度数据处理函数*/void work_temp()uchar n=0,th=0,tl=0;int temp=0;uchar flag3=1,flag2=1; /数字显示修正标记if
17、(temp_data0255)temp_data1+;tl=temp_data0&0x0f;display7=tl;if(display7&0x08)temp+=5000;0x04)temp+=2500;0x02)temp+=1250;0x01)temp+=625;display0=temp%10;display1=(temp%100)/10;display2=(temp%1000)/100;display3=temp/1000;display7=(temp_data0&0xf0)4)|(temp_data1&0x07)4);display6=display7/100;display5=display7/10%10;display4=display7%10;if(!display6) display6=0x0a; flag3=0; if(!display5) display5=0x0a; flag2=0; /最高位为0时都不显示/*主函数*/main() double templ ; ser_init();Disdata=0xff; /初始化端口discan=0xff;for(h=0;hh+)displayh=0;/开机显示8888 / 开机先转换一次write_byte(0x4e
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1