您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > ds18b20多路温度采集程序
本程序为ds18b20的多路温度采集程序,是我自己参考其他程序后改写而成,可显示4路正负温度值,并有上下限温度报警(声音、灯光报警)。亲测,更改端口即可使用。(主要器件:51单片机,ds18b20,lcd显示器)附有proteus仿真图,及序列号采集程序/****上限62度下限-20度****/#includereg51.h#defineucharunsignedchar#defineuintunsignedintsbitds=P1^1;sbitrs=P1^4;sbite=P1^6;sbitsp=P1^0;sbitd1=P1^2;sbitd2=P1^3;ucharlcdrom[4][8]={{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e},{0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0},{0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7}};unsignedcharcodetable0[]={TEMPERARTURE:U};unsignedcharcodetable1[]={0123456789ABCDEF};intf[4];inttvalue;floatftvalue;uintwarnl=320;uintwarnh=992;/****lcd程序****/voiddelayms(uintms)//延时{uinti,j;for(i=ms;i0;i--)for(j=110;j0;j--);}voidwrcom(ucharcom)//写指令{delayms(1);rs=0;P3=com;delayms(1);e=1;delayms(1);e=0;}voidwrdat(uchardat)//写数据{rs=1;e=0;P3=dat;delayms(5);e=1;delayms(5);e=0;}voidlcdinit()//初始化lcd{delayms(15);wrcom(0x38);delayms(5);wrcom(0x0c);delayms(5);wrcom(0x06);delayms(5);wrcom(0x01);delayms(5);}voiddisplay(uchar*p)//显示{while(*p!='\0'){wrdat(*p);p++;delayms(1);}}displayinit()//初始化显示{lcdinit();wrcom(0x80);display(table0);}/****ds18b20程序****/voiddsrst()//ds18b20复位{uinti;ds=0;i=103;while(i0)i--;ds=1;i=4;while(i0)i--;}bitdsrd0()//读一位数据{uinti;bitdat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i0)i--;return(dat);}uchardsrd()//读1个字节数据{uchari,j,dat;dat=0;for(i=8;i0;i--){j=dsrd0();dat=(j7)|(dat1);}return(dat);}voiddswr(uchardat)//写数据{uinti;ucharj;bittestb;for(j=8;j0;j--){testb=dat&0x01;dat=dat1;if(testb){ds=0;i++;i++;ds=1;i=8;while(i0)i--;}else{ds=0;i=8;while(i0)i--;ds=1;i++;i++;}}}voidtmstart()//初始化ds18b20{sp=1;d1=1;d2=1;dsrst();delayms(1);dswr(0xcc);dswr(0x44);}voidread_dealtemp()//读取并处理温度{uchari,j,t;uchara,b;for(j=0;j4;j++){dsrst();delayms(1);dswr(0x55);for(i=0;i8;i++){dswr(lcdrom[j][i]);//发送64位序列号}dswr(0xbe);a=dsrd();b=dsrd();tvalue=b;tvalue=8;tvalue=tvalue|a;if(tvalue0){d1=1;tvalue=~tvalue+1;wrcom(0xc0);wrdat(0x2d);if(tvaluewarnl){d2=0;sp=0;}else{d2=1;sp=1;}}else{d2=1;wrcom(0xc0);wrdat('');if(tvaluewarnh){d1=0;sp=0;}else{d1=1;sp=1;}}if(j==0){wrcom(0x8e);wrdat('2');}if(j==1){wrcom(0x8e);wrdat('3');}if(j==2){wrcom(0x8e);wrdat('4');}if(j==3){wrcom(0x8e);wrdat('5');}ftvalue=tvalue*0.0625;tvalue=ftvalue*10+0.5;ftvalue=ftvalue+0.05;f[j]=tvalue;//温度扩大十倍,精确到一位小数tvalue=f[j];t=tvalue/1000;wrcom(0x80+0x41);wrdat(table1[t]);//显示百位t=tvalue%1000/100;wrdat(table1[t]);//显示十位t=tvalue%100/10;wrdat(table1[t]);//显示个位wrdat(0x2e);//显示小数点儿t=tvalue%10/1;wrdat(table1[t]);//显示小数位delayms(5000);}}/****主函数****/voidmain(){d1=1;d2=1;sp=1;displayinit();//初始化显示while(1){tmstart();//初始化read_dealtemp();//读取温度}}/****序列号读取程序****/#includereg52.h#defineucharunsignedchar#defineuintunsignedintsbitDQ=P1^1;//温度传感器信号线sbitrs=P1^4;//LCD数据/命令选择端(H/L)位声明sbitlcden=P1^6;//LCD使能信号端位声明voiddelay(uintz);//延时函数voidDS18B20_Reset(void);//DQ18B20复位,初始化函数bitDS18B20_Readbit(void);//读1位数据函数ucharDS18B20_ReadByte(void);//读1个字节数据函数voidDS18B20_WriteByte(uchardat);//向DQ18B20写一个字节数据函数voidLCD_WriteCom(ucharcom);//1602液晶命令写入函数voidLCD_WriteData(uchardat);//1602液晶数据写入函数voidLCD_Init();//LCD初始化函数voidDisplay18B20Rom(charRom);//显示18B20序列号函数/**********************************************//*主函数*//**********************************************/voidmain(){uchara,b,c,d,e,f,g,h;LCD_Init();DS18B20_Reset();delay(1);DS18B20_WriteByte(0x33);delay(1);a=DS18B20_ReadByte();b=DS18B20_ReadByte();c=DS18B20_ReadByte();d=DS18B20_ReadByte();e=DS18B20_ReadByte();f=DS18B20_ReadByte();g=DS18B20_ReadByte();h=DS18B20_ReadByte();LCD_WriteCom(0x80+0x40);Display18B20Rom(h);Display18B20Rom(g);Display18B20Rom(f);Display18B20Rom(e);Display18B20Rom(d);Display18B20Rom(c);Display18B20Rom(b);Display18B20Rom(a);while(1);}/***************************************************//*延时函数:voiddelay()*//*功能:延时函数*//***************************************************/voiddelay(uintz)//延时函数{uintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}/***************************************************//*DS18B20函数:voidDS18B20_Reset()*//*功能:复位18B20*//***************************************************/voidDS18B20_Reset(void)//DQ18B20复位,初始化函数{uinti;DQ=0;i=103;while(i0)i--;DQ=1;i=4;while(i0)i--;}/***************************************************//*DS18B20函数:voidDS18B20_Readbit()*//*功能:读1个字节数据函数*//***************************************************/bitDS18B20_Readbit(void)//读1位数据函数{uinti;bitdat;DQ=0;i++;//i++起延时作用DQ=1;i++;i++;dat=DQ;i=8;while(i0)i--;return(dat);}/***************************************************//*DS18B20函数:voidDS18B20_ReadByte()*//*功能:读1个字节数据函数*//***************************************************/ucharDS18B20_ReadByte(void)//读1个字节数据函数{uchari,j,dat;dat=0;for(i=1;i=8;i++){j=DS18B20_Readbit();dat=(j7)|(dat1);}return(dat);}/***************************************************//*DS18B20函数:voidDS18B20_WriteByte()*//*功能:向DQ18B20写一个字节数据函数*//***************************************************/voidDS18B20_WriteByte(uchardat)//向DQ18B20写一个字节数据函数{uinti;ucharj;bittestb;for(j=1;j=8;j++){testb=dat&0x01;dat=dat1;if(testb)//写1{DQ=0;i++;i++;DQ=1;i=8;while(
本文标题:ds18b20多路温度采集程序
链接地址:https://www.777doc.com/doc-4594931 .html