1
控制/MCU
在之前的文章中我们学习了多位数码管时钟,既然有了时间,那我们为何不将他变为一个可以定时的闹钟呢,这样不就更加的方便我们了吗。这一章我们将开始对数码管定时闹钟的学习。
一、功能概述
既然我们已经可以实现多位数码管显示时间,那么我们在这个时间的基础上加上一个蜂鸣器,用按键的方式来调整我们所需要定时的时间,当时间到时进入外部中断来控制蜂鸣器,而按键同样也是外部中断的方法。外部中断的触发方法有电平触发和边沿触发两种方式,这两种方式都可以我们人为的去设定它。
二、显示原理
使用AT89C51单片机来对数码管进行时间的显示,外加蜂鸣器起到闹钟的作用。这一章节我们先了解按键外部中断的原理以及如何对按键控制时间的增减。
外部中断分为两个部分,中断初始化部分和外部中断服务函数。初始化部分是对中断进行设定,确定所选用的中断是哪一个,以及触发中断的条件,还有中断的优先级顺序。
//中断初始化
void Interrupt_eint()
{
EX0 = 1; //开启外部中断0
IT0 = 1; //设置外部中断0触发模式:下降沿触发
EX1 = 1; //开启外部中断1
IT1 = 1; //设置外部中断1触发模式
EA = 1; //开启总中断
PX0 = 1; //将外部中断的优先级提高
}
//外部0中断服务函数
void int0() interrupt 0
{
uchar j = 0;
for(j = 0;j<=3;++j)
{
DisplayNum(j);
delay_ms(1000);
}
}
我们以代码的方式进行中断的解读,之后的学习我们也可以利用这两段代码来进行运用外部中断。
三、电路连接
这里我们选用P3.0、P3.1、P3.2作为我们三个按键控制的引脚
定义代码如下:
voidkey()
{
while(key2==0)
{
input();
break;
}
if(key1==0)
{
delayms(200);
if(key1==0)
//{while(!key1){TR0=0;display(time[0]/10,time[0]%10,time[1]/10,time[1]%10,time[2]/10,time[2]%10);}TR0=1;}
{TR0=!TR0;while(!key1)display(time[0]/10,time[0]%10,time[1]/10,time[1]%10,time[2]/10,time[2]%10);}
//else if(TR0==0)TR0=1;}
else if(key1==1)
{mode++;if(mode==2)mode=0;}
}
if(key3==0)
{
delayms(200);
if(key3==0)
{if(mode==0{time[0]=0;time[1]=0;time[2]=0;num=0;
while(!key3)display(time[0]/10,time[0]%10,time[1]/10,time[1]%10,time[2]/10,time[2]%10);}
else if(mode==1){time_clk[0]=0;time_clk[1]=0;time_clk[2]=0;
while(!key3)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);}}
else if(key3==1)
{buffer=1;/*P1=1;*/}
}
}