找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 704|回复: 0
收起左侧

基于单片机的定时闹钟代码 无原理图

[复制链接]
ID:1059122 发表于 2023-6-9 16:08 | 显示全部楼层 |阅读模式
这是基于单片机的定时闹钟设计,用的是ATC89C52RC,文件包括了代码。

单片机源程序如下:
  1. #include <REGX52.H>
  2. #include "LCD1602.h"
  3. #include "DS1302.h"
  4. #include "Key.h"
  5. #include "Timer0.h"
  6. #include "Delay.h"
  7. #include "Buzzer.h"
  8. //#include "Clock.h"

  9. unsigned char Key_Get,MODE;        //MODE用作闹钟开关
  10. unsigned char i,Tmp_Status,Tmp,Tmp_Set,Count,Tmp_Getin,Key_Set,Clk_Stop;
  11. unsigned char Clk_Flag=0;         //默认关闭闹钟 unused

  12. /**
  13.   * @brief        显示实时时间
  14.   * @param  无
  15.   * @retval 无
  16.   */
  17. void TimeShow(void)
  18. {
  19.         DS1302_ReadTime();//读取时间
  20.         LCD_ShowString(1,1,"RealTime:     ");
  21.         LCD_ShowNum(2,1,DS1302_Time[0],2);//显示时
  22.         LCD_ShowNum(2,4,DS1302_Time[1],2);//显示分
  23.         LCD_ShowNum(2,7,DS1302_Time[2],2);//显示秒
  24.         
  25. }


  26. /**
  27.   * @brief        闹钟开启,到达闹钟设置时间响铃
  28.   * @param  无
  29.   * @retval 无
  30.   */
  31. void Clock_Time_Open(void)
  32. {
  33.         if(Clock_Time[0]==DS1302_Time[0] && Clock_Time[1]==DS1302_Time[1])
  34.         {
  35.                
  36.                 while(i!=1)
  37.                 {
  38.                         Buzzer_Timems(1000);
  39.                         Tmp_Status=1;
  40.                 }        
  41.                 Tmp_Status=0;
  42.                 i=0;
  43.                 MODE=0;

  44.                 //此程序为不使用外部中断关闭闹钟               
  45. /*                while(i==0)
  46.                 {
  47.                         Buzzer_Timems(1000);
  48. //                        Tmp_Status=1;
  49.                         if(Buzzer_Key()==4)        
  50.                         {
  51.                                 Clk_Flag=0;
  52.                                 i=4;
  53.                         }
  54.                 }        
  55. //                Tmp_Status=0;
  56.                 i=0;
  57.                 MODE=0;
  58. */
  59.         }
  60.         
  61.         
  62. }

  63. /**
  64.   * @brief        菜单设置 时钟/闹钟的时、分设置;显示闹钟时间;开启关闭闹钟
  65.   * @param  无
  66.   * @retval 无
  67.   */
  68. void Time_Set(unsigned char Tmp1)
  69. {
  70.         
  71.         if(Tmp1==1)
  72.         {
  73.                 LCD_ShowString(1,1,"RT Setting:  ");
  74.                 Tmp_Getin=Key();
  75.                 Key_Set=1;
  76.                 if(Tmp_Getin==1)
  77.                 {
  78.                         P2_2=!P2_2;
  79.                         Key_Set=1;
  80.                         DS1302_Time[0]++;//时间设置位数值加1
  81.                         if(DS1302_Time[0]>23){DS1302_Time[0]=0;}//时越界判断
  82.                 }
  83.                 if(Tmp_Getin==2)
  84.                 {
  85.                         Key_Set=1;
  86.                         DS1302_Time[1]++;//时间设置位数值加1
  87.                         if(DS1302_Time[1]>59){DS1302_Time[1]=0;}//分越界判断
  88.                 }
  89.                 if(Tmp_Getin==3)        
  90.                 {
  91.                         DS1302_SetTime();
  92.                         TimeShow();
  93.                         Tmp=0;        
  94.                         Key_Set=0;                        
  95.                 }        

  96.                 //实时更新显示
  97.                 LCD_ShowNum(2,1,DS1302_Time[0],2);
  98.                 LCD_ShowNum(2,4,DS1302_Time[1],2);
  99.                 LCD_ShowNum(2,7,DS1302_Time[2],2);//显示秒
  100.         }
  101.         else if(Tmp1==3)
  102.         {
  103.                 Key_Set=1;
  104.                 LCD_ShowString(1,1,"CLK Setting:  ");
  105.                 Tmp_Getin=Key();
  106.                 if(Tmp_Getin==1)
  107.                 {
  108.                         Key_Set=1;
  109.                         Clock_Time[0]++;//时间设置位数值加1
  110.                         if(Clock_Time[0]>23){Clock_Time[0]=0;}//时越界判断
  111.                 }
  112.                 if(Tmp_Getin==2)
  113.                 {
  114.                         Key_Set=1;
  115.                         Clock_Time[1]++;//时间设置位数值加1
  116.                         if(Clock_Time[1]>59){Clock_Time[1]=0;}//分越界判断
  117.                 }
  118.                 if(Tmp_Getin==3)        
  119.                 {
  120.                         DS1302_SetTime();
  121.                         LCD_ShowString(1,1,"CLK Setting Ok");
  122.                         Delay(1000);
  123.                         Tmp=0;        
  124.                         Key_Set=0;
  125.                 }        

  126.                 //实时更新显示
  127.                 LCD_ShowNum(2,1,Clock_Time[0],2);
  128.                 LCD_ShowNum(2,4,Clock_Time[1],2);
  129.         }
  130.         else if(Tmp1==2)
  131.         {        
  132.                 Key_Set=1;
  133.                 LCD_ShowString(1,1,"CLK TIM:  ");
  134.                 LCD_ShowNum(2,1,Clock_Time[0],2);
  135.                 LCD_ShowNum(2,4,Clock_Time[1],2);
  136.                 Tmp_Getin=Key();
  137.                 if(Tmp_Getin==2)
  138.                 {
  139.                         TimeShow();        
  140.                         Tmp=0;
  141.                         Key_Set=0;
  142.                 }
  143.         }
  144.         else if(Tmp1==4)
  145.         {
  146.                 Key_Set=1;
  147.                 //开关闹钟
  148.                 if(MODE==0)        //ON
  149.                 {
  150.                         MODE=1;
  151.                         Clk_Flag=MODE;
  152.                         for(i=0;i<3;i++)
  153.                         {
  154.                                 Delay(500);
  155.                                 Buzzer_Times(250);
  156.                         }
  157.                 }
  158.                 else
  159.                 {
  160.                         MODE=0;
  161.                         Clk_Flag=MODE;
  162.                         Delay(1000);
  163.                         Buzzer_Times(500);
  164.                 }
  165.                 Tmp=0;
  166.                 Key_Set=0;
  167.         }
  168. }

  169. /**
  170.   * @brief        按键检测
  171.   * @param  无
  172.   * @retval 无
  173.   */
  174. void Key_Select(void)
  175. {
  176.         Key_Get=Key();//读取键码
  177.         if(Key_Get==1)
  178.                 Tmp=1;
  179.         else if(Key_Get==2)
  180.                 Tmp=2;
  181.         else if(Key_Get==3)
  182.                 Tmp=3;
  183.         else if(Key_Get==4)
  184.                 Tmp=4;
  185.         else        
  186.                 Tmp=0;
  187. }


  188. void main()
  189. {
  190.         //初始化操作
  191.         LCD_Init();
  192.         DS1302_Init();
  193.         Timer0Init();
  194.         
  195.         LCD_ShowString(2,1,"  :  ");
  196.         //设置时间
  197.         DS1302_SetTime();
  198.         

  199.         while(1)
  200.         {
  201.                 //按键检测
  202.                 Key_Select();
  203.                
  204.                 //目的是进入菜单设置后按键不冲突,比如按k1就卡在时钟设置程序内
  205.                 if(Key_Set==0)               
  206.                         Tmp_Set=Tmp;        
  207.                
  208.                 //菜单页
  209.                 if(Tmp_Set)                                       
  210.                 {
  211.                         Time_Set(Tmp_Set);
  212.                 }        
  213.                 else
  214.                 {
  215.                         TimeShow();
  216.                 }
  217.                
  218.                 //开启闹钟
  219.                 if(MODE==1)               
  220.                 {
  221.                         Clock_Time_Open();
  222.                 }
  223.         }
  224. }

  225. void Timer0_Routine() interrupt 1
  226. {
  227.         static unsigned int Toggle;
  228.         TL0 = 0x18;                //设置定时初值
  229.         TH0 = 0xFC;        //设置定时初值
  230.         Toggle++;
  231.         if(Toggle>=1000)                        //每1秒P2_0闪烁一次
  232.         {
  233.                 Toggle=0;
  234.                 P2_0=!P2_0;
  235.         }
  236. }

  237. void INIT1() interrupt 2
  238. {
  239.         //闹钟响铃则程序将Tmp_Status置1,由此使用KEY4触发外部中断1关闭闹钟
  240.         if(Tmp_Status==1)        
  241.         {
  242.                 P2_3=!P2_3;
  243.                 i=1;
  244.         }
  245.                
  246. }
复制代码

Keil代码下载: 代码.7z (42.93 KB, 下载次数: 5)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表