找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6327|回复: 2
收起左侧

使用stm32和esp8266以及DS1302的开机自动网络授时的时钟程序

  [复制链接]
ID:138008 发表于 2019-5-8 14:12 | 显示全部楼层 |阅读模式
采用stm32f10制作了一个网络授时时钟,通过连接esp8266获得网络上的北京时间,使用www点k780点com提供的免费api,有兴趣的小伙伴们,可以去官方研究下。这里简要的说一下制作这个网络授时时钟的思路,大概就是先使用串口调试助手调试好esp8266的波特率、工作模式等,然后将其连接入家庭的路由器,或者开启手机热点让esp8266连接进去。我这里设置其波特率为115200,工作模式为AP模式。设置好这些基本的参数之后,就是开启单连接模式,连接入远程的tcp服务器,开启透传模式,发送get+数据商提供的key,获得北京时间的JSON信息,然后采用cJSON库进行,json的数据解析工作,可以解析出北京时间,然后再将得到的时间更新给DS1302模块,之后就开始不停的从DS1302模块里面获取时间了。当然大家感兴趣的。还可以获取天气等信息呢。

制作出来的实物图如下:

OLED显示屏显示时间

OLED显示屏显示时间

整体图

整体图

wifi模块

wifi模块

DS1302

DS1302

单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"                           
  5. #include "key.h"     
  6. #include "malloc.h"        
  7. #include "usart3.h"
  8. #include "wifista.h"
  9. #include "weather.h"
  10. #include "cJSON.h"
  11. #include "ds1302.h"
  12. #include "oled12864.h"


  13. void show_time(void);
  14. u8 IntegralPointFlag = 0;

  15. int main(void)
  16. {         
  17.         u8 key;
  18.         u16 t=0;
  19.         u8 constate=0;                         // 连接状态
  20.         delay_init();                     // 延时函数初始化         
  21.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  22.         uart_init(115200);                 // 串口初始化为115200
  23.         
  24.          LED_Init();                                          //初始化与LED连接的硬件接口
  25.          
  26.         KEY_Init();                                        //初始化按键
  27.         usart3_init(115200);                //初始化串口3

  28.         DS1302_Init();
  29.          
  30.         OLED_Init();
  31. //         Step_Num
  32.         OLED_P8x16Num(0,0,1);  // 显示屏初始化
  33.         OLED_P8x16Num(8,0,9);
  34.         OLED_P8x16Str(16,0,"-");
  35.         OLED_P8x16Num(24,0,0);
  36.         OLED_P8x16Num(32,0,5);
  37.         OLED_P8x16Str(40,0,"-");
  38.         OLED_P8x16Num(48,0,0);
  39.         OLED_P8x16Num(56,0,7);


  40.         OLED_P8x16Num(64,2,2);
  41.         OLED_P8x16Num(72,2,2);
  42.         OLED_P8x16Str(80,2,":");
  43.         OLED_P8x16Num(88,2,2);
  44.         OLED_P8x16Num(96,2,9);
  45.         OLED_P8x16Str(104,2,":");
  46.         OLED_P8x16Num(112,2,1);
  47.         OLED_P8x16Num(120,2,9);
  48.         
  49.         delay_ms(200);


  50.         atk_8266_wifista_config();
  51.         
  52.         printf("wifi init ok!");
  53.         
  54.         delay_ms(1000);

  55.         get_beijing_time();
  56.         
  57.         delay_ms(1000);
  58.         delay_ms(1000);
  59.         
  60.         get_beijing_time();
  61.         delay_ms(1000);
  62.         
  63.         printf("Time: %d-%d-%d  %d:%d:%d\r\n",nwt.year,nwt.month,nwt.date,nwt.hour,nwt.min,nwt.sec);
  64.         DS1302_Write_Time();

  65.         
  66.         while(1)
  67.         {
  68. // DS1302_Get_Time(time);
  69.                
  70.                 key = KEY_Scan(0);
  71.                 if(key==WKUP_PRES)
  72.                 {
  73.                         get_beijing_time();
  74.                         printf("Time: %d-%d-%d  %d:%d:%d\r\n",nwt.year,nwt.month,nwt.date,nwt.hour,nwt.min,nwt.sec);
  75.                         DS1302_Write_Time();
  76.                 }
  77.                 delay_ms(10);
  78.                 t++;
  79.                 if(t==1000)
  80.                 {
  81.                         constate=atk_8266_consta_check();//得到连接状态         
  82.                         t=0;
  83.                 }
  84.                 else if((t%100)==0)
  85.                 {
  86.                         LED1 = !LED1;
  87.                         show_time();
  88.                 }
  89.                 atk_8266_at_response(1);
  90.         }
  91. }

  92. void show_time(void)
  93. {
  94. //                DS1302_Read_Time();
  95. //                printf("%d-%d-%d  %d:%d:%d\r\n",nwt.year,nwt.month,nwt.date,nwt.hour,nwt.min,nwt.sec);
  96.                 u8 time[15];
  97.                 DS1302_Get_Time(time);
  98. //                printf("%d%d%d%d年%d%d月%d%d日 ", time[0],time[1],time[2],time[3],time[4],time[5],time[6],time[7]);
  99. //                printf("%d%d时%d%d分%d%d秒 星期%d\n", time[9],time[10],time[11],time[12],time[13],time[14],time[8]);

  100.         OLED_P8x16Num(0,0,time[2]);  
  101.         OLED_P8x16Num(8,0,time[3]);
  102.         OLED_P8x16Num(24,0,time[4]);
  103.         OLED_P8x16Num(32,0,time[5]);
  104.         OLED_P8x16Num(48,0,time[6]);
  105.         OLED_P8x16Num(56,0,time[7]);
  106.         
  107.         OLED_P8x16Num(64,2,time[9]);
  108.         OLED_P8x16Num(72,2,time[10]);
  109.         
  110.         OLED_P8x16Num(88,2,time[11]);
  111.         OLED_P8x16Num(96,2,time[12]);
  112.         
  113.         OLED_P8x16Num(112,2,time[13]);
  114.         OLED_P8x16Num(120,2,time[14]);

  115.         // 判断分钟为0  秒 小于等于 3 则可以判断 当前时间为整点  启动报时
  116.         if(time[11] == 0 && time[12] == 0 && time[13] == 0 && time[14] <= 1)
  117.         {
  118.                         
  119.                
  120.                
  121.         }
  122. }
复制代码

所有资料51hei提供下载:
ESP8266.7z (474.02 KB, 下载次数: 197)

评分

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

查看全部评分

回复

使用道具 举报

ID:142699 发表于 2019-11-11 17:37 | 显示全部楼层
原子的代码移植真是太麻烦了,一点都不方便.
回复

使用道具 举报

ID:1046983 发表于 2022-10-11 10:42 | 显示全部楼层
太棒了,收藏了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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