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,#30;初设抢答时间为 30s
MOV R2,#60;初设答题时间为 60s
MOV TMOD,#11H;设置定时器工作于方式 1
MOV TH0,#0FH
MOV TL0,#0B1H;越高发声频率越高,越尖
MOV TH1,#3CH
MOV TL1,#0B0H;50ms为一次溢出中断
SETB EA
SETB ET0
SETB ET1
SETB EX0
SETB EX1;允许 4个中断, 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 R7,#01H;读抢答键数据信号标志,这里表示只读一次有用信号
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:MOV R3,#01H
AJMP ERROR
FALSE2:MOV R3,#02H
AJMP ERROR
FALSE3:MOV R3,#03H
AJMP ERROR
FALSE4:MOV R3,#04H
AJMP ERROR
FALSE5:MOV R3,#05H
AJMP ERROR
FALSE6:MOV R3,#06H
AJMP ERROR