用dht11和1602组合的报警器的程序
各位大神看下以下的功能与程序,本人试了下,发现程序不能用,但不知道怎么改,希望各位大神能帮帮忙,非常感谢,毕设急需,可以有报酬,谢谢了!
阈值设置分为两个模块,分别是湿度最高值设置模式、温度最高值设置模式。例如湿度最高值设置,按一次K6湿度最高值加一,按一次K7湿度最高值减一,1602液晶显示将实时显示出设置值。其他值设置类似。
利用发光二极管的点亮来实现报警,当单片机P1.5、P1.6引脚输出一个低电平时发光二极管亮,实现报警。为实现温湿度阈值的连续性。考虑了温湿度阈值的存储,在掉电后,下一次使用时能回到原来设定的阈值。24C02的时钟线SCL与单片机的P1.0相连,数据线SDA与单片机的P1.1相连。
A1.1主程序
//实现功能,设定温度上限和湿度上限,超过上限值时报警。报警现象,对应二极管亮,蜂鸣器响//
#include <reg51.h>
#include"1602.h"
#include"dht.h"
#include"2402.h" //定义变量
sbitLed_qushi=P1^6; //潮湿报警灯
sbitLed_jiangwen=P1^5; //超温报警灯
sbit Key_TH1 =P1^2; //温度最高值设置按键
sbit Key_TH2 =P3^3; //温度最高值设置按键
sbit Key_HH1 =P3^4; //湿度最高值设置按键
sbit Key_HH2 =P3^5; //湿度最高值设置按键
sbit beep=P2^0; //蜂鸣器
volatile bitFlagStartRH = 0; //开始温湿度转换标志
volatile bitFlagKeyPress = 0; //有键按下
extern U8 U8FLAG,k; //定义温湿度传感器用外部变量
extern U8 U8count,U8temp;
extern U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,
U8checkdata;
extern U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,
U8RH_data_L_temp,U8checkdata_temp;
extern U8 U8comdata;
extern U8 count, count_r;
U16 temp;
S16 temperature,humidity;
S16 idata TH,HH; //温度上限和湿度上限
char * pSave;
U8 keyvalue,keyTH1, keyTH2, keyHH1, keyHH2;
U16 RHCounter;
void Data_Init() //数据初始化
{ RHCounter = 0; keyvalue = 0;
Led_qushi = 1; Led_jiangwen = 1;
TH = 40; HH = 85;
keyTH1 = 1; keyTH2 = 1;
keyHH1 = 1; keyHH2 = 1;
beep=1; }
void Timer0_Init() //定时器0初始化
{ ET0 = 1; //允许定时器0中断
TMOD = 1; //定时器工作方式选择
TL0 = 0x06; //定时器赋予低位初值
TH0 = 0xf8; //定时器赋予高位初值
TR0 = 1; } //启动定时器
void Timer0_ISR(void) interrupt 1 using 0 //定时器0中断
{ TL0 = 0x06; //定时器赋予低位初值
TH0 = 0xf8; //定时器赋予高位初值
RHCounter ++; //每2秒钟启动一次温湿度转换
if (RHCounter >= 1000)
{ FlagStartRH = 1;
RHCounter = 0; }
}
voidSave_Setting() //存入设定值、
{ pSave = (char *)&TH; //地址低位对应低8位,高位对应高8位
wrteeprom(0, *pSave); //存温度上限值TH低8位
DELAY(500); //延时
pSave ++;
wrteeprom(1, *pSave); //存温度上限值TH高8位
DELAY(500);
pSave = (char *)&HH;
wrteeprom(2, *pSave); //存湿度上限值RH低8位
DELAY(500);
pSave ++;
wrteeprom(3, *pSave); //存湿度上限值RH高8位
DELAY(500); }
voidLoad_Setting() //载入设定值、
{ pSave = (char *)&TH;
*pSave++ = rdeeprom(0);
*pSave = rdeeprom(1);
pSave = (char *)&HH;
*pSave++ = rdeeprom(2);
*pSave = rdeeprom(3);
if ((TH>99)||(TH<0)) TH = 40;
if ((HH>99)||(HH<0)) HH = 85; }
voidKeyProcess(uint num)
{ switch (num)
{ case 1:
if (TH<99) TH++;
L1602_char(1, 15, TH/10+48);
L1602_char(1, 16, TH%10+48);
break;
case 2:
if (TH>1) TH--;
L1602_char(1, 15, TH/10+48);
L1602_char(1, 16, TH%10+48);
break;
case 3:
if (HH<99) HH++;
L1602_char(2, 15, HH/10+48);
L1602_char(2, 16, HH%10+48);
break;
case 4:
if (HH>1) HH--;
L1602_char(2, 15, HH/10+48);
L1602_char(2, 16, HH%10+48);
break;
default:
break; }
Save_Setting();
}
/*********主函数**********/
void main()
{ U16 i, j, testnum;
EA = 0;
Timer0_Init(); //定时器0初始化
Data_Init();
EA = 1;
L1602_init();
L1602_string(1,1," Welcome toT&H ");
L1602_string(2,1," ControlSystem! ");
for (i=0;i<1000;i++) //延时
for (j=0;j<1000;j++) {;}
L1602_string(1,1," "); //清屏
L1602_string(2,1," ");
L1602_string(1,1,"Tem: C TH:");
L1602_string(2,1,"Hum: % HH:");
Load_Setting(); //载入温度上限和湿度上限设定值
L1602_char(1, 15, TH/10+48);
L1602_char(1, 16, TH%10+48);
L1602_char(2, 15, HH/10+48);
L1602_char(2, 16, HH%10+48);
while(1)
{ if (FlagStartRH == 1) //温湿度转换标志检查
{ TR0= 0;
testnum = RH();
FlagStartRH= 0;
TR0 = 1;
humidity = U8RH_data_H; //读出温湿度,只取整数部分
temperature = U8T_data_H;
L1602_int(1,5,temperature); //显示温湿度
L1602_int(2,5,humidity); }
//温湿度控制
if (temperature > TH) //判断超温
{ Led_jiangwen= 0; //二极管亮,超温报警
beep=0; //蜂鸣器响,超温报警
DELAY(500); } //延时
else
{ Led_jiangwen = 1;
beep=1;
DELAY(500); }
if (humidity > HH) //判断潮湿
{ Led_qushi = 0; //二极管亮,超湿报警
beep=0; //蜂鸣器响,超温报警
DELAY(500); }
else
{ Led_qushi= 1;
beep=1;
DELAY(500); }
//键盘查询,在弹起时响应
if((Key_TH1)&&(keyTH1==0)) {FlagKeyPress = 1; keyvalue = 1;}
else if((Key_TH2)&&(keyTH2==0)){FlagKeyPress=1;keyvalue= 2;}
else if((Key_HH1)&&(keyHH1==0)){FlagKeyPress=1;keyvalue=3;}
else if((Key_HH2)&&(keyHH2==0)){FlagKeyPress=1;keyvalue=4;}
if (FlagKeyPress == 1)
{ KeyProcess(keyvalue);
FlagKeyPress = 0; }
if (!Key_TH1) keyTH1 = 0;
else keyTH1 = 1;
if (!Key_TH2) keyTH2 = 0;
else keyTH2 = 1;
if (!Key_HH1) keyHH1 = 0;
else keyHH1 = 1;
if (!Key_HH2) keyHH2 = 0;
else keyHH2 = 1; }
}
A1.2 24C02程序#include"2402.h"
voidDELAY(unsigned int t)
{ while(t!=0)
t--; }
voidIICStart(void)
{ SCL=0; DELAY(1);
SDA=1; SCL=1; DELAY(1);
SDA=0; DELAY(1); SCL=0; }
void IICStop(void)
{ SDA=0;SCL=1; DELAY(1);
SDA=1; DELAY(1); SCL=0; }
void SEND0(void)
{ SDA=0; SCL=1;
DELAY(1);
SCL=0; }
void SEND1(void)
{ SDA=1; DELAY(1);
SCL=1; DELAY(1);
SCL=0; }
bitCheck_Ack(void)
{ unsigned char errtime=250;
DELAY(1); SCL=1;
DELAY(1); CY=SDA;
while(CY)
{ errtime--; CY=SDA;
if(!errtime)
{ IICStop(); return 1; }
}
DELAY(1); SCL=0; return 0;
}
voidWrite_byte(unsigned char dat)
{ unsigned char i;
for(i=0;i<8;i++)
{ if((dat<<i)&0x80)
SEND1();
else
SEND0(); }
}
unsigned charRead_byte(void)
{ unsigned char i,temp=0;
for(i=0;i<8;i++)
{ SDA=1; SCL=1;
DELAY(1);
if(SDA==1)
{ temp=temp<<1;
temp=temp|0x01; }
else
temp=temp<<1;
SCL=0; }
returntemp; }
unsigned charrdeeprom(unsigned char addr)
{ unsigned char temp=0;
bit flag=0;
IICStart();
Write_byte(0xa0);
Check_Ack();
Write_byte(addr);
Check_Ack();
IICStart();
Write_byte(0xa1);
Check_Ack();
temp=Read_byte();
SEND1();
IICStop();
return temp; }
voidwrteeprom(unsigned char addr,unsigned char dat)
{ IICStart();
Write_byte(0xa0);
Check_Ack();
Write_byte(addr);
Check_Ack();
Write_byte(dat);
Check_Ack();
IICStop(); }
#ifndef _2402_H_
#define _2402_H_
#include<reg52.h>
sbit SCL = P1^0; //模拟I2C 总线的引脚定义
sbit SDA = P1^1; //定义2402在I2C总线协议中从机地址
voidDELAY(unsigned int t); //延时函数
voidIICStart(void); //I2C开始函数
voidIICStop(void); //I2C结束函数
voidAck(void); //I2C应答函数
voidNOAck(void); //I2C应答非函数
bitCheck_Ack(void); //I2C应答检测函数
voidSEND0(void); //I2C发送0函数
voidSEND1(void); //I2C发送1函数
void Write_byte(unsignedchar dat); //I2C发送字节函数
unsigned charRead_byte(void); //I2C读取字节函数
unsigned charrdeeprom(unsigned char addr); //读AT2402函数
voidwrteeprom(unsigned char addr,unsigned char dat); //写AT2402函数
#endif //_2402_H_
A1.3 DHT11传感器程序#include"dht.h"
U8 U8FLAG,k;
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
U8 count, count_r=0;
void Delay1(U16 j)
{ U8 i;
for(;j>0;j--)
{ for(i=0;i<27;i++); }
}
void Delay_10us(void)
{ U8 i;
i--; i--;
i--; i--;
i--; i--; }
void COM(void)
{ U8 i;
for(i=0;i<8;i++)
{ U8FLAG=2;
while((!DATA)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(DATA)U8temp=1;
U8FLAG=2;
while((DATA)&&U8FLAG++); //超时则跳出for循环
if(U8FLAG==1)break; //判断数据位是0还是1.如果高电平高过预定0高电平值则数据位为 1
U8comdata<<=1;
U8comdata|=U8temp; } //0
}
//温湿度读取子程序 -以下变量均为全局变量
//温度高8位== U8T_data_H-温度低8位== U8T_data_L
//湿度高8位== U8RH_data_H-湿度低8位== U8RH_data_L
//校验 8位 == U8checkdata-调用相关子程序如下
U8 RH(void)
{ DATA=0; //主机拉低18ms
Delay1(180); //原来为5
DATA=1;
Delay_10us(); //总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
DATA=1; //主机设为输入 判断从机响应信号
//判断从机是否有低电平响应信号,不响应跳出,响应则向下运行
if(!DATA) //T !
{ U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!DATA)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出 80us 的高电平,发出则进入数据接收状态
while((DATA)&&U8FLAG++);
COM(); //数据接收状态
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
DATA=1; //数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{ U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp; }
return 1; }
else //传感器不响应
{ return 0; }
}
A1.4 1602程序/************该程序实现了对液晶1602的控制**************/
#include"1602.h"
#include"math.h"
void delay() //功能.延时,延时时间大概为140US。
{ int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++); }
ucharConvert(uchar In_Date)
{ return In_Date; }
void enable(uchardel) //1602命令函数,输入的命令值
{ P0 = Convert(del);
RS = 0; RW= 0; E = 0;
delay();
E = 1;
delay(); }
void write(uchardel) //1602写数据函数
{ P0 = Convert(del);
RS = 1; RW= 0; E = 0;
delay();
E = 1;
delay(); }
voidL1602_init(void) //1602初始化
{ enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0); }
voidL1602_char(uchar hang,uchar lie,char sign)
{ uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
write(sign); }
voidL1602_string(uchar hang,uchar lie,uchar *p)
{ uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
while(1)
{ if(*p== '\0') break;
write(*p);
p++; }
}
voidL1602_int(uchar hang, uchar lie, int num)
{ uint temp; //显示整型的温湿度数据.共占用4位.
uint gewei,shiwei,baiwei,sign;
if (num >= 0)
{ sign = 0; }
else
{ sign = 1; }
temp =abs(num);
baiwei = temp / 100;
temp = temp - baiwei*100;
shiwei = temp / 10;
gewei = temp - shiwei*10;
num = abs(num);
if (num>=100)
{ if (sign == 1) //负数
{ L1602_char(hang, lie,'-'); }
L1602_char(hang, lie+1, baiwei+48);
L1602_char(hang, lie+2, shiwei+48);
L1602_char(hang, lie+3, gewei+48); }
else if (num>=10)
{ if(sign == 1)
{ L1602_char(hang, lie+1,'-'); }
L1602_char(hang, lie+2, shiwei+48);
L1602_char(hang, lie+3, gewei+48); }
else
{ if (sign == 1)
{ L1602_char(hang, lie+2,'-'); }
L1602_char(hang, lie+3, gewei+48); }
}
#include<reg52.h>
#define ucharunsigned char
#define uint unsigned int
sbit E=P2^5; //1602使能引脚
sbit RW=P2^6; //1602读写引脚
sbit RS=P2^7; //1602数据/命令选择引脚
void delay();
ucharConvert(uchar );
void enable(uchar);
void write(uchar);
voidL1602_init(void);
voidL1602_char(uchar ,uchar ,char );
voidL1602_string(uchar ,uchar ,uchar *);
void L1602_int(uchar,uchar, int);
程序略长,,,,赞
很简单....
本来想帮你改下程序的,发现程序不是一个文件,弄了半天都没弄成一个工程。还发现少了一个头文件。就不帮你改了。小编说程序不能用,究竟问题出在哪里?是液晶不显示还是DTH11不工作,还是24C02数据保存不成功。慢慢发现问题的所在一步步去解决问题。还可以用preteus仿真一下。看看程序运行到哪里出错。
小编 有没有把问题解决了呀。我也急用啊!
同求!有的求分享~~
感谢小编!感谢小编!感谢小编!感谢小编!
1602问题应该不大,重点就是这个传感器 的时间,我以前用的时候的感觉就是这个时间很重要
厉害了
能不能用来其它的报警啊
程序略长,,,,赞
小编弄得没有,可以发一份给我看看嘛