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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

用單片機制作最高精度時間系統(tǒng),可移植到任何時鐘程序中

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:57657 發(fā)表于 2016-9-27 18:36 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用單片機制作最高精度時間系統(tǒng),可移植到任何時鐘程序中
可移植到任何數(shù)字時鐘程序中,根據(jù)單片機型號以及晶振頻率修改TH0和TL0的值。
智能日期時間累加,平閏年判斷,當月天數(shù)判斷功能,年計數(shù)值0~9999。
使用1秒的延遲函數(shù),再加上時間判斷計數(shù)函數(shù)的時間,誤差非常大。
采用5毫秒定時器中斷計數(shù),中斷觸發(fā)后重置計數(shù)值并且5毫秒計數(shù)加1。
處理5毫秒計數(shù)以及時間判斷計數(shù)函數(shù),定時器仍在計數(shù),準確觸發(fā)高精度的5毫秒中斷。
5毫秒計數(shù)加到200時,5毫秒計數(shù)清零并且觸發(fā)時間計數(shù)函數(shù),包含所有判斷日期時間的指令在5毫
秒內(nèi)完成,如5毫秒內(nèi)無法完成請改成更長毫秒時間中斷1次,避免出現(xiàn)中斷重入等問題。
若發(fā)現(xiàn)bug或其他建議意見請及時在樓下回復。
下面是源碼:


  1. #include "reg51.h"
  2. #include "intrins.h"
  3. sfr AUXR   = 0x8E;
  4. sbit led=P3^2; //秒閃爍指示燈
  5. #define ui unsigned int
  6. #define uc unsigned char
  7. ui y; //定義變量年
  8. uc m,d,h,i,s,w; //定義變量月、日、時、分、秒、周
  9. uc ms5; //5毫秒定時器中斷計數(shù)
  10. void InitTimer0(void){ //初始化5毫秒定時器,根據(jù)晶振頻率修改TH0和TL0的值。
  11.     TMOD = 0x01;
  12.     TH0 = 0x28;
  13.     TL0 = 0x00;
  14.     EA = 1;
  15.     ET0 = 1;
  16.     TR0 = 1;
  17. }

  18. bit if_leap_year(ui y){ //平閏年檢測,閏年返回1,平年返回0
  19.   //閏年是4的倍數(shù)且不是100的倍數(shù)或者是400的倍數(shù),否則是平年。
  20. if((y%4 == 0 && y%100 != 0) || y%400 == 0){
  21. return 1; //返回1表示閏年
  22. } else { //否則就是平年
  23. return 0; //返回0表示平年
  24. }
  25. }
  26. uc get_mon_day_nbr(ui y,uc m){ //通過年月獲取該月有多少天
  27. if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) { //大
  28. 月則31天
  29.   return 31;
  30. }
  31. if(m == 4 || m == 6 || m == 9 || m == 11){ //小月則30天
  32.   return 30;
  33. }
  34.   if(m == 2){ //2月
  35.    if(if_leap_year(y) == 1){ //閏年29天
  36.    return 29;
  37.    } else { //平年28天
  38.    return 28;
  39.    }
  40.   }
  41. return 0;
  42. }

  43. bit dt_is_ok(ui y,uc m,uc d,uc w,uc h,uc i,uc s){ //檢測設置的日期時間格式是否有效 1有
  44. 效0無效
  45. if(w > 7 || w < 1) return 0; //星期大于7或小于1 返回0
  46. if(y > 9999 || m > 12 || m < 1 || d < 1) return 0; //年大于999 或 月大于12 或
  47. 月小于1 或日小于1 返回0
  48. if(d > get_mon_day_nbr(y,m)) return 0; //通過年月獲取當月天數(shù) 大于該值 返回0
  49. if(h > 23 || i > 59 || s > 59) return 0; //時大于23 或 分大于59 或秒大于59 返回
  50. 0
  51. return 1; //檢測有效 返回1
  52. }
  53. bit set_time(ui yy,uc mm,uc dd,uc ww,uc hh,uc ii,uc ss){ //設置日期時間
  54.   if(dt_is_ok(yy,mm,dd,ww,hh,ii,ss) == 1){  //檢查日期時間格式有效
  55.   y=yy;m=mm;d=dd;w=ww; //設置年月日周
  56.   h=hh;i=ii;s=ss; //設置時分秒
  57.   return 1;  //設置成功 返回1
  58.   } else { //格式無效 返回0
  59.   return 0;
  60. }
  61. }

  62. void add_time(){ //時間步進1秒
  63. s++; //秒加1
  64. if(s>=60){ //秒加到60
  65. s=0; //秒清零
  66. i++; //分加1
  67.   if(i>=60){ //分加到60
  68.   i=0; //分清零
  69.   h++; //時加1
  70.    if(h>=24){ //時加到24
  71.    h=0; //時清零
  72.    d++; //日加1
  73.    w++; //星期加1
  74.    if(w > 7){ //星期超過7
  75.    w=1; //星期等于1
  76.    }
  77.     if(d > get_mon_day_nbr(y,m)){  //日超過當前年月的天數(shù)
  78.     d=1; //日清1
  79.     m++; //月加1
  80.      if(m > 12){ //月加到12以上
  81.      m=1; //月清1
  82.      y++; //年加1
  83.       if(y >= 10000){ //年加到10000
  84.       y=0; //年清零
  85.       }
  86.      }
  87.     }
  88.    }
  89.   }
  90. }
  91. }
  92. void main(){ //入口函數(shù),上電復位后在此開始執(zhí)行指令。
  93. P3=0xFF; //設置P3口全部為高電平
  94. set_time(2000,1,1,6,0,0,0); //設置日期時間
  95.     AUXR |= 0x80;  //關閉定時器0的12分頻
  96.     InitTimer0(); //初始化5毫秒定時器
  97. //死循環(huán)內(nèi)可添加其他程序,只有中斷觸發(fā)后退出,中斷返回后繼續(xù)在原地運行程序。
  98.   while(1);

  99.   }
  100. void Timer0Interrupt(void) interrupt 1{ //5毫秒定時器中斷
  101. //重置TH0與TL0的值,根據(jù)晶振頻率修改TH0和TL0的值。
  102.     TH0 = 0x28;
  103.     TL0 = 0x00;
  104.    ms5++; //5毫秒中斷計數(shù)加1
  105.     if(ms5%100 == 0)led=~led;
  106.      //5毫秒中斷計數(shù)加到200 200*5=1000毫秒 1秒觸發(fā)1次
  107.     if(ms5 >= 200){
  108.     ms5=0; //5毫秒計數(shù)清零
  109.     add_time(); //時間步進1秒
  110.     }
  111.    

  112. }
復制代碼


評分

參與人數(shù) 7黑幣 +155 收起 理由
得不到 + 5 共享資料的黑幣獎勵!
h832ea + 9 贊一個!
liyz + 5 很好的代碼
ssfc + 5 贊一個!
1007327969 + 1 很給力!
sunlei058378 + 30 贊一個!
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:74880 發(fā)表于 2016-9-29 06:06 | 只看該作者
很好...............51黑有你更精彩
回復

使用道具 舉報

板凳
ID:137878 發(fā)表于 2016-10-9 06:16 來自手機 | 只看該作者
多長時間誤差1秒??
回復

使用道具 舉報

地板
ID:3212 發(fā)表于 2016-10-9 16:06 | 只看該作者
是只用單片機內(nèi)部震蕩器實現(xiàn)嗎?
回復

使用道具 舉報

5#
ID:91165 發(fā)表于 2016-10-28 08:13 | 只看該作者
看看高到什么程度
回復

使用道具 舉報

6#
ID:67678 發(fā)表于 2016-10-28 08:21 | 只看該作者
這個要學習學習,謝謝樓主!
回復

使用道具 舉報

7#
ID:143559 發(fā)表于 2016-10-28 09:08 | 只看該作者
誰不是這么做的??這個的主要誤差來源晶振的精度,不過如果定時器沒有定時正確誤差也會很大
回復

使用道具 舉報

8#
ID:139222 發(fā)表于 2016-10-29 23:15 | 只看該作者
我覺得目前高精度還是需要溫補晶振。如果是我的話,我會選擇1s的中斷
回復

使用道具 舉報

9#
ID:94489 發(fā)表于 2016-10-30 20:37 | 只看該作者
51hei有你更精彩
回復

使用道具 舉報

10#
ID:139514 發(fā)表于 2016-11-3 15:41 | 只看該作者
參考看看,希望能得到收穫
回復

使用道具 舉報

11#
ID:63924 發(fā)表于 2016-11-3 18:29 | 只看該作者
很好,,,,
回復

使用道具 舉報

12#
ID:113208 發(fā)表于 2016-11-3 21:23 | 只看該作者
真心謝謝樓主,謝謝
回復

使用道具 舉報

13#
ID:142867 發(fā)表于 2016-11-3 23:19 | 只看該作者
如果是我的話,我會選擇1s的中斷
回復

使用道具 舉報

14#
ID:57657 發(fā)表于 2016-11-4 08:25 | 只看該作者
xuguoying_cz 發(fā)表于 2016-11-3 23:19
如果是我的話,我會選擇1s的中斷

你覺得TH0和TL0計數(shù)器計滿需要1s時間?經(jīng)過計算晶振頻率要用32.768khz的,配置CLK_DIV寄存器為0x07即對系統(tǒng)時鐘128進行分頻,所以需要4.194304Mhz的晶振,分頻后串口通訊的波特率最高1024bps,最后中斷里處理時間計數(shù)指令平均需要幾十毫秒。

回復

使用道具 舉報

15#
ID:146292 發(fā)表于 2016-11-5 19:36 | 只看該作者
看看吧,反正也不懂
回復

使用道具 舉報

16#
ID:86988 發(fā)表于 2016-11-6 18:21 | 只看該作者
年誤差多少?
回復

使用道具 舉報

17#
ID:145985 發(fā)表于 2016-11-6 18:44 | 只看該作者
這個是51單片機的程序嗎?還是兼容stm系列的
回復

使用道具 舉報

18#
ID:68499 發(fā)表于 2016-11-6 21:05 來自手機 | 只看該作者
會有溫漂吧。
回復

使用道具 舉報

19#
ID:57657 發(fā)表于 2016-11-6 21:53 | 只看該作者
fire_205 發(fā)表于 2016-11-6 18:44
這個是51單片機的程序嗎?還是兼容stm系列的

只針對51指令集系列而設計的,其他指令集的可能需要修改一些頭文件以及io口變量常量的定義聲明方法以及配置的定時器的寄存器和中斷觸發(fā)方法就行,其他的日期時間設置走時判斷語句大部分都不需要修改的。
回復

使用道具 舉報

20#
ID:57657 發(fā)表于 2016-11-6 22:01 | 只看該作者

若是溫漂對晶振頻率影響非常大的話,你覺得數(shù)顯掛鐘以及熱水器微波爐之類的設備在極端溫度下運行,時間系統(tǒng)的誤差會有多大?但規(guī)定范圍內(nèi)溫漂對頻率的影響不超過一定值的晶振是合格的。
回復

使用道具 舉報

21#
ID:57657 發(fā)表于 2016-11-6 22:12 | 只看該作者

對于晶振的輕微溫漂以及老化的影響而產(chǎn)生誤差,通過gps/gsm/cdma模塊更正時間保證零誤差,還有長波授時的方法原理如同收音機,其中有bpc/jjy/wwvb/dcf/msf等,不同國家發(fā)射的協(xié)議以及覆蓋范圍發(fā)射時間都有不同,通常一個發(fā)射基站就能覆蓋上千公里,根據(jù)發(fā)射的編碼協(xié)議解碼后獲得時間寫入內(nèi)部時間系統(tǒng)走時,通常幾小時或幾天更正一次時間,而授時信號發(fā)射站以及網(wǎng)絡授時服務器均采用原子鐘計時,數(shù)億年誤差1秒,幾乎可以忽略不計。
回復

使用道具 舉報

22#
ID:126608 發(fā)表于 2016-11-7 05:48 | 只看該作者
正想學習做一個,看看必有收獲。
回復

使用道具 舉報

23#
ID:111876 發(fā)表于 2016-11-7 06:28 | 只看該作者

是只用單片機內(nèi)部震蕩器實現(xiàn)嗎
回復

使用道具 舉報

24#
ID:145016 發(fā)表于 2016-11-7 14:48 | 只看該作者
這個要看看。。。。。。。。。。
回復

使用道具 舉報

25#
ID:113193 發(fā)表于 2016-11-7 20:59 | 只看該作者
看看是什么好東東
回復

使用道具 舉報

26#
ID:140755 發(fā)表于 2016-11-8 09:56 來自手機 | 只看該作者
啦啦啦啦啦啦啦啦啦啦啦
回復

使用道具 舉報

27#
ID:143367 發(fā)表于 2016-11-8 11:20 | 只看該作者
回復,看看學習一下
回復

使用道具 舉報

28#
ID:146832 發(fā)表于 2016-11-8 15:40 | 只看該作者
多長時間誤差1秒??
回復

使用道具 舉報

29#
ID:146879 發(fā)表于 2016-11-8 19:06 來自手機 | 只看該作者
很好,非常感謝
回復

使用道具 舉報

30#
ID:146921 發(fā)表于 2016-11-8 21:52 | 只看該作者
看一下了,不錯的程序
回復

使用道具 舉報

31#
ID:22098 發(fā)表于 2016-11-10 14:57 | 只看該作者
看看學學看看
回復

使用道具 舉報

32#
ID:147287 發(fā)表于 2016-11-10 16:01 | 只看該作者
感謝樓主分享!!
回復

使用道具 舉報

33#
ID:54731 發(fā)表于 2016-11-10 16:06 | 只看該作者
有這么準嗎
回復

使用道具 舉報

34#
ID:143996 發(fā)表于 2016-11-10 19:45 | 只看該作者
難得時間計算的這么精確
回復

使用道具 舉報

35#
ID:147404 發(fā)表于 2016-11-11 14:07 | 只看該作者
來學習學習····
回復

使用道具 舉報

36#
ID:95817 發(fā)表于 2016-11-12 12:33 | 只看該作者
學習學習
回復

使用道具 舉報

37#
ID:147531 發(fā)表于 2016-11-13 16:07 | 只看該作者
感謝分享,先看看
回復

使用道具 舉報

38#
ID:117930 發(fā)表于 2016-11-13 16:55 | 只看該作者
能不能自動校對時間呢?
回復

使用道具 舉報

39#
ID:57657 發(fā)表于 2016-11-13 17:42 | 只看該作者
5083 發(fā)表于 2016-11-13 16:55
能不能自動校對時間呢?

校對時間數(shù)據(jù)需要模塊,獲取的時間用set_time();函數(shù)即可寫入。
回復

使用道具 舉報

40#
ID:117930 發(fā)表于 2016-11-13 19:21 | 只看該作者
npn 發(fā)表于 2016-11-13 17:42
校對時間數(shù)據(jù)需要模塊,獲取的時間用set_time();函數(shù)即可寫入。

什么模塊最好?加一個GPS模塊用來對時也不錯
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产高清视频在线观看 | 一本一道久久a久久精品蜜桃 | 久久久久亚洲 | 免费看淫片 | 一区二区在线免费观看 | 麻豆av在线 | 久久躁日日躁aaaaxxxx | 欧美成人第一页 | 日韩一区二区在线视频 | 亚洲国产精品久久人人爱 | 成人午夜 | 日韩在线 | 亚洲综合在线播放 | 成人在线一区二区三区 | 黄色片免费看 | 日韩伦理电影免费在线观看 | 九九综合| 午夜看片 | 国产中文字幕在线 | 91精品国产综合久久精品图片 | 午夜电影网 | 国产一区二区 | 不卡在线视频 | 国产精品久久一区二区三区 | 久久精品16| 国产欧美精品一区二区三区 | 亚洲精品视频一区二区三区 | 日韩不卡三区 | 成人精品一区二区三区四区 | 逼逼网 | 在线观看中文字幕 | 91高清视频在线观看 | www.久久艹| 中文字幕第90页 | 国产精品久久久久久福利一牛影视 | 欧美一区视频 | 国产精品久久久久久久免费大片 | av色站 | 国产精品毛片在线 | 亚洲视频手机在线 | 国产美女黄色 |