//说明:采用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; //关闭定时器
}
}
} |