//說明:采用P3.4高電平觸發必須外接1K下拉電阻,否則讀不到低電平
//信號。一旦觸發,P3.5輸出低電平,延時期間自鎖,重復觸發無效。
#include "STC15F104E.H" //單片機頭文件
#define uint unsigned int //宏定義無符號整型數據
#define uchar unsigned char //宏定義無符號字符型數據
sbit key_IN=P3^4; //輸入端口定義
sbit OUT=P3^5; //輸出端口定義
uchar Cnt50ms,Cnt1s; //中斷計時變量
bit key_sign=0; //按鍵狀態標志
/***********按鍵識別子程序****************/
void keyscan()
{
static uchar count=0; //計數變量
if(key_IN==1) //檢測輸入如果為1
{
count++; //計數延時消抖
if(count>=100) //100次檢測按鍵如果為0
{
count=100; //防止溢出
if(key_sign==0) //按鍵狀態標志為0
{
key_sign=1; //按鍵狀態標志置1,防止重復響應
OUT=0; //輸出低電平有效
TR0= 1; //啟動定時器
}
}
}
else count=0; //計數變量清0
}
/***********定時器初始化程序****************/
void Timer0Init() //50毫秒@11.0592MHz
{
AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0xF0; //設置自動重載模式
TL0 = 0x00; //設置定時初值
TH0 = 0x4C; //設置定時初值
TF0 = 0; //清除TF0標志
// TR0 = 1; //定時器0開始計時
}
/***************主程序****************/
void main()
{
Timer0Init(); //定時器初始化
EA=1; //開總中斷
ET0=1; //開定時器0中斷
Cnt50ms=0; //賦初值0
Cnt1s=0; //賦初值0
while(1)
{
keyscan(); //按鍵識別子程序
}
}
/**************中斷服務程序*****************/
void timer0() interrupt 1
{
Cnt50ms++; //中斷變量Cnt50ms自+1
if(Cnt50ms>=20) //1秒
{
Cnt50ms=0; //中斷變量Cnt50ms清0
Cnt1s++; //計數清0
if(Cnt1s>=12) //1~255秒任意設置
{
Cnt1s=0; //中斷變量Cnt1s自清0
key_sign=0; //按鍵狀態標志清0
OUT=1; //關閉輸出
TR0=0; //關閉定時器
}
}
} |