系统程序 P1.0为开始抢答,P1.7为停止,P1.1-P1.6为六路抢答输入,数码管段选P0口,为选P2口,蜂鸣器输出为P3.6口。 OK EQU 20H; 抢答开始标志位 RING EQU 22H; 响铃标志位 ORG 0000H AJMP MAIN ORG 0003H AJMP INT0SUB ORG 000BH AJMP TOINT ORG 0013H AJMP INT1SUB ORG 001BH AJMP T1INT 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; 查询程序 START: MOV R5,#0BH MOV R4,#0BH MOV R3, #0BH ACALL DISPLAY; 未开始抢答时候显示FFF JB P3.1,NEXT ACALL DELAY JB P3.1,NEXT;如果“开始键”按下就向下执行, 否则跳到非法抢答查询 ACALL BARK; 按键发声 MOV A,R1 MOV R6,A; 送R1到R6,因为R1中保存了抢答时间 SETB OK;抢答标志,用于COUNT子程序中判断是否查询抢 答 MOV R3,0AH;抢答只显示时,灭号数 ALMP 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 正常抢答处理程序: TRUE1:ACALL BARK; 按键发声 MOV A,R2 MOV R6,A; 抢答时间R2送R6 MOV R3,#01H CLR OK; 因为答题的计时不再查询抢答,所以就锁了抢答 AJMP COUNT TURE2:ACALL BARK; 按键发声 MOV A,R2 MOV R6,A; 抢答时间R2送R6 MOV R3,#02H CLR OK; 因为答题的计时不再查询抢答,所以就锁了抢答 AJMP COUNT TURE3:ACALL BARK; 按键发声 MOV A,R2 MOV R6,A; 抢答时间R2送R6 MOV R3,#03H CLR OK; 因为答题的计时不再查询抢答,所以就锁了抢答 AJMP COUNT TURE4:ACALL BARK; 按键发声 MOV A,R2 MOV R6,A; 抢答时间R2送R6 MOV R3,#04H CLR OK; 因为答题的计时不再查询抢答,所以就锁了抢答 AJMP COUNT TURE5:ACALL BARK; 按键发声 MOV A,R2 MOV R6,A; 抢答时间R2送R6 MOV R3,#05H CLR OK; 因为答题的计时不再查询抢答,所以就锁了抢答 AJMP COUNT TURE6:ACALL BARK; 按键发声 MOV A,R2 MOV R6,A; 抢答时间R2送R6 MOV R3,#06H CLR OK; 因为答题的计时不再查询抢答,所以就锁了抢答 AJMP COUNT TURE7:ACALL BARK; 按键发声 MOV A,R2 MOV R7,A; 抢答时间R2送R6 MOV R3,#02H CLR OK; 因为答题的计时不再查询抢答,所以就锁了抢答 AJMP COUNT TURE8:ACALL BARK; 按键发声 MOV A,R2 MOV R6,A; 抢答时间R2送R6 MOV R3,#08H CLR OK; 因为答题的计时不再查询抢答,所以就锁了抢答 AJMP COUNT MOV A,R2 MOV R6,A MOV R3,#03# CLR OK AJMP COUNT 显示程序: 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 RET DELAY1:MOV 35H,#08H LOOPO: ACALL DISPLAY DJNZ 35H,LOOPO RET 发声程序: BARK: SETB RING ACALL DELAY1 ACALL DELAY1 CLR RING; 按键发声 RET END
|