当前位置:首页 > 基于51单片机的 6路抢答器 - 图文
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: SETB P3.0 SETB P3.1 SETB P3.7
MOV R5,#0BH MOV R4,#0BH MOV R3,#0BH ACALL DISPLAY
JB P1.0,NEXT ACALL DELAY
JB P1.0,NEXT;去抖动,如果\开始键\按下就向下执行,否者跳到非法抢答查询
ACALL BARK;按键发声
33
CLR P3.0 SETB P3.1 SETB P3.7 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
34
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
35
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,#0000 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
36
共分享92篇相关文档