求基於MCS 51系列微控制器AT89C51,設計8路搶答

時間 2021-09-10 12:11:59

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微控制器的中斷響應過程 正在看書是 響了,暫停看書,去接 接完 從剛才的地方繼續看書!這個過程就是中斷響應的過程!而且呼叫方是否是美女直接影響中斷響應級別! 心銥 中斷,無非就是你正在執行當前 程式的時候有中斷條件...