第22章使用DS28B20温传感器测温#
第第 1111章使用章使用 DS18B20DS18B20 温度传感器测温温度传感器测温 11.111.1概述概述 现实生产生活中,小到测量体温的温度计,大到航天飞机的温控系统,处处都离不开 温度测量。工业生产中的三大指标 { uchar m。 RW=0。 RS=0。 P1=。 for(m=0。m。//延时 25us E=1。 for(m=0。m。//延时 25us E=0。 } void wrdata1602(uchar shuju { uchar m。 RW=0。 RS=1。 P1=shuju。 8 / 17 for(m=0。m。//延时 25us E=1。 for(m=0。m。//延时 25us E=0。 } void init1602(void { RW=0。 E=0。 wr1602(0 x38。 wr1602(0 x0c。 wr1602(0 x06。 wr1602(0 x01。 } void disp1602(uchar x,uchar y,uchar ch { wr1602(0 x80+x*0 x40+y。 wrdata1602(ch。 } /****************************************/ void init18b20(void { uchar m。 DQ=0。 for(m=0。m。 //延时 732us DQ=1。 for(m=0。m。 //延时 532us } void wr18b20(uchar 18b20 { bit sendbit。 uchar i,m。 for(i=1。i { sendbit=18b20&0 x01。 18b20=18b201。 if(sendbit==0 { DQ=0。 for(m=0。m。//延时 12us DQ=0。 for(m=0。m。 //延时 66us DQ=1。 for(m=0。m。 9 / 17 //延时 12us } else { DQ=0。 for(m=0。m。//延时 9us DQ=1。 for(m=0。m。//延时 36us DQ=1。 for(m=0。m。//延时 9us } } } bit rdbit18b20(void { uchar m。 bit onebit。 DQ=0。 _nop_(。 DQ=1。 //单片机的 I/O口要输入,必须先写入1 for(m=0。m。//延时 9us onebit=DQ。 for(m=0。m。//延时 36us return(onebit。 } uchar rdbyte18b20(void { uchar i,j。 uint wenduzhi=0。 for(i=1。i { j=rdbit18b20(。 wenduzhi=(j1。 } return(wenduzhi。 } void stconv18b20(void { uchar m,n。 init18b20(。 for(m=0。m。//延时 9us wr18b20(0 xCC。 for(m=0。m。//延时 9us wr18b20(0 x44。 for(n=0。n 10 / 17 for(m=0。m。 for(n=0。n for(m=0。m。 //延时 760ms } uint rdwendu(void { init18b20(。 wr18b20(0 xCC。 wr18b20(0 xBE。 wdL=rdbyte18b20(。 wdH=rdbyte18b20(。 temp=wdH。 temp=temptemp*0.0625*10+0.5。 return(temp。 } void rd18b20rom(void { uchar j。 init18b20(。 wr18b20(0 x33。 for(j=0。j { sn[j]=rdbyte18b20(。 _nop_(。 } } /**************************************************/ main( { uint t,k。 init1602(。 rd18b20rom(。 for(k=0。k { disp1602(1,2*k,b2hex[(sn[k]&0 xf04]。 disp1602(1,2*k+1,b2hex[sn[k]&0 x0f]。 } while(1 { stconv18b20(。 t=rdwendu(。 disp1602(0,0,t/100+ 0 。 11 / 17 disp1602(0,1,t/10%10+ 0 。 disp1602(0,2, . 。 disp1602(0,3,t%10+ 0 。 disp1602(0,5,39。 disp1602(0,6, C 。 disp1602(0,14,b2hex[(wdL&0 xf04]。 disp1602(0,15,b2hex[wdL&0 x0f]。 disp1602(0,12,b2hex[(wdH&0 xf04]。 disp1602(0,13,b2hex[wdH&0 x0f]。 } } 11.4 DS18B2011.4 DS18B20温度传感器测温实例温度传感器测温实例 2 2 功能要求:功能要求: 单片机与四片DS18B20 连接,在1602 液晶屏第一行起始位置显示 “1:”,紧接着显示第一片 DS18B20 所测温度值,在 1602 液晶屏第一行中间位置 起显示“2:”紧接着显示第二片 DS18B20 所测温度值,在 1602 液晶屏第二行起始 位置显示“3:”,紧接着显示第三片 DS18B20 所测温度值,在 1602 液晶屏第二行 中间位置起显示“4:”紧接着显示第四片DS18B20所测温度值。 #include #include #define uchar unsigned char #define uint unsigned int 12 / 17 sbit RS=P2^0。 sbit RW=P2^1。 sbit E=P2^2。 sbit DQ=P2^3。 uint temp。 uchar wdL,wdH。 uchar code sn[][8]={ {0 x28,0 x0D,0 x3F,0 x2C,0 x03,0 x00,0 x00,0 x39}, {0 x28,0 xE7,0 x50,0 x2C,0 x03,0 x00,0 x00,0 xA1}, {0 x28,0 xB2,0 x40,0 x2C,0 x03,0 x00,0 x00,0 x18}, {0 x28,0 xD1,0 x45,0 x2C,0 x03,0 x00,0 x00,0 x50} }。 uchar code b2hex[]=“0123456789ABCDEF“。 //***************************************** void wr1602(uchar { uchar m。 RW=0。 RS=0。 P1=。 for(m=0。m。//延时 25us E=1。 for(m=0。m。//延时 25us E=0。 } void wrdata1602(uchar shuju { uchar m。 RW=0。 RS=1。 P1=shuju。