找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5653|回复: 7
收起左侧

STM32F103C8T6+DS1302+DS18B20+0.96OLED万年历程序

  [复制链接]
ID:269766 发表于 2021-9-30 12:44 | 显示全部楼层 |阅读模式
业余时间把论坛上一位大神的51单片机LCD12864万年历移植到STMC8T6+0.96OLED屏上,可按键设置时间日期闹钟,代码不规范,有一些暂时没发现的bug欢迎指教。

制作出来的实物图如下:
IMG_20210928_224204.jpg

单片机源程序如下:
  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;  //系统运行状态
  15. u8 flag1s = 0;    //1s定时标志位
  16. u8 flag200ms = 0; //200ms定时标志

  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的计数频率,计数到5000为500ms
  30.           Timerx_Init(99,719);//10Khz的计数频率,计数到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;        //清零标志位
  51.                         AlarmMonitor(); //监控闹钟
  52.                         if (staSystem == E_NORMAL)//如果系统正常运行
  53.                         {
  54.                                 RefreshTime(); //刷新时间
  55.                                 RefreshDate(0);//刷新日期
  56.                            RefreshLunarn();//刷新主界面农历
  57.                         }
  58.                         if (staSystem == Dis_Alarm)
  59.                         {
  60.                                 RefreshLunar(); //刷新阴历
  61.                         }
  62.                 }       
  63.                 if(flag1s && (staSystem == E_NORMAL))//1s时间到并且系统为正常运行
  64.                 {
  65.                         flag1s = 0;//清零标志位
  66.                         RefreshTemp(0);//刷新温度       
  67.                 }




  68.         }
  69.    
  70. }


  71. /* 温度刷新函数,读取当前温度并根据需要刷新液晶显示,
  72. ** ops-刷新选项:为0时只当温度变化才刷新,非0则立即刷新 */
  73. void RefreshTemp(uint8_t ops)
  74. {
  75.     short temp;
  76.   
  77.     static int16_t backup = 0;
  78.    
  79.    temp=DS18B20_Get_Temp(); //获取当前温度值
  80.     //DS18B20_Start();        //启动下一次转换
  81.     //temp >>= 4;          //舍弃4bit小数位

  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);                   //显示小数点
  92.                 OLED_P8x16Str(104,6,temp % 10); //显示温度小数第1位
  93.                 OLED_ShowCHinese(112,6,14);                   //显示℃符号
  94.                 OLED_ShowCHinese(96, 0, 43);         //显示星期
  95.     OLED_ShowCHinese(64,6,21);                   //显示温度图标  大
  96.          //RefreshLunarn();//刷新主界面农历
  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中断发生与否: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. }
复制代码

所有代码51hei附件下载:
51黑论坛OLED万年历.7z (211.71 KB, 下载次数: 633)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:229641 发表于 2021-10-2 21:15 来自手机 | 显示全部楼层
大佬能弄个ds3231的吗?1302的精度不靠谱哇
回复

使用道具 举报

ID:269766 发表于 2021-10-21 23:22 | 显示全部楼层
无需修改程序可应用到2.42寸SSD1309驱动的OLED屏上
IMG_20211021_225353.jpg

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:269766 发表于 2021-11-3 01:18 | 显示全部楼层
DS3231高精度带温度时钟万年历在2.42寸SSD1309驱动的OLED正常显示,也能应用在中景园的0.96OLED屏上

2.42OLED万年历DS3231.7z

214.03 KB, 下载次数: 127, 下载积分: 黑币 -5

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:269766 发表于 2021-11-3 01:22 | 显示全部楼层
触景情伤 发表于 2021-10-2 21:15
大佬能弄个ds3231的吗?1302的精度不靠谱哇

弄了个ds3231的程序
回复

使用道具 举报

ID:89537 发表于 2021-12-19 01:57 | 显示全部楼层
#include "ds18b20.h" 这个头文件怎么能调用上,我想与其他芯片通讯
回复

使用道具 举报

ID:845470 发表于 2021-12-25 16:05 | 显示全部楼层
现在的芯片好买吗?
回复

使用道具 举报

ID:717124 发表于 2022-3-30 21:57 | 显示全部楼层
楼主可以给一份引脚连接图吗?不然看着很懵圈啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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