久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

買的創意旋轉時鐘,自己添加ESP8266網絡自動校時功能 附程序

  [復制鏈接]
跳轉到指定樓層
樓主
前段時間t 寶買了個創意旋轉時鐘

用了一段時間感覺走時不準, 打算加個自動校時功能就自己重寫了單片機程序并配了個ESP8266的模塊
現在終于不用再手工校對時間了,而且還有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;                //發送字節個數
  17.     uint8        receCount;            //接收到的字節個數
  18.     uint8        sendPosi;            //發送位置
  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;  //高四位數碼管  P3.1 P3.2 串口  P3.2  MODE  P3.3 Plus      
  41.     P2=0xFF;
  42.     P0=~(1<<(sec%8));  //Led/數碼管公用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/數碼管公用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/數碼管公用IO
  94.         else
  95.             P0= NixieMap[tmpVal];  //Led/數碼管公用IO
  96.     }
  97.     P3=(~(1<<(l+4)))|(P3 & 0x0F);  //高四位數碼管  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位數據,可變波特率
  103. //        AUXR &= 0xBF;                //定時器1時鐘為Fosc/12,即12T
  104. //        AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  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位數據,可變波特率
  117. //        AUXR &= 0xBF;                //定時器1時鐘為Fosc/12,即12T
  118. //        AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  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位數據,可變波特率
  131.         AUXR &= 0xBF;                //定時器1時鐘為Fosc/12,即12T
  132.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  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/數碼管公用IO
  198.     P1=0xFF;  // 蜂鳴器  P1.0 18B20  P1.1 P1.2 P1.3  DS1302
  199.     P2=0xFF;  //led
  200.     P3=0xFF;  //高四位數碼管  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, 下載次數: 182)
esp8266程序(基于Arduino)
TimeNTP_ESP8266WiFi.7z (2.08 KB, 下載次數: 179)

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 伊人久久精品一区二区三区 | 久久久.com| 521av网站 | 国产精品1区2区 | 天堂成人国产精品一区 | 99精品视频一区二区三区 | 午夜小视频在线播放 | 亚洲视频在线免费观看 | 国产色网站 | 欧美日韩亚洲一区 | 欧美一区二区三区在线 | 在线免费看黄 | 中文字幕免费观看 | 在线欧美小视频 | 一区二区三区久久 | 午夜精品久久久久久久久久久久 | 国产日韩在线观看一区 | 在线免费黄色小视频 | 在线不卡av| 日韩午夜在线观看 | 亚洲视频在线一区 | 久久9久| 91就要激情| 国产福利资源在线 | 老牛嫩草一区二区三区av | www.天天操.com | 国产精品视频久久 | 国产精品久久久久久福利一牛影视 | 日韩精品一 | 国产精品视频综合 | 黄色一级网 | 久草成人| 成人超碰 | 美女在线视频一区二区三区 | 黄色片大全在线观看 | 亚洲超碰在线观看 | 天天躁日日躁狠狠很躁 | 中文字幕av网站 | 日本亚洲欧美 | 亚洲网一区| 日韩欧美在线免费 |