要求:定时器,倒计时时间由独立矩阵按键输入,在动态数码管上显示,按独立按键1开始倒计时,时间到蜂鸣器响
文件展示:
这是该工程所需要引的头文件。具体模板以及功能参考我之前发的文章
51单片机常用的一些模块(模块化编程)延时函数模块(delay)独立按键模块(key)数码管模块(Nixie)LCD1602模块矩形键盘模块定时器模块_Dream_begin_的博客-CSDN博客
主函数:
#include <REGX52.H>
#include "Timer0.H"
#include "Delay.H"
#include "MatrixKey.H"
#include "Nixie.H"
#include "Buzzer.H"
sbit Buzzer=P1^5; //蜂鸣器
sbit K1=P3^1; //第一个按键
sbit K2=P3^0; //第二个按键
sbit K3=P3^2; //第三个按键
unsigned char Num,flag1,KeyNum,Password,flag2=1; //Num用与定时器计时,KeyNum矩阵键盘,flag1判断是否开始计时
unsigned int Count; //Password用于输入时间,Count是计时位数最高时
void main()
{
Timer0Init();
/*****************************独立按键K1控制定时器是否开始计时***********************/
while(1)
{
if(K1==0) //如果K1按键按下
{
Delay(20);
while(K1==0);
Delay(20);
if(flag1==0){
flag1=1;
TR0 = 1; //定时器0开始计时
}
else{
flag1=0;
TR0 = 0; //定时器0结束计时
}
}
///****************************K3蜂鸣器停止鸣叫********************************/
while(Num==0&flag2==0)
{
Password=0; //计时清零
Num=0;
Count=0; //计次清零
Buzzer_Time(100);
if(K3==0)
{
Delay(20);
while(K3==0);
Delay(20);
flag2=1;
}
}
///***************************K2清零*******************************************/
if(K2==0)
{
Password=0; //计时清零
Num=0;
Count=0; //计次清零
TR0 = 0; //定时器0结束计时
}
///***********************矩阵键盘控制计时时间*********************************/
KeyNum=MatrixKey(); //计时时间控制
if(KeyNum)
{
if(Count<4) //如果输入次数小于4
{
Password*=10; //左移一位
Password+=KeyNum%10;
Num=Password;
Count++; //计次加一
}
}
/**************************************数码管显示倒计时**************************/
Nixie(5,Num/1000%10); //在数码管的第4位置显示千位
Nixie(6,Num/100%10); //在数码管的第3位置显示百位
Nixie(7,Num/10%10); //在数码管的第2位置显示十位
Nixie(8,Num%10); //在数码管的第1位置显示个位
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++;
if(T0Count>=1000)
{
T0Count=0;
Num--;
if(Num==0){
// Buzzer_Time(500);
TR0 = 0; //定时器0结束计时
Num=0;
flag2=0;
///Num=Password;
}
}
}