单片机控制 抢答器 论文.docx
《单片机控制 抢答器 论文.docx》由会员分享,可在线阅读,更多相关《单片机控制 抢答器 论文.docx(21页珍藏版)》请在冰豆网上搜索。
![单片机控制 抢答器 论文.docx](https://file1.bdocx.com/fileroot1/2023-8/3/5cff85cb-eff5-4a4c-a355-ed3cd7e076e9/5cff85cb-eff5-4a4c-a355-ed3cd7e076e91.gif)
单片机控制抢答器论文
摘要
此次设计提出了用AT89S52单片机为核心控制元件,设计一个简易的抢答器,本方案以AT89S52单片机作为主控核心,与74HC573锁存器、按键开关、数码管、蜂鸣器等构成四路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时/中断等电路,设计的抢答器具有实时显示抢答选手的号码和抢答时间的特点,还有复位电路,使其再开始新的一轮的答题和比赛,同时还利用C语言编程,使其实现一些基本的功能。
本设计的系统实用性强、判断精确、操作简单、扩展功能强。
它的功能实现是比赛开始,主持人读完题之后按下总开关,即计时开始,直到有一个选手抢答时,对应的会在数码管上显示出该选手的编号,蜂鸣器也会发出声音,以提示有人抢答本题,如果在规定的规定时间内没有做出抢答,则此题作废,即开始重新一轮的抢答。
根据抢答结果主持人可控制加分、减分按键对抢答的选手加减分数。
关键词:
单片机;抢答器;蜂鸣器;C程序
目录
1、设计任务1
1.1设计目的和意义:
1
1.2设计任务与要求:
1
2、系统设计1
2.1总体方案设计1
2.2芯片选型与具体电路设计2
2.2.1单片机的选型2
2.2.2振荡电路的设计3
2.2.3复位电路的设计3
2.2.4计分和组号显示的设计4
2.2.5选手按键的设计4
2.2.6主持人控制电路的设计5
2.2.7蜂鸣器电路设计5
2.3系统总体电路6
2.4系统所用元器件6
3、软件流程及程序设计7
3.1软件系统总体设计方案7
3.2软件系统流程图7
3.3工作过程分析7
4系统调试8
4.1硬件调试8
4.2软件调试8
5.总结8
5.1本系统存在的问题及改进措施8
5.2心得体会9
参考文献9
附录1:
系统源程序9
附录2:
系统实物图14
1、设计任务
1.1设计目的和意义:
在开展的竞赛抢答活动越来越多,而在大多数比赛当中都是采用抢答器进行抢答的。
本设计的核心是使用AT89S52单片机控制,抢答器可同时满足4名选手或4个代表队参加竞赛抢答比赛。
且本文设计的抢答器具有功能强大,造价低廉,维修方便等特点。
该抢答器同时具有锁存,数码LED显示功能,抢答报警,分数控制等功能。
即选手按动按钮,会锁存相应的编号,并且在LED数码管上同步显示,同时蜂鸣器会发出报警声响提示。
1.2设计任务与要求:
1)可容纳4组参赛者抢答器,每组设置一个抢答按钮供参加竞赛者使用;
2)电路具有第一抢答信号的鉴别和锁存功能。
在第一时间按抢答开关,指示灯亮并用扬声器发出声响;
3)每组在开始时预置成10分,抢答后有主持人计分,答对一次加1分,打错一次减1分。
2、系统设计
2.1总体方案设计
根据系统的要求,确定系统的总体方案如图1所示。
图1系统总体设计方案
2.2芯片选型与具体电路设计
2.2.1单片机的选型
ATMEL公司生产的AT89S52单片机,它是AT89C52/51的升级版,其硬件资源完全兼容。
所不同的是AT89S52增加了在线调试功能,即程序可以通过JTAG接口下载,调试和固化。
因而,该芯片的开发不再需要昂贵的硬件仿真器,可实现实时仿真,所有的资源都可以为用户所使用,可以在线编程或在系统编程,更进一步地说,在线编程或在系统编程是开发的系统具有了通过网络进行升级、维护的潜在功能。
AT89S52的性能及特点:
●
图289S52
与MCS-51系列单片机兼容;
●片内有4K(8K)可在线重复编程的快速内存可擦写存储器(FlashMemory);
●存储器可循环写入/擦写10000次以上;
●存储器数据保存时间为10年以上;
●宽工作电压范围:
Vcc可为2.7V6.5V;
●全静态工作:
可从0Hz24MHz;
●程序存储器具有三级加密保护;
●128个字节(256字节)的内部RAM;
●32条可编程I/O口线;
●三个16位定时器/计数器;
●中断结构具有5级(6级)中断源和两个优下级;
●可编程全双工串行通讯;
●空闲维持低功耗和掉电状态保护存储数据;
●具有JTAG接口,可方便的在线编程或在系统编程。
2.2.2振荡电路的设计
AT89S52内部有一个用于构成片内振荡器的高增益反相放大器,振荡器产生的信号送到CPU,作为CPU的时钟信号,驱动CPU产生执行指令功能的机器周期。
引脚XTAL1和XTAL2是此放大器的输人端和输出端。
这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器,振荡电路的连接如图所示图8所示,外接石英晶体或陶瓷谐振器以及电容C3和C4构成并联谐振电路,接在放大器的反馈回路中。
对外接电容C3和C4的值虽然没有严格的要求,但电容的大小多少会影响振荡器频率的高低、振荡器的稳定性、起振圈内部振荡的接法的快速性和温度稳定性
。
图3.振荡电路
2.2.3复位电路的设计
单片机复位是使CPU和系统中的其他功能部件都处在一
图3.晶振电路
个确定的初始状态,并从这个状态开始工作。
无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。
89系列单片机的复位信号是从RST引脚输人到芯片的施密特触发器中的。
当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚有一个高电平并维持2个机器周期(24个振荡周期)[1],则CPU就可响应并且将系统复位。
复位分为手动复位和上电复位。
本设计系统采用的是手动复位,当按下按钮时,即使人的动作很快,也会使按钮保持通达数十毫秒,所以,手动复位能确保复位时间要求。
复位电路连接如图。
图4.复位电路
2.2.4计分和组号显示的设计
计分部分由一个共阴极八位八段数码管构成,初始置数为“10101010”两个一组组成四组选手初始分数“10分”;组号显示是由一个共阳极七段数码管构成,通过P2口直接对其控制。
电路图如下:
图5.显示电路
2.2.5选手按键的设计
四位选手通过按键产生的电平下降沿信息送至P1.0~P1.3口,然后再经由主控制模块处理锁存,最后在七段数码管上显示最早按下的选手号。
电路图如下:
图6.选手按键电路
2.2.6主持人控制电路的设计
主持人控制部分由一个开始键和减分、加分两个按钮组成。
开始按键通过外部中断送信息给控制模块,加分、减分分别通过P1.4和P1.5送入分数控制信息。
电路图如下:
图7.主持人控制开始电路
图8.主持人控制加分、减分电路
2.2.7蜂鸣器电路设计
P3.5口控制的蜂鸣器主要是提醒选手答题时间到。
电路图如下:
图9.蜂鸣器电路
2.3系统总体电路
图10.总电路图
2.4系统所用元器件
本系统所用的元器件清单如表1所示。
表1本系统所用的元器件
元器件名称
数量
16SEG-MPX8-CC-RED
1
STC89S52
1
蜂鸣器
1
电阻10k
1
独立按键
7
瓷片电容22PF
2
电解电容10uf
1
10K排阻
1
七段数码管
1
锁存器74HC573
2
电源VCC
1
导线
若干
3、软件流程及程序设计
3.1软件系统总体设计方案
主函数内先将中断请求打开、设置触发方式,然后调用延时子程序、数码管显示子程序、键盘扫描子程序、中断子程序来达到设计目的。
3.2软件系统流程图
图11.主程序流程图
3.3工作过程分析
系统上电后,八位八段数码管显示“10101010”从右到左两两一组分别为四位选手的初始分数10分。
当主持人按下开始键后四位选手开始抢答,最早按键的选手的组号将显示在七段数码管上,紧接着在规定的时间内做答,时间到蜂鸣器发出声音提示答题结束,主持人凭借选手回答内容通过A5、A6按键加分、减分。
没人回答主持人可按开始键进行下一轮。
4系统调试
系统调试包括硬件调试和软件调试,而且两者是密不可分的。
我们设计好的硬件电路和软件程序,只有经过联合调试,才能验证其正确性;软硬件的配人情况以及是否达到设计任务的要求,也只有经过调试,才能发现问题并加以解决、完善,最终开发成实用产品。
4.1硬件调试
硬件调试分单元电路调试和联机调试,单元电路试验在硬件电路设计时已经进行,这里的调试只是将其制成印刷电路板后试验电路是否正确,并排除一些加工工艺性错误(如错线、开路、短路等)。
这种调试可单独模拟进行,也可通过开发装置由软件配合进行,硬件联机调试则必须在系统软件的配合下进行。
本设计硬件是用开发板上已有的部件搭建而成的,所以只要熟悉板子的原理图连接好所需的模块,然后做一些简单的测试确保各个器件正常工作。
4.2软件调试
由于本设计简单所以是一边在keil软件上修改程序一边烧写观察运行结果,其中在keil软件上查错时可以通过调试里面的单步运行、进入子函数内部和设置断点分析。
5.总结
5.1本系统存在的问题及改进措施
本设计用软件定时造成延时不准。
另外本设计可以对抢答器扩展的功能有:
1)可以将该抢答器扩展抢答定时功能,添加定时中断可以比较精确的设置延时。
2)可以对该抢答器扩展遥控抢答,这样可以对抢答器进行遥控控制不受位置环境限制。
3)可以对该对抢答器的报警电路扩展,可以改变抢答或报警单调的音调改为柔美的音乐声音。
5.2心得体会
经过近两周的努力,在老师和同学的商讨和帮助下,我较好的完成了设计任务,通过此次课程设计,我重新认识到了自学的重要性,以及学以致用的道理。
我在图书馆和网上查阅了大量的资料。
通过此次的抢答器的设计,让我重新拾起了以前所学习的电子知识,及我觉得此次设计让我更加巩固了所学的知识并在设计的过程中学会了与时俱进,克服了编程的枯燥感,让我受益匪浅。
在今后的学习过程中,应该多到图书馆看一些专业方面的书籍和增长上网解决问题的能力,以丰富自己的知识。
此次设计遇到的最大问题是可以在Proteus上正常显示的程序在板子上运行出错,调试后在板子上运行良好的程序仿真时又有问题。
此次设计加深了我对单片机及一些外围芯片、电路的理解和应用,由于知识水平的局限,设计中可能会存在着一些不足,我真诚的接受老师和同学的批评和指正。
参考文献
[1]郭文川主编.单片机原理与接口技术.北京:
中国农业出版社,2007:
20-42.
[2]郭天祥主编.新概念51单片机C语言教程:
入门、提高、开发、拓展全攻略.北京:
电子工业出版社,2008:
108-120.
附录1:
系统源程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeSEG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管0-9
ucharcodeSEG1[]={0xbf,0xf9,0xa4,0xb0,0x99,0xc0};//共阳数码管-12340
ucharcodeBIT[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//数码管位选1-8依次亮
uchara[5];
sbitbeep=P3^5;//蜂鸣器
sbitdula=P1^7;
sbitwela=P1^6;
sbitinte=P3^2;//主持人开始
sbitK1=P1^0;
sbitK2=P1^1;
sbitK3=P1^2;
sbitK4=P1^3;
sbitK5=P1^4;
sbitK6=P1^5;
uinti,j;
uchars_flag,k,shi,ge;
voiddelay1ms(unsignedintcount)//nms延时
{
unsignedinti,j;
for(i=0;ifor(j=0;j<120;j++);
}
voiddelay()//1ms延时函数
{
for(j=0;j<120;j++);
}
voidBEEP()
{
uintm,n;
for(m=0;m<800;m++)//P3.5脚发声提示
{
for(n=0;n<47;n++);//延时
beep=~beep;//取反输出到喇叭的信号
}
}
voiddisplay(ucharx,uchara,ucharb)//显示数据,显示位置a和b
{
shi=x/10;
ge=x%10;
dula=1;
P0=SEG[ge];
dula=0;
wela=1;
P0=BIT[a];
wela=0;
P0=0xff;//消隐
delay();
dula=1;
P0=SEG[shi];
dula=0;
wela=1;
P0=BIT[b];
wela=0;
P0=0xff;
delay();
}
ucharkeyscan()//4路热键扫描(哪个键先按下,哪个优先级最高)
{
P1=0xff;
if(K1==0)
{
delay1ms(55);
if(K1==0)
{
k=1;
s_flag=0;//关闭开始键标志位,使再按其他七个键不会响应
while(!
K1);
}
}
if(K2==0)//下面七个键的处理同上
{
delay1ms(55);
if(K2==0)
{
k=2;
s_flag=0;//重要标志位
while(!
K2);
}
}
if(K3==0)
{
delay1ms(55);
if(K3==0)
{
k=3;
s_flag=0;
while(!
K3);
}
}
if(K4==0)
{
delay1ms(55);
if(K4==0)
{
k=4;
s_flag=0;
while(!
K4);
}
}
if(s_flag==0&&k!
=0)
return(k);
else//有2人同时抢答或无人抢答继续显示‘-’
{k=0;
return(k);}
}
/*************外中断0的中断服务子程序****************/
voidintersevr0(void)interrupt0
{
EX0=0;//关CPUwai中断请求
k=0;//每次进入中断清除上次K值
if(inte==0)//测试P3.2是否是低电位,如果是,则延时一段时间消抖再测
{
delay1ms(50);//仿真不用消抖
if(inte==0)//再次测试P3.2脚电位,确保P3.2脚处的开关已按下(这样可去抖动)
{
P2=0xbf;//使数码管显示‘-',指示可以开始抢答
s_flag=1;
for(i=0;i<1000;i++)//1秒内抢答完成
for(j=0;j<120;j++)
{
if(s_flag==1)//只接受第一个抢答,其后无效
{
P2=SEG1[keyscan()];}
}
BEEP();
delay1ms(3000);//抢答结果显示6秒
P2=0xff;//使数码管全黑,为下一轮抢答做好准备
}
}
EX0=1;//开CPU总中断请求
}
voidmain(void)
{
uchari;
EA=1;//打开CPU总中断请求
IT0=1;//设定INT0的触发方式为脉冲负边沿触发
P2=0xff;
for(i=1;i<5;i++)
a[i]=10;
EX0=1;//打开INT0中断请求
while
(1)
{
display(a[1],0,1);//一开始4位选手都显示10分
display(a[2],2,3);
display(a[3],4,5);
display(a[4],6,7);
i=keyscan();
if(K5==0)
{
delay1ms(70);//按键延时太长,倒置数码管闪烁厉害
if(K5==0)
a[i]=a[i]-1;
}
if(K6==0)
{delay1ms(70);
if(K6==0)
{a[i]=a[i]+1;}
}
}
}
附录2:
系统实物图
图12上电初始状态图
图13主持人按下开始按键后图
图14选手1抢答到后的图
图15比赛完后分数图