单总线两个ds18b20测温12684显示.docx
- 文档编号:5762678
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:21
- 大小:19.07KB
单总线两个ds18b20测温12684显示.docx
《单总线两个ds18b20测温12684显示.docx》由会员分享,可在线阅读,更多相关《单总线两个ds18b20测温12684显示.docx(21页珍藏版)》请在冰豆网上搜索。
单总线两个ds18b20测温12684显示
#include
#include
#include
#include
//#include
#defineucharunsignedchar
#defineuintunsignedint
intl=0;
//**********宏定义所需指令
#defineBASIC_SET0x30
#defineEXTEND_SET0x34
#defineDRAW_ON0x36
#defineDRAW_OFF0x34
unsignedchartemp0=0x00;
unsignedcharTPH,TPL;
xdataunsignedchara[]="哈尔滨理工大学";
xdataunsignedcharb[]="当前室温为:
";
unsignedcharc[]="0000000000000000";
ucharcodestr1[]={0x28,0x5E,0xAC,0x28,0x03,0x00,0x00,0xB9};//ROM1
ucharcodestr2[]={0x28,0xFF,0xA8,0x68,0x04,0x00,0x00,0x57};//ROM2
sbitT=P1^1;
sbitRS=P0^6;
sbitRW=P3^6;
sbitEN=P3^7;
//sbitT10=P0^5;
voiddelay_1us(unsignedintx);
//externvoiddelay_1us();
voiddelay_5us();
voiddelay_10us();
voiddelay_20us();
voiddelay_100us();
voiddelay_200us();
voidDelayXus(unsignedcharn);
bitreset_DS18B20();
voidwriteByte_DS18B20(unsignedcharx);
unsignedcharreadByte_DS18B20();
voidshow_Temperature(ucharx);
voidDS18B20_show(ucharx);
voidinit_DS18B20();
typedefunsignedcharuint8;
typedefcharint8;
typedefunsignedshortuint16;
typedefshortint16;
typedefunsignedlonguint32;
typedeflongint32;
unsignedcharExchange(unsignedcharch){
unsignedcharTT=0x80;
unsignedcharEE=0x01;
unsignedcharTemp=0,i;
for(i=0;i<8;i++){
if(ch&TT)Temp=Temp|EE;
TT=TT>>1;
EE=EE<<1;
}
returnTemp;
}
voiddelay1ms(uintms)//延时1毫秒(不够精确的)
{uinti,j;
for(i=0;i for(j=0;j<100;j++); } voidDelay1(unsignedintn){ unsignedinti; for(i=0;i _nop_(); } } //***********ms级延时函数 voiddelay_1ms(uintx) { uinti,j; for(j=0;j for(i=0;i<110;i++); } voidLCD_write_command(unsignedcharcommand){ //Checkbusy(); RS=0; RW=1; Delay1(10); RW=0; EN=1; P2=Exchange(command); EN=0; } ucharread_dat(void) { uchartemp; P2=0xff; RS=1; RW=1; Delay1(25); EN=0; EN=1; temp=P2; EN=0; returnExchange(temp); } /*写入一个字节的数据*/ voidLCD_write_byte(unsignedcharch){ RS=1; RW=1; Delay1(10); RW=0; EN=1; P2=Exchange(ch); EN=0; } voidLCD_write_line(unsignedchar*ch,unsignedintLCD_line,unsignedcharLCD_High){ intstr_len=0; intLCD_line_len=16; inti=0; unsignedcharaddr; str_len=strlen(ch); if(str_len<16)///要显示的字符串可能大于16Byte LCD_line_len=str_len; else ; switch(LCD_line) { case1: //写入第一行 addr=0x80; break; case2: //写入第二行 addr=0x90; break; case3: //写入第三行 addr=0x88; break; case4: //写入第四行 addr=0x98; break; default: break; } LCD_write_command(addr+LCD_High); while(i LCD_write_byte(ch[i]); i++; } } /*voidShowAncientPeom(){ LCD_write_command(0x30); LCD_write_command(0x01); Delay1(500); LCD_write_line(b,1,0); //LCD_write_line(a,1,4); //strcpy(d,g[0]); LCD_write_line(d,2,1); LCD_write_line(c1,3,0); LCD_write_line(a,4,0); }*/ voidLCD_init(){ unsignedcharcommand; RS=0; RW=0; EN=0; //command=0x30; //LCD_write_command(command); command=0x30; LCD_write_command(command); command=0x0c; LCD_write_command(command); command=0x01; LCD_write_command(command); command=0x06; LCD_write_command(command); } voiddelay_1us(unsignedintx){ unsignedinti; x=x*5/4; for(i=0;i } voidinit_DS18B20(){ bitresult; T=1; delay_1us(5);//延迟几微秒 T=0;//单片机将单线总线信号拉低480-950us, delay_1us(500);//然后释放总线(拉高电平) T=1; delay_1us(20);//等待15-60us等待DS18B20输出脉冲 delay_1us(100);//DS18B20会持续输出60-240us, //之后DS18B20会拉高电平,释放总线 result=T; } bitreset_DS18B20(){ bitflag; T=0; DelayXus(240); DelayXus(240); /* delay_200us(); delay_200us(); delay_100us(); delay_20us(); */ T=1; //delay_100us(); //delay_20us(); DelayXus(100); while(T); flag=T; /* delay_200us(); delay_20us(); delay_10us(); delay_10us(); */ DelayXus(240); DelayXus(180); //while(! T); //delay_100us(); return(flag); } /* voiddelay_1us(){//STC11/10系列长调用LCALL花费6个时钟周期, //ret返回花费4个时钟周期 _nop_();//NOP指令花费1个时钟周期 _nop_(); } */ voiddelay_5us(){ _nop_(); } voiddelay_10us(){ delay_5us(); _nop_(); } voiddelay_20us(){ delay_10us(); delay_5us(); _nop_(); } voiddelay_100us(){ delay_20us(); delay_20us(); delay_20us(); delay_20us(); delay_10us(); delay_5us(); _nop_(); } voiddelay_200us(){ delay_100us(); delay_20us(); delay_20us(); delay_20us(); delay_20us(); delay_10us(); delay_5us(); _nop_(); } voidwriteByte_DS18B20(unsignedchardat){ unsignedchari=0; for(i=0;i<8;i++){ T=0;////单片机将单线总线拉低,开始写 _nop_(); T=dat&0x01;////写入数据 /*delay_20us(); delay_20us(); delay_20us(); */DelayXus(60); T=1; dat>>=1; } } unsignedcharreadByte_DS18B20(){ unsignedchari; for(i=0;i<8;i++){ temp0>>=1; T=0;////单片机拉低信号,开始 //_nop_(); DelayXus (1); T=1; //_nop_(); DelayXus (1); if(T==1) temp0|=0x80; DelayXus(20); DelayXus(20); //delay_20us(); //delay_20us();////等待控制器开始在45us内采样 } return(temp0); } /*voidshow_Temperature(){ inti=0; reset_DS18B20();//设备复位 writeByte_DS18B20(0xCC);//跳过ROM命令 writeByte_DS18B20(0x44);//开始转换命令 while(! T);//等待转换完成 reset_DS18B20();//设备复位 writeByte_DS18B20(0xCC);//跳过ROM命令 writeByte_DS18B20(0xBE);//读暂存存储器命令 TPL=readByte_DS18B20();//读温度低字节 TPH=readByte_DS18B20();//读温度高字节 while(i<20000){i++;} DS18B20_show(); }*/ voidb20_Matchrom(uchara)//匹配ROM { charj; writeByte_DS18B20(0x55);//发送匹配ROM命令 if(a==1) { for(j=0;j<8;j++) writeByte_DS18B20(str1[j]);//发送18B20的序列号,先发送低字节 } if(a==2) { for(j=0;j<8;j++) writeByte_DS18B20(str2[j]);//发送18B20的序列号,先发送低字节 } } voidshow_Temperature(ucharz)/*读取温度值并转换*/ { inti=0; reset_DS18B20(); writeByte_DS18B20(0xCC); //for(i=0;i<8;i++) //{ //str1[i]=readByte_DS18B20(); //}//读序列号 reset_DS18B20(); if(z==1) { b20_Matchrom (1);//匹配ROM1 } if(z==2) { b20_Matchrom (2);//匹配ROM2 } writeByte_DS18B20(0x44); delay1ms(5); reset_DS18B20(); writeByte_DS18B20(0xCC);//读序列号 reset_DS18B20(); if(z==1) { b20_Matchrom (1);//匹配ROM1 } if(z==2) { b20_Matchrom (2);//匹配ROM2 } writeByte_DS18B20(0xBE); //*读取温度*/ TPL=readByte_DS18B20(); TPH=readByte_DS18B20(); /*tvalue=TPH; tvalue<<=8; tvalue=tvalue|TPL; if(tvalue<0x0fff) tflag=0; else {tvalue=~tvalue+1; tflag=1; } tt=tvalue*0.0625; tvalue=tt*10; return(tvalue);*/ while(i<20000){i++;} DS18B20_show(z); } /************************************** 向TPLTPH中的字在LCD上显示出来写1字节数据 **************************************/ voidDS18B20_show(ucharz){ unsignedchartemperature[14]; unsignedchartemp1;//存放整数部分 //unsignedchartemp2;//存放小数部分 uint16temp3;//存放小数+整数 unsignedchartemp[]="Temp+000.0000"; temperature[0]='+';temperature[1]='0';temperature[2]='0'; temperature[3]='0';temperature[4]='0';temperature[5]='0'; temperature[6]='0';temperature[7]='0';temperature[8]='.'; temperature[9]='0';temperature[10]='0';temperature[11]='0'; temperature[12]='0';temperature[13]='0'; if(TPH&0xf8)temperature[0]='-'; if(TPH&0x04)temperature[1]='1'; if(TPH&0x02)temperature[2]='1'; if(TPH&0x01)temperature[3]='1'; if(TPL&0x80)temperature[4]='1'; if(TPL&0x40)temperature[5]='1'; if(TPL&0x20)temperature[6]='1'; if(TPL&0x10)temperature[7]='1'; if(TPL&0x08)temperature[9]='1'; if(TPL&0x04)temperature[10]='1'; if(TPL&0x02)temperature[11]='1'; if(TPL&0x01)temperature[12]='1'; ////////温度为正负时分别将其二进制数放进两个字节 temp3=(((0x0000|TPH)<<8)|TPL);//将TPL,TPH中的整数部分的数 //移到16位temp3中 if(TPH&0xf8){ temp[4]='-'; temp3=~temp3+0x0001;//将其转化成正数的二进制形式 } else{ } //temp1=((TPH&0x07)<<4)|((TPL&0xf0)>>4); temp1=(temp3>>4)&0x007f; switch(temp1/100){//设置整数部分百位数字符temp="温度+000.0000" case0x00: temp[5]='0'; break; case0x01: temp[5]='1'; break; default: break; } switch((temp1%100)/10){//设置整数部分十位数字符temp="温度+000.0000" case0x00: temp[6]='0'; break; case0x01: temp[6]='1'; break; case0x02: temp[6]='2'; break; case0x03: temp[6]='3'; break; case0x04: temp[6]='4'; break; case0x05: temp[6]='5'; break; case0x06: temp[6]='6'; break; case0x07: temp[6]='7'; break; case0x08: temp[6]='8'; break; case0x09: temp[6]='9'; break; default: break; } switch((temp1%100)%10){//设置整数部分个位数字符temp="温度+000.0000" case0x00: temp[7]='0'; break; case0x01: temp[7]='1'; break; case0x02: temp[7]='2'; break; case0x03: temp[7]='3'; break; case0x04: temp[7]='4'; break; case0x05: temp[7]='5'; break; case0x06: temp[7]='6'; break; case0x07: temp[7]='7'; break; XX文库-让每个人平等地提升自我case0x08: temp[7]='8'; break; case0x09: temp[7]='9'; break; default: break; } ////////////////设置小数部分显示字符temp="温度+000.0000" //temp1=TPL&0x0f; temp1=temp3&0x000f; switch(temp1){ case0x00: temp[9]='0';temp[10]='0';//0.0625*0 temp[11]='0';temp[12]='0'; break; case0x01: temp[9]='0';temp[10]='6';//0.0625*1 temp[11]='2';temp[12]='5'; break; case0x02: temp[9]='1';temp[10]='2';//0.0625*2 temp[11]='5';temp[12]='0'; break; case0x03: temp[9]='1';temp[10]='8';//0.0625*3 temp[11]='7';temp[12]='5'; break; case0x04: temp[9]='2';temp[10]='5';//0.0625*4 temp[11]='0';temp[12]='0'; break; case0x05: temp[9]='3';temp[10]='1';//0.0625*5 temp[11]='2';temp[12]='5'; break; case0x06: temp[9]='3';temp[10]='7';//0.0625*6 temp[11]='5';temp[12]='0'; break; case
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 总线 两个 ds18b20 测温 12684 显示
![提示](https://static.bdocx.com/images/bang_tan.gif)