本设计由STC89C52单片机电路+LCD1602液晶显示电路+按键电路+压力开关电路+蜂鸣器报警电路+电源电路组成。
1、通过按键可以设置B分钟的正向计时,当压力开关按下后,正向计时开始启动。设置的时间结束后如果压力开关没有弹开,则蜂鸣器一直长鸣报警。如果压力开关在设置的时间结束前弹开,则蜂鸣器不报警。B的时间为0-10分钟。
2、压力开关弹开后,蜂鸣器先不鸣叫,B的计时时间清零。如果A秒结束前,压力开关再次按下,则蜂鸣器报警。
3、压力开关弹开后,蜂鸣器先不鸣叫,B的计时时间清零。如果超过A秒结束后,压力开关再次按下,则蜂鸣器不报警。
4、可以通过按键设置A,A的时间为0-10分钟。
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include "1602.h"
#include "delay.h"
sbit key1 =P2^0; //接口定义
sbit key2 =P2^1;
sbit key3 =P2^2;
sbit sw = P3^2;
sbit buz = P1^0;
unsigned int setA = 1; // 设置
unsigned int setY = 1; //设置
unsigned char SetFlag = 0;//设置标志
unsigned long time_20ms=0; //定时变量
unsigned char dis0[16]; //显示数组
unsigned char dis1[16]; //显示数组
bit disFlag =0; //定时更新
unsigned char firstIn = 0;//进行对比
unsigned int timeCountY = 0;//计数
unsigned int timeCountT = 0;//计数
unsigned int checkCount = 0;//弹起计数检测
void Init_Timer0(void); //函数声明
void CheckKey(void);
void main (void)
{
Init_Timer0(); //定时器0初始化
buz = 0; //打开蜂鸣器
DelayMs(120);
buz = 1;//蜂鸣器 关闭
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear(); //清屏
while(1) //主循环
{
CheckKey();
if(disFlag ==1) //定时更新显示
{
disFlag =0; //更新显示标志清零
sprintf(dis1," y%02d a%02d ",setY,setA);
LCD_Write_String(0,1,dis1); //初始化显示
if(timeCountY > setY*60)
{
buz = 0; //打开蜂鸣器
}
else if((checkCount < setA*60)&&(checkCount!=0)) //弹起时间低于一定值
{
buz = 0; //打开蜂鸣器
}
else
{
buz = 1;//蜂鸣器 关闭
}
}
}
}
void CheckKey(void)
{
static unsigned char rekey =0;
if((key1==0)||(key2==0)||(key3==0)) //检测到按键按下
{
DelayMs(10); //小抖动
if(rekey==0)
{
if(key1==0) //检测是否按下
{
rekey=1;
SetFlag++;//设置标志
if(SetFlag >= 3) SetFlag = 0;
}
else if(key2==0)//设置值键
{
rekey=1;
if(SetFlag==1) //处于设置2
{
if(setY > 1)
{setY=setY-1;}
}
else if(SetFlag==2) //处于设置1
{
if(setA > 1 )
{setA=setA-1;}
}
}
else if(key3==0)//设置值键
{
rekey=1;
if(SetFlag==1)//处于设置2
{
if(setY < 10 )
{setY=setY+1;}
}
else if(SetFlag==2) //处于设置1
{
if(setA < 10 )
{setA=setA+1;}
}
}
}
}
else
{
rekey=0; //防止重复检测到按键
}
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
time_20ms++;
if(time_20ms%5==0)
{disFlag = 1;}
if(time_20ms%50==0) //定时1s
{
if(sw == 0) //按下
{
timeCountY++; //压下计数
if(firstIn == 0) //防止重复处理
{
checkCount = timeCountT; //赋值检测
firstIn = 1;
}
timeCountT = 0; //弹起清零
}
else
{
timeCountT++; //弹起计数
checkCount = 0; //清空弹起对比
timeCountY = 0;
firstIn = 0;
}
}
}
资料下载地址