1、ds18b20多路温度采集程序本程序为ds18b20的多路温度采集程序,是我自己参考其他程序后改写而成,可显示4路正负温度值,并有上下限温度报警(声音、灯光报警)。亲测,更改端口即可使用。(主要器件:51单片机,ds18b20,lcd显示器)附有proteus仿真图,及序列号采集程序/*上限62度 下限-20度*/#include#define uchar unsigned char#define uint unsigned intsbit ds=P11;sbit rs=P14;sbit e=P16;sbit sp=P10;sbit d1=P12;sbit d2=P13;uchar lcdro
2、m48=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;unsigned char code table0=TEMPERARTURE:U ;unsigned char code table1=0123456789ABCDEF;int f4;int tvalue;float ftvalue;uint warnl=320;u
3、int warnh=992;/*lcd程序*/void delayms(uint ms)/延时 uint i,j; for(i=ms;i0;i-) for(j=110;j0;j-);void wrcom(uchar com)/写指令 delayms(1); rs=0; P3=com; delayms(1); e=1; delayms(1); e=0;void wrdat(uchar dat)/写数据 rs=1; e=0; P3=dat; delayms(5); e=1; delayms(5); e=0;void lcdinit()/初始化lcd delayms(15); wrcom(0x38)
4、;delayms(5); wrcom(0x0c);delayms(5); wrcom(0x06);delayms(5); wrcom(0x01);delayms(5);void display(uchar *p)/显示 while(*p!=0) wrdat(*p); p+; delayms(1); displayinit()/初始化显示 lcdinit(); wrcom(0x80); display(table0);/*ds18b20程序*/void dsrst()/ds18b20复位 uint i; ds=0; i=103; while(i0)i-; ds=1; i=4; while(i0)
5、i-;bit dsrd0()/读一位数据 uint i; bit dat; ds=0;i+; ds=1;i+;i+; dat=ds; i=8;while(i0)i-; return(dat);uchar dsrd()/读1个字节数据 uchar i,j,dat; dat=0; for(i=8;i0;i-) j=dsrd0(); dat=(j1); return(dat);void dswr(uchar dat)/写数据 uint i; uchar j; bit testb; for(j=8;j0;j-) testb=dat&0x01; dat=dat1; if(testb) ds=0; i+;
6、i+; ds=1; i=8;while(i0)i-; else ds=0; i=8;while(i0)i-; ds=1; i+;i+; void tmstart()/初始化ds18b20 sp=1; d1=1; d2=1; dsrst(); delayms(1); dswr(0xcc); dswr(0x44);void read_dealtemp()/读取并处理温度 uchar i,j,t; uchar a,b; for(j=0;j4;j+) dsrst(); delayms(1); dswr(0x55); for(i=0;i8;i+) dswr(lcdromji);/发送64位序列号 dsw
7、r(0xbe); a=dsrd(); b=dsrd(); tvalue=b; tvalue=8; tvalue=tvalue|a; 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(0x8
8、e); wrdat(5); ftvalue=tvalue*0.0625; tvalue=ftvalue*10+0.5; ftvalue=ftvalue+0.05; fj=tvalue;/温度扩大十倍,精确到一位小数 tvalue=fj; t=tvalue/1000; wrcom(0x80+0x41); wrdat(table1t);/显示百位 t=tvalue%1000/100; wrdat(table1t);/显示十位 t=tvalue%100/10; wrdat(table1t);/显示个位 wrdat(0x2e); /显示小数点儿 t=tvalue%10/1; wrdat(table1t
9、);/显示小数位 delayms(5000); /*主函数*/void main() d1=1; d2=1; sp=1; displayinit();/初始化显示 while(1) tmstart();/初始化 read_dealtemp();/读取温度 /*序列号读取程序*/#include #define uchar unsigned char#define uint unsigned intsbit DQ = P11; /温度传感器信号线sbit rs = P14; /LCD数据/命令选择端(H/L)位声明sbit lcden = P16; /LCD使能信号端位声明void delay(
10、uint z); /延时函数void DS18B20_Reset(void); /DQ18B20复位,初始化函数bit DS18B20_Readbit(void); /读1位数据函数uchar DS18B20_ReadByte(void); /读1个字节数据函数void DS18B20_WriteByte(uchar dat); /向DQ18B20写一个字节数据函数void LCD_WriteCom(uchar com); /1602液晶命令写入函数void LCD_WriteData(uchar dat); /1602液晶数据写入函数void LCD_Init(); /LCD初始化函数voi
11、d Display18B20Rom(char Rom); /显示18B20序列号函数/*/* 主函数 */*/void main() uchar a,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_Read
12、Byte(); 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);/*/* 延时函数:void delay() */* 功能:延时函数 */*/void delay(uint z)/延时函数 uint x,y; for( x = z; x 0
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1