1、本程序为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 lcdrom48=0x28,0x30,0
2、xc5,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;uint warnh=992;/
3、*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()/初始化lcddelayms(15);wrcom(0x38);delayms(5);wrcom(0x0c);delayms(5)
4、;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)i-;bit dsrd0()/读一位数据uint i;bit dat;ds=0;i+;ds=1;i+;i
5、+;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+;i+;ds=1;i=8;while(i0)i-;elseds=0;i=8;while(i0)i-;ds=1;i+;i+;void tmstart()
6、/初始化ds18b20sp=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位序列号dswr(0xbe);a=dsrd();b=dsrd();tvalue=b;tvalue=8;tvalue=tvalue|a;if(tvaluewarnl)d2=0;sp=0;elsed2=1;sp=1
7、;elsed2=1;wrcom(0xc0);wrdat( );if(tvaluewarnh)d1=0;sp=0;elsed1=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;fj=tvalue;/温度扩大十倍,精确到一位小数tvalue=fj;t=tvalue/1000;w
8、rcom(0x80+0x41);wrdat(table1t);/显示百位 t=tvalue%1000/100;wrdat(table1t);/显示十位t=tvalue%100/10;wrdat(table1t);/显示个位wrdat(0x2e); /显示小数点儿t=tvalue%10/1;wrdat(table1t);/显示小数位 delayms(5000);/*主函数*/void main() d1=1;d2=1;sp=1;displayinit();/初始化显示 while(1) tmstart();/初始化 read_dealtemp();/读取温度 /*序列号读取程序*/#includ
9、e #define uchar unsigned char#define uint unsigned intsbit DQ = P11; /温度传感器信号线sbit rs = P14; /LCD数据/命令选择端(H/L)位声明sbit lcden = P16; /LCD使能信号端位声明void delay(uint z); /延时函数void DS18B20_Reset(void); /DQ18B20复位,初始化函数bit DS18B20_Readbit(void); /读1位数据函数uchar DS18B20_ReadByte(void); /读1个字节数据函数void DS18B20_Wr
10、iteByte(uchar dat); /向DQ18B20写一个字节数据函数void LCD_WriteCom(uchar com); /1602液晶命令写入函数void LCD_WriteData(uchar dat); /1602液晶数据写入函数void LCD_Init(); /LCD初始化函数void 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 = DS18B
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1