采用stm32f103c8t6制作了一个网络时钟,通过连接esp8266获得网络上的北京时间。这里提供一个数据的接口地址,如果大家有兴趣学习一下的话,可以打开这个地址注册一下申请一个接口:nowapicom/api
这里简要的说一下制作这个网络授时时钟的思路,大概就是先使用串口调试助手调试好esp8266的波特率、工作模式等,然后将其连接入家庭的路由器,或者开启手机热点让esp8266连接进去。我这里设置其波特率为115200,工作模式为AP模式。设置好这些基本的参数之后,就是开启单连接模式,连接入远程的tcp服务器,开启透传模式,发送get+数据商提供的key,获得北京时间的信息,通过串口接收再数据处理获得准确的北京时间。之后通过stm32自带的rtc时钟进行走时,不需要实时接收,只需要在开机的时候接收即可。
注意:程序中使用了中文的显示,可能oled也和各位的不匹配,如有用到的麻烦自己进行修改调试。同时注意供电的稳定!
stm32单片机源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "oled.h"
- #include "key.h"
- #include "flash.h"
- #include "malloc.h"
- #include "usart.h"
- #include "text.h"
- #include "esp8266.h"
- #include "RTC.h"
- extern _calendar_obj calendar;
- void display_week(void);
- int main(void)
- {
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
- uart_init(115200); //串口初始化为9600
- OLED_Init(); //初始化液晶
- LED_Init(); //LED初始化
- KEY_Init(); //按键初始化
- mem_init(); //初始化内存池
- OLED_Init(); //初始化OLED
- OLED_Clear();
- esp8266_init();
- esp8266_get_shijian();
- esp8266_get_time();
- dispose_time_data();
- RTC_Init();
- while(font_init()) //字体初始化
- {
- OLED_ShowString(0,0,"chinese init error!!",16);
- }
- Show_Str(32,0,"年",16,0);
- Show_Str(64,0,"月",16,0);
- Show_Str(96,0,"日",16,0);
- Show_Str(0,2,"日一二三四五六",16,0);
- Show_Str(16,4,": :",16,0);
- display_week();
- while(1)
- {
- OLED_ShowNum(0,0,calendar.w_year,4,16);//年
- OLED_ShowNum(48,0,calendar.w_month,2,16);//月
- OLED_ShowNum(80,0,calendar.w_date,2,16);//日
- OLED_ShowNum(0,4,calendar.hour,2,16);//时
- OLED_ShowNum(24,4,calendar.min,2,16);//分
- OLED_ShowNum(48,4,calendar.sec,2,16);//秒
- if((calendar.hour==0)&&(calendar.min==0)&&(calendar.sec==0))
- {
- calendar.week+=1;
- if(calendar.week==8) calendar.week=1;
- display_week();
- }
- }
- }
- void display_week(void)
- {
- switch(calendar.week)
- {
- case(1):Show_Str(16,2,"一",16,1);break;
- case(2):Show_Str(32,2,"二",16,1);break;
- case(3):Show_Str(48,2,"三",16,1);break;
- case(4):Show_Str(64,2,"四",16,1);break;
- case(5):Show_Str(80,2,"五",16,1);break;
- case(6):Show_Str(96,2,"六",16,1);break;
- case(7):Show_Str(0,2,"日",16,1);break;
- }
- }
复制代码
由于某些原因附件中的程序源码已经删掉部分内容,不能直接使用,仅供学习参考:
代码片段下载:
程序源码.rar
(373.47 KB, 下载次数: 513)
|