1樓:匿名使用者
org 0000h
ajmp main
org 0003h
ajmp int0sub
org 000bh
ajmp t0int
org 001bh
ajmp t1int
ok equ 20h ; 搶答開始標誌位
ring equ 22h ; 響鈴標誌位
org 0040h
main: mov r1,#0fh; 初設搶答時間為15s
mov r2,#0ah; 初設答題時間為10s
mov tmod,#11h; 設定未定時器/模式1
mov th0,#0f0h
mov tl0,#0ffh; 越高發聲頻率越高,越尖
mov th1,#3ch
mov tl1,#0b0h; 50ms為一次溢位中斷
setb ea
setb et0
setb et1
setb ex0
setb ex1; 允許四個中斷,t0/t1/int0/int1
clr ok
clr ring
setb tr1
setb tr0; 一開始就執行定時器,以開始顯示fff.如果想重新計數,重置th1/tl1就可以了
//查詢程式:
start: mov r5,#0bh
mov r4,#0bh
mov r3,#0bh
acall display; 未開始搶答時候顯示fff
jb p3.0,next
acall delay
jb p3.0,next;去抖動,如果"開始鍵"按下就向下執行,否者跳到非法搶答查詢
acall bark;按鍵發聲
mov a,r1
mov r6,a; 送r1->r6,因為r1中儲存了搶答時間
setb ok; 搶答標誌位,用於count只程式中判斷是否查詢搶答
mov r3,#0ah; 搶答只顯示計時,滅號數
ajmp count;進入倒計時程式,"查詢有效搶答的程式"在count裡面
next: jnb p1.0,false1
jnb p1.1,false2
jnb p1.2,false3
jnb p1.3,false4
jnb p1.4,false5
jnb p1.5,false6
jnb p1.6,false7
jnb p1.7,false8
ajmp start
//非法搶答處理程式:
false1: acall bark; 按鍵發聲
mov r3,#01h
ajmp error
false2: acall bark
mov r3,#02h
ajmp error
false3: acall bark
mov r3,#03h
ajmp error
false4: acall bark
mov r3,#04h
ajmp error
false5: acall bark
mov r3,#05h
ajmp error
false6: acall bark
mov r3,#06h
ajmp error
false7: acall bark
mov r3,#07h
ajmp error
false8: acall bark
mov r3,#08h
ajmp error
//倒計時程式(包括有效搶答程式):
count: mov r0,#00h; 重置定時器中斷次數
mov th1,#3ch
mov tl1,#0b0h; 重置定時器
recount: mov a,r6; r6儲存了倒計時的時間
mov b,#0ah
div ab; 除十分出個位/十位
mov 30h,a; 十位存於(30h)
mov 31h,b; 個位存於(31h)
mov r5,30h ; 取十位
mov r4,31h ; 取個位
mov a,r6
clr c
subb a,#07h
jnc larger ;大於5s跳到larger,小於等於5s會提醒
mov a,r0
cjne a,#0ah,full;1s中0.5s向下執行
clr ring
ajmp check
full: cjne a,#14h,check ; 1s時,響並顯示號數並清r0,重新計時
setb ring
mov a,r6
jz quit ; 計時完畢
mov r0,#00h
dec r6 ; 一秒標誌減1
ajmp check
larger: mov a,r0
cjne a,#14h,check ; 如果1s向下執行,否者跳到查"停/顯示"
dec r6; 計時一秒r6自動減1
mov r0,#00h
check: jnb p3.1,quit; 如按下停止鍵退出
acall display
jnb p1.0,true1
jnb p1.1,true2
jnb p1.2,true3
jnb p1.3,true4
jnb p1.4,true5
jnb p1.5,true6
jnb p1.6,true7
jnb p1.7,true8
ajmp recount
quit: clr ok ; 如果按下了"停止鍵"重新回到開始
clr ring
acall bark
ajmp start
//正常搶答處理程式:
true1: acall bark; 按鍵發聲
mov a,r2
mov r6,a; 搶答時間r2送r6
mov r3,#01h
clr ok;
ajmp loop2
true2:acall bark;
mov a,r2
mov r6,a
mov r3,#02h
clr ok
ajmp loop2
true3:acall bark;
mov a,r2
mov r6,a
mov r3,#03h
clr ok
ajmp loop2
true4:acall bark;
mov a,r2
mov r6,a
mov r3,#04h
clr ok
ajmp loop2
true5: acall bark;
mov a,r2
mov r6,a
mov r3,#05h
clr ok
ajmp loop2
true6: acall bark;
mov a,r2
mov r6,a
mov r3,#06h
clr ok
ajmp loop2
true7: acall bark;
mov a,r2
mov r6,a
mov r3,#07h
clr ok
ajmp loop2
true8: acall bark;
mov a,r2
mov r6,a
mov r3,#08h
clr ok
ajmp loop2
loop2: ajmp display ;搶答後停止計時,等待返回
setb ring
jnb p3.1 , quit
ajmp loop2
//犯規搶答程式:
error: setb ring ;犯規響鈴
mov r5,#0bh
mov r4,#0bh; 顯示ff和犯規號數
loop3: acall display
jnb p3.1 , quit1; 等待"停止"鍵按下
ajmp loop3
quit1: clr ring
clr ok
ajmp start
//顯示程式:
display:mov dptr,#dat1; 查表顯示程式,利用p0口做段選碼口輸出/p2低三位做位選碼輸出
mov a,r5
movc a,@a+dptr
mov p2,#01h
mov p0,a
acall delay
mov dptr,#dat2
mov a,r4
movc a,@a+dptr
mov p2,#02h
mov p0,a
acall delay
mov a,r3
movc a,@a+dptr
mov p2,#04h
mov p0,a
acall delay
retdat1:db 00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00h,71h
;"滅","1","2","3","4","5","6","7","8","9","滅","f"
dat2:db 3fh, 06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00h,71h
delay1: mov 35h,#08h
loop0: acall display
djnz 35h,loop0
ret//延時(顯示和去抖動用到):
delay: mov 32h,#12h
loop: mov 33h,#0afh
loop1: djnz 33h,loop1
djnz 32h,loop
ret//發聲程式:
bark: setb ring
acall delay1
acall delay1
acall delay1
acall delay1
clr ring; 按鍵發聲
ret//int0(搶答時間r1調整程式):
int0sub:mov a,r1
mov b,#0ah
div ab
mov r5,a
mov r4,b
mov r3,#0ah
acall display;先在兩個時間led上顯示r1
jnb p3.2,inc0; p3.2為+1s鍵,如按下跳到inco
jnb p3.3,dec0; p3.3為-1s鍵,如按下跳到deco
jnb p3.4,back0; p3.4為確定鍵,如按下跳到backo
ajmp int0sub
inc0: mov a,r1
cjne a,#63h,add0; 如果不是99,r2加1,如果加到99了,r1就置0,重新加起
mov r1,#00h
acall delay1
ajmp int0sub
add0: inc r1
acall delay1
ajmp int0sub
dec0: mov a,r1
jz setr1;如果r1為0, r1就置99,
dec r1
acall delay1
ajmp int0sub
setr1: mov r1,#63h
acall delay1
ajmp int0sub
back0: reti
//to溢位中斷(響鈴程式):
t0int:mov th0,#0ech
mov tl0,#0ffh
jnb ring,out
cpl p3.6 ; ring標誌位為1時候p3.6口不短取反使喇叭發出一定頻率的聲音
out: reti
//t1溢位中斷(計時程式):
t1int: mov th1,#3ch
mov tl1,#0b0h
inc r0
reti
end設計圖發你郵箱
MCS 51微控制器的中斷問題,MCS 51微控制器問題?
中斷系統中有兩個 使用者不能使用的 優先順序狀態觸發器 其中一個,置1時,表示正在執行高優先順序的中斷,遮蔽所有中斷請求 還有一個,置1時,表示正在執行低優先順序的中斷,遮蔽同級中斷請求.明白了吧?其實就是說這兩個觸發器,是使用者無法訪問到的,是內建且自動賦值的.一旦有高優先順序的中斷執行了,第一個...
mcs51微控制器的偽指令有哪些,MCS51微控制器的偽指令有哪些?
雨人吉他 1 資料傳送類指令 助記符 功能說明 位元組數 振盪週期 mov a,rn 暫存器內容送入累加器 1 12 mov a,direct 直接地址單元中的資料送入累加器 2 12 mov a,ri 間接ram中的資料送入累加器 1 12 mov a,data8 8位立即數送入累加器 2 12 ...
間述MCS 51微控制器的中斷響應過程
產生中斷訊號,發出中斷申請,響應中斷,進入中斷服務程式,中斷返回 2 簡述mcs 51微控制器的中斷響應過程 正在看書是 響了,暫停看書,去接 接完 從剛才的地方繼續看書!這個過程就是中斷響應的過程!而且呼叫方是否是美女直接影響中斷響應級別! 心銥 中斷,無非就是你正在執行當前 程式的時候有中斷條件...