|
本人初學(xué)者,想請求大佬能幫幫我,解決一下問題。目前整個仿真已經(jīng)實現(xiàn)煙霧、溫度檢測,聲光報警,報警閾值設(shè)定,實時溫度、煙霧顯示。我正在編寫解除報警的代碼,主要功能是10s內(nèi),若有人按下報警解除按鍵,那么聲光報警解除;若10s內(nèi)沒有按下解除報警按鍵,單片機(jī)自動實現(xiàn)關(guān)門停機(jī)功能。紅色部分為我寫的報警解除代碼
#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數(shù)據(jù)
uchar flag; //用于判斷是否報警解除
//運(yùn)行模式
uchar Mode = 0; //=1:設(shè)置溫度閾值 =2:設(shè)置煙霧閾值 =0:正常監(jiān)控模式
//管腳聲明
sbit Led_RED = P2^0; //紅燈引腳設(shè)置
sbit Led_YELLOW = P2^1; //黃燈引腳設(shè)置
sbit Buzzer = P2^2; //蜂鳴器引腳設(shè)置
sbit Fan = P3^3;
void main(void)
{
uchar key,i,j;
uchar flag;
T = correct_T(); //初始化時調(diào)用溫度讀取函數(shù) 防止開機(jī)85°C
LCDInit(); //調(diào)用初始化顯示函數(shù)
LCDWriteStr(0,0,"SET T:00 E:000");//開機(jī)界面
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://正常監(jiān)控模式
{
LCD_Display(pre_T,pre_Smoke,T,Smoke);//顯示預(yù)設(shè)溫度,預(yù)設(shè)煙霧,溫度值,煙霧值
if(Smoke >= pre_Smoke) //煙霧值大于等于預(yù)設(shè)值時
{
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; //解除循環(huán)標(biāo)志
Led_RED = 1; // 解除聲光報警
Buzzer = 1; //蜂鳴器關(guān)閉
break; //跳出內(nèi)層循環(huán)
}
else
flag = 1;
}
if(flag == 0) //報警解除鍵按下,跳出外層循環(huán)
break; //跳出循環(huán)
else if((flag == 1) && (i == 4999))
Move_positive(50);
}
}
else //煙霧值小于預(yù)設(shè)值時
{
Led_RED = 1; //煙霧報警燈滅
// Fan = 1;
}
if(T >= (pre_T*10))
//溫度大于等于預(yù)設(shè)溫度值時
//(為什么是大于預(yù)設(shè)值*10:因為我們要顯示的溫度是有小數(shù)點后一位,
//是一個3位數(shù),25.9°C時實際讀的數(shù)是259,所以判斷預(yù)設(shè)值時將預(yù)設(shè)值*10)
{
Buzzer = 0; //蜂鳴器報警
Led_YELLOW = 0; //溫度報警燈亮
for(i=0;i<5000;i++) //延時十秒
{
for(j=0;j<110;j++);
{
if(key == KEY_SOLVE) //報警解除鍵按下
{
flag = 0; //解除循環(huán)標(biāo)志
Led_RED = 1; // 解除聲光報警
Buzzer = 1; //蜂鳴器關(guān)閉
break; //跳出內(nèi)層循環(huán)
}
else
flag = 1;
}
if(flag == 0) //報警解除鍵按下,跳出外層循環(huán)
break;//跳出循環(huán)
else if((flag == 1) && (i == 4999))
Move_positive(50);
}
}
else //溫度值小于預(yù)設(shè)值時
{
Led_YELLOW = 1; //溫度報警燈滅
}
if((Smoke < pre_Smoke) && (T < (pre_T*10)))
{
Buzzer = 1;
}
break;
}
case 1://預(yù)設(shè)溫度模式
{
LCDSetPosition(0,5); //指定位置
LCDWriteCmd(0x0d); //陰影閃爍LCD_DIS_ON_SHADE_ON
if(key == KEY_ADD)//加按鍵按下
{
pre_T++;
if(pre_T >= 99)//當(dāng)閥值加到大于等于99時
pre_T = 99;//閥值固定為99
LCD_Write_Char(0,6,pre_T,2);//顯示預(yù)設(shè)溫度
}
if(key == KEY_MINUS)//減鍵按下
{
if(pre_T <= 1) //當(dāng)溫度上限值減小到1時
pre_T = 1; //固定為1
pre_T--; //預(yù)設(shè)溫度值減一,最小為0
LCD_Write_Char(0,6,pre_T,2); //顯示預(yù)設(shè)溫度
}
break;//執(zhí)行后跳出switch
}
case 2:
{
LCDSetPosition(0,12); //指定位置
LCDWriteCmd(0x0d); //顯示開,光標(biāo)關(guān),光標(biāo)不閃爍LCD_DIS_ON_SHADE_ON
if(key == KEY_ADD) //加鍵按下
{
if(pre_Smoke >= 255)
pre_Smoke = 254;//閥值固定為254
pre_Smoke++; //預(yù)設(shè)煙霧值(閥值)加1,最大為255
LCD_Write_Char(0,13,pre_Smoke,3);
}
if(key == KEY_MINUS)//減鍵按下
{
if(pre_Smoke <= 1)//當(dāng)溫度上限值減小到1時
pre_Smoke = 1;//固定為1
pre_Smoke--;//預(yù)設(shè)溫度值減一,最小為0
LCD_Write_Char(0,13,pre_Smoke,3);////顯示預(yù)設(shè)溫度
}
break;//執(zhí)行后跳出switch
}
default:
{
LCDWriteCmd(0x38);//屏幕初始化LCD_MODE_PIN8
LCDWriteCmd(0x0c);//打開顯示 無光標(biāo) 無光標(biāo)閃爍LCD_DIS_ON
Mode = 0;
break;
}
}
}
}
紅框部分是我自己在基本功能上添加的解除報警代碼。有大佬幫忙看看嗎?謝謝了,在proteus中仿真,按下報警解除鍵沒用,而且實時煙霧溫度測量會出現(xiàn)延時,甚至改變環(huán)境煙霧溫度,不能正確反應(yīng)在lcd屏上。
|
|