機電之家資源網(wǎng)
單片機首頁|單片機基礎|單片機應用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
基于51單片機秒表的程序設計
基于51單片機秒表的程序設計
 更新時間:2009-12-17 13:25:19  點擊數(shù):0
【字體: 字體顏色

1.設計目的:
            (1)利用單片機定時器中斷和定時器計數(shù)方式實現(xiàn)秒、分定時。
            (2)通過LED顯示程序的調整,熟悉8155與8051,8155與LED的接口技術,熟悉LED動態(tài)顯示的控制過程。
            (3)通過鍵盤程序的調整,熟悉8155與矩陣式鍵盤的接口技術,熟悉鍵盤掃描原理。
            (4)通過閱讀和調試簡易秒表整體程序,學會如何編制含LED動態(tài)顯示、鍵盤掃描和定時器中斷等多種功能的綜合程序,初步體會大型程序的編制和調試技巧。
            2.  設計步驟與要求
            (1)要求:以8位LED右邊2位顯示秒,左邊6位顯示0,實現(xiàn)秒表計時顯示。以4×4矩陣鍵盤的KE0、KE1、KE2等3鍵分別實現(xiàn)啟動、停止、清零等功能。
            (2)方法:用單片機定時器T0中斷方式,實現(xiàn)1秒定時;利用單片機定時器1方式3計數(shù),實現(xiàn)60秒計數(shù)。用動態(tài)顯示方式實現(xiàn)秒表計時顯示,用鍵盤掃描方式取得KE0、KE1、KE2的鍵值,用鍵盤處理程序實現(xiàn)秒表的啟動、停止、清零等功能。
            (3)軟件設計:軟件整體設計思路是以鍵盤掃描和鍵盤處理作為主程序,LED動態(tài)顯示作為子程序。二者間的聯(lián)系是:主程序查詢有無按鍵,無按鍵時,調用二次LED動態(tài)顯示子程序(約延時8ms)后再回到按鍵查詢狀態(tài),不斷循環(huán);有按鍵時,LED動態(tài)顯示子程序作為按鍵防抖延時被連續(xù)調用二次(約延時16ms),待按鍵處理程序執(zhí)行完后,再回到按鍵查詢狀態(tài),同時兼顧了按鍵掃描取值的準確性和LED動態(tài)顯示的穩(wěn)定性。秒定時采用定時器T0中斷方式進行,60秒計數(shù)由定時器1采用方式3完成,中斷及計數(shù)的開啟與關閉受控于按鍵處理程序。由上述設計思路可設計出軟件流程圖如圖1.1所示。
            (5)程序編制:編程時置KE0鍵為“啟動”,置KE1鍵為“停止”,置KE2鍵為“清零”,因按鍵較少,在處理按鍵值時未采用散轉指令“JMP”,而是采用條件轉移指令“CJNE”,每條指令后緊跟著一條無條件跳轉指令“AJMP”,轉至相應的按鍵處理程序,如不是上述3個按鍵值則跳回按鍵查詢狀態(tài)。8位LED顯示的數(shù)據(jù)由顯示緩沖區(qū)30H~37H單元中的數(shù)據(jù)決定,順序是從左至右,動態(tài)顯示時,每位顯示持續(xù)時間為1ms,1ms延時由軟件實現(xiàn),8位顯示約耗時8ms。主程序、按鍵查詢子程序采用第0組工作寄存器,顯示子程序采用第1組工作寄存器。1秒定時采用定時器T0方式1中斷,每50ms中斷一次,用21H做50
            ms計數(shù)單元,每20次為一個循環(huán),計滿20次,60秒計數(shù)單元(20H)計數(shù)1次。60秒計數(shù)采用定時器T1方式2計數(shù),計數(shù)脈沖采用軟件置位、復位P3.5口的方法實現(xiàn),用20H單元做60秒計數(shù)單元,如定時器T1溢出,則20H單元被清零,20H單元的數(shù)據(jù)采用十進制計數(shù),該數(shù)據(jù)被拆成個位和十位兩個數(shù)據(jù)后分別送至顯示緩沖區(qū)的30H、31H單元。

按照上述思路可編制源程序如下:
                              ORG                 0000H
                    AJMP       MAIN
                    ORG        000BH
                    AJMP       CONT
            ;主程序
            ;――――――――――初始化程序―――――――――――
            MAIN:        MOV       TMOD,#61H           ;置T0方式1定時,T1方式2計數(shù)
                                   MOV       TH0,#3CH                    ;T0置初值
                                   MOV       TL0,#0B0H
                                   MOV       TH1,#0C4H                  ;T1置初值
                                   MOV       TL1,#0C4H               
                                   MOV       DPTR,#4400H          
            ;8155控制口地址送DPTR
                                   MOV       A,#43H                      
            ;設置8155工作方式字
                                   MOVX       @DPTR,A              
            ;設置PA、PB口輸出,PC口輸入
                                   MOV       20H,#00H                   
            ;60秒計數(shù)單元置初值
                                   MOV       21H,#14H                  
            ;50ms計數(shù)單元置初值
                                   MOV       SP,#3FH                    
            ;堆棧指針置初值
                                   MOV       R2,#08H                    
            ;LED待顯示位數(shù)送R2
                                   MOV       R0,#30H                     
            ;顯示緩沖區(qū)首址送R0
            STAR:        MOV       @R0,#00H                  ;顯示緩沖區(qū)清零
                      INC        R0
                                   DJNZ       R2,STAR
                                   CLR        A                                 
              ;累加器清零
            ;―――――――――――鍵盤查詢程序――――――――――
              KEY:           ACALL     KS          ;調按鍵查詢子程序判是否有鍵按下             
                            
                JNZ       K1                                    ;有鍵按下轉移
                                   ACALL       DISP                          
            ;無鍵按下,調顯示子程序延時
                                   AJMP       KEY                             
            ;繼續(xù)查詢按鍵
            ;―――――――――――鍵盤掃描程序――――――――――
            K1:            ACALL     DISP                            ;鍵盤去抖延時
                      ACALL   DISP
                                   ACALL   KS                               
            ;再次判別是否有鍵按下
                                   JNZ        K2                                
            ;有鍵按下轉移
                AJMP       KEY                         ;無按鍵,誤讀,繼續(xù)查詢按鍵
             K2:              MOV       R3,#0FEH                  ;首列掃描字送R3
                                  MOV       R4,#00H                     ;首列號送R4
            K3:            MOV       DPTR,#4401H          ;PA口地址送DPTR,開始列掃描
                                   MOV       A,R3                        
                                   MOVX       @DPTR,A                ;列掃描字送PA口
                                   INC        DPTR                           
            ;指向PC口
                      INC        DPTR
                                   MOVX       A,@DPTR               ;讀取行掃描值
                                   JB           ACC.0,L1                    
            ;第0行無鍵按下,轉查第1行
                                   MOV       A,#00H                     
            ;第0行有鍵按下,行首鍵號送A
                                   AJMP       LK                               
            ;轉求鍵號
            L1:            JB           ACC.1,L2                    
            ;第1行無鍵按下,轉查第2行
                                   MOV       A,#08H                     
            ;第1行有鍵按下,行首鍵號送A
                                   AJMP       LK                               
            ;轉求鍵號
             L2:             JB           ACC.2,L3                    
            ;第2行無鍵按下,轉查第3行
                                   MOV       A,#10H                     
            ;第2行有鍵按下,行首鍵號送A
                                   AJMP       LK                               
            ;轉求鍵號
            L3:               JB           ACC.3,NEXT             ;第3行無鍵按下,轉查下一列

                                   MOV       A,#18H                      
            ;第3行有鍵按下,行首鍵號送A
                      AJMP       LK
            LK:            ADD       A,R4                         ;形成鍵碼送A
                                   PUSH       ACC                           
            ;鍵碼入棧保護
             K4:            ACALL   DISP
                                   ACALL       KS                          
            ;等待鍵釋放
                                   JNZ        K4                               
            ;未釋放,等待
                                   POP        ACC                            
            ;鍵釋放,彈棧送A
                                   AJMP       PR                              
            ;轉鍵盤處理程序
            NEXT:        INC        R4                                 ;修改列號
                                   MOV       A,R3
                                   JNB        ACC.3,KEY              
            ;4列掃描完返回按鍵查詢狀態(tài)
                                   RL          A                                
              ;未掃描完,改為下列掃描字
                                   MOV       R3,A                        
            ;掃描字暫存R3
                                   AJMP       K3                              
            ;轉列掃描程序
            ;―――――――――――鍵盤處理程序―――――――――――――――
            PR:           CJNE       A,#00H,PR01         ;不是KE0鍵碼,轉KE1鍵
                                  AJMP       KE0                            
            ;轉KE0鍵處理程序
            PR01:        CJNE       A,#01H,PR02         ;不是KE1鍵碼,轉KE2鍵
                                  AJMP       KE1                            
            ;轉KE1鍵處理程序
            PR02:         CJNE       A,#02H,PR03        ;不是KE2鍵碼,返回按鍵查詢
                                   AJMP       KE2                            
            ;轉KE2鍵處理程序
            PR03:         AJMP       KEY
            KE0:           SETB       TR0                             ;啟動定時器T0
                                   SETB       TR1                            
            ;啟動定時器T1
                                   SETB       ET0                            
            ;允許定時器T0中斷
                                   SETB       EA                              
            ;開中斷
                                   AJMP       KEY                      
            ;返回鍵盤查詢狀態(tài)
            KE1:           CLR        EA                               ;關中斷
                                   CLR        ET0                            
            ;禁止定時器T0中斷
                                   CLR        TR1                            
            ;關定時器T1
                                   CLR        TR0                            
            ;關定時器T0
                      AJMP       KEY
            KE2:           CLR        EA                                 ;關中斷
                                   AJMP       MAIN                         
            ;返回主程序進行初始化
            ;――――――――――按鍵查詢子程序――――――――――――――
             KS:            MOV       DPTR,#4401H           ;置8155PA口地址
                                    MOV       A,#00H                     
                                   MOVX       @DPTR,A               
            ;全掃描字#00H送PA口
                                   INC        DPTR                           
            ;指向PC口
                      INC        DPTR
                                   MOVX       A,@DPTR            ;讀入PC口狀態(tài)
                                   CPL        A                                 
              ;變正邏輯,高電平表示有鍵按下
                                   ANL       A,#0FH                  ;屏蔽高4位
                                   RET                                          
              ;返回,A≠0表示有鍵按下
            ;―――――――――LED動態(tài)顯示子程序―――――――――――――
            DISP:          PUSH       ACC                            ;A入棧保護
                                   SETB       RS0                             
            ;保護第0組工作寄存器,啟用第1組工作寄存器                      
                                  MOV    R2,#08H         ;LED待顯示位數(shù)送R2
                                   MOV       R1,#00H                    ;設定顯示時間
                                   MOV       R3,#7FH                   
            ;選中最右端LED
                                   MOV       R0,#30H                   
            ;顯示緩沖區(qū)首址送R0
                                   MOV       A,@R0                      ;秒顯示個位送A

            DISP1:        MOV       DPTR,#TAB            ;指向字形表首址
                                   MOVC       A,@A+DPTR        ;查表取得字形碼
                                   MOV       DPTR,#4402H         
            ;指向8155PB口(段碼口)
                                   MOVX       @DPTR,A             ;字形碼送PB口
                                   MOV       A,R3                         ;取位選字
                                   MOV       DPTR,#4401H         
            ;指向8155PA口(位選口)
                                   MOVX       @DPTR,A             ;位碼送PA口
                                   DJNZ       R1,$                         
            ;延時0.5ms
                                   DJNZ       R1,$                         
            ;延時0.5ms
                                   RR          A                                
              ;位選字移位
                                   MOV       R3,A                        
            ;移位后的位選字送R3
                                   INC        R0                                
            ;指向下一位緩沖區(qū)地址
                                   MOV       A,@R0                      ;緩沖區(qū)數(shù)據(jù)送A

                DJNZ       R2,DISP1                   ;未掃描完,繼續(xù)循環(huán)
                                   CLR        RS0                              
            ;恢復第0組工作寄存器
                                   POP        ACC                             
            ;A彈棧,恢復現(xiàn)場
                      RET
            TAB:          DB          3FH,06H,5BH,4FH,66H             
            ;共陰極LED字形表
                                   DB          6DH,7DH,07H,7FH,6FH
            ;――――――――――定時器中斷服務程序―――――――――――――
            CONT:       PUSH    ACC                               ;保護現(xiàn)場
                                   MOV     TH0,#3CH               ;定時器T1重置初值
               , ;        &, nbsp;  &nbs, p;        MOV     TL0,#0B0H                        
                                   MOV     A,20H                      ;秒計數(shù)器送A
                      AJMP    CONT1                       
            REN:           AJMP    REN1
            CONT1:      DJNZ       21H,REN                     ;1秒定時未到,中斷返回
                                   MOV       21H,#14H                    
            ;重置50ms計數(shù)初值
                                   CLR        P3.5                              
             ;軟件產(chǎn)生定時器T1計數(shù)脈沖
                      NOP
                      NOP
                      SETB       P3.5
                                   INC        A                                 
              ;1秒計數(shù)值加1
                                   DA         A                                 
              ;換算為10進制計數(shù)
                                   JBC        TF1,CONT2                ;60秒到,轉清零

             CONT3:     MOV       20H,A                        ;計數(shù)值送60秒計數(shù)單元20H
                                   ANL       A,#0FH                  ;屏蔽高4位
                                   MOV       30H,A                       
            ;秒表個位待顯示數(shù)據(jù)送顯示緩沖區(qū)
                                   MOV       A,20H
                                   SWAP     A                                  
            ;60秒計數(shù)單元高、低4位數(shù)據(jù)互換
                                   ANL       A,#0FH                  ;屏蔽高4位
                                   MOV       31H,A                       
            ;秒表十位待顯示數(shù)據(jù)送顯示緩沖區(qū)
                      AJMP       REN1
             CONT2:     MOV       A,#00H                     
                      AJMP       CONT3
            REN1:         POP        ACC                            ;恢復現(xiàn)場
                                   RET                                          
            ;中斷返回
                      END                           
            3. 總結與分析
               
            (1)實驗采用七段碼LED設計(數(shù)碼管),顯示直觀;采用定時器中斷,計時更準確;功能齊全,可隨時啟動、停止、清零,后者智能化程度更高。
            (2)設計、調試大型程序時,需先根據(jù)要求劃分模塊,優(yōu)化結構;再根據(jù)各模塊特點確定何為主程序,何為子程序,何為中斷服務程序,相互間如何調用;再根據(jù)各模塊性質和功能將各模塊細化,設計出程序流程圖;最后才根據(jù)各模塊流程圖編制具體程序。調試時應先調主程序,實現(xiàn)最基本最主要的功能,在此基礎上再將各模塊功能往主程序上堆砌,直至各模塊聯(lián)調、統(tǒng)調,實現(xiàn)全部功能。本例子將整個程序劃分為鍵盤程序,動態(tài)顯示程序,秒計時程序三大模塊,根據(jù)各自的特點確定鍵盤程序為主程序,動態(tài)顯示程序為子程序,秒計時程序為定時器中斷服務程序。主程序又細分為初始化程序,鍵盤查詢程序,鍵盤掃描程序,鍵盤處理程序四大部分。三大模塊之間的關系是:鍵盤程序在無鍵按下時,不斷調用動態(tài)顯示子程序;在有鍵按下時,先調用動態(tài)顯示子程序消抖,再進入鍵盤處理程序,控制中斷服務程序的運行;處理完畢后,再不斷調用動態(tài)顯示子程序。經(jīng)上述處理后,三大模塊運行協(xié)調一致,既保持了動態(tài)顯示的穩(wěn)定性,又保持了鍵盤的可靠性,還保持了秒計時的準確性,較好地實現(xiàn)了全部功能。

            (3)本例子只用到8位LED顯示中的兩位,只用到4×4鍵盤16個按鍵中的3個,因此,其功能還有較大的擴展空間。只要將上述程序稍加改動即可實現(xiàn)秒、分、時、日顯示,并可作全方位修改的實時時鐘。如增加LED顯示位數(shù)或將顯示改為LCD顯示模塊,可實現(xiàn)年、月、周、日、時、分、秒顯示。

  • 上一篇: 基于AT89C51的濕度檢測系統(tǒng)設計
  • 下一篇: 沒有了
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網(wǎng)友評論:(只顯示最新5條。)
    關于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

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

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

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