官术网_书友最值得收藏!

1.3 項目參考程序

1.3.1 軟件編程要點

項目通過單片機定時器/計數器T0定時產生中斷實現計時。將T0設置為定時工作方式1,以10ms為基本計時單元,每10ms產生一次中斷,利用軟件對中斷計數累加。當定時器產生100次中斷后(即1s后),秒單元加1。同理,對分單元、時單元亦采用相同的計數原理,分別產生秒、分、時等各位時間值,經并行口連接的6位LED顯示。

以學校的作息時間為例進行作息時間控制。首先將學校的作息時間制成表格存入單片機的數據區。每秒將當前時間與數據區中時間做一次比較,若相等則通過端口輸出警示信號,進行相應的打鈴、播音等。

數據區的每一項時間控制字需要占用8個存儲單元,其中啟動控制與關閉控制各占4個單元,控制字的內容為:

時間控制字的控制碼定義見表1-1。

表1-1 時間控制字的控制碼定義

作息時間定義見表1-2。

表1-2 作息時間定義

時間控制字的控制碼定義見表1-3。

表1-3 時間控制字的控制碼定義

1.3.2 RAM單元分配

程序中用到的內部RAM數據存儲單元見表1-4。

表1-4 內部RAM數據存儲單元

1.3.3 項目程序流程圖

1.主程序流程圖

主程序流程圖見圖1-2。

圖1-2 主程序流程圖

2.控制程序流程圖

控制程序流程圖見圖1-3。

圖1-3 控制程序流程圖

3. INT0、INT1中斷服務程序流程圖

INT0、INT1中斷服務程序流程圖見圖1-4。

圖1-4 中斷服務程序流程圖

4. T0中斷服務程序流程圖

T0中斷服務程序流程圖見圖1-5。

圖1-5 T0中斷服務程序程流程圖

5.顯示程序流程圖

顯示程序流程圖見圖1-6。

圖1-6 顯示程序流程圖

1.3.4 項目參考程序

項目參考程序如下。

            ----------------------------------------------------
           ;變量定義區
            ;----------------------------------------------------
            COUNT       EQU26H     ;0.1s計數單元
            SECOND      EQU27H     ;秒計數單元
            MINUTE      EQU28H     ;分計數單元
            TIME        EQU29H     ;時計數單元
            COUNT T     EQU2AH     ;計時單元加1暫存器
            STONE S     EQU2BH     ;存放秒計數基制
            STONE M     EQU2CH     ;存放分計數基制
            STONE T     EQU2DH     ;存放時計數基制
            ADDRESS     EQU2EH     ;保存數據區地址暫存器
            STONE N     EQU3AH     ;控制碼存儲單元
            NUMBER1     EQU38H     ;數據暫存單元
            NUMBER2     EQU3BH     ;數據暫存單元
            ;4A-4FH     顯示緩沖區
            ;----------------------------------------------------
            ORG0000H
            LJMPMAIN               ;轉主程序
            ORG0003H
            LJMPINT0               ;轉INT0中斷服務程序
            ORG000BH
            LJMPCLOCK              ;轉定時器T0中斷
            ORG0013H
            LJMPINT1               ;轉INT1中斷服務程序
            ;----------------------------------------------------
           ;主程序
            MAIN∶MOVSP,#5AH           ;堆棧指針
                  MOVSTONE S,#60H      ;秒計數基制
                  MOVSTONE M,#60H      ;分計數機制
                  MOVSTONE T,#24H      ;時計數機制
                  MOVXBR1,#14H         ;INT0, INT1連到端口引腳
                  MOVXBR2,#0C0H        ;禁止弱上拉,交叉開關允許
                  MOVOSCICN,#05H       ;選用內部晶振4MHz
                  MOVWDTCN,#0DEH       ;禁止看門狗
                  MOVWDTCN,#0ADH
                  MOVTMOD,#01H         ;設定時器T0工作方式1
                  MOVTL0,#0CAH         ;置T0初值
                  MOVTH0,#7DH
                  SETBEA               ;開中斷
                  SETBET0              ;定時器T0中斷允許
                  SETBEX0              ;外部中斷0允許
                  SETBEX1              ;外部中斷1允許
                  MOVTCON,#10H         ;啟動定時器T0
            LOOP∶LCALLDSUP            ;調顯示
                  SJMPLOOP
            ;----------------------------------------------------
           ;顯示程序
            DSUP∶MOVR0,#4FH          ;準備向緩沖區放數
                  MOVA, SECOND
                  ACALLPTDS           ;存秒值
                  MOVA, MINUTE
                  ACALLPTDS           ;存分值
                  MOVA, TIME
                  ACALLPTDS           ;存時值
                  MOVR0,#4AH          ;指向緩沖區首地址
                  MOVR2,#7FH          ;左邊第一位開始顯示
            DSUP1∶ORLP0,#0FCH        ;關各數碼管
                  MOVA,@R0            ;取顯示緩沖區中的數
                  MOVP1, A            ;送出字形BCD碼
                  MOVA, R2            ;取字位碼
                  ANLP0, A            ;送字位碼
                  MOVR3,#00H
            DSUP4∶DJNZR3, DSUP4      ;延時
                  ORLP0,#0FCH         ;關各數碼管
                  INCR0               ;右移一位,為顯示下一位做準備
                  MOVR2, A            ;存位碼
                  JBACC.1, DSUP1      ;不到最后一位,則繼續
                  RET
            ;----------------------------------------------------
           ;向緩沖區放數
            PTDS∶MOVR1, A            ;暫存
                  ACALLPTDS1          ;低4位先放入緩沖區
                  MOVA, R1            ;取出原數
                  SWAPA               ;高4位放入低4位中
            PTDS1∶ANLA,#0FH          ;放進顯示緩沖區
                  MOV@R0, A
                  DECR0               ;緩沖區地址指針減1
                  RET
            ;----------------------------------------------------
           ;控制程序
            LOOP1∶MOVDPTR,#100CH
                  MOVADDRESS, DPL
            LOOP4∶MOVDPL, ADDRESS
                  MOVR3,#04H
                  MOVR1, COUNT T
            LOOP2∶INCDPTR
                  DJNZR3, LOOP2
                  MOVADDRESS, DPL
                  MOVR3,#03H            ;時分秒共3次
                  CLRA
                  MOVCA,@A+DPTR         ;取控制碼
                  JZLOOP3               ;若A=0,則數據區結束
                  MOVSTONE N, A         ;保存控制碼
            LOOP5∶INCDPTR              ;修改數據區時間單元指針
                  DECR1                 ;修改計時單元指針
                  CLRA
                  MOVCA,@A+DPTR         ;讀數據區時間
                  MOVNUMBER2, A         ;暫存
                  MOVA,@R1              ;讀計時單元時間
                  CJNEA, NUMBER2, LOOP4 ;比較時間
                  DJNZR3, LOOP5         ;3次循環
                  MOVA, STONE N         ;恢復控制碼
                  MOVP2, A              ;由P2口輸出
            LOOP3∶RET
            ;----------------------------------------------------
            ; T0中斷服務程序
            CLOCK∶PUSHPSW              ;保護
                  PUSHACC
                  SETBRS0               ;選擇工作寄存器組1
                  MOVTL0,#0CAH          ;重裝初值
                  MOVTH0,#7DH
                  INCCOUNT              ;0.1s單元加1
                  MOVA, COUNT           ;取0.1s單元內容
                  CJNEA,#0AH, DONE      ;不等于10轉DONE
                  MOVCOUNT,#00H         ;等于則清零
                  MOVR0,#SECOND         ;指向秒計數單元
                  MOVR1,#STONE S        ;指向秒計數單元基制
                  MOVR3,#03H            ;循環3次(秒分時)
            LOOP0∶MOVA,@R0             ;取計時單元值
                  ADDA,#01H             ;十進制調整
                  DAA
                  MOV@R0, A             ;送回計時單元
                  MOVNUMBER1,@R1        ;暫存
                  CJNEA, NUMBER1, DONE0 ;不等于計時基制則轉出
                  MOV@R0,#00H           ;等于則清零
                  INCR0                 ;指向下一個計數單元
                  INCR1                 ;指向下一個計數單元基制
                  DJNZR3, LOOP0         ;秒分時3次循環
            DONE0∶CALLLOOP1            ;調控制子程序
            DONE∶POPACC                ;恢復
                  POPPSW
                  RETI
            ;----------------------------------------------------
            ; ITN0中斷服務程序
            INT0∶CLREX0                ;INT0中斷關閉
                  PUSHACC
                  JNBP0.0,$             ;消除鍵抖動
                  INCMINUTE             ;分單元加1
                  MOVA, MINUTE          ;十進制調整
                  ADDA,#00H
                  DAA
                  MOVMINUTE, A
                  SUBBA,#60H            ;不等于計數基制轉DSUP2
                  JCDSUP2
                  MOVMINUTE,#00H        ;相等則分單元清零
            DSUP2∶LCALLDSUP            ;調顯示子程序
                  POPACC
                  SETBEX0               ;開INT0中斷
                  RETI                  ;中斷返回
            ;----------------------------------------------------
            ; INT1中斷服務程序
            INT1∶CLREX1                ;INT1中斷關閉
                  PUSHACC
                  JNBP0.1,$             ;消除鍵抖動
                  INCTIME               ;時單元加1
                  MOVA, TIME            ;十進制調整
                  ADDA,#00H
                  DAA
                  MOVTIME, A
                  SUBBA,#24H            ;不等于計數基制轉DSUP3
                  JCDSUP3
                  MOVTIME,#00H          ;相等則時單元清零
            DSUP3∶LCALLDSUP            ;調顯示子程序
                  POPACC
                  SETBEX1               ;開INT1中斷
                  RETI                  ;中斷返回
            ;----------------------------------------------------
           ;控制碼
            CODE0∶ORG1010H
            DB01H,06H,40H,00H,11H,06H,40H,15H,10H,06H,50H,00H,11H,07H,10H,00H
            DB01H,08H,00H,00H,11H,08H,00H,15H,01H,08H,50H,00H,11H,08H,50H,15H
            DB01H,09H,00H,00H,11H,09H,00H,15H,01H,09H,50H,00H,11H,09H,50H,15H
            DB10H,09H,55H,00H,11H,10H,05H,00H,01H,10H,10H,00H,11H,10H,10H,15H
            DB01H,11H,00H,00H,11H,11H,00H,15H,01H,11H,10H,00H,11H,11H,00H,15H
            DB01H,12H,00H,00H,11H,12H,00H,15H,01H,13H,50H,00H,11H,13H,50H,15H
            DB01H,14H,00H,00H,11H,14H,00H,15H,01H,14H,50H,00H,11H,14H,50H,15H
            DB01H,15H,00H,00H,11H,15H,00H,15H,01H,15H,50H,00H,11H,15H,50H,15H
            DB10H,18H,00H,00H,11H,18H,30H,00H,01H,19H,30H,00H,11H,19H,30H,15H
            DB01H,21H,30H,00H,11H,21H,30H,15H,00H
            END
主站蜘蛛池模板: 扎赉特旗| 长顺县| 盘山县| 银川市| 大宁县| 建平县| 包头市| 奉节县| 郁南县| 拉孜县| 靖边县| 石林| 高安市| 德保县| 万源市| 德令哈市| 汝南县| 哈尔滨市| 扎兰屯市| 陇川县| 河南省| 易门县| 沂水县| 富宁县| 托克托县| 瓮安县| 西丰县| 尉氏县| 红原县| 凉城县| 庐江县| 桂阳县| 宣威市| 晋江市| 衡山县| 伊宁县| 陇西县| 文登市| 大足县| 晋中市| 瑞昌市|