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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11021|回復: 19
收起左側

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

  [復制鏈接]
ID:489769 發表于 2019-3-14 15:24 | 顯示全部樓層 |閱讀模式
前段時間t 寶買了個創意旋轉時鐘
旋轉鐘.png
用了一段時間感覺走時不準, 打算加個自動校時功能就自己重寫了單片機程序并配了個ESP8266的模塊
現在終于不用再手工校對時間了,而且還有18650電池,可以充電

NClock1.jpg NClock2.jpg

單片機程序
  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 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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 | 顯示全部樓層
沒有圖紙嗎
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:103696 發表于 2020-6-7 12:46 | 顯示全部樓層
其實直接用NodeMCU就行啦,要驅動LED只要加HC595就行,根本不用用STC單片機
回復

使用道具 舉報

ID:64253 發表于 2020-8-12 10:56 | 顯示全部樓層
看了半天沒研究出個啥,
回復

使用道具 舉報

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

使用道具 舉報

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

回復

使用道具 舉報

ID:242753 發表于 2021-5-9 10:14 | 顯示全部樓層
增加自動校時,是個不錯的主意!
回復

使用道具 舉報

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

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

使用道具 舉報

ID:79874 發表于 2023-3-23 05:28 來自手機 | 顯示全部樓層
能提供下設計資料嗎
回復

使用道具 舉報

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

使用道具 舉報

ID:1112603 發表于 2024-5-5 16:09 | 顯示全部樓層
這玩意兒誤差太大,加個網絡校時功能廢物再利用,還不錯。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频二区在线观看 | 日韩欧美在线观看 | 新91视频网| 亚洲视频在线看 | 欧美视频一区二区三区 | 亚洲精品一区二三区不卡 | 狠狠操操| 免费观看日韩精品 | 九九久久久久久 | 欧美成人在线网站 | 91视频国产精品 | 午夜视频在线免费观看 | 国产精品久久7777777 | 欧美一区二区视频 | 亚洲大片在线观看 | 荷兰欧美一级毛片 | 亚洲欧美综合 | 一区二区三区 在线 | 亚洲最大成人综合 | 欧美一级二级在线观看 | 亚洲天堂精品一区 | 亚洲综合首页 | 嫩草一区二区三区 | 国产精品久久毛片av大全日韩 | 日本不卡免费新一二三区 | va精品| 不卡在线视频 | 国内精品视频在线 | 国产成人精品免费视频大全最热 | 久久99久久 | wwwxxx国产 | 国产99热在线 | 久久av网 | 午夜日韩| 欧美日产国产成人免费图片 | 亚洲欧美日本国产 | 91一区 | 久久久国产一区 | 丝袜久久 | 天天草天天操 | 台湾佬成人网 |