|
本人初學者,想請求大佬能幫幫我,解決一下問題。目前整個仿真已經實現煙霧、溫度檢測,聲光報警,報警閾值設定,實時溫度、煙霧顯示。我正在編寫解除報警的代碼,主要功能是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屏上。
|
|