制作出来的实物图如下:
![1.jpg 1.jpg](https://static.assets-stash.eet-china.com/forum/202110/17/184914gw6mxroy6zox67wr.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 } } }
复制代码