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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1554|回復: 1
打印 上一主題 下一主題
收起左側

STM32單片機rtc鬧鐘,旋鈕,按鍵調節時間日期代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:1127127 發表于 2024-7-4 22:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include "stm32f10x.h"                  // Device header
  2. #include "Delay.h"                                                //延時模塊,主函數中未使用
  3. #include "OLED.h"                                                //OLED顯示模塊
  4. #include "MyRTC.h"                                                //RTC模塊
  5. #include "Key.h"                                                //按鍵模塊
  6. #include "Buzzer.h"                                                //蜂鳴器模塊
  7. #include "Encoder.h"

  8. /*
  9.         功能:        簡易時鐘,可以通過按鍵調整日期時間和設定鬧鐘,通過OLED顯示日期時間等相關信息
  10.        
  11.         原理:        RTC
  12.        
  13.         接線:        OLED顯示屏:SCK接PB8,SDA接PB9
  14.                         有源蜂鳴器(低電平觸發):I/O接PB12
  15.                         1~4號獨立按鍵:分別接PB11,PB10,PB1,PB0
  16.        
  17.         注意:        若出現沒有現象或時間不動等情況,請查看MyRTC.c
  18. */

  19. uint16_t MyRTC_Time[] = {2024,4,11,12,0,0};                //定義全局的時間數組,數組內容分別為年、月、日、時、分、秒
  20. uint32_t Alarm_CNT,Alarm_Time,Alarm_Time_Rest;        //鬧鐘相關變量,單位都是秒
  21. uint8_t Hour,Min,Sec;                                                        //用來調整鬧鐘時間的變量
  22. uint8_t KeyNum ;                                                                //按鍵鍵碼值
  23. uint8_t Flag_Count;                                                                //是否在計時標志,0為不在計時
  24. uint8_t Flag_Change;                                                        //按鍵調節鬧鐘/日期/時間,0為調節鬧鐘,1為調節日期,2為調節時間


  25. /*按鍵控制函數*/
  26. void Key_Control(void)
  27. {
  28.         KeyNum = Key_GetNum();        //讀取按鍵鍵碼
  29.        
  30.         if(Flag_Change == 0)        //調節鬧鐘
  31.         {
  32.                 if(KeyNum == 1)                //1號按鍵調整小時
  33.                 {
  34.                         Hour+= Encoder_Get();
  35.                         if(Hour > 60)
  36.                                 Hour = 0;
  37.                 }
  38.                 else if(KeyNum == 2)        //2號按鍵調整分鐘
  39.                 {
  40.                         Min+= Encoder_Get();
  41.                         if(Min > 60)
  42.                                 Min = 0;
  43.                 }
  44.                 else if(KeyNum == 3)        //3號按鍵調整秒
  45.                 {
  46.                         Sec+= Encoder_Get();
  47.                         if(Sec > 60)
  48.                                 Sec = 0;
  49.                 }

  50.                 else if(KeyNum == 4)        //4號按鍵
  51.                 {
  52.                         if(Buzzer_State()==0)                //若蜂鳴器沒響
  53.                         {
  54.                                 Alarm_Time = Hour*3600 + Min*60 + Sec;                        //計算鬧鐘時長,單位是秒
  55.                                
  56.                                 if(Alarm_Time > 0)
  57.                                 {
  58.                                         Alarm_CNT = RTC_GetCounter()+Alarm_Time-1;                        //設定鬧鐘值,需要-1
  59.                                         RTC_SetAlarm(Alarm_CNT);                                                        //寫入鬧鐘值到RTC的ALR寄存器
  60.                                         Flag_Count = 1;
  61.                                 }
  62.                                 else        //若鬧鐘時長為0,則轉到按鍵調節日期
  63.                                 {
  64.                                         Flag_Change = 1;       
  65.                                 }
  66.                         }
  67.                         else        //若蜂鳴器響
  68.                         {
  69.                                 Buzzer_OFF();                //關閉蜂鳴器
  70.                                 OLED_ShowString(4,1,"        ");        //刷新oled第四行       
  71.                         }
  72.                 }
  73.         }
  74.        
  75.         else if(Flag_Change == 1)                //調節日期
  76.         {
  77.                 Delay_ms(2000);
  78.                 KeyNum = Key_GetNum();
  79.                 if(KeyNum == 1)                        //1號按鍵調整年
  80.                 {
  81.                         MyRTC_Time[0]+= Encoder_Get();
  82.                         MyRTC_SetTime();
  83.                 }
  84.                 else if(KeyNum == 2)        //2號按鍵調整月
  85.                 {
  86.                         MyRTC_Time[1]+= Encoder_Get();
  87.                         MyRTC_SetTime();
  88.                 }
  89.                 else if(KeyNum == 3)        //3號按鍵調整日
  90.                 {
  91.                         MyRTC_Time[2]+= Encoder_Get();
  92.                         MyRTC_SetTime();
  93.                 }
  94.                 else if(KeyNum == 4)        //4號按鍵,改為調整時間
  95.                 {
  96.                         Flag_Change = 2;
  97.                 }                       
  98.         }
  99.        
  100.         else if(Flag_Change == 2)                //調節時間
  101.         {
  102.                 Delay_ms(2000);
  103.                 KeyNum = Key_GetNum();
  104.                 if(KeyNum == 1)                        //1號按鍵調整小時
  105.                 {
  106.                         MyRTC_Time[3]+= Encoder_Get();
  107.                         MyRTC_SetTime();
  108.                 }
  109.                 else if(KeyNum == 2)        //2號按鍵調整分鐘
  110.                 {
  111.                         MyRTC_Time[4]+= Encoder_Get();
  112.                         MyRTC_SetTime();
  113.                 }
  114.                 else if(KeyNum == 3)        //3號按鍵調整秒
  115.                 {
  116.                         MyRTC_Time[5]+= Encoder_Get();
  117.                         MyRTC_SetTime();
  118.                 }
  119.                 else if(KeyNum == 4)        //4號按鍵
  120.                 {
  121.                         Flag_Change = 0;        //改為調整鬧鐘
  122.                         OLED_ShowString(4,1,"            ");        //刷新oled第四行
  123.                 }                       
  124.         }

  125. }

  126. int main(void)
  127. {
  128.         /*模塊初始化*/
  129.         OLED_Init();                //OLED初始化
  130.         MyRTC_Init();                //RTC初始化
  131.         Key_Init();                        //按鍵初始化
  132.         Buzzer_Init();                //蜂鳴器初始化
  133.         Encoder_Init();                //旋轉編碼器初始化
  134.                
  135.         /*顯示靜態字符串*/
  136.         OLED_ShowString(1, 1, "Date:XXXX-XX-XX");
  137.         OLED_ShowString(2, 1, "Time:XX:XX:XX");
  138.         OLED_ShowString(3, 1, "Alarm:XX:XX:XX");

  139.         while (1)
  140.         {
  141.                 MyRTC_ReadTime();                                                        //RTC讀取時間,最新的時間存儲到MyRTC_Time數組中
  142.                 Key_Control();                                                                //調用按鍵控制函數

  143.                 OLED_ShowNum(1, 6, MyRTC_Time[0], 4);                //顯示MyRTC_Time數組中的時間值,年
  144.                 OLED_ShowNum(1, 11, MyRTC_Time[1], 2);                //月
  145.                 OLED_ShowNum(1, 14, MyRTC_Time[2], 2);                //日
  146.                 OLED_ShowNum(2, 6, MyRTC_Time[3], 2);                //時
  147.                 OLED_ShowNum(2, 9, MyRTC_Time[4], 2);                //分
  148.                 OLED_ShowNum(2, 12, MyRTC_Time[5], 2);                //秒
  149.                 OLED_ShowNum(4, 15, Key_GetNum(), 2);                //秒

  150.                
  151.                 if(Flag_Count)                                                                                //正在計時,則顯示鬧鐘響起剩余時間
  152.                 {
  153.                         Alarm_Time_Rest = Alarm_CNT-RTC_GetCounter()+1;        //計算鬧鐘響起剩余時間
  154.                         if(Alarm_Time_Rest > Alarm_Time)                                //防止溢出錯誤
  155.                                 Alarm_Time_Rest = 0;
  156.                        
  157.                         OLED_ShowNum(3,7,Alarm_Time_Rest/3600,2);                //顯示剩余小時
  158.                         OLED_ShowNum(3,10,(Alarm_Time_Rest%3600)/60,2);        //顯示剩余分鐘
  159.                         OLED_ShowNum(3,13,(Alarm_Time_Rest%3600)%60,2);        //顯示剩余秒
  160.                        
  161.                         if(RTC_GetFlagStatus(RTC_FLAG_ALR) == 1)                //鬧鐘時間到,檢查標志位為1
  162.                         {
  163.                                 RTC_ClearFlag(RTC_FLAG_ALR);                                //清除標志位
  164.                                 Flag_Count = 0;Alarm_Time = 0;                                //重置相關參數
  165.                                 Hour = 0;Min = 0; Sec = 0;
  166.                                
  167.                                 Buzzer_ON();                                                                //打開蜂鳴器
  168.                                 OLED_ShowString(4,1,"Time Out");
  169.                         }
  170.                         else                                                                                        //鬧鐘時間未到
  171.                         {
  172.                                 OLED_ShowString(4,1,"Counting");                        //顯示正在計時
  173.                         }
  174.                 }
  175.                 else                                                                                                //不在計時,則顯示需要設定的鬧鐘時間
  176.                 {
  177.                         OLED_ShowNum(3,7,Hour,2);
  178.                         OLED_ShowNum(3,10,Min,2);
  179.                         OLED_ShowNum(3,13,Sec,2);
  180.                 }
  181.                
  182.                 if(Flag_Change == 1)                //顯示“調節日期”
  183.                 {
  184.                         OLED_ShowString(4,1,"Change Date");
  185.                 }
  186.                 else if(Flag_Change == 2)        //顯示“調節時間”
  187.                 {
  188.                         OLED_ShowString(4,1,"Change Time");
  189.                 }
  190.         }
  191. }

復制代碼

原理圖: 無
仿真: 無
代碼: Project.7z (187.52 KB, 下載次數: 24)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:229641 發表于 2024-7-9 23:54 來自手機 | 只看該作者
精度怎么樣?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美aaaaaa| 天堂网av在线 | 国产欧美久久一区二区三区 | 亚洲精品一区二区另类图片 | 又爽又黄axxx片免费观看 | 91精品国产91久久久久游泳池 | 国产中文视频 | 精品国产欧美 | 日本大片在线播放 | 久久精品综合 | 欧美精品一区在线发布 | 91在线视频国产 | 国产福利久久 | 老头搡老女人毛片视频在线看 | 羞羞视频网 | 伊人网综合在线 | 亚洲 中文 欧美 日韩 在线观看 | 日韩另类 | 在线观看免费福利 | 日日操夜夜操视频 | 久久久人| 天天干成人网 | 日本在线网站 | 国产精品久久久久久久白浊 | 成人av片在线观看 | 成人免费视频7777777 | av天空| 成人在线视频网 | 久久久精品一区二区 | 亚洲国产成人精品久久 | 亚洲欧美在线观看 | 日皮视频免费 | 国产精品一区二区久久久久 | 亚洲一区二区三区视频免费观看 | 91久久北条麻妃一区二区三区 | 亚洲综合小视频 | 91精品国产99 | 成年免费在线观看 | 日韩aⅴ视频 | 亚洲欧美日韩精品 | 看a网站 |