收藏 分销(赏)

ds18b20多路温度采集程序.doc

上传人:人****来 文档编号:4543596 上传时间:2024-09-27 格式:DOC 页数:23 大小:86.50KB
下载 相关 举报
ds18b20多路温度采集程序.doc_第1页
第1页 / 共23页
ds18b20多路温度采集程序.doc_第2页
第2页 / 共23页
点击查看更多>>
资源描述
本程序为ds18b20得多路温度采集程序,就是我自己参考其她程序后改写而成,可显示4路正负温度值,并有上下限温度报警(声音、灯光报警)。 亲测,更改端口即可使用。(主要器件:51单片机,ds18b20,lcd显示器) 附有proteus仿真图,及序列号采集程序 /****上限62度 下限20度****/ #include<reg51、h> #define uchar unsigned char #define uint unsigned int sbit ds=P1^1; sbit rs=P1^4; sbit e=P1^6; sbit sp=P1^0; sbit d1=P1^2; sbit d2=P1^3; uchar lcdrom[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}}; unsigned char code table0[]={"TEMPERARTURE:U "}; unsigned char code table1[]={"0123456789ABCDEF"}; int f[4]; int tvalue; float ftvalue; uint warnl=320; uint warnh=992; /****lcd程序****/ void delayms(uint ms)//延时 { uint i,j; for(i=ms;i>0;i) for(j=110;j>0;j); } void wr(uchar )//写指令 { delayms(1); rs=0; P3=; 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); wr(0x38);delayms(5); wr(0x0c);delayms(5); wr(0x06);delayms(5); wr(0x01);delayms(5); } void display(uchar *p)//显示 { while(*p!='\0') { wrdat(*p); p++; delayms(1); } } displayinit//初始化显示 { lcdinit; wr(0x80); display(table0); } /****ds18b20程序****/ void dsrst//ds18b20复位 { uint i; ds=0; i=103; while(i>0)i; ds=1; i=4; while(i>0)i; } bit dsrd0//读一位数据 { uint i; bit dat; ds=0;i++; ds=1;i++;i++; dat=ds; i=8;while(i>0)i; return(dat); } uchar dsrd//读1个字节数据 { uchar i,j,dat; dat=0; for(i=8;i>0;i) { j=dsrd0; dat=(j<<7)|(dat>>1); } return(dat); } void dswr(uchar dat)//写数据 { uint i; uchar j; bit testb; for(j=8;j>0;j) { testb=dat&0x01; dat=dat>>1; if(testb) { ds=0; i++;i++; ds=1; i=8;while(i>0)i; } else { ds=0; i=8;while(i>0)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;j<4;j++) { dsrst; delayms(1); dswr(0x55); for(i=0;i<8;i++) { dswr(lcdrom[j][i]);//发送64位序列号 } dswr(0xbe); a=dsrd; b=dsrd; tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0) { d1=1; tvalue=~tvalue+1; wr(0xc0); wrdat(0x2d); if(tvalue>warnl) { d2=0; sp=0; } else { d2=1; sp=1; } } else { d2=1; wr(0xc0); wrdat(' '); if(tvalue>warnh) { d1=0; sp=0; } else { d1=1; sp=1; } } if(j==0) { wr(0x8e); wrdat('2'); } if(j==1) { wr(0x8e); wrdat('3'); } if(j==2) { wr(0x8e); wrdat('4'); } if(j==3) { wr(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; wr(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); } } /****主函数****/ void main { d1=1; d2=1; sp=1; displayinit;//初始化显示 while(1) { tmstart;//初始化 read_dealtemp;//读取温度 } } /****序列号读取程序****/ #include <reg52、h> #define uchar unsigned char #define uint unsigned int sbit DQ = P1^1; //温度传感器信号线 sbit rs = P1^4; //LCD数据/命令选择端(H/L)位声明 sbit lcden = P1^6; //LCD使能信号端位声明 void delay(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_Write(uchar ); //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 = DS18B20_ReadByte; g = DS18B20_ReadByte; h = DS18B20_ReadByte; LCD_Write(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; x ) for( y = 110; y > 0; y ); } /***************************************************/ /* DS18B20函数:void DS18B20_Reset */ /* 功能:复位18B20 */ /***************************************************/ void DS18B20_Reset(void)//DQ18B20复位,初始化函数 { uint 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; 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 << 7 ) | ( dat >> 1 ); } return(dat); } /***************************************************/ /* DS18B20函数:void DS18B20_WriteByte */ /* 功能:向DQ18B20写一个字节数据函数 */ /***************************************************/ void DS18B20_WriteByte(uchar dat) //向DQ18B20写一个字节数据函数 { uint i; uchar j; bit testb; for( j=1; j<=8; j++) { testb = dat&0x01; dat= dat>>1; if(testb) //写1 { DQ = 0; i++;i++; DQ = 1; i = 8;while(i>0)i; } else { DQ = 0; //写0 i = 8;while(i>0)i; DQ = 1; i++;i++; } } } /***********************************************/ /* LCD函数:void LCD_Write */ /* 功能:向LCD写入命令 */ /***********************************************/ void LCD_Write(uchar ) { rs = 0; P3= ; delay(5); lcden = 0; delay(5); lcden = 1; delay(5); lcden = 0; } /***********************************************/ /* LCD函数:void LCD_WriteData(uchar dat) */ /* 功能:向LCD写入数据 */ /***********************************************/ void LCD_WriteData(uchar dat) { rs = 1; //选择LCD为写入数据状态 lcden = 0; P3= dat; //将待写入数据放到总线上 delay(5); lcden = 1; //给LCD使能端一个脉冲 delay(5); //信号将之前放到总线上 lcden = 0; //得数据写入LCD delay(5); } /***********************************************/ /* LCD函数:void LCD_Init */ /* 功能:初始化LCD,设定LCD得初始状态 */ /***********************************************/ void LCD_Init { LCD_Write(0x38); //LCD显示模式设定 delay(15); LCD_Write(0x08); //关闭LCD显示 delay(3); LCD_Write(0x01); //LCD显示清屏 delay(3); LCD_Write(0x06); //设定光标地址指针为自动加1 delay(3); LCD_Write(0x0c); //打开LCD显示,但不显示光标 } /**********************************************/ /* */ /* 显示18B20序列号 */ /* */ /**********************************************/ void Display18B20Rom(char Rom) { uchar h,l; l = Rom & 0x0f; //取低4位 h = Rom & 0xf0; //取高4位 h >>= 4; if( ( h >= 0x00 )&&( h <= 0x09 ) ) LCD_WriteData(h+0x30); //取ASCII码 else LCD_WriteData(h+0x37); //取ASCII码 if( ( l >= 0x00 )&&( l <= 0x09 ) ) LCD_WriteData(l+0x30); //取ASCII码 else LCD_WriteData(l+0x37); //取ASCII码 }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服