实习报告单片机抢答器设计.docx
《实习报告单片机抢答器设计.docx》由会员分享,可在线阅读,更多相关《实习报告单片机抢答器设计.docx(19页珍藏版)》请在冰豆网上搜索。
实习报告单片机抢答器设计
西安郵電大学
单片机课程设计C报告书
院(系)名称
:
自动化学院
学生姓名
:
孙天骜、张梦圆、李咪咪、左鹏飞
专业名称
:
智能科学与技术
班级
:
智能1202
时间
:
2014年10月20日至2014年10月31日
一、数字抢答器的概述
对于抢答器我们大家都知道那是用于选手做抢答题时用的,选手进行抢答,抢到题的选手来回答问题。
抢答器不仅考验选手的反应速度同时也要求选手具备足够的知识面和一定的勇气。
选手们都站在同一个起跑线上,体现了公平公正的原则。
本实验设计的数字抢答器由主体电路与扩展电路组成。
优先编码电路、锁存器、译码电路将参赛队的输入信号在显示器上输出;用控制电路和主持人开关启动报警电路,以上两部分组成主体电路。
通过定时电路和译码电路将秒脉冲产生的信号在显示器上输出实现计时功能,构成扩展电路。
经过布线、焊接、调试等工作后数字抢答器成形。
更具有实用性。
二、设计任务与要求
1、基本要求
(1)抢答器同时供4名选手或4个代表队比赛,分别用4个按钮S1~S4表示。
(2)设置一个系统清除和抢答控制开关S,该开关由主持人控制。
(3)抢答器具有锁存与显示功能。
即选手按动按钮,锁存相应的编号,并在LED数码管上显示。
选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。
(4)抢答器具有定时抢答功能,且一次抢答的时间由主持人设定为30秒。
当主持人启动"开始"键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间0.5秒左右。
(5)参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。
(6)如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00
优点:
与普通抢答器相比,本作品有以下几方面优势:
1、具有清零装置和抢答控制,可由主持人操纵避免有人在主持人说“开始”前提前抢答违反规则。
2、具有定时功能,在30秒内无人抢答表示所有参赛选手获参赛队对本题弃权。
3、30秒时仍无人抢答其报警电路工作表示抢答时间耗尽并禁止抢答。
三、抢答器原理
该抢答器供不多于四个的抢答比赛使用。
每个选手的座位前安装一只抢答按钮开关和一只信号灯。
主持人的座位前安装一只复原按钮开关、一只蜂鸣器和一只抢答器工作状态指示灯。
每当主持人口头发出允许抢答的号令之后,哪个队先按下座位上的按钮开关,封锁其他按钮开关的活动。
并且熄灭主持人座位上的状态指示灯和发出3声类似于电话振铃的提示声,以“声明”此次抢答动作已经完成。
在主持人确认后,按下复原按钮,状态指示灯重新点亮,并且同时发出“笛——”声,为下一次的抢答作好准备。
电路中的蜂鸣器FM是一只带有助音腔的压电陶瓷蜂鸣器,用于模拟发出报警声的功率放大器和喇叭。
在FM发声的同时,灯D4也在发光。
FM可以看作是一个电容性负载,本身不能流过直流电流。
发声的原理是,作用在两个电极极板的电位在发生变化时,陶瓷材料就发生弯曲,从而振动空气发出声音。
FM和4只按钮开关SWa~SWd以及4只电阻Ra~Rd都是在演示板的基础上额外添加的。
由于RB端口内部具有上拉电阻,只要用软件设置其有效,即可省略在4只端口引脚上外接上拉电阻。
四、抢答器方案论证
(1)抢答器同时供4名选手或4个代表队比赛,分别用4个按钮S1~S4表示。
(2)设置一个系统清除和抢答控制开关S,该开关由主持人控制。
(3)抢答器具有锁存与显示功能。
即选手按动按钮,锁存相应的编号,并在LED数码管上显示。
选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。
(4)抢答器具有定时抢答功能,且一次抢答的时间由主持人设定30秒。
当主持人启动"开始"键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间0.5秒左右。
(5)参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。
如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00
(6)4路抢答器可以利用硬件电子元器件实现,但电路结构复杂,调试困难,涉及到的外围元件多,不便于安装,实验给实际操作带来很大的麻烦。
(7)我们利用单片机可以用很少元件实现相同功能,而且单片机性能稳定,可操作性强。
可以只用P0口连接上拉电阻,完成驱动LED的功能,串接按键可以由选手自己控制抢答机会,利用P3口的RXD接74LS164的A,B端,TXD接移位脉冲做时钟信号。
利用单片机程序判断选手按键是否有效,但选手违规抢答,利用简单程序显示选手序号,启动蜂鸣器并不间断,告诉主持人有人违规操作,抢答无效。
给出相应的延时,选手按正常的操作抢答,软件倒记时,利用74LS164移位寄存6段数码管,实现倒记时显示时间,到5秒相应时间提醒选手时间快到了,要及时作答,并启动蜂鸣器。
(8)如果有选手在规定的时间以前完成问题,主持人通过按键P2.4复位,开始新的问题作答,因为程序不是很大不需要扩展存储空间,选手按键跳入相应的子程序,回答倒记时,通过单片机实现功能可以更人性化,只需单电源供电更方便,容易实现。
电路结构简单,外围扩展的电路不是很多,锻炼我们所学的知识应用到现实生活当中。
为我们提供实践的机会。
单片机是电子专业发展的方向,更好的使用单片机可以是我们的产品小型化,使用更方便,性能更稳定,功能更齐全,所以我们选用单片机加一定的外围设备实现本次课程设计的要求。
五、注意事项
为使硬件电路设计尽可能合理,应注意以下几方面:
(1)尽可能采用功能强的芯片,以简化电路,功能强的芯片可以代替若干普通芯片,随着生产工艺的提高,新型芯片的的价格不断下降,并不一定比若干普通芯片价格的总和高。
(2)留有设计余地。
在设计硬件电路时,要考虑到将来修改扩展的方便。
因为很少有一锤定音的电路设计,如果现在不留余地,将来可能要为一点小小的修改或扩展而被迫进行全面返工。
(3)程序空间,选用片内程序空间足够大的单片机,本设计采用AT89C51单片机。
(4)I/O端口,在样机研制出来后进行现场试用时,往往会发现一些被忽视的问题,而这些问题不是靠单纯的软件措施来解决的。
如有些新的信号需要采集,就必须增加输入检测端;有些物理量需要控制,就必须增加输出端。
如果在硬件电路设计就预留出一些I/O端口,虽然当时空着没用,那么用的时候就派上用场了。
六、系统原理图
七、硬件结构设计
1.时钟频率电路的设计
单片机必须在时钟的驱动下才能工作.在单片机内部有一个时钟振荡电路,只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度。
图3-2外部振荡源电路
一般选用石英晶体振荡器。
此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。
电路中两个电容C1,C2的作用有两个:
一是帮助振荡器起振;二是对振荡器的频率进行微调。
C1,C2的典型值为30PF。
单片机在工作时,由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。
其大小是时钟信号频率的倒数,常用fosc表示。
如时钟频率为12MHz,即fosc=12MHz,则时钟周期为1/12µs。
2.复位电路的设计
单片机的第9脚RST为硬件复位端,只要将该端持续4个机器周期的高电平即可实现复位,复位后单片机的各状态都恢复到初始化状态,其电路图如图4所示:
值得注意的是,在设计当中使用到了硬件复位和软件复位两种功能,由上面的硬件复位后的各状态可知寄存器及存储器的值都恢复到了初始值,而前面的功能介绍中提到了倒计时时间的记忆功能,该功能的实现的前提条件就是不能对单片机进行硬件复位,所以设定了软复位功能。
软复位实际上就是当程序执行完毕之后,将程序指针通过一条跳转指令让它跳转到程序执行的起始地址。
3.数码管电路设计
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。
共阳极就是把所有LED的阳极连接到共同接点com,而每个LED的阴极分别为a、b、c、d、e、f、g及dp(小数点)。
但是把数码管直接接入电路时数码管的显示不是很亮,所以在实际的电路焊接时加入了放大器。
4.蜂鸣器
我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音。
八、主程序系统结构图
1.系统程序
抢答器程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbiterror=P1^3;
//选手按键
sbitk1=P3^0;
sbitk2=P3^1;
sbitk3=P3^2;
sbitk4=P3^3;
sbitk=P1^0;//主持人按键开始
sbitr=P1^1;
sbitbeep=P3^7;//蜂鸣器
ucharcodetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};//0-9代码
ucharshiwei,gewei,xuanshou,count,i,second,flag,flagO;bang,time1;
uintt,m,n,a,a1,a2,a3,a4;
voidmainOne();
voidmainTwo();
voiddis();
voidTimer()
{
TMOD|=0x01;
TH0=0xd8;//初值55536,计数10000次,每次1US,总计10ms
TL0=0xf0;
IE=0x82;//这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时
TR0=1;
}
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddisplay(ucharshiwei,gewei,xuanshou)//显示函数
{
if(flag){
P2=~0xfe;//打开显示时间十位的位选
P0=shiwei;//显示十位
delay(5);
P2=~0xfd;//个位位选
P0=gewei;
delay(5);
P2=~0xfb;//选手位选
P0=xuanshou;
delay(5);
}else{
P2=~0xfe;//打开显示时间十位的位选
P0=~0xf3;//显示十位
delay(5);
P2=~0xfd;//个位位选
P0=~0xf3;
delay(5);
P2=~0xfb;//选手位选
P0=xuanshou;
delay(5);
}
}
voiddis(void)
{
shiwei=~tab[second/10];
gewei=~tab[second%10];
xuanshou=~tab[i];
display(shiwei,gewei,xuanshou);
}
voidtim(void)interrupt1using1//为定时中断TR0
{
TH0=0xd8;//重新赋值
TL0=0xf0;
count++;
if(count==100)//100*10ms=1秒
{
count=0;
second--;//秒减1
}
}
voidinit()//初始化函数
{
error=0;
r=1;
flag=1;
flagO=1;
bang=1;
P2=~0x04;
P0=~0xf3;
t=0;
beep=0;
i=0;
second=29;
a1=1;
a2=1;
a3=1;
a4=1;
}
voidcheckkey(){
if(k1==0){delay(5);if(k1==0);while(!
k1);t=1;}
elseif(k2==0){delay(5);if(k2==0);while(!
k2);t=2;}
elseif(k3==0){delay(5);if(k3==0);while(!
k2);t=3;}
elseif(k4==0){delay(5);if(k4==0);while(!
k2);t=4;}
}
voidTimeOut(){
TR0=0;
if(bang){
beep=1;
error=1;
time1=50;
while(time1--){
delay(10);
dis();
}
time1=0;
bang=0;
}
beep=0;
error=0;
}
voidmainTwo(){
init();
while
(1){
//判断违规
if((k1==0||k2==0||k3==0||k4==0)&&flag){
flag=0;
error=1;
checkkey();
switch(t)
{
case1:
{
i=1;beep=1;delay(300);beep=0;
break;
}
case2:
{
i=2;beep=1;delay(300);beep=0;
break;
}
case3:
{
i=3;beep=1;delay(300);beep=0;
break;
}
case4:
{
i=4;beep=1;delay(300);beep=0;
break;
}
}
}
if(flag==0){
dis();
}
//复位按钮
if(r==0){
init();
}
mainOne();
}
}
voidmainOne(){
if(k==0&&flag)//主持人按下开始键
{
Timer();
delay(10);
while(!
k);
while
(1)
{
if(r==0){
mainTwo();
}
dis();
m=0;
n=0;
if(second==10||second==20){
beep=1;
bang=50;
while(bang--){
delay(10);
dis();
}
beep=0;
}
if(second==0){
TR0=0;n=1;
if(flagO){
beep=1;
time1=50;
while(time1--){
dis();
delay(10);
}
flagO=0;
beep=0;
}
if(k==0)
{beep=1;delay(500);beep=0;second=29;TR0=1;m=1;}
}
if(n==0)
{
if(k1==0||k2==0||k3==0||k4==0)
{checkkey();}
elseif(k==0){delay(5);if(k==0);while(!
k);t=0;i=0;second=29;beep=1;delay
(500);beep=0;TR0=1;}
}
while(t)
{
if(m==0)//开关,保证程序只执行一次
{
switch(t)
{
case1:
{TR0=1;i=1;second=30;beep=1;delay(300);beep=0;
a1=0;a2=1;a3=1;a4=1;m=1;break;
}
case2:
{
TR0=1;i=2;second=30;beep=1;delay(300);beep=0;
a2=0;a1=1;a3=1;a4=1;m=1;break;
}
case3:
{
TR0=1;i=3;second=30;beep=1;delay(300);beep=0;
a3=0;a1=1;a2=1;a4=1;m=1;break;
}
case4:
{
TR0=1;i=4;second=30;beep=1;delay(300);beep=0;
a4=0;a1=1;a2=1;a3=1;m=1;break;
}
}
}
if(r==0){
mainTwo();
}
if(a1==0)//选手的计时
{
a1=0;
dis();
if(second==0){
TimeOut();
}
if(k1==0){
TR0=0;
}
}
elseif(a2==0)
{
a2=0;
dis();
if(second==0){
TimeOut();
}
if(k2==0){
TR0=0;
}
}
elseif(a3==0)
{
a3=0;
dis();
if(second==0){
TimeOut();
}
if(k3==0){
TR0=0;
}
}
elseif(a4==0)
{
a4=0;
dis();
if(second==0){
TimeOut();
}
if(k4==0){
TR0=0;
}
}if(k==0){i=0;t=0;second=29;beep=1;delay(500);beep=0;TR0=1;}
while(!
k);
}
}
}
}
voidmain()
{
mainTwo();
}
九、实验心得
李咪咪:
本次设计报告主要介绍了单片机实现抢答器的设计方法,系统介绍了电路硬件构成和软件程序,本次设计以AT89C52单片机为核心,采用了数字显示器直接显示,并自动复位的设计思想,它能根据不同的抢答输入信号,经过单片机的控制处理并产生不同的与输入信号相对应的输出信号,最后通过LED数码管显示相应的路数,即两组的抢答时间相差几微妙,也可分辨出是哪组先按下的按键。
在设计过程中我查阅了大量的资料,认真研究教材,这使我对单片机的认识又加深了一步,虽然在做实验之前有好多东西都不懂,但是在本次实习之后我学到了很多东西,同时通过本次实验也培养了我的耐心和刻苦钻研的精神!
左鹏飞:
针对课设题目八路抢答器,一开始还没有头绪,不会运用所学知识进行有效设计,但通过上网查阅各种类似的设计,查阅所提供的芯片功能,确定基本设计方案,又通过仿真验证试验方案的可实行性,虽说比较烦杂但却对设计一个电路有了基本的经验,总之,在设计过程中学到了许多。
作为现代的大学生,如果仅停留在以往的层次上,是远远跟不上时代的步伐,也无法使自己立足在竞争如此激烈的社会里,通过此次实习,看到了自己的水平和差距,学要在今后的学习中又进一步的提高。
张梦圆:
通过这次实习,提高了我的动手能力,也增长了我不少的单片机知识。
这次的实习也是一个团队合作的项目,一个人很难完成这次的任务。
通过与队友的交流与合作成功完成了这次的任务。
通过查阅资料、设计电路、仿真、焊接等过程完成了实习。
因为之前有一定的焊接经验,所以主要担任焊接与系统的调试工作。
希望以后能有类似的体验。
孙天骜:
因为之前对单片机有一定的了解,所以在此次实习中还是比较容易的。
模块化的设计对于单片机来说还是十分重要的,所以我们这次的电路设计分成了好几个模块:
最小系统、蜂鸣器模块、数码管模块、抢答器模块。
通过对各个模块的分析最终设计出完整的抢答器系统。
中间也遇到了不少的问题,通过查资料等方式最终都解决了。
使自己的水平又提高了不少。