這是基于單片機的簡易數字時鐘,能顯示秒、分、時。其中第一個按鍵按下后是時加一,第二個按鍵按下后是分加一,第三個按鍵是清零
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機匯編語言程序:
- ;====================================================================
- ; Main.asm file generated by New Project wizard
- ;
- ; Created: 周五 5月
- ; Processor: 80C51
- ; Compiler: ASEM-51 (Proteus)
- ;====================================================================
- $NOMOD51
- $INCLUDE (8051.MCU)
- ;====================================================================
- ; DEFINITIONS
- ;====================================================================
- ;====================================================================
- ; VARIABLES
- ;====================================================================
- ;====================================================================
- ; RESET and INTERRUPT VECTORS
- ;====================================================================
- ; Reset Vector
-
- ORG 0000H;程序開始地址
- LJMP MAIN;跳到MAIN
- ORG 000BH;TO 中斷程序入口
- LJMP INTT0;跳到To開始執行程序
- ORG 0100H
- MAIN:
- MOV @R0,#70H;準備7OH-79H 10個字節空間
- MOV R7,#09H
- XIANSHICHUSHIHUA:
- MOV @R0,#00H;將70H-79H初始化為00H
- INC R0
- DJNZ R7,XIANSHICHUSHIHUA
- MOV TMOD,#01H;設To為16位定時器
- MOV TL0,#0B0H;賦初始值
- MOV TH0,#3CH
- SETB EA;CPU開中斷
- SETB ET0;允許To中斷
- SETB TR0;啟動To
- MOV R4,#14H;1S設定初始值
- LOOP:
- LCALL XIANSHI;調用顯示程序
- JB P1.0,LOOP1;判斷P1.0有無按下
- LCALL HOUR_SET;調用小時設定程序
- AJMP LOOP
- LOOP1:
- JB P1.1,LOOP2;判斷P1.1有無按下
- LCALL MIN_SET;調用分設定程序
- AJMP LOOP
- LOOP2:
- JB P1.2,LOOP3;判斷P1.2有無按下
- LCALL CLR0;調用清零程序,這里只清零秒
- AJMP LOOP
- LOOP3:
- AJMP LOOP
- HOUR_SET:
- ACALL XIANSHI;調用顯示程序
- JNB P1.0,HOUR_SET ;P1.0按下跳到調小時程序
- INC 78H;小時的個位加1
- MOV R6,78H
- CJNE R6,#10,HOUR1 ;個位不為10跳到HOUR1
- MOV 78H,#0;個位清零
- INC 79H;十位加1
- JMP EXIT;跳到EXIT
- HOUR1:
- MOV R6,78H
- CJNE R6,#4,EXIT;個位不為4跳到EXIT
- MOV R6,79H
- CJNE R6,#2,EXIT;十位不為2跳到EXIT
- MOV 78H,#0;小時清零
- MOV 79H,#0
- EXIT:
- RET;調時返回
- MIN_SET:
- CALL XIANSHI;調用顯示程序
- JNB P1.1,MIN_SET;P1.1按下跳到調分程序
- INC 76H;分的個位加1
- MOV R5,76H
- CJNE R5,#10,EXIT ;個位不為10 跳到 MIS1
- MOV 76H,#0;個位清零
- INC 77H;十位加1
- MOV R5,77H
- CJNE R5,#6,EXIT;十位不為6跳到MIS1
- MOV 77H,#0;分清零
- MOV 76H,#0
- RET
- INTT0:
- PUSH ACC;入棧,保護現場
- PUSH PSw
- CLR ET0;關閉中觀允許
- CLR TR0;關閉中斷
- MOV A,#0B7H;中斷響應時間同步修正
- ADD A,TL0;低8位初值修正
- MOV TL0 ,A
- MOV A,#3CH;高8位初值修正
- ADDC A,TH0
- MOV TH0,A
- SETB TR0;開啟定時器TO
- DJNZ R4,OUT;20 次中斷未到中斷退出
- ADDS:
- MOV R4,#14H;20次中斷到重賦初值
- MOV R0,#71H;指向秒計時單元
- ACALL ADD1;調用ADD1
- MOV A,R3;秒數據放入A
- CLR C;清零進位標志
- CJNE A,#60,ADDMM;秒是否到了60.是則跳轉
- ADDMM:
- JC OUT;小雨60秒中斷退出
- ACALL CLR0;等于60秒調用 CLRO清零秒
- MOV R0,#77H;指向分計時單元
- ACALL ADD1;調用 ADD1
- MOV A,R3;分數據放入A
- CLR C;清零進位標志
- CJNE A,#60,ADDH;分是否到了60,是則跳轉
- ADDH:
- JC OUT;小于60分時中斷退出
- ACALL CLR0;等于60分調用 CLRO清零秒
- MOV R0,#79H;指向時計時單元
- ACALL ADD1;調用ADD1
- MOV A,R3;時數據放入A
- CLR C;清零進位標志
- CJNE A,#24H,HOUR ;時是否到了24是則跳轉
- HOUR:
- JC OUT;小于24時時中斷退出
- ACALL CLR0;調用 CLRO
- OUT:
- MOV 72H,76H;將分的存儲地址轉移
- MOV 73H,77H
- MOV 74H,78H;將時的存儲地址轉移
- MOV 75H,79H
- POP PSW;恢復現場
- POP ACC
- SETB ET0
- RETI
- CLR0:
- CLR A;清零A
- MOV @R0,A;清零RO存放地址中的數據
- DEC R0;RO地址減1
- MOV @R0,A
- RET
- ADD1:
- MOV A,@R0;取當前計時單元數據到A
- DEC R0;指向前一地址
- SWAP A;A中數據高四位與低四位交換
- ORL A,@R0;前一地址中數據放入A中低四位
- ADD A,#01H;A加1操作
- DA A;十進制調整
- MOV R3,A;移入R3寄存器
- ANL A,#0FH;高四位變0
- MOV @R0,A;放回前一地址單元
- MOV A,R3;取回R3中暫存數據
- INC R0;指向當前地址單元
- SWAP A;A中數據高四位與低四位交換
- ANL A,#0FH;高四位變0
- MOV @R0,A;數據放入當削地址單元中
- RET;子程序返回
- XIANSHI:
- MOV R1,#70H;指向顯示數據首址
- MOV R5,#01H;掃描控制字初值
- PLAY:
- MOV A,R5;掃描字放入A
- MOV P2,A;從P2口輸出
- MOV A,@R1;取顯示數據到A
- MOV DPTR,#TAB;取段碼表地址
- MOVC A,@A+DPTR;查顯示數據對應段碼
- MOV P0,A;段碼放入PO口
- LCALL DL1MS;顯示1MS
- INC R1;指向下一地址
- MOV A,R5;掃描控制字放入A
- JB ACC.5,ENDOUT ;ACC.5=0時一次顯示結束
- RL A;A中數據循環左移
- MOV R5,A;放回R5內
- AJMP PLAY;跳回PLAY循環
- ENDOUT:
- CLR P2.5;一次顯示結束,P2口復位
- RET;子程序返回
- TAB:
- DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
- DL1MS: ;1毫秒延時程序
- MOV R6,#14H
- DL1:
- MOV R7,#19H
- DL2:
- DJNZ R7,DL2
- DJNZ R6,DL1
- RET
- END
- ;====================================================================
- ; CODE SEGMENT
- ;====================================================================
- ;====================================================================
-
復制代碼
Proteus8.8仿真文件下載:
時鐘.zip
(22.74 KB, 下載次數: 39)
2022-5-5 23:41 上傳
點擊文件名下載附件
|