1、ds18b20多路温度采集程序本程序为 ds18b20 的多路温度采集程序,是我自己参考其他程 序后改写而成,可显示 4 路正负温度值,并有上下限温度报警 (声 音、灯光报警) 亲测,更改端口即可使用。 (主要器件: 51 单片机, ds18b20 , lcd 显示器)附有 proteus 仿真图,及序列号采集程序/* 上限 62 度 下限 -20 度*/#include#define uchar unsigned char #define uint unsigned int sbit ds=P11;sbit rs=P14;sbit e=P16;sbit sp=P10;sbit d1=P12;
2、sbit d2=P13;uchar lcdrom48=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 ftva
3、lue;uint warnl=320;uint 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()/ 初始化 lcddelayms(15);w
4、rcom(0x38);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()/ds18b20uint i;ds=0;i=103;while(i0)i-;ds=1;i=4;while(i0)i-;b
5、it 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+;i+;ds=1; i=8;whi
6、le(i0)i-;elseds=0;i=8;while(i0)i-; ds=1;i+;i+;void tmstart()/ 初始化 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(lcdrom ji);/ 发送 64 位序列号 dswr(0xbe); a=dsrd(); b=dsrd();
7、tvalue=b; tvalue=8; tvalue=tvalue|a; if(tvaluewarnl) d2=0;sp=0; elsed2=1;sp=1;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
8、=ftvalue*10+0.5;ftvalue=ftvalue+0.05;f j=tvalue;/ 温度扩大十倍,精确到一位小数 tvalue=f j;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);/ 显示小数位 delayms(5000);/*主函数 */void main() d
9、1=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;据/ 命令选择端 (H/L) 位声明 sbit lcden = P16;端位声明/ 温度传/LCD 数/LCD 使能信号void delay(uint z);/ 延voidDS18B20_Reset(void);时函数/
10、 读 1 位数/DQ18B20 复位,初始化函数bit DS18B20_Readbit(void);/ 读 1 个据函数uchar DS18B20_ReadByte(void);字节数据函数void DS18B20_WriteByte(uchardat);/ 向DQ18B20 写一个字节数据函数void LCD_WriteCom(ucharcom);/1602液晶命令写入函数void LCD_WriteData(uchardat);/1602液晶数据写入函数voidLCD_Init();/LCD 初始化函数void Display18B20Rom(char Rom); / 显示 18B20 序
11、列号函数/*主函数*/ /*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_ReadByte();g = DS18B20_ReadByte();h = DS18B20_ReadByte
12、();LCD_WriteCom(0x80+0x40);Display18B20Rom(h);Display18B20Rom(g);Display18B20Rom(f);Display18B20Rom(e);Display18B20Rom(d);Display18B20Rom(c);Display18B20Rom(b);Display18B20Rom(a);while(1);/*/delay()函数/* 延 时 函 数 :void*/* 功 能 : 延 时*/ void delay(uint z)/ 延时函数uint x,y;for( x = z; x 0; x- )for( y = 110;
13、y 0; y- );/*/*DS18B20 函 数 :void DS18B20_Reset()*/*功能复 位 18B20*/复位,初始化函数/*/ void DS18B20_Reset(void)/DQ18B20uint i;DQ = 0;i = 103;while( i 0 ) i-;DQ = 1;i = 4;while( i 0 ) i-;/*/*DS18B20 函 数 :void DS18B20_Readbit()*/*功 能 : 读 1 个 字 节 数 据 函 数*/bit DS18B20_Readbit(void) / 读 1 位数据函数uint i;bit dat;DQ = 0;
14、i+; /i+ 起延时作用DQ = 1;i+;i+; dat = DQ;i = 8;while( i 0 )i-; return( dat );/*/* DS18B20 函 数 :void DS18B20_ReadByte() */* 功 能 : 读 1 个 字 节 数 据 函 数 */uchar DS18B20_ReadByte(void) / 读 1 个字节数据函数uchar i,j,dat;dat = 0;for( i = 1; i = 8; i+ )j = DS18B20_Readbit();dat = ( j 1 ); return(dat);/*/* DS18B20 函 数 :vo
15、id DS18B20_WriteByte()*/* 功 能: 向 DQ18B20 写 一 个字 节 数 据 函 数*/ 向 DQ18B20void DS18B20_WriteByte(uchar dat)写一个字节数据函数 uint i;uchar j;bit testb;for( j=1; j1;if(testb) / 写 1DQ = 0; i+;i+;DQ = 1;i = 8;while(i0)i-;elseDQ = 0; / 写 0i = 8;while(i0)i-;DQ = 1;i+;i+;/*LCD 函数:voidLCD_WriteCom()*/*功能:向LCD写入命令*/void
16、LCD_WriteCom(uchar com) rs = 0;P3= com;delay(5);lcden = 0;delay(5);lcden = 1;delay(5);lcden = 0;/* LCD 函 数 :void LCD_WriteData(uchar dat)*/* 功 能 : 向 LCD 写 入 数 据*/ /*/void LCD_WriteData(uchar dat)rs1;/ 选择 LCD 为写入数据状态lcden = 0;P3= dat;/ 将待写入数据放到总线上delay(5);lcden = 1;/ 给LCD 使能端一个脉冲delay(5);/ 信号将之前放到总线上
17、lcden = 0;/ 的数据写入 LCDdelay(5);/*/*LCD函数:voidLCD_Init()*/*功 能 : 初 始 化 LCD , 设 定 LCD的初始状态*/*void LCD_Init()LCD_WriteCom(0x38);模式设定delay(15);LCD_WriteCom(0x08);显示delay(3);LCD_WriteCom(0x01);清屏delay(3);LCD_WriteCom(0x06);地址指针为自动加 1delay(3);LCD_WriteCom(0x0c);显示,但不显示光标/*/*/LCD 显示/ 关闭 LCD/LCD 显示/ 设定光标/ 打开 LCD*/* 显 示 18B20 序 列 号 */*/*/void Display18B20Rom(char Rom)uchar h,l;l = Rom & 0x0f; / 取低 4 位h = Rom & 0xf0; / 取高 4 位h = 4;if( ( h = 0x00 )&( h = 0x00 )&( l = 0x09 ) )LCD_WriteData(l+0x30);/ 取 ASCII 码elseLCD_WriteData(l+0x37);/ 取 ASCII 码
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1