求51微控制器的控制的八路搶答器的程式

2022-05-04 04:43:24 字數 6581 閱讀 2587

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...