|
這是基于單片機的定時鬧鐘設計,用的是ATC89C52RC,文件包括了代碼。
單片機源程序如下:- #include <REGX52.H>
- #include "LCD1602.h"
- #include "DS1302.h"
- #include "Key.h"
- #include "Timer0.h"
- #include "Delay.h"
- #include "Buzzer.h"
- //#include "Clock.h"
- unsigned char Key_Get,MODE; //MODE用作鬧鐘開關
- unsigned char i,Tmp_Status,Tmp,Tmp_Set,Count,Tmp_Getin,Key_Set,Clk_Stop;
- unsigned char Clk_Flag=0; //默認關閉鬧鐘 unused
- /**
- * @brief 顯示實時時間
- * @param 無
- * @retval 無
- */
- void TimeShow(void)
- {
- DS1302_ReadTime();//讀取時間
- LCD_ShowString(1,1,"RealTime: ");
- LCD_ShowNum(2,1,DS1302_Time[0],2);//顯示時
- LCD_ShowNum(2,4,DS1302_Time[1],2);//顯示分
- LCD_ShowNum(2,7,DS1302_Time[2],2);//顯示秒
-
- }
- /**
- * @brief 鬧鐘開啟,到達鬧鐘設置時間響鈴
- * @param 無
- * @retval 無
- */
- void Clock_Time_Open(void)
- {
- if(Clock_Time[0]==DS1302_Time[0] && Clock_Time[1]==DS1302_Time[1])
- {
-
- while(i!=1)
- {
- Buzzer_Timems(1000);
- Tmp_Status=1;
- }
- Tmp_Status=0;
- i=0;
- MODE=0;
- //此程序為不使用外部中斷關閉鬧鐘
- /* while(i==0)
- {
- Buzzer_Timems(1000);
- // Tmp_Status=1;
- if(Buzzer_Key()==4)
- {
- Clk_Flag=0;
- i=4;
- }
- }
- // Tmp_Status=0;
- i=0;
- MODE=0;
- */
- }
-
-
- }
- /**
- * @brief 菜單設置 時鐘/鬧鐘的時、分設置;顯示鬧鐘時間;開啟關閉鬧鐘
- * @param 無
- * @retval 無
- */
- void Time_Set(unsigned char Tmp1)
- {
-
- if(Tmp1==1)
- {
- LCD_ShowString(1,1,"RT Setting: ");
- Tmp_Getin=Key();
- Key_Set=1;
- if(Tmp_Getin==1)
- {
- P2_2=!P2_2;
- Key_Set=1;
- DS1302_Time[0]++;//時間設置位數值加1
- if(DS1302_Time[0]>23){DS1302_Time[0]=0;}//時越界判斷
- }
- if(Tmp_Getin==2)
- {
- Key_Set=1;
- DS1302_Time[1]++;//時間設置位數值加1
- if(DS1302_Time[1]>59){DS1302_Time[1]=0;}//分越界判斷
- }
- if(Tmp_Getin==3)
- {
- DS1302_SetTime();
- TimeShow();
- Tmp=0;
- Key_Set=0;
- }
- //實時更新顯示
- LCD_ShowNum(2,1,DS1302_Time[0],2);
- LCD_ShowNum(2,4,DS1302_Time[1],2);
- LCD_ShowNum(2,7,DS1302_Time[2],2);//顯示秒
- }
- else if(Tmp1==3)
- {
- Key_Set=1;
- LCD_ShowString(1,1,"CLK Setting: ");
- Tmp_Getin=Key();
- if(Tmp_Getin==1)
- {
- Key_Set=1;
- Clock_Time[0]++;//時間設置位數值加1
- if(Clock_Time[0]>23){Clock_Time[0]=0;}//時越界判斷
- }
- if(Tmp_Getin==2)
- {
- Key_Set=1;
- Clock_Time[1]++;//時間設置位數值加1
- if(Clock_Time[1]>59){Clock_Time[1]=0;}//分越界判斷
- }
- if(Tmp_Getin==3)
- {
- DS1302_SetTime();
- LCD_ShowString(1,1,"CLK Setting Ok");
- Delay(1000);
- Tmp=0;
- Key_Set=0;
- }
- //實時更新顯示
- LCD_ShowNum(2,1,Clock_Time[0],2);
- LCD_ShowNum(2,4,Clock_Time[1],2);
- }
- else if(Tmp1==2)
- {
- Key_Set=1;
- LCD_ShowString(1,1,"CLK TIM: ");
- LCD_ShowNum(2,1,Clock_Time[0],2);
- LCD_ShowNum(2,4,Clock_Time[1],2);
- Tmp_Getin=Key();
- if(Tmp_Getin==2)
- {
- TimeShow();
- Tmp=0;
- Key_Set=0;
- }
- }
- else if(Tmp1==4)
- {
- Key_Set=1;
- //開關鬧鐘
- if(MODE==0) //ON
- {
- MODE=1;
- Clk_Flag=MODE;
- for(i=0;i<3;i++)
- {
- Delay(500);
- Buzzer_Times(250);
- }
- }
- else
- {
- MODE=0;
- Clk_Flag=MODE;
- Delay(1000);
- Buzzer_Times(500);
- }
- Tmp=0;
- Key_Set=0;
- }
- }
- /**
- * @brief 按鍵檢測
- * @param 無
- * @retval 無
- */
- void Key_Select(void)
- {
- Key_Get=Key();//讀取鍵碼
- if(Key_Get==1)
- Tmp=1;
- else if(Key_Get==2)
- Tmp=2;
- else if(Key_Get==3)
- Tmp=3;
- else if(Key_Get==4)
- Tmp=4;
- else
- Tmp=0;
- }
- void main()
- {
- //初始化操作
- LCD_Init();
- DS1302_Init();
- Timer0Init();
-
- LCD_ShowString(2,1," : ");
- //設置時間
- DS1302_SetTime();
-
- while(1)
- {
- //按鍵檢測
- Key_Select();
-
- //目的是進入菜單設置后按鍵不沖突,比如按k1就卡在時鐘設置程序內
- if(Key_Set==0)
- Tmp_Set=Tmp;
-
- //菜單頁
- if(Tmp_Set)
- {
- Time_Set(Tmp_Set);
- }
- else
- {
- TimeShow();
- }
-
- //開啟鬧鐘
- if(MODE==1)
- {
- Clock_Time_Open();
- }
- }
- }
- void Timer0_Routine() interrupt 1
- {
- static unsigned int Toggle;
- TL0 = 0x18; //設置定時初值
- TH0 = 0xFC; //設置定時初值
- Toggle++;
- if(Toggle>=1000) //每1秒P2_0閃爍一次
- {
- Toggle=0;
- P2_0=!P2_0;
- }
- }
- void INIT1() interrupt 2
- {
- //鬧鐘響鈴則程序將Tmp_Status置1,由此使用KEY4觸發外部中斷1關閉鬧鐘
- if(Tmp_Status==1)
- {
- P2_3=!P2_3;
- i=1;
- }
-
- }
復制代碼
Keil代碼下載:
代碼.7z
(42.93 KB, 下載次數: 5)
2023-6-10 00:25 上傳
點擊文件名下載附件
定時鬧鐘
|
|