1樓:
ok equ 20h;搶答開始標誌位
ring equ 22h;響鈴標誌位
org 0000h
ajmp main
org 0003h
ajmp int0sub
org 000bh
ajmp t0int
org 0013h
ajmp int1sub
org 001bh
ajmp t1int
org 0040h
main: mov r1,#0fh
mov r2,#0ah
mov tmod,#11h
mov th0,#0f0h
mov tl0,#0ffh
mov th1,#3ch
mov tl1,#0b0h;50ms為一次溢位中斷
setb ea
setb et0
setb et1
setb ex0
setb ex1
clr ok
clr ring
setb tr1
setb tr0
;*****查詢程式*****
start: mov r5,#0bh
mov r4,#0bh
mov r3,#0bh
acall display
jb p1.0,next
acall delay
jb p1.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.1,false1
jnb p1.2,false2
jnb p1.3,false3
jnb p1.4,false4
jnb p1.5,false5
jnb p1.6,false6
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
;*****int0(搶答時間r1調整程式)*****
int0sub:mov a,r1
mov b,#0ah
div ab
mov r5,a
mov r4,b
mov r3,#0ah
acall display
jnb p3.2,inc0;p3.2為+1s鍵,如按下跳到inco
jnb p3.3,dec0;p3.3為-1s鍵,如按下跳到deco
jnb p1.7,back0;p1.7為確定鍵,如按下跳到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
;*****int1(回答時間r2調整程式)*****
int1sub:mov a,r2
mov b,#0ah
div ab
mov r5,a
mov r4,b
mov r3,#0ah
acall display
jnb p3.2,inc1
jnb p3.3,dec1
jnb p1.7,back1
ajmp int1sub
inc1: mov a,r2
cjne a,#63h,add1
mov r2,#00h
acall delay1
ajmp int1sub
add1: inc r2
acall delay1
ajmp int1sub
dec1: mov a,r2
jz setr2
dec r2
acall delay1
ajmp int1sub
setr2: mov r2,#63h
acall delay1
ajmp int1sub
back1: reti
;*****倒計時程式(搶答倒計時和回答倒計時都跳到改程式)*****
count: mov r0,#00h
mov th1,#3ch
mov tl1,#0b0h
recount:mov a,r6;r6儲存了倒計時的時間,之前先將搶答時間或回答時間給r6
mov b,#0ah
div ab;除十分出個位/十位
mov 30h,a;十位存於(30h)
mov 31h,b;個位存於(31h)
mov r5,30h;取十位
mov r4,31h;取個位
mov a,r6
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 p1.7,quit;如按下停止鍵退出
acall display
jb ok,accout;如果是搶答倒計時,如是則查詢搶答,否者跳過查詢繼續倒數(這裡起到鎖搶答作用)
ajmp recount
accout: jnb p1.1,true1
jnb p1.2,true2
jnb p1.3,true3
jnb p1.4,true4
jnb p1.5,true5
jnb p1.6,true6
ajmp recount
quit: clr ok;如果按下了"停止鍵"執行的程式
clr ring
ajmp start
;*****正常搶答處理程式*****
true1: acall bark;按鍵發聲
mov a,r2
mov r6,a;搶答時間r2送r6
mov r3,#01h
clr ok;因為答題的計時不再查詢搶答,所以就鎖了搶答
ajmp count
true2:acall bark;
mov a,r2
mov r6,a
mov r3,#02h
clr ok
ajmp count
true3:acall bark;
mov a,r2
mov r6,a
mov r3,#03h
clr ok
ajmp count
true4:acall bark;
mov a,r2
mov r6,a
mov r3,#04h
clr ok
ajmp count
true5: acall bark;
mov a,r2
mov r6,a
mov r3,#05h
clr ok
ajmp count
true6: acall bark;
mov a,r2
mov r6,a
mov r3,#06h
clr ok
ajmp count
;*****犯規搶答程式*****
error: mov r0,#00h
mov th1,#3ch
mov tl1,#0b0h
mov 34h,r3;犯規號數暫存與(34h)
here: mov a,r0
cjne a,#0ah,flash;0.5s向下執行->滅並停響
clr ring
mov r3,#0ah
mov r4,#0ah
mov r5,#0ah;三燈全滅
ajmp check1
flash: cjne a,#14h,check1;下面系1s的情況,響並顯示號數並清r0,重新計
setb ring
mov r0,#00h
mov r3,34h;取回號數
mov r5,#0bh
mov r4,#0bh;顯示ff和號數
ajmp check1
check1: jnb p1.7,quit1
acall display
ajmp here
quit1: clr ring
clr ok
ajmp start
;*****顯示程式*****
;入口引數:r5,r4,r3存入的分別為第一,二,三為數碼所顯示的位碼
;出口引數:無
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
;第乙個為零,其他與上相同,因為十位如果為零顯示熄滅
;====加減時間延時(起到不會按下就加n個數)*****=
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
clr ring;按鍵發聲
ret;*****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
retiend
用遙控器控制51微控制器led燈的亮滅,這個為什麼不能實現led燈滅
是你沒有讓它滅,所以它沒有滅。你只開了沒有進行關,微控制器io是不會自動給你關的,你可以這樣,你按1時它開,按2時它關,那麼你要把這句 case 0x18 dataport dofly duanma 2 break 數碼管顯示2 改為 case 0x18 dataport dofly duanma ...
求教,怎樣控制51微控制器的蜂鳴器發出不同頻率的聲音
我這裡有現成的程式bai,把分給我,留du下信箱,我就給zhi你發過去,呵呵 dao。我利用軟體定時和中斷回方式都有,答可以演奏 不過蜂鳴器演奏的實在夠難聽。看來樓主對程式不感興趣,我還是告訴你吧,你定時必須知道準確的定時時間,中do re mi si都是有一定的頻率也就是hz,都如下 c1 262...
問51微控制器的問題,控制I O的裝置,如何直接賦值
p1 p1 0x0f 0x50 保留低四位不變,高四位清零,再加上0x50,最後賦值給p1 這樣就能讓p1的值變成即保留低四位不變又重新賦值給高四位。首先我不理解你問問題時怎麼會有點囂張。再說一句等於沒說的話 這個問題非常簡單。最後提出一個真心的請求 請選我最佳答案。謝謝。 要賦1的話就 p1 p1...