多功能数字钟(A)
一、任务
设计制作一个24小时制多功能数字钟。
示意图如下(仅供参考):
二、要求
(1)具有时间设置(小时和分钟)、闹钟时间设置、闹钟开、闹钟关功能。
(2)数字显示小时、分钟,有AM、PM指示器,闹钟就绪灯,蜂鸣器。
(3)220V供电。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极数码管数字定义
uint clock[2]={58,23}; //初始化时间
uint alarm[2]={0,23}; //初始化闹铃时间
uint i,miao,flag;
sbit rd=P1^3;
sbit key4=P1^4; //只有摁下这个才可以调整时间
sbit key3=P1^5; //摁下这个可以切换出闹铃设置时间以便调整
sbit key2=P1^6; //增加小时的个位数,开闹铃
sbit key1=P1^7; //增加分钟的个位数,关闹铃
sbit didi=P3^7; //闹铃接口
void delay(uint t) //延时代码
{
uint x,y;
for(x=t;x>0;x--)
for(y=120;y>0;y--);
}
void initial() //初始化
{
TMOD=0x01; //T0方式1计时0.05S
TH0=(65536-50000)/256;//定时器T0的高四位赋值
TL0=(65536-50000)%256;//定时器T0的低四位赋值
EA=1; //中断允许
ET0=1; //允许计数器T0中断
TR0=1; //开中断,启动定时器
}
void timer0() interrupt 1 //定时器启动1模式
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==18)
{
i=0;
miao++; //根据振荡频率计算时间增加秒
if(miao==60) //如果秒=60了归为零且分钟增加一分钟
{
miao=0;
clock[0]=clock[0]+1;
if(clock[0]==60) //如果分钟为60,小时增加1
{
clock[0]=0;
clock[1]=clock[1]+1;
if(clock[1]==24) //小时为24小时制,如果24即为0
{
clock[1]=0;
}
}
}
}
}
void display(uint *p) //LED显示代码
{
P2=0xbf;
P0=tab[*p/10];
delay(2);
P2=0xff;
P2=0x7f;
P0=tab[*p%10];
delay(2);
p++;
delay(2);
P2=0xff;
P2=0xdf;
P0=0xbf; //显示"-"
delay(2);
P2=0xff;
P2=0xfb;
P0=0xbf; //显示"-"
delay(2);
P2=0xff;
if(*p<=12)
{
P2=0xfd;
P0=0x88; //如果是上午时间,从左数第二个LED显示A(AM)
delay(2);
}
if(*p>12)
{
P2=0xfd;
P0=0x8c; //如果是下午时间,LED上显示P(PM)
delay(2);
}
P2=0xf7;
P0=tab[*p/10];
delay(2);
P2=0xff;
P2=0xef;
P0=tab[*p%10];
delay(2);
}
void keyscan() //键盘控制时间改变的代码
{
if(key2==0)
{
delay(5);
if(key2==0)
{
clock[1]=clock[1]+1;
if(clock[1]==24)
{
clock[1]=0;
}
}
while(!key2);
}
if(key1==0)
{
delay(5);
if(key1==0)
{
clock[0]=clock[0]+1;
if(clock[0]==60)
{
clock[0]=0;
}
}
while(!key1);
}
display(clock); //显示时间
}
void alarm_control() //闹铃时间控制代码
{
if(key2==0) //key2摁下表示闹铃初始值小时增加1 {
delay(5);
if(key2==0)
{
alarm[1]=alarm[1]+1;
if(alarm[1]==24)
{
alarm[1]=0;
}
}
while(!key2);
}
if(key1==0) //key1摁下表示闹铃初始值分钟增加1
{
delay(5);
if(key1==0)
{
alarm[0]=alarm[0]+1;
if(alarm[0]==60)
{
alarm[0]=0;
}
}
while(!key1);
}
display(alarm);
P2=0xfe;
P0=0x88; //LED上显示A,说明模式为闹铃模式
delay(2);
}
void time_control() //时间控制代码,选择闹铃模式还是时间模式
{
if(key2==0)
{
flag=1;
}
if(key1==0)
flag=0;
if(flag==1&&clock[0]==alarm[0]&&clock[1]==alarm[1])
{
while(key1)
{
didi=0;
display(alarm);
P2=0xfe;
P0=0x88; //LED最左端显示A,即为闹铃模式
delay(2);
}
flag=0;
didi=1;
}
}
void main() //主函数
{
initial(); //初始化
flag=0; //闹铃模式开,进入循环
while(1)
{
display(clock); //显示主时间
if(key4==0)
{
while(!key4)
{
keyscan();
}
}
if(key3==0) //切换出闹铃时间,以便于调整以及查看{
while(!key3)
{
delay(8);
display(alarm); //显示闹铃时间
alarm_control(); //闹铃键盘控制
}
}
time_control();
}
}
//flag=0为闹钟模式,flag=1为时钟模式。