基于单片机的8路抢答器的设计 下载本文

主程序协调三个中断一起工作,实现抢答功能,其流程图如下: Y 提醒发声 N N N N 倒计时大于5s? N 倒计时显示 显示法规号码 按键发声 Y 准备状态,显示FFF 程序初始化 开始键按下? N 非法抢答? 倒计时开始 按键发声 Y 停止键按下? Y 倒计时结束? Y 停止键按下? 显示抢答号,剩余时间 N 停止键按下? Y 抢答键按下? Y 按键发声 图4-5 主程序流程图

- 8 -

附录: 程序代码:

P3.0为开始抢答,P3.1为停止,P1.0-P1.7为八路抢答输入,数码管段选P0口,位选P2的低三位口,蜂鸣器输出为P3.6口。 ORG 0000H AJMP MAIN ORG 0003H AJMP INT0SUB ORG 000BH AJMP T0INT ORG 001BH AJMP T1INT

OK EQU 20H ; 抢答开始标志位 RING EQU 22H ; 响铃标志位

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

- 9 -

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 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: ACALL BARK; 按键发声 MOV R3,#01H AJMP ERROR

- 10 -

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 FALSE7: ACALL BARK MOV R3,#07H AJMP ERROR FALSE8: ACALL BARK MOV R3,#08H AJMP ERROR

倒计时程序(包括有效抢答程序):

COUNT: MOV R0,#00H; 重置定时器中断次数 MOV TH1,#3CH

MOV TL1,#0B0H; 重置定时器

RECOUNT: MOV A,R6; R6保存了倒计时的时间 MOV B,#0AH

DIV AB; 除十分出个位/十位 MOV 30H,A; 十位存于(30H) MOV 31H,B; 个位存于(31H)

- 11 -