STM32万年历制作指南
一、概述
STM32是一种常用的微控制器,具有强大的处理能力和低功耗特性,非常适合用于制作各种电子设备。本文将介绍如何使用STM32制作一款简易的万年历,帮助您轻松查看日期、时间和农历等信息。
二、所需材料
1. STM32微控制器(建议使用STM32F103C8型号)
2. 液晶显示屏(LCD或OLED)
3. 按键或触摸屏
4. 农历数据(可通过网络下载或购买已编译好的数据文件)
5. 杜邦线、螺丝刀等必备工具
三、制作步骤
1. 连接硬件:将STM32微控制器与液晶显示屏通过杜邦线连接,按键或触摸屏接入STM32的GPIO口。
2. 编写程序:编写STM32程序,实现读取农历数据、显示日期、时间、星期几和节气等信息。程序应包括中断服务程序,用于处理按键或触摸屏输入。
1)代码
int main() { delay_init(); //延时函数初始化 NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 LED_Init(); //LED端口初始化 OLED_Init(); //初始化OLED OLED_Clear() ; USART_Config(); Key_GPIO_Config(); /* 配置RTC秒中断优先级 */ RTC_NVIC_Config(); RTC_CheckAndConfig(&systmtime); while (1) { /* 每过1s 更新一次时间*/ if (TimeDisplay == 1) { /* 当前时间 */ Time_Display( RTC_GetCounter(),&systmtime); TimeDisplay = 0; } //按下按键,通过串口修改时间 if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON ) { struct rtc_time set_time; /*使用串口接收设置的时间,输入数字时注意末尾要加回车*/ Time_Regulate_Get(&set_time); /*用接收到的时间设置RTC*/ Time_Adjust(&set_time); //向备份寄存器写入标志 BKP_WriteBackupRegister(RTC_BKP_DRX, RTC_BKP_DATA); } } }
主函数就这么多,比较简单,就是初始化了一下OLED,配置了一下RTC,这些代码都比较好找到,下面来看看Time_display的具体代码:
/* * 函数名:Time_Display * 描述 :显示当前时间值 * 输入 :-TimeVar RTC计数值,单位为 s * 输出 :无 * 调用 :内部调用 */ void Time_Display(uint32_t TimeVar,struct rtc_time *tm) { static uint32_t FirstDisplay = 1; uint32_t BJ_TimeVar; uint8_t str[200]; // 字符串暂存 /* 把标准时间转换为北京时间*/ BJ_TimeVar =TimeVar + TIME_ZOOM; to_tm(BJ_TimeVar, tm);/*把定时器的值转换为北京时间*/ if((!tm->tm_hour && !tm->tm_min && !tm->tm_sec) || (FirstDisplay)) { GetChinaCalendar((u16)tm->tm_year, (u8)tm->tm_mon, (u8)tm->tm_mday, str); printf("\r\n 今天新历:%0.2d%0.2d,%0.2d,%0.2d", str[0], str[1], str[2], str[3]); OLED_ShowString(1,0,"RTC",16); OLED_ShowCHinese(28,0,0);//景 OLED_ShowCHinese(46,0,1);//园 OLED_ShowCHinese(64,0,2);//电 OLED_ShowCHinese(82,0,3);//子 OLED_ShowString(1,2,"Design by ZF",16); // OLED_ShowCHinese(88,0,5);//科 // OLED_ShowCHinese(104,0,6);//技 GetChinaCalendarStr((u16)tm->tm_year,(u8)tm->tm_mon,(u8)tm->tm_mday,str); printf("\r\n 今天农历:%s\r\n", str); if(GetJieQiStr((u16)tm->tm_year, (u8)tm->tm_mon, (u8)tm->tm_mday, str)) printf("\r\n 今天农历:%s\r\n", str); FirstDisplay = 0; } /* 输出时间戳,公历时间 */ printf(" UNIX时间戳 = %d 当前时间为: %d年(%s年) %d月 %d日 (星期%s) %0.2d:%0.2d:%0.2d\r",TimeVar, tm->tm_year, zodiac_sign[(tm->tm_year-3)%12], tm->tm_mon, tm->tm_mday, WEEK_STR[tm->tm_wday], tm->tm_hour, tm->tm_min, tm->tm_sec); OLED_ShowNum(0,4,tm->tm_year,4,16); OLED_ShowCHinese(33,4,4);//电 OLED_ShowNum(51,4,tm->tm_mon,2,16); OLED_ShowCHinese(69,4,5);//电 OLED_ShowNum(87,4,tm->tm_mday,2,16); OLED_ShowCHinese(105,4,6);//电 OLED_ShowNum(0,6,tm->tm_hour,2,16); OLED_ShowString(18,6,":",16); OLED_ShowNum(37,6,tm->tm_min,2,16); OLED_ShowString(55,6,":",16); OLED_ShowNum(74,6,tm->tm_sec,2,16); }
3. 调试与优化:进行程序调试和优化,确保万年历能够正确显示信息。
4. 连接电源:为STM32和液晶显示屏等硬件连接电源。
5. 包装测试:完成以上步骤后,对万年历进行包装,并进行测试,确保其正常运行。
四、注意事项
1. 在下载农历数据时,请确保数据来源可靠,以免中毒或使用盗版数据。
2. 在连接液晶显示屏时,请务必使用绝缘胶带固定线缆,以防短路。
3. 在调试和优化程序时,请备份原始程序,以防意外丢失数据。
五、功能扩展
1. 添加时间提醒功能:可设置闹钟,在特定日期或节气前提醒用户。
2. 显示更多信息:如公历闰年、农历闰月、节气名称等。
3. 蓝牙或WiFi通信:可通过蓝牙或WiFi从互联网获取最新农历数据,实现实时更新。文章来源:https://www.toymoban.com/news/detail-768972.html
文章来源地址https://www.toymoban.com/news/detail-768972.html
到了这里,关于STM32制作万年历的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!