基于单片机的抢答系统设计.docx
- 文档编号:5466008
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:16
- 大小:252.58KB
基于单片机的抢答系统设计.docx
《基于单片机的抢答系统设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的抢答系统设计.docx(16页珍藏版)》请在冰点文库上搜索。
基于单片机的抢答系统设计
《单片机原理及接口》
课程设计报告
题目:
基于单片机的抢答系统设计
专业名称:
通信工程
班级:
学号:
姓名:
2011年12月
基于单片机的抢答系统设计
作者
(电子信息工程学系)
摘要:
介绍了一种基于单片机的6人抢答器的设计。
该系统主要由单片机AT89C51,6位液晶显示屏,喇叭及多路开关电路组成。
先进行六位送数跑马,接着扫描抢答键,通过按键抢答显示抢答者的号数,并发出声音提示。
再者若有其他人抢答,系统一概不予响应,知道复位键按下进入下一轮抢答。
该设计的不足之处就是按键不够灵敏,优点是硬件电路简单,功能齐全,操作方便。
关键词:
单片机;抢答器
1设计的基本内容
本设计主要是在proteus+keil软件仿真软件设计的一种基于51系列单片机的一种六位的抢答器。
六路抢答器有六个抢答按钮,分别为按键K1、K2、K3、K4、K5、K6,一个主持人控制的复位按钮K0。
在无人抢答时,6只数码管轮流循环显示1~6。
基本要求:
谁先抢答,数码管停止跑马,6个数码管同时亮谁的编号,其后再有人按键,系统不予响应,直到复位键按下,开始下一轮抢答。
扩展部分:
谁先抢答,对应的数码管亮5次抢答人的编号,并发出声音提示。
2方案论证
2.1按键选择
方案1:
用独立的外接按键方案2:
用矩阵键盘
键盘是单片机系统中通用的输入设备,用于向系统输入数据或控制信息。
常用的键盘有两种,分别是独立键盘和矩阵式键盘。
矩阵式键盘相对其更加灵敏,并且可扩展更多按键,适用于按键数量较多的场合。
独立式键盘接口电路,它的硬件电路和软件编程都比较简单,但每个按键必须占一根I/O口线,在按键个数较多时,I/O口线资源浪费较大,故只在按键数量不多时采用该电路。
而本设计所需要的抢答键只要6个,也不算多,虽然矩阵式键盘有其较高的灵敏性,但从简单编程的角度出发,最终还是选择独立式键盘。
2.2数码管选择
方案1:
共阴级数码管方案2:
共阴级数码管
LED显示器是由发光二极管显示字段的显示器件。
在单片机应用系统中通常使用的是七段LED,这种显示器有共阴极与共阳极两种。
图1共阴极图2共阳极图3管脚配置
共阴极LED显示器的发光二极管阴极共地,当某个发光二极管的阳极为高电平时,该发光二极管则点亮;共阳极LED显示器的发光二极管阳极并接。
由于平时都是采用共阴极的数码管,比较熟悉其代码,所以选用共阴极数码管。
3硬件设计
电路包括以下六个部分:
单片机,晶振电路,抢答按键电路,6位数码管显示,复位开关电路及声音提示电路。
单片机内部有一个复位开关,但是只是内部自带的,而设计的要求就是自编程序实现复位功能,所以还得附加一个复位开关电路。
图4总设计框图
3.1AT89C51控制电路
AT89C51是最常用的单片机芯片,该芯片有40个引脚,其中P0~P3为数据输入/输出接口,XTAL1和XTAL2用于外接晶体;RESET用于复位信号输入;ALE是地址锁存允许控制位,其输出频率是时钟振荡频率的1/6;
,程序存储器允许;
,该引脚的接法决定着程序存储器的0000~0FFFH这4KB地址范围是在单片机内部还是外部。
MCS-51系列单片机有四组8位并行I/O口,记作P0、P1、P2和P3。
每组I/O口内部都有8位数据输入缓冲器、8位数据输出锁存器及数据输出驱动等电路。
四组并行I/O端口即可以按字节操作,又可以按位操作。
当系统没有扩展外部器件时,I/O端口用作双向输入输出口;当系统作外部扩展时,使用P0、P2口作系统地址和数据总线、P3口有第二功能,与MCS-51的内部功能器件配合使用。
图5单片机模块
本设计中各引脚接法如下:
P0口外接LED显示屏用于显示;由于P0口内部无上拉电阻,为保证按键断开时I/O口线有确定的高电平,所以在P0口外部要接上拉和限流电阻。
P0口接的是段选;P1口的6个端口分别与6个BUTTON按键相连,所以在编程的时候要分别定义;P2口接位选;P3.3接K0复位键,另一端接地,所以是低电平有效;P3.2与扬声器相连,扬声器的另一端也是接地;如图所示的单片机模块里面左上部分的电路构成晶振电路,于产生时钟频率;左半边的中间电路是复位电路,采用了手动复位与自动上电复位结合的形式,复位可靠,电路简单;复位信号是系统内部初始化所需的,当系统加电开始工作时,或工作过程中出现故障无法正常工作时,都需要复位信号使系统能重新开始工作。
因此,系统需要上电复位、手动复位和遇故障自动复位电路。
此设计采用片内RAM空间,故电路里将ALE和
引脚悬空处理,将
接地。
3.2六位LED动态显示电路
LED显示器有静态显示与动态显示两种方式。
(1) LED静态显示方式
各位LED的位选线连在一起接地或接+5V;
每位LED的段选线(a-dp)各与一个八位并行口相连。
在同一时间里每一位显示的字符可以各不相同。
(2)LED动态显示方式
将所有LED的段选线并联在一起,由一个八位I/O口控制,而位选线分别由相应的I/O口线控制。
如:
8位LED动态显示电路只需要两个八位I/O口。
其中一个控制段选码,另一个控制位选。
图6显示屏模块
本设计中,多位七段共阴LED数码管与单片机连接时将所有LED的段选线并联在一起,由一个八位I/O口控制,而位选线分别由相应的I/O口线控制。
由于所有位的段选码皆由一个I/O控制,因此,在每个瞬间,多位LED只可能显示相同的字符。
要想每位显示不同的字符,必须采用动态扫描显示方式。
即在每一瞬间只使某一位显示相应字符。
在此瞬间,位选控制I/O口在该显示位送入选通电平(共阴极送低电平)以保证该位显示相应字符,段选控制I/O口输出相应字符段选码。
如此轮流,使每位显示该位应显示字符,并保持延时一段时间,以造成视觉暂留效果。
不断循环送出相应的段选码、位选码,就可以获得视觉稳定的显示状态。
3.2按键电路
图7按键电路显示模块
AT89C51的P1口接6个独立按键,此处采用按键输入为低电平有效,所以按键的一端接地,另一端接P1口的I/O口线。
P1.0~P1.5分别接BUTTON按键,并命名为K1、K2、K3、K4、K5、K6。
按键有BUTTON及SWITCH开关两种,而BUTTON按键比较好操作只需按一下即可,而SWITCH开关还要来回拨动,虽然SWITCH有不具备活动性的开关,可以不用消抖语句,可是当复位键按下的时候,还要将开关拨起来,使用起来更加繁琐,所以采用BUTTON按键,只要在程序中添加消抖语句判断即可。
3.3扬声器及复位电路
图8扬声器及复位模块
将P3.0接扬声器并命名为beep;P3.4接BUTTON复位键,低电平有效。
4软件设计
图9抢答程序流程图
设计基本思路:
当运行开关一打开,6只数码管轮流循环显示1~6,开始循环跑马,接着就开始判断是否有人抢答,所以就要设计跑马的程序,并在跑马里面就要添加键盘扫描语句
判断是否有人抢答,为了不能重复抢答所以得添加一个标志位flag禁止在他人抢答的基础上再次抢答。
基本功能就是在抢答后6个数码管同时显示抢答者的号码,将位选设为全部显示即可。
扩展功能就是抢答后在相应的位管显示相应的号码及声音提示,所以只要分别给为选和段选送相应的位码,并连接一个扬声器在有人抢答的时候取反即可。
最后复位键按下后还要实行循环跑马,即要循环判断复位键,但用while
(1)语句判断的时候要注意它是一个死循环,所以还要设置变量y但复位键按下后y=-0;跳出循环进入下一轮的跑马。
4.1亮灭变化声音提示设计
基本要求:
数码管停止跑马,6个数码管同时亮谁的编号。
由于共阴极是低电平有效所以当P2的位选送“0”的时候有效,延迟产生视觉暂留效果。
程序如下:
P2=0x00;P0=tab1[num];mDelay(5);
扩展要求:
对应的数码管亮5次抢答人的编号,并发出声音提示。
在子函数display()里面,beep就是扬声器,取反就能发出声音提示。
先送位选,并用for语句实现5次循环,刚开始段选为0,即灭,在每一次for语句的循环里面都是实行一灭一亮,所以只要5次。
程序如下:
display()
{beep=~beep;
P2=tab2[num];
for(k=0;k<5;k++)
{
P0=0x00;
mDelay(500);
P0=tab1[num];
mDelay(500);
}}
4.2抢答按键电路及复位按键电路设计
在按键电路中要注意按键抖动的消除。
按键或键盘都是一个机械开关,键的按下和放开是利用机械触点的闭合和断开来实现的。
由于机械触点的弹性作用,一个按键开关在闭合及断开瞬间均有一连串的抖动,抖动的时间长短由按键的机械特性决定,一般为5~10ms。
为了确保按键动作只确认一次,必须消除抖动的影响。
消除抖动的措施有硬、软件两种。
硬件:
可用RS触发器或单稳态电路消除抖动。
软件:
在判断有键按下后,延时10ms后,再确定该键是否保持闭合状态,若是则确认为被按键,否则忽略此次按键。
在本设计中,定义了子函数scan()进行键盘扫描,并对K1到K6的抢答按键都进行了消抖编程,部分程序如下:
if(K1==0){mDelay(10);if(K1==0){while(~K1);num=0;flag=0;}}
复位按键就只有K0,复位的目的就是将前面运行的结果清零,并从头开始跑马,
所以要进行复位键是否按下的判断,如果按下,就显示抢答的号码,因为在显示魔魁啊里面有用到一个while
(1)的循环所以会导致一直跳不出当前的循环,所以要定义一个变量y进行预置和判断后设值,当y=0;就会跳出寻环进而进入主程序的while
(1)死循环,从而进入下一轮的抢答。
程序如下:
while(y){if(K0==0){y=0;flag=1;}}
4.3优先抢答设计
在按键扫描的时候要进行判断,哪个键先按下,哪个优先级就最高,避免显示多人同时抢答。
所以在设计的时候就要设置一个抢答标志位flag,一开始跑马的时候flag=1表示可以开始抢答,而当有抢答键按下的时候就flag=0关掉开始抢答标志,使得按其他5个抢答键系统都不会响应。
而在抢答结束后复位键按下之后就要将flag=1使系统又可以重新开始抢答。
5功能调试及结果分析
(1)调试方法:
利用Keil软件和proteus软件分别编写程序和设计电路并运行。
图10proteus电路连接
(2)调试结果:
通过仿真调试和改进实现了跑马,抢答,复位的功能,改变延时的参数,使得数码管显示和跑马有序,延迟的时间越小,其送位选的速度就越快。
在跑马的时候将延迟的时间设为400ms数码管就会逐一显示。
在基本要求里面,将延迟的时间改成5ms,可以实现6位数码管静态显示。
在扩展要求里面,将延迟的时间改为400ms就可以实现段选送数的。
(3)结果分析:
经过调节及更改程序里面的延迟函数参数,使得数码管的显示更加有序,并达到了设计的标准。
不过抢答器的按键有时候不是很灵敏,这主要是与程序里面的延时函数有关,当运行延时程序时,按键不能检测,所以应尽量减小和减少延时。
(4)调试现象
基本要求:
当电源开始键按下的时候,抢答器就开始从1~6跑马,当K3按下的时候,6位数码管全显示3。
若有人再抢答系统也不会给予响应,直到复位键按下,又开始下一轮的跑马抢答。
扩展要求:
当K5按下的时候,第五位数码管就开始闪烁,先灭后亮,最后停在5。
若有人再抢答系统也不会给予响应,直到复位键按下,又开始下一轮的跑马抢答。
6设计总结
6.1该系统的优点
(1)使用简单的元器件,简易的程序就可以实现抢答,声音提示及复位的功能。
(2)扬声器的使用可以通过取反实现,而不用定时器中断实现,使得程序更加简单。
(3)使用子函数使得主程序更加明了简洁。
由于程序里多次要进行按键扫描,判断是否有人抢答,而按键扫描又要消抖,又有6个,语句比较长,所以调用子函数显得很有必要。
(4)只需要通过允许抢答标志位的设定可以使抢答器实现有一人抢答后,系统不再响应他人的抢答。
6.2该系统的缺点
(1)由于循环语句程序中的延时的使用,导致抢答按键显示电路在抢答的时候,会有延时效应,导致抢答键一按下,不能立马显示有人抢答。
虽然尽量减小和减少延时可以使得抢答按键更加灵敏,但是在循环送数显示的时候,还是要设定一个合适的值,使得闪烁显示和跑马能够逐一显示,不然设置小了,跑马就会更快。
(2)程序里的括号用的有点多,一直嵌套,使得程序看起来不够简洁。
6.3设计心得
在设计中着实遇到了一些问题,其一是定时器中断程序的编写,为了能让扬声器响久一点,编了一段程序,并把闪烁五下也放在定时器中断里面,但后来发现就算不用定时器,照样可以发出声音提示,所以就采取最简单的取反来实现声音提示了;其二是复位按键电路程序的编写,因为在抢答后是通过用while
(1)来判断是否有复位键按下,而while
(1)又是一个死循环,所以在后面判断按键的时候根本就不会有反应,根本就不能跳出循环,后来通过定义一个变量才得以跳出循环,到达跑马的程序里面。
程序编写的过程其实就是不断修正的过程,编出来的东西有时候不一定能实现最终的功能,都要通过修改运行才能看到最终结果。
基本部分:
#include
sbitK0=P3^4;
sbitK1=P1^0;
sbitK2=P1^1;
sbitK3=P1^2;
sbitK4=P1^3;
sbitK5=P1^4;
sbitK6=P1^5;
inti,j,num;
charflag=1,begin,y;
voidmDelay(unsignedintDelay)
{unsignedinti;
for(;Delay>0;Delay--)
{for(i=0;i<124;i++)
{;}
}
}
unsignedcharcodetab1[]={0x06,0x5B,0x4F,0x66,0x6D,0x7D};
unsignedcharcodetab2[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};
scan()
{
if(K1==0){mDelay(10);if(K1==0){while(~K1);num=0;flag=0;}}//送抢答号,不允许再次抢答
if(K2==0){mDelay(10);if(K2==0){while(~K2);num=1;flag=0;}}
if(K3==0){mDelay(10);if(K3==0){while(~K3);num=2;flag=0;}}
if(K4==0){mDelay(10);if(K4==0){while(~K4);num=3;flag=0;}}
if(K5==0){mDelay(10);if(K5==0){while(~K5);num=4;flag=0;}}
if(K6==0){mDelay(10);if(K6==0){while(~K6);num=5;flag=0;}}}
main()
{
while
(1)
{for(j=0;j<6;j++)
{for(i=0;i<6;i++)
{P2=tab2[i];
P0=tab1[j];//跑1到6数
mDelay(400);
if(flag==1)//如果无人抢答,就开始按键扫描
{scan();}
if(flag==0)//如果有人抢答,显示
{y=1;//设定可环变量
j=0;//复位后再次抢答时从1开始寻循环
scan();//键盘扫描
while(y)
{
P2=0x00;//位选全选,同时显示
P0=tab1[num];//送相应的位选
mDelay(5);
if(K0==0)//如果复位键按下,跳出循环
{y=0;
flag=1;}//允许抢答
}
}
}
}
}
}
扩展部分:
#include"reg51.h"
sbitK0=P3^4;
sbitK1=P1^0;
sbitK2=P1^1;
sbitK3=P1^2;
sbitK4=P1^3;
sbitK5=P1^4;
sbitK6=P1^5;
sbitbeep=P3^0;
chari,j,k,num,begin,y,flag=1;
unsignedcharcodetab1[]={0x06,0x5B,0x4F,0x66,0x6D,0x7D};
unsignedcharcodetab2[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};
voidmDelay(unsignedintDelay)
{unsignedinti;
for(;Delay>0;Delay--)
{for(i=0;i<124;i++)
{;}
}
}
scan()//键盘扫面电路
{if((K0==0)){mDelay(10);if(K0==0){while(~K0);begin=1;flag=1;}}//按键消抖,允许抢答
if(K1==0){mDelay(10);if(K1==0){while(~K1);num=0;flag=0;}}//送抢答号,不允许再次抢答
if(K2==0){mDelay(10);if(K2==0){while(~K2)num=1;flag=0;}}
if(K3==0){mDelay(10);if(K3==0){while(~K3);num=2;flag=0;}}
if(K4==0){mDelay(10);if(K4==0){while(~K4);num=3;flag=0;}}
if(K5==0){mDelay(10);if(K5==0){while(~K5);num=4;flag=0;}}
if(K6==0){mDelay(10);if(K6==0){while(~K6);num=5;flag=0;}}}
display()
{beep=~beep;//扬声器发声
P2=tab2[num];//送相应的位选
for(k=0;k<5;k++)//循环5次
{
P0=0x00;
mDelay(400);
P0=tab1[num];
mDelay(400);//先灭后亮
}}
main()
{
while
(1)
{for(j=0;j<6;j++)
{for(i=0;i<6;i++)
{P2=tab2[i];
P0=tab1[j];//跑1到6数
mDelay(300);
if(flag==1)//如果无人抢答,就开始按键扫描
{scan();}
if(flag==0)//如果有人抢答,显示
{y=1;
i=-1;//复位后再次抢答时从第1位开始循环
j=0;//复位后再次抢答时从1开始循环
display();
while(y)
{
scan();//键盘扫描判断复位键
if(begin==1)
if(flag==1)//如果复位键按下,跳出循环
{y=0;}
}
}}}}}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 抢答 系统 设计