| 把报警值设为26度以上温度报警器就一直响(环境温度未超过),其余时候正常,求大神指点。。 #include <reg52.h> #include <stdio.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; sbit ds=P2^2; //温度传感器信号线 sbit beep=P2^3; //蜂鸣器 sbit lcden=P3^4;//液晶使能端 sbit lcdrs=P3^5;//液晶数据命令选择端 sbit RW=P3^6; //读写选择端 uint temp; //定义整型温度数据 uchar num; uint a1,a2,a3; float f_temp; //定义浮点型温度数据 uchar warn; //定义温度报警值 sbit s1=P3^0; //进入报警温度设置键 sbit s2=P3^1; //温度增加1 sbit s3=P3^2; //温度减少1 sbit s4=P3^3; //保存并退出 uchar code table1[]="The Warn: "; uchar code table2[]="The Temp: "; uchar code table3[]="0123456789"; void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } //1602模块 void write_com(uchar com) //写命令函数 { lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_data(uchar date) //写数据函数 { lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void init0() //初始化函数 { lcden=0; RW=0; dula=0; wela=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } void init1() //液晶屏显示初始 { warn=26; a1=warn/10; a2=warn%10; write_com(0x80); for(num=0;num<16;num++) { write_data(table1[num]); delay(5); } write_com(0x80+11); write_data(table3[a1]); write_data(table3[a2]); write_com(0x80+40); for(num=0;num<16;num++) { write_data(table2[num]); delay(5); } } //以上为1602液晶显示模块 //DS18b20模块 void dsreset(void) //DS18b20复位初始化函数 { uint i1; ds=0; i1=103; while(i1>0)i1--; ds=1; i1=4; while(i1>0)i1--; } bit tempreadbit(void) //读一位数据函数 { uint i2; bit dat; ds=0;i2++; ds=1;i2++;i2++; dat=ds; i2=8;while(i2>0)i2--; return (dat); } uchar tempread(void) //读一个字节数据函数 { uchar i3,j,dat; dat=0; for(i3=1;i3<=8;i3++) { j=tempreadbit(); dat=(j<<7)|(dat>>1); } return(dat); } void tempwritebyte(uchar dat) //向DS18b20写一个字节数据函数 { uint i4; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) { ds=0; i4++;i4++; ds=1; i4=8; while(i4>0) i4--; } else { ds=0; i4=8; while(i4>0) i4--; ds=1; i4++; i4++; } } } void tempchange(void) //DS18b20开始获取温度并转换 { dsreset(); delay(1); tempwritebyte(0xcc); tempwritebyte(0x44); } uint get_temp() //读取寄存器中存储的温度数据 { uchar a,b; dsreset(); delay(10); tempwritebyte(0xcc); tempwritebyte(0xbe); a=tempread(); //读第八位 b=tempread(); //读高八位 temp=b; temp<<=8; //组合两个字节 temp=temp|a; f_temp=temp*0.0625; //温度在寄存器为12位,分辨率0.0625 temp=f_temp*10+0.5; //乘10表示小数点后取一位并四舍五入 return temp; } void dis_temp(uint t1) //显示温度数值 { uint i; i=t1/100; write_com(0xc0+11); write_data(table3); i=t1%100/10; write_com(0xc0+12); write_data(table3); i=t1%100%10; write_com(0xc0+13); write_data(0x2e); write_com(0xc0+14); write_data(table3); } //以上为ds18b20模块 //键盘模块 void keyscan() { if(s1==0) { delay(5); if(s1==0) { write_com(0x80+11); write_com(0x0f); while(!s1); } } if(s2==0) { delay(5); if(s2==0) { warn++; a1=warn/10; a2=warn%10; write_com(0x80+11); write_com(0x0f); write_data(table3[a1]); write_data(table3[a2]); while(!s2); } } if(s3==0) { delay(5); if(s3==0) { warn--; a1=warn/10; a2=warn%10; write_com(0x80+11); write_com(0x0f); write_data(table3[a1]); write_data(table3[a2]); while(!s3); } } if(s4==0) { delay(5); if(s4==0) { write_com(0x38); write_com(0x0c); write_com(0x06); while(!s4); } } } //以上为键盘模块 void deal(uint t2) //温度处理和报警函数 { if(t2>warn) { beep=0; delay(10); } else { beep=1; delay(10); } } //主函数 void main() { uchar i5; init0(); init1(); while(1) { keyscan(); delay(10); a3=warn; warn=a3*10; delay(10); tempchange(); delay(5); for(i5=10;i5>0;i5--) { dis_temp(get_temp()); } delay(5); deal(temp); warn=a3; } } |
| 欢迎光临 迅维网 (https://www.chinafix.com/) | Powered by Discuz! X3.4 |