DS18B20多点测温.docx
- 文档编号:10646798
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:17
- 大小:17.23KB
DS18B20多点测温.docx
《DS18B20多点测温.docx》由会员分享,可在线阅读,更多相关《DS18B20多点测温.docx(17页珍藏版)》请在冰豆网上搜索。
DS18B20多点测温
DS18B20多点测温(读序列,匹配序列,51C程序,1602显示)
程序一:
单个读序列号。
程序二,匹配并且读两个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 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 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 多点 测温