在之前的文章中我们学习了数码管定时闹钟中的按键中断的写法,接下来我们需要将我们的按键、蜂鸣器和我们之前设计的数码管计时器相结合起来,就可以实现一个数字时间现实的定时闹钟了。
一、功能概述
通过按键来控制设定的时间,当到达时间后进入外部中断,蜂鸣器开始工作,实现定时闹钟的功能。时间数字在四位数码管上进行显示,分钟倒计时定时闹钟的功能,在此基础上还可以添加小时的数码管,来对小时的时间进行设置,原理还是类似的。
二、显示原
本设计同样采用的AT89C51单片机来实现多位数码管的控制,附带按键设置时间,以及蜂鸣器闹钟的功能。
电路连接如下:
三、程序代码设计
结合我们前几章所学的数码管以及定时器、中断的方法来对程序进行编写。
程序如下:
#include< reg52.h >
#include< intrins.h >
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^0;//按键
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit buffer=P2^3;//蜂鸣器
sbit DU =P2^6;//段选
sbit WE =P2^7;//位选
uchar bitdata[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管1-8
uchar segdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//段选0-9,-
uchar dis_arr[]={10,10,10,10,10,10};//时钟显示数组
uchar time[]={0,0,0};//时钟 时分秒
uchar time_In[]={0,0,0,0,0,0};
uchar time_clk[]={0,0,0};//闹钟 时分秒
uchar num=0;
uchar mode=0;
uchar keydown=0;
uchar clk_state=0;
uchar keyIn,keyvalue,i,temp;//矩阵键盘读入
void key();
void init();
uchar keyscan();//矩阵键盘扫描函数
void delayms(uint x);//延时函数
void display(uchar duan1,uchar duan2,uchar duan3,uchar duan4,uchar duan5,uchar duan6);
void display_1(uchar wei,uchar duan);
void input();
void soundTime();
void main()
{
input();
init();
while(1)
{
key();
if(mode==0)//时钟
display(time[0]/10,time[0]%10,time[1]/10,time[1]%10,time[2]/10,time[2]%10);
else if(mode==1)//闹钟
display(time_clk[0]/10,time_clk[0]%10,time_clk[1]/10,time_clk[1]%10,time_clk[2]/10,time_clk[2]%10);
}
}
void init()//初始化函数
{
P3=0xff;//给高电平
TMOD=0x01;//定时器工作方式选择1
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1; //开总中断
ET0=1;//允许定时器0中断
TR0=1;//开始计数
//P1=1;
}
void delayms(uint x)//延时函数
{
uint i,j;
for(i=x;i >0;i