#DS18B20多点测温51C程序.docx
- 文档编号:15535125
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:18
- 大小:17.09KB
#DS18B20多点测温51C程序.docx
《#DS18B20多点测温51C程序.docx》由会员分享,可在线阅读,更多相关《#DS18B20多点测温51C程序.docx(18页珍藏版)》请在冰点文库上搜索。
#DS18B20多点测温51C程序
DS18B20多点测温<读序列,匹配序列,51C程序,1602显示)
因为本人在前两天找DS18B20多点测温<51C程序),网上下载了很多,但是都不是很理想,后来,自己总结前人的知识,重新写了这个程序。
其中包括程序一:
单个读序列号。
程序二,匹配并且读两个DS18B20,当然,读多个与读两个基本原理一样,只要加上其序列号等即可。
本程序所有显示都是用LCD1602显示。
程序一:
度序列号,并用1602显示,1602从左到右分别是低到高位。
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^7。
//ds18b20与单片机连接口
sbitRS=P3^0。
sbitRW=P3^1。
sbitEN=P3^2。
unsignedcharcodestr1[]={""}。
unsignedcharcodestr2[]={""}。
ucharfCode[8]。
uchardatadisdata[5]。
uinttvalue。
//温度值
uchartflag。
//温度正负标志
/*************************lcd1602程序**************************/
voiddelay1ms(unsignedintms>//延时1毫秒<不够精确的)
{unsignedinti,j。
for(i=0。
i i++> for(j=0。 j<100。 j++>。 } voidwr_com(unsignedcharcom>//写指令// {delay1ms(1>。 RS=0。 RW=0。 EN=0。 P2=com。 delay1ms(1>。 EN=1。 delay1ms(1>。 EN=0。 } voidwr_dat(unsignedchardat>//写数据// {delay1ms(1>。 。 RS=1。 RW=0。 EN=0。 P2=dat。 delay1ms(1>。 EN=1。 delay1ms(1>。 EN=0。 } voidlcd_init(>//初始化设置// {delay1ms(15>。 wr_com(0x38>。 delay1ms(5>。 wr_com(0x08>。 delay1ms(5>。 wr_com(0x01>。 delay1ms(5>。 wr_com(0x06>。 delay1ms(5>。 wr_com(0x0c>。 delay1ms(5>。 } voiddisplay(unsignedchar*p>//显示// { while(*p! ='\0'> { wr_dat(*p>。 p++。 delay1ms(1>。 } } voidinit_play(>//初始化显示 {lcd_init(>。 wr_com(0x80>。 display(str1>。 wr_com(0xc0>。 display(str2>。 } /******************************ds1820*********************/ voiddelay_18B20(unsignedinti>//延时1微秒 { while(i-->。 } voidds1820rst(>/*ds1820复位*/ {ucharx=0。 DQ=1。 //DQ复位 delay_18B20(4>。 //延时 DQ=0。 //DQ拉低 delay_18B20(100>。 //精确延时大于480us DQ=1。 //拉高 delay_18B20(40>。 } uchards1820rd(>/*读数据*/ {uchari=0。 uchardat=0。 for(i=8。 i>0。 i--> {DQ=0。 //给脉冲信号 dat>>=1。 DQ=1。 //给脉冲信号 if(DQ> dat|=0x80。 delay_18B20(10>。 } return(dat>。 } voidds1820wr(ucharwdata>/*写数据*/ {uchari=0。 for(i=8。 i>0。 i--> {DQ=0。 DQ=wdata&0x01。 delay_18B20(10>。 DQ=1。 wdata>>=1。 } } read_temp(>/*读取温度值并转换*/ {uchara,b。 ds1820rst(>。 ds1820wr(0xcc>。 //*跳过读序列号*/ ds1820wr(0x44>。 //*启动温度转换*/ ds1820rst(>。 ds1820wr(0xcc>。 //*跳过读序列号*/ ds1820wr(0xbe>。 //*读取温度*/ a=ds1820rd(>。 b=ds1820rd(>。 tvalue=b。 tvalue<<=8。 tvalue=tvalue|a。 if(tvalue<0x0fff> tflag=0。 else {tvalue=~tvalue+1。 tflag=1。 } tvalue=tvalue*(0.625>。 //温度值扩大10倍,精确到1位小数 return(tvalue>。 } /*******************************************************************/ voidds1820disp(>//温度值显示 {ucharflagdat。 disdata[0]=tvalue/1000+0x30。 //百位数 disdata[1]=tvalue%1000/100+0x30。 //十位数 disdata[2]=tvalue%100/10+0x30。 //个位数 disdata[3]=tvalue%10+0x30。 //小数位 if(tflag==0> flagdat=0x20。 //正温度不显示符号 else flagdat=0x2d。 //负温度显示负号: - if(disdata[0]==0x30> {disdata[0]=0x20。 //如果百位为0,不显示 if(disdata[1]==0x30> {disdata[1]=0x20。 //如果百位为0,十位为0也不显示 } } wr_com(0xc0>。 wr_dat(flagdat>。 //显示符号位 wr_com(0xc1>。 wr_dat(disdata[0]>。 //显示百位 wr_com(0xc2>。 wr_dat(disdata[1]>。 //显示十位 wr_com(0xc3>。 wr_dat(disdata[2]>。 //显示个位 wr_com(0xc4>。 wr_dat(0x2e>。 //显示小数点 wr_com(0xc5>。 wr_dat(disdata[3]>。 //显示小数位 } voidDispCode(> { unsignedchari,temp。 ds1820rst(>。 ds1820wr(0x33>。 for(i=0。 i<8。 i++> { fCode[i]=ds1820rd(>。 } wr_com(0x80+0x40>。 for(i=0。 i<8。 i++> { temp=fCode[i]>>4。 //显示高四位 if(temp<10> wr_dat(temp+0x30>。 else wr_dat(temp+0x37>。 temp=fCode[i]&0x0f。 //显示低四位 if(temp<10> wr_dat(temp+0x30>。 else wr_dat(temp+0x37>。 } } /********************主程序***********************************/ voidmain(> { init_play(>。 //初始化显示 DispCode(>。 //系列号显示 delay1ms(1000>。 while(1> {//read_temp(>。 //读取温度 //ds1820disp(>。 //显示 。 } } 程序二: 匹配序列号,并读温度。 #include #include #defineucharunsignedchar #defineuintunsignedint sbitRS=P3^0。 sbitRW=P3^1。 sbitEN=P3^2。 sbitDQ=P3^7。 ucharcodestr1[]={0x28,0x08,0xA7,0xBA,0x02,0x00,0x00,0x18}。 //ROM1 ucharcodestr2[]={0x28,0x0C,0xBA,0xBA,0x02,0x00,0x00,0x54}。 //ROM2 ucharcodetable[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00}。 //摄氏温度符号 uchardatadisdata[5]。 uinttvalue。 //温度值 uchartflag。 //温度正负标志 /*************************lcd1602程序**************************/ voiddelay1ms(uintms>//延时1毫秒<不够精确的) {uinti,j。 for(i=0。 i i++> for(j=0。 j<100。 j++>。 } voidwr_com(ucharcom>//写指令// {delay1ms(1>。 RS=0。 RW=0。 EN=0。 P2=com。 delay1ms(1>。 EN=1。 delay1ms(1>。 EN=0。 } voidwr_dat(uchardat>//写数据// {delay1ms(1>。 。 RS=1。 RW=0。 EN=0。 P2=dat。 delay1ms(1>。 EN=1。 delay1ms(1>。 EN=0。 } voidwr_new(>、//写新字符 { uchari。 wr_com(0x40>。 for(i=0。 i<8。 i++> { wr_dat(table[i]>。 } } voidlcd_init(>//初始化设置// {delay1ms(15>。 wr_com(0x38>。 delay1ms(5>。 wr_com(0x08>。 delay1ms(5>。 wr_com(0x01>。 delay1ms(5>。 wr_com(0x06>。 delay1ms(5>。 wr_com(0x0c>。 delay1ms(5>。 wr_new(>。 wr_com(0x80>。 wr_dat('A'>。 wr_com(0x81>。 wr_dat(': '>。 wr_com(0x89>。 wr_dat(0x00>。 wr_com(0x8a>。 wr_dat('C'>。 wr_com(0xc9>。 wr_dat(0x00>。 、、//摄氏温度字符 wr_com(0xca>。 wr_dat('C'>。 wr_com(0xc0>。 wr_dat('B'>。 wr_com(0xc1>。 wr_dat(': '>。 } /******************************ds1820程序***************************************/ voiddelay_18B20(uinti>//延时1微秒 { while(i-->。 } voidds1820rst(>/*ds1820复位*/ {ucharx=0。 DQ=1。 //DQ复位 delay_18B20(4>。 //延时 DQ=0。 //DQ拉低 delay_18B20(100>。 //精确延时大于480us DQ=1。 //拉高 delay_18B20(40>。 } uchards1820rd(>/*读数据*/ {uchari=0。 uchardat=0。 for(i=0。 i<8。 i++> {DQ=0。 //给脉冲信号 dat>>=1。 DQ=1。 //给脉冲信号 if(DQ> dat|=0x80。 delay_18B20(10>。 } return(dat>。 } voidds1820wr(uchardat>/*写数据*/ {uchari=0。 for(i=0。 i<8。 i++> {DQ=0。 DQ=dat&0x01。 delay_18B20(10>。 DQ=1。 dat>>=1。 } } voidb20_Matchrom(uchara>//匹配ROM { charj。 ds1820wr(0x55>。 //发送匹配ROM命令 if(a==1> { for(j=0。 j<8。 j++> ds1820wr(str1[j]>。 //发送18B20的序列号,先发送低字节 } if(a==2> { for(j=0。 j<8。 j++> ds1820wr(str2[j]>。 //发送18B20的序列号,先发送低字节 } } read_temp(ucharz>/*读取温度值并转换*/ {uchara,b。 floattt。 ds1820rst(>。 ds1820wr(0xcc>。 、//读序列号 ds1820rst(>。 if(z==1> { b20_Matchrom(1>。 //匹配ROM1 } if(z==2> { b20_Matchrom(2>。 //匹配ROM2 } ds1820wr(0x44>。 //*启动温度转换*/ delay1ms(5>。 ds1820rst(>。 ds1820wr(0xcc>。 //读序列号 ds1820rst(>。 if(z==1> { b20_Matchrom(1>。 //匹配ROM1 } if(z==2> { b20_Matchrom(2>。 //匹配ROM2 } ds1820wr(0xbe>。 //*读取温度*/ a=ds1820rd(>。 b=ds1820rd(>。 tvalue=b。 tvalue<<=8。 tvalue=tvalue|a。 if(tvalue<0x0fff> tflag=0。 else {tvalue=~tvalue+1。 tflag=1。 } tt=tvalue*0.0625。 tvalue=tt*10。 return(tvalue>。 } /*****************显示函数******************************/ voidds1820disp(ucharz>//温度值显示 {ucharflagdat。 disdata[0]=tvalue/1000+0x30。 //百位数 disdata[1]=tvalue%1000/100+0x30。 //十位数 disdata[2]=tvalue%100/10+0x30。 //个位数 disdata[3]=tvalue%10+0x30。 //小数位 if(tflag==0> flagdat=0x20。 //正温度不显示符号 else flagdat=0x2d。 //负温度显示负号: - if(disdata[0]==0x30> {disdata[0]=0x20。 //如果百位为0,不显示 if(disdata[1]==0x30> {disdata[1]=0x20。 //如果百位为0,十位为0也不显示 } } if(z==1> { wr_com(0x82>。 wr_dat(flagdat>。 //显示符号位 wr_com(0x83>。 wr_dat(disdata[0]>。 //显示百位 wr_com(0x84>。 wr_dat(disdata[1]>。 //显示十位 wr_com(0x85>。 wr_dat(disdata[2]>。 //显示个位 wr_com(0x86>。 wr_dat(0x2e>。 //显示小数点 wr_com(0x87>。 wr_dat(disdata[3]>。 //显示小数位 } if(z==2> { wr_com(0xc2>。 wr_dat(flagdat>。 //显示符号位 wr_com(0xc3>。 wr_dat(disdata[0]>。 //显示百位 wr_com(0xc4>。 wr_dat(disdata[1]>。 //显示十位 wr_com(0xc5>。 wr_dat(disdata[2]>。 //显示个位 wr_com(0xc6>。 wr_dat(0x2e>。 //显示小数点 wr_com(0xc7>。 wr_dat(disdata[3]>。 //显示小数位 } } /********************主程序***********************************/ voidmain(> { lcd_init(>。 //初始化显示 while(1> { read_temp(1>。 //读取温度 ds1820disp(1>。 //显示 read_temp(2>。 //读取温度 ds1820disp(2>。 //显示 //delay1ms(10000>。 } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS18B20 多点 测温 51 程序