找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 11021|回復(fù): 19
收起左側(cè)

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

  [復(fù)制鏈接]
ID:489769 發(fā)表于 2019-3-14 15:24 | 顯示全部樓層 |閱讀模式
前段時(shí)間t 寶買(mǎi)了個(gè)創(chuàng)意旋轉(zhuǎn)時(shí)鐘
旋轉(zhuǎn)鐘.png
用了一段時(shí)間感覺(jué)走時(shí)不準(zhǔn), 打算加個(gè)自動(dòng)校時(shí)功能就自己重寫(xiě)了單片機(jī)程序并配了個(gè)ESP8266的模塊
現(xiàn)在終于不用再手工校對(duì)時(shí)間了,而且還有18650電池,可以充電

NClock1.jpg NClock2.jpg

單片機(jī)程序
  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é)個(gè)數(shù)
  17.     uint8        receCount;            //接收到的字節(jié)個(gè)數(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;                //定時(shí)器1時(shí)鐘為Fosc/12,即12T
  104. //        AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
  105. //        TMOD &= 0x0F;                //清除定時(shí)器1模式位
  106. //        TMOD |= 0x20;                //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
  107. //        TL1 = 0xFF;                //設(shè)定定時(shí)初值
  108. //        TH1 = 0xFF;                //設(shè)定定時(shí)器重裝值
  109. //        ET1 = 0;                //禁止定時(shí)器1中斷
  110. //        TR1 = 1;                //啟動(dòng)定時(shí)器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;                //定時(shí)器1時(shí)鐘為Fosc/12,即12T
  118. //        AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
  119. //        TMOD &= 0x0F;                //清除定時(shí)器1模式位
  120. //        TMOD |= 0x20;                //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
  121. //        TL1 = 0xFD;                //設(shè)定定時(shí)初值
  122. //        TH1 = 0xFD;                //設(shè)定定時(shí)器重裝值
  123. //        ET1 = 0;                //禁止定時(shí)器1中斷
  124. //        TR1 = 1;                //啟動(dòng)定時(shí)器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;                //定時(shí)器1時(shí)鐘為Fosc/12,即12T
  132.         AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
  133.         TMOD &= 0x0F;                //清除定時(shí)器1模式位
  134.         TMOD |= 0x20;                //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
  135.         TL1 = 0xFA;                //設(shè)定定時(shí)初值
  136.         TH1 = 0xFA;                //設(shè)定定時(shí)器重裝值
  137.         ET1 = 0;                //禁止定時(shí)器1中斷
  138.         TR1 = 1;                //啟動(dòng)定時(shí)器1
  139.     ES=1;
  140. }


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

  151. void Timer0Init(void)                //25毫秒@22.1184MHz
  152. {
  153.         AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
  154.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  155.         TL0 = 0x00;                //設(shè)置定時(shí)初值
  156.         TH0 = 0x4C;                //設(shè)置定時(shí)初值
  157.         TF0 = 0;                //清除TF0標(biāo)志
  158.         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  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;    //通訊超時(shí)值
  276. ……………………

  277. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:406598 發(fā)表于 2019-3-16 09:24 | 顯示全部樓層
樓主 這個(gè)需要連手機(jī)  用網(wǎng)絡(luò)校準(zhǔn)嗎?那個(gè)基于安卓什么意思
回復(fù)

使用道具 舉報(bào)

ID:489769 發(fā)表于 2019-3-19 11:14 | 顯示全部樓層
鳳的情緒 發(fā)表于 2019-3-16 09:24
樓主 這個(gè)需要連手機(jī)  用網(wǎng)絡(luò)校準(zhǔn)嗎?那個(gè)基于安卓什么意思

Arduino 不是安卓哦, 這個(gè)不需要手機(jī)的,只要有wifi就可以
回復(fù)

使用道具 舉報(bào)

ID:374219 發(fā)表于 2019-3-24 09:51 | 顯示全部樓層
沒(méi)有圖紙嗎
回復(fù)

使用道具 舉報(bào)

ID:67537 發(fā)表于 2019-5-9 14:34 | 顯示全部樓層
沒(méi)有看懂,為什么還要用單獨(dú)的單片機(jī)和DS1302,8266完全可以勝任還節(jié)省器件
回復(fù)

使用道具 舉報(bào)

ID:12816 發(fā)表于 2019-5-16 13:06 | 顯示全部樓層
你這程序外圈不會(huì)亮吧
回復(fù)

使用道具 舉報(bào)

ID:565553 發(fā)表于 2019-6-18 11:56 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:615301 發(fā)表于 2020-6-3 21:16 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:26508 發(fā)表于 2020-6-6 21:57 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:103696 發(fā)表于 2020-6-7 12:46 | 顯示全部樓層
其實(shí)直接用NodeMCU就行啦,要驅(qū)動(dòng)LED只要加HC595就行,根本不用用STC單片機(jī)
回復(fù)

使用道具 舉報(bào)

ID:64253 發(fā)表于 2020-8-12 10:56 | 顯示全部樓層
看了半天沒(méi)研究出個(gè)啥,
回復(fù)

使用道具 舉報(bào)

ID:800754 發(fā)表于 2021-5-8 14:09 | 顯示全部樓層
太好了,有個(gè)同樣的鬧鐘
回復(fù)

使用道具 舉報(bào)

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

回復(fù)

使用道具 舉報(bào)

ID:242753 發(fā)表于 2021-5-9 10:14 | 顯示全部樓層
增加自動(dòng)校時(shí),是個(gè)不錯(cuò)的主意!
回復(fù)

使用道具 舉報(bào)

ID:622100 發(fā)表于 2021-6-20 12:37 | 顯示全部樓層
yyhhgg 發(fā)表于 2019-5-9 14:34
沒(méi)有看懂,為什么還要用單獨(dú)的單片機(jī)和DS1302,8266完全可以勝任還節(jié)省器件

樓主是不想放棄這個(gè)時(shí)鐘外圈的燈效吧
回復(fù)

使用道具 舉報(bào)

ID:79874 發(fā)表于 2023-3-23 05:28 來(lái)自手機(jī) | 顯示全部樓層
能提供下設(shè)計(jì)資料嗎
回復(fù)

使用道具 舉報(bào)

ID:106272 發(fā)表于 2023-4-4 21:41 | 顯示全部樓層
好東西,標(biāo)記一下
回復(fù)

使用道具 舉報(bào)

ID:1112603 發(fā)表于 2024-5-5 16:09 | 顯示全部樓層
這玩意兒誤差太大,加個(gè)網(wǎng)絡(luò)校時(shí)功能廢物再利用,還不錯(cuò)。
回復(fù)

使用道具 舉報(bào)

ID:76044 發(fā)表于 2024-5-23 17:08 | 顯示全部樓層
樓主,能否指點(diǎn)一下,我制作的時(shí)鐘是DS1302走時(shí),8266網(wǎng)絡(luò)單片機(jī)串口接收校準(zhǔn),它們之間如何轉(zhuǎn)換,我發(fā)現(xiàn)DS1302是16進(jìn)制,8266串口接收是十進(jìn)制,我一直沒(méi)搞定不知如何轉(zhuǎn)換,單獨(dú)的程序都可以用,請(qǐng)樓主不吝賜教
回復(fù)

使用道具 舉報(bào)

ID:1043730 發(fā)表于 2024-5-25 12:49 | 顯示全部樓層
哇,謝謝樓主,我也要做一個(gè)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

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

快速回復(fù) 返回頂部 返回列表