久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1136|回復: 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)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品一区在线观看 | 国产免费观看一区 | 欧美高清视频一区 | 99pao成人国产永久免费视频 | 黄色一级视频免费 | 午夜影院在线播放 | 欧美成年黄网站色视频 | 午夜视频在线免费观看 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 97精品久久 | 国产蜜臀| 国产激情网站 | 日韩成人av在线播放 | 色视频www在线播放国产人成 | 亚洲综合色丁香婷婷六月图片 | 天天干天天干 | 免费观看一级特黄欧美大片 | 一级在线 | 亚av在线| 最新国产精品精品视频 | 黄色av大片 | 国产精品免费一区二区三区 | 日韩视频观看 | 亚洲网站在线播放 | 一区二区三区欧美在线观看 | 欧美日韩亚洲国产 | 国产精品美女久久久免费 | 欧美高清免费 | 国产精品地址 | 涩涩视频网站在线观看 | 国产亚洲精品精品国产亚洲综合 | 久久99精品视频 | 午夜三级网站 | 国产美女永久免费无遮挡 | 欧美v片| 精品亚洲一区二区三区四区五区高 | 日韩精品专区在线影院重磅 | 中文字幕高清免费日韩视频在线 | 蜜桃特黄a∨片免费观看 | 91九色视频 | re久久|