【单片机汇编实战】基于51单片机的抢答器设计


操作系统:Win10
设计软件:Keil5 + proteus
单片机选型:AT89C51
制作日期:2020.6.15
发布日期:2020.12.25

一、项目要求

(1)构建proteus仿真平台:包含抢答输入+串口+数码管

(2)通过串口设置计时器的开始,并把抢答结果通过串口输出

(3)数码管输出抢答结果+组号

(4)比赛结束,能发出报警声

二、设计难点

1、合理分配89C51的中断系统。计划将两个定时器中断分别运用于抢答倒计时和蜂鸣器发出警报的时长,将两个外部中断分别运用于自定义倒计时时长。

2、机器周期与现实时间的匹配、及定时器的初值设定问题。

3、系统的启动、抢答功能则利用程序结构,不断循环检测。

4、在中断用尽的情况下考虑如何设计抢答器的抢答模式和待机模式(可自定义时长)的设计。

5、在抢答器的抢答模式和待机模式中,分别考虑数码管显示和抢答的公平性,故决定循环如下:显示数码管十位->检测玩家一是否抢答->检测玩家二是否抢答->显示数码管个位->检测玩家三是否抢答->检测玩家四是否抢答。

6、数码管显示所须的BCD码与二进制的运算问题。

7、单片机的重启复位保护功能。

8、便于用户增设抢答人数的拓展功能。

三、设计思路

在这里插入图片描述
系统分为两个模式,等待模式和抢答模式。

默认状态下为等待模式,该状态下可调节倒计时时间和启动倒计时开始抢答。

抢答模式中,则开始倒计时,任意玩家按下抢答键,倒计时即刻停止,且蜂鸣器发出警报,晶体管显示抢答成功玩家的标号;若倒计时结束无玩家抢答,数码管显示0,且蜂鸣器发出警报。无论以何种方式结束,系统都将再次进入等待模式,倒计时时间将恢复。在抢答模式中,用户不能对倒计时时间进行操作。

为了打破抢答用户数量的限制且保证相对公平性,各抢答器将不使用外部中断功能触发(51单片机仅2个外部中断),而采用循环检索的方式,通常情况下单片机的指令周期为微妙级,在现实应用中可忽略其误差影响。

而倒计时时间设定模块对触发时效性要求不高,也可使用循环检索,但为了代码编写便利,我们将两个外部中断功能用于此处,恰好满足两位数的时间设定需求。

而单片机的两个定时器中断源将分别用于抢答倒计时(可调)和蜂鸣器及显示抢答成功用户(3s)。

四、proteus设计图

在这里插入图片描述
(1)核心元件在电路中的功能:
AT89C51作为控制芯片,完成运算控制、信号识别以及实现显示功能。

四位数码管前两位显示倒计时,第三位置空,最后一位显示抢答组号。

晶体振荡器产生稳定的时钟脉冲来控制振荡电路的输入和输出。

蜂鸣器在比赛结束时能发出报警声。

(2)主要功能在电路中是如何完成的:

抢答器电路

四个抢答器按钮分别接于P1.1到P1.4,用于识别抢答按键的先后,锁存第一位抢答者编号,使后按者无效,之后通过译码显示抢答者编号。

其中切换模式开关接于P1.0,用于启动抢答模式。

复位重启电路

复位电路接于RST口,用于抢答前和抢答后的复位与重启功能。

时钟振荡电路

时钟振荡电路接于XTAL1和XTAL2,用一个晶体振荡器产生稳定的时钟脉冲来控制振荡电路的输入和输出,用于提供精确的定时。为了仿真实验便于计算,设置晶振为12MHz。

晶体管显示电路

接于P0.0到P0.6和P2.0到P2.3,用来显示各提示信息。前两位显示倒计时时间,最后一位显示抢答用户的序号,若无人抢答,显示0。开机后倒计时默认10s。

报警电路

接于P1.6,当比赛结束时发出报警声。为了方便观测,串接小灯表示状态。

串口输入输出电路

接于P3.0和P3.1,当串口输入s启动,串口抢答结果输出为SUC:+编号 无人抢答输出NONE。

设置时间电路

两个按键分别独立控制个位和十位,分别从0-9循环。

五、实验结果与性能指标

1、定时器置数设置(定时器0和定时器1相同):

MOV TMOD,#01H;设置定时器0模式
MOV TL0,#0B0H;
MOV TH0,#3CH;设置定时器0的初值

MOV 11H,#60;蜂鸣器持续3s,每1s为20个loop

仿真设置晶振为12MHz,使用16位计数器,每一秒设置20个循环,即赋值应为216-1/20·106=15536=3CB0 H

2、抢答模式中,对各个用户检测的公平性:

//循环顺序:显示数码管十位->检测玩家1->检测玩家2->显示数码管个位->检测玩家3->检测玩家4,交错执行使数码管视觉效果均匀,对玩家的识别也相对公平

将顺序平均分配,保证检测的相对公平。以12MHz振荡频率为例,一个机器周期为1us。根据代码,相邻用户检测间相差5us;显示一位数码管也为5us。即用户之间最多相差5us,对实际使用几乎不造成影响。

3、倒计时模式下的时间设定功能:
倒计时模式下,软件禁止外部中断功能,但计数器依然运行,因此按下后外部标志位会置1,但不运行中断。直到抢答模式结束,进入等待模式后,开启外部中断允许,倒计时时间设定改变。因此抢答过程中,时间设定不会对功能造成影响,抢答结束后数码管时间才会立即变化(一位)。

4、设定时间00s后启动抢答:
蜂鸣器会立即被触发,数码管显示结果0(无人抢答),再次进入等待,不会触发bug。

5、数码管、蜂鸣器、串口的计数器分配问题:
由于串口必须使用计数器T1,因此分配蜂鸣器为T2。数码管在倒计时时,串口不工作,使用T1的中断;数码管显示结果时,串口也须输出结果,蜂鸣器发出警报,因此数码管使用T0的中断。

6、时钟、复位的仿真问题:
在proteus软件中无法调试复位功能,但根据电路图,我们可以推断该复位短路基本正确,在现实中可以实现复位功能。

同时我们发现,改变晶振大小并不会使机器周期变化,默认为12MHz。对仿真过程没有大碍。

六、源码(含.asm汇编代码和.DSN电路文件)

点击此处下载

未经允许不得转载,不得作为商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:点我我会动 设计师:我叫白小胖 返回首页
评论

打赏作者

Owen1u

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值