- 积分
- 3553
- 下载分
- 分
- 威望
- 点
- 原创币
- 点
- 下载
- 次
- 上传
- 次
- 注册时间
- 2014-11-13
- 精华
|
马上注册,获取阅读精华内容及下载权限
您需要 登录 才可以下载或查看,没有帐号?注册
x
把报警值设为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;
}
}
|
|
|