(一)設計任務
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閃關燈和三個電阻
1.PNG (199.42 KB, 下載次數: 106)
下載附件
2017-10-29 14:49 上傳
2.PNG (309.47 KB, 下載次數: 96)
下載附件
2017-10-29 14:49 上傳
(五)程序設計及流程圖
流程圖:
3.PNG (21.42 KB, 下載次數: 93)
下載附件
2017-10-29 14:50 上傳
單片機源程序如下:
- #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、數碼顯示管可以外加一些三極管,電阻和電容,讓電路設計更合理。
|