日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機電之家資源網(wǎng)
單片機首頁|單片機基礎(chǔ)|單片機應(yīng)用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
自制的單片機電子鐘走時精準
自制的單片機電子鐘走時精準
 更新時間:2008-7-26 19:45:42  點擊數(shù):3
【字體: 字體顏色
相信有很多愛好單片機的朋友都用單片機制作過電子鐘,這的確是一個很好的鍛煉課題?墒钱斣谀阆硎艹晒Φ目鞓坊蚴窃谂笥衙媲办乓臅r候,你會突然間發(fā)現(xiàn)你當初對著電視校準的電子鐘的時間竟然變快或是變慢了。于是你就嘗試用各種方法來調(diào)整它的走時精度,但是最終的效果還是不盡人意,只好每過一段時間手動調(diào)整一次了。漸漸的你有點煩了,不再去管它或是直接棄之不用。 我和大家一樣對此深有體會,于是我開始查找翻閱資料,試圖找出一個解決的好方法。終于有一天…… 廢話太多——stop 原因分析: 1.                  單片機電子鐘的計時脈沖基準是由外部晶振的頻率經(jīng)過12分頻后提供,采用內(nèi)部的定時/計數(shù)器來實現(xiàn)計時功能。所以,外接晶振頻率精確度直接影響電子鐘計時的準確性。 2.                  單片機電子鐘利用內(nèi)部定時/計數(shù)器溢出產(chǎn)生中斷(12M晶振一般為50ms)再乘以相應(yīng)的倍率來實現(xiàn)秒、分、時的轉(zhuǎn)換。大家都知道從定時/計數(shù)器產(chǎn)生中斷請求到響應(yīng)中斷需要3-8個機器周期(如不明白請參考其它資料),定時中斷子程序中的數(shù)據(jù)入棧和重裝定時/計數(shù)器的初值還需要占用數(shù)個機器周期,還有從中斷入口轉(zhuǎn)到中斷子程序也要占用一定的機器周期。    例如:        ORG       00H       LJMP      START       ORG       0BH       LJMP      TIMER                 ;2個機器周期        ORG       30HSTART:       MOV      30H,       #0                 MOV      31H,       #0       MOV      32H,       #0       MOV      33H,       #0       MOV      20H,       #10               MOV      21H,       #2       MOV      SP,   #40H                    MOV      IP,   #00H       MOV      IE,   #82H                     ;開EA﹑ET0       MOV      TMOD,   #01H              ;定時器模式1             MOV      TH0,       #03CH           ;50MS初裝值       MOV      TL0,       #0B0H       SETB      TR0                             ;啟動TR0LOOP:       ……TIMER:                                             ;定時器中斷子程序       PUSH      ACC                            ;2個機器周期        PUSH      PSW                            ;2個機器周期        MOV      TL0,              #0B0H+6+3                 MOV      TH0,       #03CH       ……                            RETI                            END      從上面的例子大家可以看出從中斷入口到定時/計數(shù)器初值的低8位裝入需要占用2+2+2=6個機器周期。所以我們在編程時一般會把這8個機器周期加入定時/計數(shù)器的初值。但是從定時/計數(shù)器溢出中斷請求到執(zhí)行中斷需要幾個機器周期(3-8個機器周期)我們很難確定其準確值,因此導(dǎo)致了電子鐘計時不準。 解決方法: 1.                采用高精度晶振方案
雖然采用高精度的晶振可以稍微提高電子鐘計時的精確度,但是其并不是導(dǎo)致電子鐘計時不準的主要因素,而且高精度的晶振價格較高,所以不必采用此方案。 2.                動態(tài)同步修正方案
從程序入手,采用動態(tài)同步修正方法給定時/計數(shù)器賦初值。動態(tài)同步修正方法:由于定時/計數(shù)器溢出后又會從0開始自動加數(shù),固在給定時/計數(shù)器再次賦值前將定時/計數(shù)器低位(TL0)中的值和初始值相加后一并送入定時/計數(shù)器中,此時定時/計數(shù)器中的值即為動態(tài)同步修正后的準確值。例如:                  TIMER:                                                   PUSH ACC                  PUSH PSW                  MOV  A, #0B0H                  ADD   A, TL0                      ;初值和TL0中的數(shù)相加即為同步修正值                  MOV  TL0,       A                  ;修正值送定時/計數(shù)器低8位                  MOV  TH0,      #03CH                  ……                                   RETI 采用了此種方法后相信你的電子鐘的精度已經(jīng)大大提高了。別走開,后面內(nèi)容更精彩。 3.                自動調(diào)整方案
采用了同步修正方案后電子鐘的精度雖然提高了很多,但是由于晶振頻率的偏差和一些其它未知因素(同一塊電路板、同樣的程序換了一片單片機后走時誤差卻不一樣,不知是何原因)的影響,時間長了仍然會有積累誤差。為此我設(shè)計出了此自動調(diào)整方案,實際也是一種容錯技術(shù)。其自動調(diào)整原理為:實測出誤差1秒所需的時間,然后每隔這樣一段時間后就對秒進行加1或減一調(diào)整。例如:電子鐘每過50小時就慢1秒,其自動調(diào)整程序如下:                  TIMER:                                                ;定時中斷程序                  PUSH ACC                                  ;數(shù)據(jù)保護                  PUSH PSW                  …… T_3:                  INC    A_1                  MOV  A,   A_1                  CJNE  A,   #50,       RETI_1         ;到50小時了嗎?                  INC    S_1                                    ;到50小時秒加1                  MOV  A_1,      #OOH   RETI_1:                  POP    PSW                  POP    ACC                  RETI 使用此方法調(diào)整較費時間,但是效果非常好,經(jīng)實驗一次調(diào)整可以將月誤差控制在1秒左右,如按此方法再次測出誤差1秒所需的天數(shù)并進行二次調(diào)整,其精度會更高。 電子鐘源程序:(修改后)修改前的源程序可以到論壇<單片機技術(shù)交流>里看我發(fā)的<簡單的電子鐘源程序>一文            S_1     EQU      30H                            ;秒寄存器            M_1    EQU      31H                            ;分寄存器            H_1    EQU      32H                            ;時寄存器            A_1    EQU      33H                            ;自動調(diào)整寄存器            ORG   00H            LJMP  START            ORG   03H            RETI            ORG   0BH                                   ;定時中斷入口            LJMP  TIMER                    ORG   13H            RETI            ORG   1BH            RETI            ORG   30H START:            MOV  S_1,       #0                        ;秒、分、時寄存器清0            MOV  M_1,      #0            MOV  H_1,      #0            MOV  A_1,      #0            MOV  20H,      #10                      ;0.5秒鐘中斷次數(shù),0.5s=500ms=50msx10            MOV  21H,      #2                      ;2個0.5秒即為1秒            MOV  SP,  #40H                          ;堆棧指針設(shè)置            MOV  IE,   #82H                          ;開定時器0中斷及總中斷            MOV  TMOD,  #01H                          ;定時器0模式1            MOV  TH0,      #03CH                        ;50ms初值            MOV  TL0,       #0B0H            SETB  TR0                                   ;啟動定時器0 LOOP:            ACALL     DISP                                  ;調(diào)用顯示            JNB    P3.4,      MT                      ;查詢分調(diào)整鍵            JNB    P3.5,      HT                       ;查詢時調(diào)整鍵            AJMP LOOP MT:                                            ;分調(diào)整            ACALL     DISP            JNB    P3.4,      MT                      ;鍵消抖            INC    M_1                                   ;分加1            MOV  A,   M_1                                CJNE  A,   #60,       LOOP                  ;沒到60分返回,到60分清0               MOV  M_1,      #0            AJMP LOOP HT:                                             ;時調(diào)整            ACALL     DISP            JNB    P3.5,      HT            INC    H_1            MOV  A,   H_1            CJNE  A,   #24,       LOOP            MOV  H_1,      #0            AJMP LOOP DISP:                                         ;顯示子程序            MOV  DPTR,   #NUMTAB                        ;表地址送數(shù)據(jù)指針            MOV  A,   M_1                            ;分送A            MOV  B,    #10                          DIV    AB                              ;十進制調(diào)整            ADD   A,   R0                        ;查表偏移量調(diào)整            MOVC      A,   @A+DPTR                        ;查表                MOV  P1,  A                         ;分十位送p1口顯示            CLR    P3.2                                   ;開分十位顯示            ACALL     D1MS                                ;延時1ms            SETB  P3.2                                   ;關(guān)顯示            MOV  A,   B                          ;分個位p1口顯示                      ADD   A,   R0                            MOVC      A,   @A+DPTR            MOV  P1,  A            CLR           P3.3            ACALL     D1MS            SETB  P3.3            MOV  A,   H_1                            ;時送A            MOV  B,    #10            DIV    AB            ADD   A,   R0            MOVC      A,   @A+DPTR            MOV  P1,  A                             CLR    P3.0                                   ;顯示時十位            ACALL     D1MS            SETB  P3.0            MOV  A,   B            ADD   A,   R0            MOVC      A,   @A+DPTR            MOV  P1,  A            CLR    P3.1                                   ;顯示時個位            ACALL     D1MS            SETB  P3.1            RET                                       ;返回 TIMER:                                             ;定時中斷程序            PUSH ACC                                  ;數(shù)據(jù)保護            PUSH PSW            MOV  A,   #0B0H                        ;同步修正            ADD   A,   TL0            MOV  TL0,       A                         ;重置50ms定時值            MOV  TH0,      #03CH            DJNZ  20H,      RETI_1                       ;到0.5秒了嗎?            MOV  20H,      #10            CPL    25H.0                                ;取反秒點閃爍標志位            JNB    25H.0,   T_1                      ;標志位為0轉(zhuǎn)T_1            MOV  R0,  #0                        ;查表偏移量寄存器置0(不顯示秒點)            AJMP T_2 T_1:            MOV  R0,  #10                      ;查表偏移量寄存器置10(顯示秒點,秒點每秒閃爍1次) T_2:               DJNZ  21H,      RETI_1                       ;到1秒了嗎?            MOV  21H,      #2            INC    S_1                             ;秒加1            MOV  A,   S_1            CJNE  A,   #60,       RETI_1                ;到60秒了嗎?            MOV  S_1,       #0                        ;到60秒清0            INC    M_1                                   ;分加1            MOV  A,   M_1            CJNE  A,   #60,       RETI_1                ;到60分了嗎?            MOV  M_1,      #0            INC    H_1                                   ;時加1            MOV  A,   H_1            CJNE  A,   #24,       T_3               ;到24小時了嗎?            MOV  H_1,      #00H T_3:                                                         ;自動調(diào)整            INC    A_1            MOV  A,   A_1            CJNE  A,   #50,       RETI_1            INC    S_1            MOV  A_1,      #OOH   RETI_1:            POP    PSW            POP    ACC            RETI D1MS:                                              ;1毫秒延時            MOV  R7,  #2 D_1:            MOV  R6,  #250            DJNZ  R6,  $            DJNZ  R7,  D_1            RET NUMTAB:            DB      10H,0D3H,48H,41H,83H,21H,20H,53H,00H,01H;不顯示秒點            DB      14H,0D7H,4CH,45H,87H,25H,24H,57H,04H,05H;顯示秒點            END   由于本人接觸單片機的時間不長,文章中難免有錯誤之處,還請大家多指教。如有其他問題可以在論壇上討論。本文可以自由傳播,但請注明作者及出處
  • 上一篇: 帶鬧鐘智能電子鐘
  • 下一篇: 74HC595-8位數(shù)碼管循環(huán)移位顯示
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術(shù)支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設(shè)備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內(nèi)容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學(xué)會
    中國行業(yè)電子商務(wù)100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1