MCS-51單片機(jī)中斷測試系統(tǒng)設(shè)計(jì)
;========================================================
;設(shè)計(jì)要求
;
;1、硬件設(shè)計(jì)要求
;使用AT89C51單片機(jī),時(shí)鐘12MHz,設(shè)計(jì)時(shí)鐘電路和上電復(fù)位電路,
;P0口、P1口、P2口分別驅(qū)動3個(gè)LED七段數(shù)碼管顯示器,
;P3口的外部中斷0和外部中斷1分別連接按鍵K1和按鍵K2。
;
;2、軟件設(shè)計(jì)要求
;從0000H單元地址開始編制主程序;
;1秒鐘定時(shí)由單片機(jī)內(nèi)部定時(shí)器完成,定時(shí)器0完成50毫秒定時(shí),定時(shí)器1完成20的計(jì)數(shù)。
;軟件要在Proteus仿真環(huán)境下可以運(yùn)行,并實(shí)現(xiàn)下列的功能要求。
;正常狀態(tài)下,第一個(gè)數(shù)碼顯示器每隔1秒循環(huán)顯示0到9數(shù)字;
;當(dāng)按鍵K1按下時(shí),產(chǎn)生中斷,第二個(gè)數(shù)碼顯示器每隔1秒分別顯示0到9數(shù)字后,返回到第一個(gè)數(shù)碼顯示器繼續(xù)每隔1秒循環(huán)顯示0到9數(shù)字;
;當(dāng)按鍵K2按下時(shí),可以中斷前面的顯示程序,第三個(gè)數(shù)碼管顯示器每隔1秒分別顯示0到9數(shù)字后,返回中斷前狀態(tài)繼續(xù)運(yùn)行。
;
;懸賞分:100 - 解決時(shí)間:2010-7-5 21:39
;========================================================
;從題目中要求出現(xiàn)的現(xiàn)象來看,很明顯是要求反映出兩個(gè)開關(guān)按下時(shí),中斷程序和主程序之間的優(yōu)先級別的關(guān)系。
;51單片機(jī)只有兩個(gè)中斷優(yōu)先級,應(yīng)該把它們設(shè)置給外部中斷X1和X0,其它中斷源如T1和T0,只能采用查詢方式。
;原要求用T1計(jì)數(shù)20次,本程序?qū)Υ诉M(jìn)行了簡化,在軟件查詢T0定時(shí)期間,用軟件計(jì)數(shù),效果相同。
;程序如下:
;----------------------------------------------
ORG 0000H
SJMP START
ORG 0003H
LJMP X0_INT ;轉(zhuǎn)到X0中斷入口
ORG 0013H
LJMP X1_INT ;轉(zhuǎn)到X1中斷入口
;----------------------------------------------
START:
MOV TMOD, #01H ;T0定時(shí)方式1
MOV TH0, #HIGH(65536 - 50000) ;定時(shí)
MOV TL0, #LOW(65536 - 50000) ;定時(shí)50ms
SETB TR0
SETB IT0 ;下降沿觸發(fā)外部中斷
SETB IT1
MOV SP, #60H
MOV IE, #10000101B ;只是允許X1,X0申請中斷
MOV IP, #00000100B
MOV 30H, #0
MOV 31H, #0
MOV 32H, #0
MOV 33H, #20
MOV P0, #0C0H ;數(shù)碼管顯示0
MOV P1, #0C0H ;顯示0
MOV P2, #0C0H ;顯示0
;----------------------------------------------
M_LOOP:
MOV A, 30H ;主程序顯示0~9的計(jì)數(shù)單元
MOV DPTR, #NUMTAB ;指定查表地址
MOVC A, @A+DPTR ;查七段碼
MOV P0, A ;送出去顯示
CALL WAIT1S ;等上1秒鐘
MOV A, 30H
ADD A, #1
DA A
ANL A, #0FH
MOV 30H, A
SJMP M_LOOP ;無限循環(huán)
;----------------------------------------------
X0_INT:
PUSH ACC ;保護(hù)現(xiàn)場
PUSH PSW
SETB RS0 ;換工作區(qū)1
MOV 31H, #0 ;T0中斷程序顯示0~9的計(jì)數(shù)單元
X0_LOOP:
MOV A, 31H ;取來T0的計(jì)數(shù)值
MOV DPTR, #NUMTAB ;指定查表地址
MOVC A, @A+DPTR ;查七段碼
MOV P2, A ;送出去顯示
CALL WAIT1S ;等上1秒鐘
MOV A, 31H
ADD A, #1
DA A
ANL A, #0FH
MOV 31H, A
JNZ X0_LOOP ;不為0,就循環(huán)
MOV P2, #0C0H
POP PSW
POP ACC ;恢復(fù)現(xiàn)場
RETI
;----------------------------------------------
X1_INT:
PUSH ACC ;保護(hù)現(xiàn)場
PUSH PSW
SETB RS0 ;換工作區(qū)1
SETB RS1 ;換工作區(qū)3
MOV 32H, #0 ;T1中斷程序顯示0~9的計(jì)數(shù)單元
X1_LOOP:
MOV A, 32H ;取來T1的計(jì)數(shù)值
MOV DPTR, #NUMTAB ;指定查表地址
MOVC A, @A+DPTR ;查七段碼
MOV P1, A ;送出去顯示
CALL WAIT1S ;等上1秒鐘
MOV A, 32H
ADD A, #1
DA A
ANL A, #0FH
MOV 32H, A
JNZ X1_LOOP ;不為0,就循環(huán)
MOV P1, #0C0H
POP PSW
POP ACC ;恢復(fù)現(xiàn)場
RETI
;----------------------------------------------
NUMTAB:
DB 0C0H, 0F9H, 0A4H, 0B0H, 099H
DB 092H, 082H, 0F8H, 080H, 090H
;----------------------------------------------
WAIT1S:
JNB TF0, $ ;等待50ms
MOV TL0, #LOW(65536 - 50000) ;定時(shí)50ms
MOV TH0, #HIGH(65536 - 50000) ;定時(shí)50ms
CLR TF0
DJNZ 33H, WAIT1S ;繼續(xù)等待20次
MOV 33H, #20 ;終于等到了1s
RET
;----------------------------------------------
END
;----------------------------------------------
;程序用PROTEUS運(yùn)行,屏幕截圖如下: