您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > 项目六多路测温系统的设计
项目六多路测温系统的设计21项目六多路测温系统的设计能力目标1、能够设计字符型液晶显示器的接口电路及驱动程序。2、能够利用数字温度传感器DS18B20设计电子温度计及多路测温系统。任务一用DS18B20设计电子温度计DS18B20是美国DALLAS公司推出的数字温度传感器,传感器及相关的数字转换电路都被集成到了一起,外形如同一只三极管,具有微型化、低功耗、高性能、抗干抗性强等优点;它采用独特的单线接口方式,与单片机连接时,仅需一根口线;由于每片DS18B20均有唯一的产品序列号,所以允许在单总线上挂接数十至上百片数字式传感器,这样可以非常方便地构成多路温度测量系统。一、初识数字温度传感器1、DS18B20的测温范围为-55℃~125℃,12位温度读数,分辨率为1/16℃,温度转换时间最多为750ms,其引脚如图6-1所示:DQ:数据输入输出,也在数据总线供电方式给设备提供电源。VDD:可选的电源电压。DS18B20有两种供电方式:数据总线供电方式和外部供电方式。若采用数据总线供电方式,VDD应接地,这样可省一根线,但测温的时间较长。GND:电源地DS18B20与单片机的连接非常简单,如图6-2所示:2、每片DS18B20均有一个唯一产品序列号,固化在内部的64位激光ROM中,其格式如下:开始8位是是产品的类型编号,接着是每个器件唯一的序号,共48位,最后8位是针对前面56位的CRC校验码,这也是多个DS18B20可以采用一条数据线进行通信的原因,只要单片机用匹配命令即可访问总线上的指定DS18B20。8位CRC校验码48位序列号8位工厂代码MSBLSBMSBLSBMSBLSB3、DS18B20内部有9个字节的暂存器,开始两个暂存器(TMSB、TLSB)存放当前测到的温度值,以16位补码形式表示12位温度读数,分辨率为1/16℃,(内部配置寄存器可以图6-2与单片机的连接GNDDQVDDDALLASDS18S20123图6-1DS18B20引脚图项目六多路测温系统的设计22设置温度数据的位数为9、10、11、12,出厂时设置成12位温度读数),高位是温度值的符号扩展,单片机发出温度转换命令后,DS18B20将测得的温度值保存在TMSB、TLSB中,供单片机读取。温度与数字量的关系如表6-1所示:二、读写时序DS18B20与单片机之间的数据传送是靠严格的时序来实现的:1、初始化时序(见图6-3)与DS18B20的通信前,首先必须对其初始化,由单片机在t0时刻发出最短为480us的低电平有效的复位脉冲,在t1时刻释放总线并进入接收状态,DS18B20检测到总线变高后,等15到60us,在t2时刻发出低电平有效的存在脉冲响应。初始化DS18B20函数bitreset(void)//初始化DS18B20{biterr;DQ=0;//在数据线上产生600us的低电平delay15(40);DQ=1;//数据线拉高delay15(4);//延时60userr=DQ;//读取数据线状态,err=0:复位成功delay15(18);//err=1:复位失败return(err);}表6-1温度与数字量对应关系表温度值(℃)输出二进制码十六进制表示+125000001111101000007D0H+25.062500000001100100010191H+0.500000000000010000008H000000000000000000000H-0.51111111111111000FFF8H-25.06251111111001101111FE6FH-551111110010010000FC90H图6-3初始化时序项目六多路测温系统的设计232、写时序(图6-4)单片机在t0时刻将总线拉至低电平,从t0时刻开始的15us之内应将要写的数据位送到总线上,DS18B20在t0后的15—60us内对总线采样,若为低电平,写入的是0;若为高电平,写入的为1。连续写2位之间的间隙应大于1us。向DS18B20写入一个字节函数voidwrbyte(uchard)//向DS18B20写入一个字节{uchari;dat=d;for(i=8;i0;i--)//循环写8位(先低位,后高位){DQ=0;//产生15us的负脉冲delay15(1);DQ=dat0;//将当前数据位送数据线dat=dat1;//将下一位要写入的数据移到最低位delay15(1);//延时15usDQ=1;//数据线拉高,为写入下一位做准备}}3、读时序(见图6-5)单片机在t0时刻将总线从高拉至低电平,保持1us后,在t1时刻将总线拉高,释放总线,DS18B20通过保持总线为高发送“1”,将总线拉低发送“0”,并在t2时刻释放总线。单片机必须在t2之前读取总线状态。从DS18B20读取一个字节函数ucharrdbyte(void)//从DS18B20读取一个字节{uchari;dat=0;//读出数据初值为0for(i=8;i0;i--)//循环读8位(先低位,后高位){dat=dat1;//读出数据先右移一位DQ=0;//产生1us的负脉冲_nop_();DQ=1;//数据总线拉高图6-4写时序图6-5读时序项目六多路测温系统的设计24delay15(1);//延时15usdat7=DQ;//读取数据delay15(4);//延时,为读下一位做准备}return(dat);}三、基本操作指令DS18B20提供了一系列的指令来控制传感器的工作,上电后,传感器处于空闲状态,需单片机向其发送指令,控制它进行相应的操作。1、READROM[33H]在多点温度测量系统安装前,首先必须知道每只DS18B20的产品序列号,可以将DS18B20逐个与单总线挂接,由单片机发该命令,从激光ROM读出8个字节的序列号。注意:执行该指令时,如果总线上有多个DS18B20时,所有的DS18B20会试图同时传送信号,这样就会发生数据冲突,导致操作失败。2、SKIPROM[CCH]单片机可用这一命令同时访问总线上的所有设备而不需送出ROM序列码信息。例如:发出SKIPROM命令后接着送出CONVERT命令,可使总线上的所有DS18B20同时进行温度转换。3、MATCHROM[55H]执行该命令后,单片机必须接着向DS18B20发送8个字节的产品序列号,以选中单总线上指定的DS18B20,只有完全匹配的DS18B20才能对随后由单片机发出的读暂存器操作命令进行响应。4、CONVERTT[44H]该命令开始一次温度转换。转换结束后,数据保存在暂存器中2个字节的温度寄存器TMSB、TLSB中。5、READSCRTCHPAD[BEH]用该命令可读暂存器的内容。数据传送开始于字节0的最低位,直到暂存器的第9字节被读取。温度寄存器TLSB、TMSB处于暂存器的开始两个字节,如只需读取温度值,在读取开始的两个字节后,可用初始化命令结束读操作。项目六多路测温系统的设计25四、电子温度计的设计如图6-6所示,用数字温度传感器DS18B20构成一个电子温度计,将所测的温度值在LED显示器上显示出来,保留一位小数(电路连接:将实验仪的JP2短接,DSQ接P10)。设计思想:测温过程可这样进行:单片机首先对DS18B20进行复位操作,由于总线上只有一只DS18B20,无需根据序列号来识别传感器,因此单片机对其复位后可发SIKPROM[CCH]指令,再用CONVERTT[44H]指令启动传感器开始温度转换。转换完成后,DS18B20已将当前温度值放入了内部的暂存器中,为了读取温度值,单片机仍需对传感器进行复位操作,并跳过ROM识别,然后发读暂存器指令READSCRTCHPAD[BEH],再连续读出两个字节的温度值,将其转换为十进制数在数码管上显示出来,相应的流程如图6-7所示:发DS18B20复位命令发跳过ROM命令发启动温度转换指令发DS18B20复位命令发跳过ROM命令发读暂存器指令读取2字节的温度值将温度值转换为BCD码送显示缓存调用显示程序开始图6-7温度测量流程图abcdefgdpCOM1COM2COM3COM4P1.0Q1Q2Q3Q4R12R11R10R9R1470R*8R2R3R4R5R6R7R8P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7VCCP2.0P2.1P2.2P2.3LED1LED2LED3LED48051P1.0VCC3DQ2GND1DS18B20VCCR134.7KDSQ图6-6电子温度计原理图项目六多路测温系统的设计26从DS18B20读出的温度值是二进制数表示的,必须转换为十进制数才能以我们习贯的字符形式显示出来,在默认情况下DS18B20的转换精度为12位,分辨率为1/16℃(0.0625℃),即把温度寄存器里的二进制值乘以0.0625,就是实际的十进制温度值。通过观察表6-1可以发现十进制值和二进制值之间有着很明显的关系:就是将二进制的高字节的低四位和低字节的高四位组成一个字节转换成十进制数后就是温度的百、十、个位值(如果是负数首先对其求补即可),而剩下的低字节的低四位化成十进制数后,就是温度的小数部分。小数部分只有四位,取值范围是0~F,转换成十进制小数值就是0.0625的0~15倍,由于只要精确到0.1℃,可通过查表6-2来简化这种转换,表中四位二进制数用一位十六进制数表示。DS18B20的测温范围为-55~+125,对于零度以上,‘+’不显示;如果在零度以下,则显示‘-’号。为了符合人们的习惯,对高位的‘0’不予显示。以下是电子温度计的源程序清单:#defineucharunsignedchar#includereg51.h#includeintrins.hsbitDQ=P1^0;//DS18B20的数据线bdatauchardat;//用于数据收发sbitdat0=dat^0;//变量dat的最低位sbitdat7=dat^7;//变量dat的最高位uchardp[16]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};//小数部分转换ucharcodesegtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x8c,0xbf,0xff};uchardbuf[4]={0,0,0,12};//显示缓存voiddisp(void)//LED动态显示程序{uchari,n,bsel;bsel=0xfe;//首先点亮最低位for(n=0;n4;n++){P2=bsel;//位选口P0=segtab[dbuf[n]];//将显示缓存的数据转换为字段码显示if(n==1)P0=P0&0x7F;//定点显示小数点bsel=(bsel1)+1;//准备显示下一位表6-2小数部分二进制与十进制转换表小数部分二进制值0123456789ABCDEF十进制值0011233455667889项目六多路测温系统的设计27for(i=1;i200;i++);//延时P0=0xff;//熄灭所有字段}}voiddelay15(ucharn)//15us延时函数{do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();n--;}while(n);}bitreset(void)//初始化DS18B20{biterr;DQ=0;//在数据线上产生600us的低电平delay15(40);DQ=1;//数据线拉高delay15(4);//延时60userr=DQ;//读取数据线状态,err=0:复位成功delay15(18);//err=1:复位失败return(err);}voidwrbyte(uchard)//向DS18B20写入一个字节{uchari;dat=d;for(
本文标题:项目六多路测温系统的设计
链接地址:https://www.777doc.com/doc-1983001 .html