(一)设计任务
1、采用四位LED动态显示小时、分单元。
2、具有自动整点报时功能。
3、可以通过四个开关设定修改时间,保证准确性。
4、通过LED灯的显示,实现整点报时。
(二)设计方案
显示时、分,打开电源时,应当显示的数据为00:00,秒钟通过右边的LED灯的闪烁来显示,每闪烁一次代表计时一秒,然后电路会自动开始计时。电路中应当有时、分的时间调整按钮。当显示数据变为00:00时,而不是24:00。时间调整按钮按下时间小于1s时,时钟进入休眠状态;大于1s时,进入时间调整状态,每按1次,显示值加1。K1~K4每按一下,开关状态取反。当闹钟开关k1开启,则显示闹钟设置时间,且中间蓝色LED指示灯亮(蓝色LED灭则显示时钟时间),K2进行小时+1设置,K3进行分钟+1设置,若开关k4开启,则允许闹钟开启,当时间到达闹钟设定时间时,左边闹钟的绿色LED灯闪烁,进行报时,闪烁延时一分钟后熄灭。
程序执行后工作LED指示灯闪动,表示程序开始执行,LCD显示“00:00”,按下操作键K1~K4动作如下:
(1) K1—显示闹钟设置的时间。
(2) K2—时调整
(3) K3—分调整
(4) K4—闹铃ON/OFF的状态设置,ON闹钟开启,OFF闹钟关闭。
(三)设计原理
本设计中实现的是4位数的显示。一般来说,控制多位数码管常采用的方法是扫描显示法,即各位数码管共用输入数据,但各数码管的显示控制线则单独控制。 用扫描显示法来完成多位数字显示设计,程序执行时,先使要显示的数字位数对应的数码管允许点亮;然后,将要显示的数据输出到数码管;显示时间到了之后,再切换到下一个数码管来显示,秒钟通过右边LED闪烁来显示,每一秒闪一下。 报时方面设计采取使用左边的LED灯闪烁进行报时,灯闪烁一分钟后熄灭。
(四)硬件电路设计
电路设计:由以上的分析知,电路中除了单片机之外,还需要4个数码管,4个开关按钮,三个LED闪关灯和三个电阻
(五)程序设计及流程图
流程图:
单片机源程序如下:
- #include<reg52.h>
- unsigned char code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
- unsigned int num,tt;
- unsigned char ALARM,ALA_SWITCH,ALA_SHI,ALA_FEN,SHI,FEN,num1,num2,num3,num4;
- sbit K1=P1^0;
- sbit K2=P1^1;
- sbit K3=P1^2;
- sbit K4=P1^3;
- sbit GLED=P0^0;
- sbit RLED=P0^1;
- sbit CLOCK_ADJ=P0^2;
- void delay(unsigned int a);
- void display(unsigned char a,unsigned char b);
- void readkey();
- void main()
- {
- RLED=0;
- ALARM=0;
- ALA_SWITCH=0;
- CLOCK_ADJ=1;
- ALA_SHI=12;
- ALA_FEN=0;
- SHI=0;
- FEN=0;
- num=0;
- tt=0;
- TMOD=0x01;
- EA=1;
- ET0=1;
- TR0=1;
- TH0=(65536-50000)/256;//50ms
- TL0=(65536-50000)%256;
- while(1)
- {
- if(tt>=10)
- { RLED=!RLED;
- tt=0;
- num++;
- if(num>=120)
- {
- num=0;
- FEN++;
- }
- if(FEN>=60)
- {
- FEN=0;
- SHI++;
- }
- if(SHI>=24) SHI=0;
- }
- if(ALA_SHI>=24)ALA_SHI=0;
- if(ALA_FEN>=60)ALA_FEN=0;
- if(SHI==ALA_SHI&&FEN==ALA_FEN)ALARM=1;
- else ALARM=0;
- readkey();
- if(CLOCK_ADJ==1)display(SHI,FEN);
- if(CLOCK_ADJ==0)display(ALA_SHI,ALA_FEN);
- }
- }
- void delay(unsigned int a)
- {
- unsigned int x,y;
- for(x=a;x>0;x--)
- for(y=100;y>0;y--);
- }
- void time0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- tt++;
- if(ALARM==1&&ALA_SWITCH==1)GLED=!GLED;
-
- }
- void display(unsigned char a,unsigned char b)
- {
- num1=a/10;
- num2=a%10;
- num3=b/10;
- num4=b%10;
-
- P3=0xFF;
- P2=table[num1];
- P3=0x0E;
- delay(2);
-
- P3=0xFF;
- if(num%2==0)
- P2=table[num2]|0x80;
- else P2=table[num2];
- P3=0X0D;
- delay(2);
-
- P3=0xFF;
- P2=table[num3];
- P3=0X0B;
- delay(2);
-
- P3=0xFF;
- P2=table[num4];
- P3=0X07;
- delay(2);
- }
- void readkey()
- {
- if(K1==0)
- {
- delay(5);
- delay(5);
- if(K1==0)CLOCK_ADJ=!CLOCK_ADJ;
- while(!K1) ;
- delay(5);
- delay(5);
- }
- if(K2==0)
- {
- delay(5);
- delay(5);
- if(K2==0)
- {
- if(CLOCK_ADJ==1)SHI++;
- if(CLOCK_ADJ==0)ALA_SHI++;
- }
- while(!K2);
- delay(5);
- delay(5);
- }
- if(K3==0)
- {
- delay(5);
- delay(5);
- if(K3==0)
- if(CLOCK_ADJ==1)FEN++;
- if(CLOCK_ADJ==0)ALA_FEN++;
- while(!K3) ;
- delay(5);
- delay(5);
- }
- if(K4==0)
- {
- delay(5);
- delay(5);
- if(K4==0)
- {
- GLED=1;
- ALA_SWITCH=!ALA_SWITCH;
- }
- while(!K4);
- delay(5);
- delay(5);
- }
- }
复制代码
(六)设计方案的改进
1、本系统只采用了4个数码管,而是通过LED灯闪烁来实现秒的计数,电路中可多加两个数码管,来显示秒的计时,来提高电子闹钟的准确性。
2、我们可以把LED灯闪烁报时换成蜂鸣器音乐报时,这样更能实现“闹钟”报时功能,使我们更能感知到。
3、数码显示管可以外加一些三极管,电阻和电容,让电路设计更合理。
|