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
推薦閱讀
- 24小時學會電腦組裝與維護
- Learning AngularJS Animations
- SDL Game Development
- Effective STL中文版:50條有效使用STL的經驗(雙色)
- 數字邏輯(第3版)
- Large Scale Machine Learning with Python
- R Deep Learning Essentials
- 面向對象分析與設計(第3版)(修訂版)
- 電腦高級維修及故障排除實戰
- “硬”核:硬件產品成功密碼
- 單片機原理及應用:基于C51+Proteus仿真
- 計算機應用基礎案例教程(Windows 7+Office 2010)
- ARM接口編程
- DevOps實戰:VMware管理員運維方法、工具及最佳實踐
- Machine Learning Projects for Mobile Applications