基于STM32F103的—DS3231+OLED0.96_IIC万年历时钟有温度显示!
制作出来的实物图如下:
1.jpg


单片机源程序如下:
#include "DS3231.h"
  • #include "i2c_soft.h"
  • #include "delay.h"
  • Calendar_OBJ calendar;
  • #define DS3231_WriteAddress                0xD0   
  • #define DS3231_ReadAddress                0xD1
  • //bcd转hex
  • u8 BCD2HEX(u8 val)
  • {
  •     u8 i;
  •     i= val&0x0f;
  •     val >>= 4;
  •     val &= 0x0f;
  •     val *= 10;
  •     i += val;
  •    
  •     return i;
  • }
  • u16 B_BCD(u8 val)
  • {
  •         u8 i,j,k;
  •         i=val/10;
  •         j=val%10;
  •         k=j+(i<<4);
  •         return k;
  • }
  • void DS3231_WR_Byte(u8 addr,u8 bytedata)
  • {
  •         I2C_Start();
  •         I2C_SendByte(DS3231_WriteAddress);
  •         I2C_WaitAck();
  •         I2C_SendByte(addr);
  •         I2C_WaitAck();
  •         I2C_SendByte(bytedata);
  •         I2C_WaitAck();
  •         I2C_Stop();
  • }      
  • u8 DS3231_RD_Byte(u8 addr)
  • {
  •         u8 Dat=0;
  •   
  •         I2C_Start();
  •         I2C_SendByte(DS3231_WriteAddress);
  •         I2C_WaitAck();
  •         I2C_SendByte(addr);
  •         I2C_WaitAck();
  •         I2C_Start();
  •         I2C_SendByte(DS3231_ReadAddress);
  •         I2C_WaitAck();
  •         Dat=I2C_ReceiveByte();
  •         I2C_Stop();
  •       
  •         return Dat;
  • }
  • //ds3231初始化函数
  • void DS3231_Init(void)
  • {
  •         I2C_GPIO_Config();
  •         DS3231_WR_Byte(0x0e,0);
  •         delay_ms(2);
  •     DS3231_WR_Byte(0x0f,0x0);
  •         delay_ms(2);
  • }
  • //DS3231初始化设置函数( 年 月 日 时 分 秒 周)
  • void Set_DS3231_Time(u8 yea,u8 mon,u8 da,u8 hou,u8 min,u8 sec,u8 week)
  • {
  •         u8 temp=0;
  •   
  •         temp=B_BCD(yea);
  •         DS3231_WR_Byte(0x06,temp);  
  •         temp=B_BCD(mon);
  •         DS3231_WR_Byte(0x05,temp);  
  •         temp=B_BCD(da);
  •         DS3231_WR_Byte(0x04,temp);
  •         temp=B_BCD(hou);
  •         DS3231_WR_Byte(0x02,temp);
  •         temp=B_BCD(min);
  •         DS3231_WR_Byte(0x01,temp);  
  •         temp=B_BCD(sec);
  •         DS3231_WR_Byte(0x00,temp);
  •         temp=B_BCD(week);
  •         DS3231_WR_Byte(0x03,temp);
  • }
  • void Get_DS3231_Time(void)
  • {
  •         calendar.w_year=DS3231_RD_Byte(0x06);  
  •         calendar.w_year=BCD2HEX(calendar.w_year);
  •         calendar.w_month=DS3231_RD_Byte(0x05);
  •         calendar.w_month=BCD2HEX(calendar.w_month);
  •         calendar.w_date=DS3231_RD_Byte(0x04);  
  •         calendar.w_date=BCD2HEX(calendar.w_date);
  •          
  •         calendar.hour=DS3231_RD_Byte(0x02);
  •         calendar.hour&=0x3f;                  
  •         calendar.hour=BCD2HEX(calendar.hour);
  •         calendar.min=DS3231_RD_Byte(0x01);
  •         calendar.min=BCD2HEX(calendar.min);
  •         calendar.sec=DS3231_RD_Byte(0x00);
  •         calendar.sec=BCD2HEX(calendar.sec);
  •       
  •         calendar.week=DS3231_RD_Byte(0x03);
  •         calendar.week=BCD2HEX(calendar.week);
  •       
  •         DS3231_WR_Byte(0x0e,0x20);
  •         calendar.temper_H=DS3231_RD_Byte(0x11);
  •         calendar.temper_L=(DS3231_RD_Byte(0x12)>>6)*25;
  • }
  • 复制代码
    #include "led.h"
  • #include "exti.h"
  • #include "oled.h"
  • #include "i2c_soft.h"
  • #include "DS3231.h"
  • #include "delay.h"
  • #include "sys.h"
  • #include "bmp.h"
  • int main(void)
  • {      
  •         u8 k=0;//*t=0,p=2,
  •       
  •         delay_init();                        //延时函数初始化         
  •         LED_Init();                                //初始化与LED连接的硬件接口
  •         I2C_GPIO_Config();
  •         EXTI_KEY_Config();
  •         DS3231_Init();
  •         //Set_DS3231_Time(21,10,16,9,21,00,6);//21年10月16号21分00秒周六 .第1次初始化DS3231使用后注销
  •         OLED_Init();
  •         OLED_Clear();
  •         //LED1_ON;                                //LED1 ON
  •                               
  •         while(1)
  •         {
  •                 Get_DS3231_Time();
  •                 if(k!=calendar.sec)
  •                 {
  •                         k=calendar.sec;                       
  •                         //显示日期
  •                         OLED_ShowString(0,0,"2",16); //显示年的千位字符2
  •                         OLED_ShowString(10,0,"0",16); //显示年的百位字符0
  •                         OLED_ShowChar(20,0,calendar.w_year/10+48,16);
  •                         OLED_ShowChar(31,0,calendar.w_year%10+48,16);
  •                         OLED_ShowCHinese(40,0,0);//在2列6行显示”年“
  •                         OLED_ShowChar(59,0,calendar.w_month/10+48,16);
  •                         OLED_ShowChar(68,0,calendar.w_month%10+48,16);
  •                         OLED_ShowCHinese(78,0,1);//在2列6行显示”月“
  •                         OLED_ShowChar(96,0,calendar.w_date/10+48,16);
  •                         OLED_ShowChar(105,0,calendar.w_date%10+48,16);
  •                         OLED_ShowCHinese(113,0,14);//在2列6行显示”日“
  •                         //显示时间
  •                         OLED_Show16X32(0,2,calendar.hour/10);
  •                         OLED_Show16X32(17,2,calendar.hour%10);
  •                         OLED_Show16X32(33,2,10);
  •                         OLED_Show16X32(48,2,calendar.min/10);
  •                         OLED_Show16X32(64,2,calendar.min%10);
  •                         OLED_Show16X32(80,2,10);
  •                         OLED_Show16X32(96,2,calendar.sec/10);
  •                         OLED_Show16X32(111,2,calendar.sec%10);
  •                        
  •                         //显示星期
  • //                        OLED_ShowCHinese(2,6,6);//在2列6行显示”星“
  • //                        OLED_ShowCHinese(18,6,7);//在18列6行显示”期“
  •                         OLED_ShowCHinese(0,6,2);//在2列6行显示”周“
  •                         OLED_ShowCHinese(20,6,calendar.week+7); //在34列6行显示”星期数“  
  •                         //显示温度数据
  •                         //OLED_ShowChar(70,6,127,16);                        //温度计图标
  •                         OLED_ShowCHinese(46,6,4);//在2列6行显示”温“
  •                         OLED_ShowCHinese(64,6,5);//在18列6行显示”度“
  •                         OLED_ShowChar(80,6,calendar.temper_H/10+48,16);//显示温度十位
  •                         OLED_ShowChar(89,6,calendar.temper_H%10+48,16);//显示温度个位
  •                         OLED_ShowString(97,6,".",16);//.点
  •                         OLED_ShowChar(104,6,calendar.temper_L/10+48,16);//显示小数
  •                         OLED_ShowCHinese(113,6,3);//温度C
  •                 }
  •         }
  • }      
  • 复制代码