|
#include <reg52.h> //調(diào)用單片機頭文件
#define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255
#define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
#define key_io P1
uchar key_can;
// 紅外熱釋電平時為0 有輸出為1
sbit beep = P2^3; //蜂鳴器定義
sbit red = P2^2; //紅色發(fā)光二極管定義
sbit green = P2^1; //綠色發(fā)光二極管定義
sbit yellow = P2^0; //黃色發(fā)光二極管定義
sbit hw = P1^3; //紅外熱釋傳感器定義
bit flag_300ms = 0;
/****************獨立按鍵處理函數(shù)************************/
void key()
{
static uchar key_new = 0,key_old = 0,key_value = 0;
if(key_new == 0) //按鍵松開
{
if((key_io & 0x07) == 0x07)
key_value ++;
else
key_value = 0;
if(key_value >= 5) //按鍵松開松手檢測
{
key_value = 0;
key_new = 1; //按鍵松開后進(jìn)入等待按鍵狀態(tài)
}
}
else
{
if((key_io & 0x07) != 0x07) //按鍵按下
key_value ++;
else
key_value =0;
if(key_value >= 5) //按鍵按下消抖
{
key_value = 0;
key_new = 0; //按鍵松開后進(jìn)入等待松開按鍵狀態(tài)
}
}
key_can = 20;
if((key_new == 0) && (key_old == 1))
{
switch(key_io & 0x07)
{
case 0x06: key_can = 1; break; //得到按鍵值
case 0x05: key_can = 2; break; //得到按鍵值
case 0x03: key_can = 3; break; //得到按鍵值
}
}
key_old = key_new;
}
/*************定時器0初始化程序***************/
void time_init()
{
EA = 1; //開總中斷
TMOD = 0X01; //定時器0工作方式1
ET0 = 1; //開定時器0中斷
TR0 = 1; //允許定時器0定時
}
uchar flag_alarm ; //報警標(biāo)志位
uchar flag_bufang ; //布防標(biāo)志位
uchar flag_bufang_en ; //布防標(biāo)志位使能
uint flag_value; //用做定時器的變量
/******************紅外報警處理**********************/
void hongwai_dis()
{
if(flag_alarm == 1) //報警
{
red = ~red; //紅燈報警
beep = ~beep; //蜂鳴器報警
}
if(flag_bufang_en == 1) //準(zhǔn)備開始布防
{
green = ~green; //綠燈閃
}
if(flag_bufang == 1) //確認(rèn)布防
{
green = 0; //如果延時布防成功 綠燈長亮
if(hw == 1) //紅外有輸出
{
flag_alarm = 1;
}
}
}
/******************對應(yīng)不同按鍵處理**********************/
void key_with()
{
if(key_can == 1) //按鍵緊急報警
{
flag_alarm = 1; //報警標(biāo)志位 ;
}
if(key_can == 2) //布防按鍵
{
flag_bufang_en = 1;
}
if(key_can == 3) //取消報警 把變量清零
{
flag_alarm = 0;
flag_bufang = 0;
flag_bufang_en = 0;
flag_value = 0;
P2 = 0xff;
}
}
/******************主程序**********************/
void main()
{
time_init();
while(1)
{
key();
yellow = ~hw; //紅外熱釋電指示燈 有輸出就亮黃燈
if(key_can < 10)
{
key_with(); //按鍵設(shè)置函數(shù)
}
if(flag_300ms == 1)
{
flag_300ms = 0;
hongwai_dis(); //紅外報警函數(shù)
}
}
}
/*************定時器0中斷服務(wù)程序***************/
void time0_int() interrupt 1
{
static uint value;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
value ++;
if(value % 6 == 0)
{
flag_300ms = 1;
}
if(flag_bufang_en == 1)
{
flag_value ++;
if(flag_value >= 600) //30秒
{
flag_bufang = 1;
flag_bufang_en = 0;
flag_value = 0;
}
}
} |
|