电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
课程设计系列之多路抢答器
分 享
扫描二维码分享
课程设计系列之多路抢答器
51单片机
课程设计
抢答器
入门电子设计
关注
发布时间: 2021-03-31
丨
阅读: 659
## 简介 大家好,本篇文章的内容是基于51单片机的多路抢答器,首先来看一下抢答器需要实现的功能,多路抢答器肯定要支持多路抢答,所以在设计电路时要设计多个抢答按键,还需要两个按键用于开启抢答,在开启抢答后可以添加一个数码管用于显示抢答时间的倒计时,有选手抢答后数码管会显示选手的序号,也可以在抢答成功后亮起一个LED灯进行指示,当抢答结束或者超时无人抢答后可以通过再次按下开始抢答按键进行电路复位,最后再添加一个按键设置抢答倒计时时间。以上就是多路抢答器基本的功能设计,确定好功能后我们就可以开始电路部分的设计了。 ## 硬件设计 硬件部分还是先通过Proteus仿真进行验证,首先列出需要用到的器件: - AT89C52单片机 - 按键 - 2位数码管 - LED - 电阻 选择好用到的器件后开始连接电路,下面是抢答器的仿真电路图, ![](https://cf05.ickimg.com/bbsimages/202103/fda840d8ee23bb5ec6ac17a4451bada6.png) 电路主要包括单片机、按键、数码管、LED这四部分,仿真中的单片机不需要添加其他的外围电路,直接放置芯片就能运行。 数码管用来显示抢答倒计时和抢答成功的选手号码,在这里选择的是两位的共阳极数码管,数码管的两个阳极分别连接到了单片机的P10、P11口,数码管阴极连接到了单片机的P2口,下面是数码管在proteus中的位置, ![](https://cf05.ickimg.com/bbsimages/202103/2818fe4174d665af95d01b049041a608.png) 在这里设置了6个按键用于选手抢答,分别连接到了单片机的P3口, ![](https://cf05.ickimg.com/bbsimages/202103/8a893f73758fbdaa29d7d7dc98d86e61.png) 单片机P13、P14口连接的两个按键分别用于开启抢答和调整抢答倒计时时间, ![](https://cf05.ickimg.com/bbsimages/202103/913f9049b9abf72fe607fd6b399b2cb6.png) LED用于在有人成功抢答后亮起进行提示。 ![](https://cf05.ickimg.com/bbsimages/202103/17192c93b9aec03f288226aae13cffe5.png) ## 软件设计 抢答器的硬件部分连接好后可以进行程序的编写了,首先要驱动数码管进行数字显示,电路中选择的是共阳极数码管,就是数码管的阳极是连接在一起的,每一位数码管都有一个阳极引脚,分别连接到了单片机的P10和P11脚,两位数码管的阴极都是一样的,通过,控制阴极来实现数字的显示,共阳极数码管的编码表在下面的程序中会给出,在显示的时候是通过动态扫描的方法实现两位数码管显示不同的数字,下面是数码管的显示函数: ```c #include "reg52.h" #define uint unsigned int #define uchar unsigned char sbit SG1 = P1^0; sbit SG2 = P1^1; sbit LED = P1^2; sbit begin = P1^3; sbit settime = P1^4; sbit P30 = P3^0; sbit P31 = P3^1; sbit P32 = P3^2; sbit P33 = P3^3; sbit P34 = P3^4; sbit P35 = P3^5; //共阳极数码管编码表 unsigned char code table[]={ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e }; int t,time,player,stime; void delay(uint x) { uint y,z; for(y=x;y>0;y--) { for(z=100;z>0;z--) {;} } } void SMG(uint z) //数码管显示 { uint g,s; g = z%10; s = z/10; SG1 = 0; SG2 = 1; P2 = table[g]; delay(2); P2 = 0xff; SG1 = 1; SG2 = 0; P2 = table[s]; delay(2); P2 = 0xff; } ``` 现在数码管就可以正常的显示了,接下来开始设置定时器,当按下启动抢答的按键后会开启定时器进行10秒的倒计时,数码管会进行时间的显示,在定时器中断中进行数码管显示时间的更新和其他操作,下面是定时器的设置和定时器中断函数: ```c void Timer() { TMOD &= 0x0F; //设置定时器模式 TL1 = 0x00; //设置定时初值 TH1 = 0x28; //设置定时初值 TF1 = 0; //清除TF1标志 TR1 = 0; ET1 = 1; EA = 1; } void T1_ISR(void) interrupt 3 { t++; if(t == 200) { time--; if(time == -1) //抢答时间结束,自动复原 { time = 10; LED = 0; TR1 = 0; } t = 0; } } ``` 现在可以进行各个按键功能的编写了,由于在这里使用的都是独立按键,所以程序都很简单,通过if判断按键是否按下,进行按键消抖后再次判断即可,在这里可以现在主函数中添加抢答启动按键和时间调节按键的函数,这样可以先检测一下数码管和定时器是否正常工作,下面是启动按键和时间调节按键的函数,添加在主函数的while循环中即可: ```c if(begin == 0) //抢答启动 { delay(5); if(begin == 0) { LED = 1; settime = 1; TR1 = 1; time = stime; player = 0; } } if(settime == 0) //时间调节 { delay(5); if(settime == 0) { stime++; time = stime; delay(200); if(stime == 100) { stime = 0; } } } ``` 设置好按键后可以先运行仿真查看一下效果, ![](https://cf05.ickimg.com/bbsimages/202103/4659194257f416e0d3a33d041d2962c4.png) 可以看到在点击运行后数码管成功显示了剩余的时间是10秒,现在按下时间调节按键看一下时间是否会增加, ![](https://cf05.ickimg.com/bbsimages/202103/a698234c4cb8da19f119f7b77bb71575.png) 按下后可以看到时间从10秒逐渐增加到了12秒,说明时间调节功能可以正常工作,现在看一下当启动抢答按键按下后数码管会不会进行倒计时显示, ![](https://cf05.ickimg.com/bbsimages/202103/963edfe9b3ff8eb2155e1642ef0ed114.png) 可以看到启动抢答后时间开始倒计时,说明定时器可以正常工作了,现在可以进行选手抢答按键的功能设计了,这6个抢答按键程序的写法与启动抢答按键相似,当有选手按下抢答按键后我们需要在数码管上显示抢答选手的编号,所以需要再写一个显示编号的数码管驱动函数,函数如下: ```c void displayplayer() { if(TR1 == 0) //显示选手编号 { while(begin) { SG1 = 0; SG2 = 1; P2 = table[player]; delay(2); P2 = 0xff; SG1 = 1; SG2 = 0; P2 = 0xbf; delay(2); P2 = 0xff; } } else //显示编号 { while(begin) { SG1 = 0; SG2 = 1; P2 = table[player]; } } } ``` 上述函数可以显示抢答成功的选手的编号,现在就可以编写每个按键的函数了,下面是完整的主函数部分: ```c void main() { LED = 1; player = 0; time = 10; stime = 10; Timer(); while(1) { if(begin == 0) //抢答启动 { delay(5); if(begin == 0) { LED = 1; settime = 1; TR1 = 1; time = stime; player = 0; } } if(settime == 0) //时间调节 { delay(5); if(settime == 0) { stime++; time = stime; delay(200); if(stime == 100) { stime = 0; } } } if(P30 == 0) //选手1 { delay(5); if(P30 == 0) { LED = 0; player = 1; displayplayer(); } } if(P31 == 0) //选手2 { delay(5); if(P31 == 0) { LED = 0; player = 2; displayplayer(); } } if(P32 == 0) //选手3 { delay(5); if(P32 == 0) { LED = 0; player = 3; displayplayer(); } } if(P33 == 0) //选手4 { delay(5); if(P33 == 0) { LED = 0; player = 4; displayplayer(); } } if(P34 == 0) //选手5 { delay(5); if(P34 == 0) { LED = 0; player = 5; displayplayer(); } } if(P35 == 0) //选手6 { delay(5); if(P35 == 0) { LED = 0; player = 6; displayplayer(); } } if(player == 0) { SMG(time); } } } ``` 这样就可以实现当开始抢答后,如果有选手成功抢答后,LED会亮起,同时数码管会显示抢答成功的选手的编号,如果有选手在启动抢答按键没有按下时进行抢答,数码管也会显示抢答选手的编号,显示时会有标记,表示选手未开始就抢答,现在可以运行一下仿真查看效果,下面是未启动抢答时选手抢答的显示效果: ![](https://cf05.ickimg.com/bbsimages/202103/aba596245d923ac0c30dbfac99893529.png) 下面是启动抢答后有选手抢答的效果: ![](https://cf05.ickimg.com/bbsimages/202103/a1f99c96a17f69e4c98c003867b559fb.png) 以上就是多路抢答器的设计过程了,之后会继续介绍其他课程设计的制作思路,感谢观看。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
入门电子设计
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交