|
这是基于单片机的定时闹钟设计,用的是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)
|
|