|
本人初学者,想请求大佬能帮帮我,解决一下问题。目前整个仿真已经实现烟雾、温度检测,声光报警,报警阈值设定,实时温度、烟雾显示。我正在编写解除报警的代码,主要功能是10s内,若有人按下报警解除按键,那么声光报警解除;若10s内没有按下解除报警按键,单片机自动实现关门停机功能。红色部分为我写的报警解除代码
#include <reg52.h>
#include <string.h>
#include <stdio.h>
#include "intrins.h"
#include "delay.h"
#include "LCD1602.h"
#include "ADC0832.h"
#include "DS18B20.h"
#include "key.h"
//#include "alarm_flag.h"
#include "motor.h"
#define uchar unsigned char
#define uint unsigned int
uchar pre_T = 50; //温度报警阈值
uchar pre_Smoke = 100; //烟雾报警阈值
uint T; //温度值全局变量
uchar Smoke; //用于读取ADC数据
uchar flag; //用于判断是否报警解除
//运行模式
uchar Mode = 0; //=1:设置温度阈值 =2:设置烟雾阈值 =0:正常监控模式
//管脚声明
sbit Led_RED = P2^0; //红灯引脚设置
sbit Led_YELLOW = P2^1; //黄灯引脚设置
sbit Buzzer = P2^2; //蜂鸣器引脚设置
sbit Fan = P3^3;
void main(void)
{
uchar key,i,j;
uchar flag;
T = correct_T(); //初始化时调用温度读取函数 防止开机85°C
LCDInit(); //调用初始化显示函数
LCDWriteStr(0,0,"SET T:00 E:000");//开机界面
LCDWriteStr(1,0,"NOW T:00.0 E:000");
delay_ms(1000);
T = correct_T();
while(1)
{
key = Key_Scan(); //按键扫描
Smoke = ADC0832(0); //读取烟雾值
T = correct_T(); //读取温度值
if(key == KEY_SET) //按键按下一次,则模式加1
{
Mode++;//改变模式值
}
switch(Mode)
{
case 0://正常监控模式
{
LCD_Display(pre_T,pre_Smoke,T,Smoke);//显示预设温度,预设烟雾,温度值,烟雾值
if(Smoke >= pre_Smoke) //烟雾值大于等于预设值时
{
Led_RED = 0; //烟雾报警灯亮
// Fan = 0;
Buzzer = 0; //蜂鸣器报警
for(i=0;i<5000;i++) //延时十秒
{
for(j=0;j<110;j++);
{
if(key == KEY_SOLVE) //报警解除键按下
{
flag = 0; //解除循环标志
Led_RED = 1; // 解除声光报警
Buzzer = 1; //蜂鸣器关闭
break; //跳出内层循环
}
else
flag = 1;
}
if(flag == 0) //报警解除键按下,跳出外层循环
break; //跳出循环
else if((flag == 1) && (i == 4999))
Move_positive(50);
}
}
else //烟雾值小于预设值时
{
Led_RED = 1; //烟雾报警灯灭
// Fan = 1;
}
if(T >= (pre_T*10))
//温度大于等于预设温度值时
//(为什么是大于预设值*10:因为我们要显示的温度是有小数点后一位,
//是一个3位数,25.9°C时实际读的数是259,所以判断预设值时将预设值*10)
{
Buzzer = 0; //蜂鸣器报警
Led_YELLOW = 0; //温度报警灯亮
for(i=0;i<5000;i++) //延时十秒
{
for(j=0;j<110;j++);
{
if(key == KEY_SOLVE) //报警解除键按下
{
flag = 0; //解除循环标志
Led_RED = 1; // 解除声光报警
Buzzer = 1; //蜂鸣器关闭
break; //跳出内层循环
}
else
flag = 1;
}
if(flag == 0) //报警解除键按下,跳出外层循环
break;//跳出循环
else if((flag == 1) && (i == 4999))
Move_positive(50);
}
}
else //温度值小于预设值时
{
Led_YELLOW = 1; //温度报警灯灭
}
if((Smoke < pre_Smoke) && (T < (pre_T*10)))
{
Buzzer = 1;
}
break;
}
case 1://预设温度模式
{
LCDSetPosition(0,5); //指定位置
LCDWriteCmd(0x0d); //阴影闪烁LCD_DIS_ON_SHADE_ON
if(key == KEY_ADD)//加按键按下
{
pre_T++;
if(pre_T >= 99)//当阀值加到大于等于99时
pre_T = 99;//阀值固定为99
LCD_Write_Char(0,6,pre_T,2);//显示预设温度
}
if(key == KEY_MINUS)//减键按下
{
if(pre_T <= 1) //当温度上限值减小到1时
pre_T = 1; //固定为1
pre_T--; //预设温度值减一,最小为0
LCD_Write_Char(0,6,pre_T,2); //显示预设温度
}
break;//执行后跳出switch
}
case 2:
{
LCDSetPosition(0,12); //指定位置
LCDWriteCmd(0x0d); //显示开,光标关,光标不闪烁LCD_DIS_ON_SHADE_ON
if(key == KEY_ADD) //加键按下
{
if(pre_Smoke >= 255)
pre_Smoke = 254;//阀值固定为254
pre_Smoke++; //预设烟雾值(阀值)加1,最大为255
LCD_Write_Char(0,13,pre_Smoke,3);
}
if(key == KEY_MINUS)//减键按下
{
if(pre_Smoke <= 1)//当温度上限值减小到1时
pre_Smoke = 1;//固定为1
pre_Smoke--;//预设温度值减一,最小为0
LCD_Write_Char(0,13,pre_Smoke,3);////显示预设温度
}
break;//执行后跳出switch
}
default:
{
LCDWriteCmd(0x38);//屏幕初始化LCD_MODE_PIN8
LCDWriteCmd(0x0c);//打开显示 无光标 无光标闪烁LCD_DIS_ON
Mode = 0;
break;
}
}
}
}
红框部分是我自己在基本功能上添加的解除报警代码。有大佬帮忙看看吗?谢谢了,在proteus中仿真,按下报警解除键没用,而且实时烟雾温度测量会出现延时,甚至改变环境烟雾温度,不能正确反应在lcd屏上。
|
|