標(biāo)題: STM32F103C8T6+DS1302+DS18B20+0.96OLED萬年歷程序 [打印本頁]

作者: qitahao    時間: 2021-9-30 12:44
標(biāo)題: STM32F103C8T6+DS1302+DS18B20+0.96OLED萬年歷程序
業(yè)余時間把論壇上一位大神的51單片機(jī)LCD12864萬年歷移植到STMC8T6+0.96OLED屏上,可按鍵設(shè)置時間日期鬧鐘,代碼不規(guī)范,有一些暫時沒發(fā)現(xiàn)的bug歡迎指教。

制作出來的實(shí)物圖如下:


單片機(jī)源程序如下:
  1. #include "main.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "led.h"
  5. #include "usart.h"
  6. #include "oled.h"
  7. #include "timer.h"
  8. #include "stm32f10x.h"
  9. #include "key.h"
  10. #include "nonli.h"
  11. #include "yangli.h"
  12. #include "ds18b20.h"
  13. #include "DS1302.h"


  14. enum eStaSystem staSystem = E_NORMAL;  //系統(tǒng)運(yùn)行狀態(tài)
  15. u8 flag1s = 0;    //1s定時標(biāo)志位
  16. u8 flag200ms = 0; //200ms定時標(biāo)志

  17. extern void KeyDriver(void);
  18. extern void RefreshLunarn(void);
  19. extern void KeyScan(void);





  20. int main()
  21. {
  22.        
  23.        

  24.        

  25.           SystemInit();
  26.         delay_init(72);             //延時初始化
  27.         NVIC_Configuration();
  28.         uart_init(9600);   //串口初始化
  29.         //Timerx_Init(5000,7199);//10Khz的計(jì)數(shù)頻率,計(jì)數(shù)到5000為500ms
  30.           Timerx_Init(99,719);//10Khz的計(jì)數(shù)頻率,計(jì)數(shù)到50為1ms
  31.           OLED_Init();
  32.         Init_DS1302();
  33.         LED_Init();
  34.    DS18B20_Init();
  35.        
  36.          KEY_Init();
  37.         delay_ms(50);
  38.                 RefreshTime();        //刷新時間
  39.         RefreshDate(1);        //立即刷新日期
  40.         RefreshTemp(1); //立即刷新溫度顯示
  41.         RefreshLunarn();


  42.          while(1)
  43.          {  


  44.                  
  45.                  
  46.                         KeyScan();//按鍵掃描
  47.             KeyDriver();        //按鍵檢測
  48.                 if(flag200ms)        //200ms時間到
  49.                 {
  50.                         flag200ms = 0;        //清零標(biāo)志位
  51.                         AlarmMonitor(); //監(jiān)控鬧鐘
  52.                         if (staSystem == E_NORMAL)//如果系統(tǒng)正常運(yùn)行
  53.                         {
  54.                                 RefreshTime(); //刷新時間
  55.                                 RefreshDate(0);//刷新日期
  56.                            RefreshLunarn();//刷新主界面農(nóng)歷
  57.                         }
  58.                         if (staSystem == Dis_Alarm)
  59.                         {
  60.                                 RefreshLunar(); //刷新陰歷
  61.                         }
  62.                 }       
  63.                 if(flag1s && (staSystem == E_NORMAL))//1s時間到并且系統(tǒng)為正常運(yùn)行
  64.                 {
  65.                         flag1s = 0;//清零標(biāo)志位
  66.                         RefreshTemp(0);//刷新溫度       
  67.                 }




  68.         }
  69.    
  70. }


  71. /* 溫度刷新函數(shù),讀取當(dāng)前溫度并根據(jù)需要刷新液晶顯示,
  72. ** ops-刷新選項(xiàng):為0時只當(dāng)溫度變化才刷新,非0則立即刷新 */
  73. void RefreshTemp(uint8_t ops)
  74. {
  75.     short temp;
  76.   
  77.     static int16_t backup = 0;
  78.    
  79.    temp=DS18B20_Get_Temp(); //獲取當(dāng)前溫度值
  80.     //DS18B20_Start();        //啟動下一次轉(zhuǎn)換
  81.     //temp >>= 4;          //舍棄4bit小數(shù)位

  82.    
  83.     if ((backup!=temp) || (ops!=0)) //按需要刷新液晶顯示
  84.     {
  85.                

  86.                      if(temp/10 > 0)
  87.                         OLED_P8x16Str(80,6,temp/100);  //顯示溫度十位
  88.                 else
  89.                         OLED_P8x16Str(80,6,12);             //否則溫度十位為0不顯示
  90.                 OLED_P8x16Str(88,6,temp % 100/10);  //顯示溫度個位
  91.                 OLED_P8x16Str(96,6,14);                   //顯示小數(shù)點(diǎn)
  92.                 OLED_P8x16Str(104,6,temp % 10); //顯示溫度小數(shù)第1位
  93.                 OLED_ShowCHinese(112,6,14);                   //顯示℃符號
  94.                 OLED_ShowCHinese(96, 0, 43);         //顯示星期
  95.     OLED_ShowCHinese(64,6,21);                   //顯示溫度圖標(biāo)  大
  96.          //RefreshLunarn();//刷新主界面農(nóng)歷
  97.                 temp= 0;
  98.                 backup = temp;             //刷新上次溫度值

  99.     }
  100. }

  101. void TIM3_IRQHandler(void)   //TIM3中斷
  102. {
  103.                 static uint8_t tmr1s = 0;
  104.     static uint8_t tmr200ms = 0;
  105.        
  106.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發(fā)生與否:TIM 中斷源
  107.                 {
  108.                 TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中斷待處理位:TIM 中斷源



  109.         tmr200ms++;  //定時200ms
  110.     if (tmr200ms >= 1)
  111.     {
  112.         tmr200ms = 0;
  113.         flag200ms = 1;
  114.         tmr1s++;  //定時1s
  115.         if (tmr1s >= 5)
  116.         {
  117.             tmr1s = 0;
  118.             flag1s = 1;
  119.         }
  120.     }
  121.         //KeyScan();//按鍵掃描
  122.                        

  123.                 }
  124. }
復(fù)制代碼

所有代碼51hei附件下載:
51黑論壇OLED萬年歷.7z (211.71 KB, 下載次數(shù): 660)


作者: 觸景情傷    時間: 2021-10-2 21:15
大佬能弄個ds3231的嗎?1302的精度不靠譜哇
作者: qitahao    時間: 2021-10-21 23:22
無需修改程序可應(yīng)用到2.42寸SSD1309驅(qū)動的OLED屏上

IMG_20211021_225353.jpg (2.02 MB, 下載次數(shù): 58)

IMG_20211021_225353.jpg

作者: qitahao    時間: 2021-11-3 01:18
DS3231高精度帶溫度時鐘萬年歷在2.42寸SSD1309驅(qū)動的OLED正常顯示,也能應(yīng)用在中景園的0.96OLED屏上

2.42OLED萬年歷DS3231.7z

214.03 KB, 下載次數(shù): 130, 下載積分: 黑幣 -5


作者: qitahao    時間: 2021-11-3 01:22
觸景情傷 發(fā)表于 2021-10-2 21:15
大佬能弄個ds3231的嗎?1302的精度不靠譜哇

弄了個ds3231的程序
作者: S_camp    時間: 2021-12-19 01:57
#include "ds18b20.h" 這個頭文件怎么能調(diào)用上,我想與其他芯片通訊
作者: snail_hill    時間: 2021-12-25 16:05
現(xiàn)在的芯片好買嗎?
作者: ghrhdhtgh    時間: 2022-3-30 21:57
樓主可以給一份引腳連接圖嗎?不然看著很懵圈啊
作者: qq749249634    時間: 2025-2-12 11:19
里面可以按鍵設(shè)置嗎
作者: allen98    時間: 2025-2-19 19:33
你們都正常嗎,為什么我寫入時間的時候讀取的時間除了年份是2099其他都正常呢
作者: yingfeng202067    時間: 2025-3-25 20:41
為啥我下載程序后沒有顯示啊,STM32103FC8T6,7針OLED顯示屏;代碼編譯沒有錯誤


作者: sping999    時間: 2025-4-4 22:07
請教一下,怎么把DS1302的時間,通過一個模塊語音播報(bào)出來?
作者: 七彩的夢想    時間: 2025-4-8 23:07
好資料先收藏起來,方便學(xué)習(xí)用




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1