找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11186|回復: 19
打印 上一主題 下一主題
收起左側(cè)

買的創(chuàng)意旋轉(zhuǎn)時鐘,自己添加ESP8266網(wǎng)絡自動校時功能 附程序

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:489769 發(fā)表于 2019-3-14 15:24 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
前段時間t 寶買了個創(chuàng)意旋轉(zhuǎn)時鐘

用了一段時間感覺走時不準, 打算加個自動校時功能就自己重寫了單片機程序并配了個ESP8266的模塊
現(xiàn)在終于不用再手工校對時間了,而且還有18650電池,可以充電



單片機程序
  1. #include <global.h>
  2. #include <stdio.h>
  3. #include "DS1302.h"
  4. #include "DS18B20.h"

  5. //-----------------------------------------------

  6. /* define constants */
  7. #define FOSC 12000000
  8. #define BAUD 19200           //UART baudrate

  9. bit UpdateDisp,UpdateTime,ShowTemp,CapTemp,TempChange,UpdateMsg,ShowFlag;

  10. static uint8 ss=0;
  11. static uint16 ms=0;

  12. #define CommBufSize 0x3F
  13. struct tcomm_buf{
  14.     uint8 sendBuf[CommBufSize],receBuf[CommBufSize];
  15.     uint8        receTimeOut;
  16.     uint8        sendCount;                //發(fā)送字節(jié)個數(shù)
  17.     uint8        receCount;            //接收到的字節(jié)個數(shù)
  18.     uint8        sendPosi;            //發(fā)送位置
  19. };

  20. struct tcomm_buf xdata comm1_data;
  21. /*
  22. void Delay1ms()                //@12.000MHz
  23. {
  24.         unsigned char i, j;

  25.         i = 2;
  26.         j = 239;
  27.         do
  28.         {
  29.                 while (--j);
  30.         } while (--i);
  31. }
  32. void Delayms(uint16 c)                //@12.000MHz
  33. {
  34.         while(c--)
  35.         Delay1ms();
  36. }
  37. */

  38. void Uart_Check(void);

  39. void UpdateLed(void){
  40.     P3= P3|0xF0;  //高四位數(shù)碼管  P3.1 P3.2 串口  P3.2  MODE  P3.3 Plus      
  41.     P2=0xFF;
  42.     P0=~(1<<(sec%8));  //Led/數(shù)碼管公用IO
  43.     P2=~(1<<(sec/8));  //led
  44. }

  45. const uint8 NixieMap[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x9C,0xFF};


  46. void UpdateNixie(uint8 l){
  47.     int8 tmpVal;
  48.     P2=0xFF;  //led
  49.     P3=(P3|0xF0);
  50.     P0= 0xFF;
  51.     if(ShowTemp){
  52.         switch(l){
  53.             case 0:
  54.                 tmpVal = Temp1/10;
  55.                 break;
  56.             case 1:
  57.                 tmpVal = Temp1%10;
  58.                 break;
  59.             case 2:
  60.                 tmpVal = 16;
  61.                 break;
  62.             case 3:
  63.                 tmpVal = 0x0C;
  64.                 break;
  65.         }
  66.         P0= NixieMap[tmpVal];  //Led/數(shù)碼管公用IO        
  67.     }
  68.     else
  69.     {  
  70.         switch(l){
  71.             case 0:
  72.                 tmpVal =  hour/10;
  73.                 //P0= 0xC0;
  74.                 //P3=0xE0|(P3&0x0F);
  75.                 break;
  76.             case 1:
  77.                 tmpVal =  hour%10;
  78.                 //P0= 0xF9;
  79.                 //P3=0xD0|(P3&0x0F);
  80.                 break;
  81.             case 2:
  82.                 tmpVal = min/10;
  83.                 //P0= 0xA4;
  84.                 //P3=0xB0|(P3&0x0F);
  85.                 break;
  86.             case 3:
  87.                 tmpVal = min%10;
  88.                 //P0= 0xB0;
  89.                 //P3=0x70|(P3&0x0F);
  90.                 break;
  91.         }
  92.         if(l==1&&ShowFlag)
  93.             P0= NixieMap[tmpVal] & 0x7F;  //Led/數(shù)碼管公用IO
  94.         else
  95.             P0= NixieMap[tmpVal];  //Led/數(shù)碼管公用IO
  96.     }
  97.     P3=(~(1<<(l+4)))|(P3 & 0x0F);  //高四位數(shù)碼管  P3.0 P3.1 串口  P3.2  MODE  P3.3 Plus      
  98. }

  99. //void UartInit(void)                //115200bps@22.1184MHz
  100. //{
  101. //        PCON |= 0x80;                //使能波特率倍速位SMOD
  102. //        SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  103. //        AUXR &= 0xBF;                //定時器1時鐘為Fosc/12,即12T
  104. //        AUXR &= 0xFE;                //串口1選擇定時器1為波特率發(fā)生器
  105. //        TMOD &= 0x0F;                //清除定時器1模式位
  106. //        TMOD |= 0x20;                //設定定時器1為8位自動重裝方式
  107. //        TL1 = 0xFF;                //設定定時初值
  108. //        TH1 = 0xFF;                //設定定時器重裝值
  109. //        ET1 = 0;                //禁止定時器1中斷
  110. //        TR1 = 1;                //啟動定時器1
  111. //    ES=1;
  112. //}

  113. //void UartInit(void)                //19200bps@22.1184MHz
  114. //{
  115. //        PCON &= 0x7F;                //波特率不倍速
  116. //        SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  117. //        AUXR &= 0xBF;                //定時器1時鐘為Fosc/12,即12T
  118. //        AUXR &= 0xFE;                //串口1選擇定時器1為波特率發(fā)生器
  119. //        TMOD &= 0x0F;                //清除定時器1模式位
  120. //        TMOD |= 0x20;                //設定定時器1為8位自動重裝方式
  121. //        TL1 = 0xFD;                //設定定時初值
  122. //        TH1 = 0xFD;                //設定定時器重裝值
  123. //        ET1 = 0;                //禁止定時器1中斷
  124. //        TR1 = 1;                //啟動定時器1
  125. //    ES=1;
  126. //}

  127. void UartInit(void)                //9600bps@22.1184MHz
  128. {
  129.         PCON &= 0x7F;                //波特率不倍速
  130.         SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  131.         AUXR &= 0xBF;                //定時器1時鐘為Fosc/12,即12T
  132.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發(fā)生器
  133.         TMOD &= 0x0F;                //清除定時器1模式位
  134.         TMOD |= 0x20;                //設定定時器1為8位自動重裝方式
  135.         TL1 = 0xFA;                //設定定時初值
  136.         TH1 = 0xFA;                //設定定時器重裝值
  137.         ET1 = 0;                //禁止定時器1中斷
  138.         TR1 = 1;                //啟動定時器1
  139.     ES=1;
  140. }


  141. //void Timer0Init(void)                //1毫秒@22.1184MHz
  142. //{
  143. //        AUXR &= 0x7F;                //定時器時鐘12T模式
  144. //        TMOD &= 0xF0;                //設置定時器模式
  145. //        TL0 = 0x00;                //設置定時初值
  146. //        TH0 = 0xB8;                //設置定時初值
  147. //        TF0 = 0;                //清除TF0標志
  148. //        TR0 = 1;                //定時器0開始計時
  149. //    ET0 = 1;                        //enable timer0 interrupt   
  150. //}

  151. void Timer0Init(void)                //25毫秒@22.1184MHz
  152. {
  153.         AUXR &= 0x7F;                //定時器時鐘12T模式
  154.         TMOD &= 0xF0;                //設置定時器模式
  155.         TL0 = 0x00;                //設置定時初值
  156.         TH0 = 0x4C;                //設置定時初值
  157.         TF0 = 0;                //清除TF0標志
  158.         TR0 = 1;                //定時器0開始計時
  159.     ET0 = 1;                        //enable timer0 interrupt   
  160. }


  161. /* Timer0 interrupt routine */
  162. void tm0_isr() interrupt 1 using 1
  163. {
  164.     UpdateDisp=1;
  165.     ShowFlag = ms<122;
  166.     if(ms++>222){
  167.         ms=0;
  168.         sec++;
  169.         switch(sec%4){
  170.             case 1:
  171.                 TempChange=1;
  172.                 break;
  173.             case 2:
  174.                 CapTemp=1;
  175.                 break;
  176.             case 3:
  177.                 //ShowTemp=1;
  178.                 break;
  179.         }
  180.         
  181.         if(sec>=60){
  182.             sec=0;
  183.             UpdateTime=1;
  184.         }
  185.         if((sec%5)>=3){
  186.             ShowTemp=1;
  187.         }
  188.         else
  189.             ShowTemp=0;
  190.     }
  191. }

  192. void WaitMs(void){
  193.     while(UpdateDisp==0);
  194. }


  195. void main()
  196. {
  197.     P0=0xFF;  //Led/數(shù)碼管公用IO
  198.     P1=0xFF;  // 蜂鳴器  P1.0 18B20  P1.1 P1.2 P1.3  DS1302
  199.     P2=0xFF;  //led
  200.     P3=0xFF;  //高四位數(shù)碼管  P3.0 P3.1 串口  P3.2  MODE  P3.3 Plus  
  201.     ShowFlag = 0;
  202.     ShowTemp = 0;

  203.     comm1_data.sendCount=0;   
  204.     comm1_data.sendPosi=0;   

  205.         UartInit();
  206.     Timer0Init();

  207.     EA = 1;                 //Open master interrupt switch

  208.     printf("STC89-90xx\r\nUart Test !\r\n");
  209.     DS1302_readtime();
  210.    
  211. //    year=18;
  212. //    month=11;
  213. //    day=2;
  214. //    hour=14;
  215. //    min=32;
  216. //    sec=0;
  217. //   
  218. //    DS1302_Write();
  219.    
  220.     //P0=0x1;   
  221.     //uint8 c=1;
  222.     while(1){
  223.         Uart_Check();
  224.         UpdateNixie(0);
  225.         WaitMs();
  226.         UpdateNixie(1);
  227.         WaitMs();
  228.         UpdateNixie(2);
  229.         WaitMs();
  230.         UpdateNixie(3);
  231.         WaitMs();
  232.         UpdateLed();
  233.         if(UpdateTime){
  234.             UpdateTime=0;
  235.             DS1302_readtime();//sec,min,hour,day,month,week,year
  236.             printf("Update Time %02d-%02d-%02d  %02d:%02d:%02d\r\n",year,month,day,hour,min,sec);
  237.         }
  238.         if(TempChange){
  239.             TempChange=0;
  240.             Start_Change();
  241.         }        
  242.         if(CapTemp){
  243.             CapTemp=0;
  244.             Read_Temperature();
  245.         }        
  246. //        if(ShowTemp){
  247. //            ShowTemp=0;
  248. //            printf("Temperature: %.1f\r\n",Temp);
  249. //        }
  250.         WaitMs();
  251.     }
  252. }


  253. /*----------------------------
  254. UART interrupt service routine
  255. ----------------------------*/
  256. void Uart_Isr() interrupt 4 using 1
  257. {
  258.         if(TI)
  259.         {
  260.                 TI = 0;
  261.                 if(comm1_data.sendPosi < comm1_data.sendCount)
  262.                 {
  263.                         SBUF = comm1_data.sendBuf[comm1_data.sendPosi++];
  264.                 }
  265.                 else
  266.                 {
  267.             comm1_data.sendPosi = 0;
  268.             comm1_data.sendCount = 0;
  269.                         comm1_data.receCount = 0;   //清接收地址偏移寄存器
  270.                 }
  271.         }
  272.         else if(RI)
  273.         {
  274.                 RI = 0;
  275.                 comm1_data.receTimeOut = 5;    //通訊超時值
  276. ……………………

  277. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

NewClock.7z (15.95 KB, 下載次數(shù): 182)
esp8266程序(基于Arduino)
TimeNTP_ESP8266WiFi.7z (2.08 KB, 下載次數(shù): 179)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏15 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:406598 發(fā)表于 2019-3-16 09:24 | 只看該作者
樓主 這個需要連手機  用網(wǎng)絡校準嗎?那個基于安卓什么意思
回復

使用道具 舉報

板凳
ID:489769 發(fā)表于 2019-3-19 11:14 | 只看該作者
鳳的情緒 發(fā)表于 2019-3-16 09:24
樓主 這個需要連手機  用網(wǎng)絡校準嗎?那個基于安卓什么意思

Arduino 不是安卓哦, 這個不需要手機的,只要有wifi就可以
回復

使用道具 舉報

地板
ID:374219 發(fā)表于 2019-3-24 09:51 | 只看該作者
沒有圖紙嗎
回復

使用道具 舉報

5#
ID:67537 發(fā)表于 2019-5-9 14:34 | 只看該作者
沒有看懂,為什么還要用單獨的單片機和DS1302,8266完全可以勝任還節(jié)省器件
回復

使用道具 舉報

6#
ID:12816 發(fā)表于 2019-5-16 13:06 | 只看該作者
你這程序外圈不會亮吧
回復

使用道具 舉報

7#
ID:565553 發(fā)表于 2019-6-18 11:56 | 只看該作者
謝謝分享
回復

使用道具 舉報

8#
ID:615301 發(fā)表于 2020-6-3 21:16 | 只看該作者
謝謝分享
回復

使用道具 舉報

9#
ID:26508 發(fā)表于 2020-6-6 21:57 | 只看該作者
謝謝分享
回復

使用道具 舉報

10#
ID:103696 發(fā)表于 2020-6-7 12:46 | 只看該作者
其實直接用NodeMCU就行啦,要驅(qū)動LED只要加HC595就行,根本不用用STC單片機
回復

使用道具 舉報

11#
ID:64253 發(fā)表于 2020-8-12 10:56 | 只看該作者
看了半天沒研究出個啥,
回復

使用道具 舉報

12#
ID:800754 發(fā)表于 2021-5-8 14:09 | 只看該作者
太好了,有個同樣的鬧鐘
回復

使用道具 舉報

13#
ID:59830 發(fā)表于 2021-5-8 18:04 | 只看該作者
看了你改動的,硬件改動不大,也合理,挺好.
我也買過  測試了一下.
1. 18650 電池 (1600MA)  升壓5V   3天左右充一次電.
2. 蜂鳴器 聲音(嘀嘀響  赤耳).
3. 設置時間鬧鐘參數(shù)時   數(shù)碼管顯示(有些人不一定會調(diào)) 局限性,看說明書才會吧.
4. 如果 改時鐘DS3231 芯片,時間誤差小,價格貴些.
5.  好的地方  花樣燈  可以.
6.  好的地方 初學者練習焊接 動手能力 學習不錯.

回復

使用道具 舉報

14#
ID:242753 發(fā)表于 2021-5-9 10:14 | 只看該作者
增加自動校時,是個不錯的主意!
回復

使用道具 舉報

15#
ID:622100 發(fā)表于 2021-6-20 12:37 | 只看該作者
yyhhgg 發(fā)表于 2019-5-9 14:34
沒有看懂,為什么還要用單獨的單片機和DS1302,8266完全可以勝任還節(jié)省器件

樓主是不想放棄這個時鐘外圈的燈效吧
回復

使用道具 舉報

16#
ID:79874 發(fā)表于 2023-3-23 05:28 來自觸屏版 | 只看該作者
能提供下設計資料嗎
回復

使用道具 舉報

17#
ID:106272 發(fā)表于 2023-4-4 21:41 | 只看該作者
好東西,標記一下
回復

使用道具 舉報

18#
ID:1112603 發(fā)表于 2024-5-5 16:09 | 只看該作者
這玩意兒誤差太大,加個網(wǎng)絡校時功能廢物再利用,還不錯。
回復

使用道具 舉報

19#
ID:76044 發(fā)表于 2024-5-23 17:08 | 只看該作者
樓主,能否指點一下,我制作的時鐘是DS1302走時,8266網(wǎng)絡單片機串口接收校準,它們之間如何轉(zhuǎn)換,我發(fā)現(xiàn)DS1302是16進制,8266串口接收是十進制,我一直沒搞定不知如何轉(zhuǎn)換,單獨的程序都可以用,請樓主不吝賜教
回復

使用道具 舉報

20#
ID:1043730 發(fā)表于 2024-5-25 12:49 | 只看該作者
哇,謝謝樓主,我也要做一個
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表