八路抢答器设计Word文档格式.docx
《八路抢答器设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《八路抢答器设计Word文档格式.docx(33页珍藏版)》请在冰豆网上搜索。
论文中的表、图和公式按章编号,如:
表1.1、表1.2……;
图1.2、图1.2……;
公式(1.1)、公式(1.2)。
课程设计任务书
一、课程设计的任务和基本要求
1.抢答器同时供8名选手或8个代表队比赛,分别用8个按钮S0~S5表示。
2.设置一个系统清除和抢答控制开关S,该开关由主持人控制。
3.抢答器具有锁存与显示功能。
即选手按动按钮,锁存相应的编号,并在LED数码管上显示,同时扬声器发出报警声响提示。
选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。
4.抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如20秒)。
当主持人启动"
开始"
键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间0.5秒左右。
5.参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。
6.如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。
二、进度安排
2016-12-20至2016-12-23:
老师组织学生讨论单片机课程设计的内容。
教学proteus软件和keil软件的相关用法,并同时制定相关的规范操作和相应的课程设计要求。
2016-12-24至2016-12-27:
学生以小组为单位,选择相应的课程设计题目进行相互间的讨论,并对题目提出观点和看法。
然后在网上查找相应的资料,以课程设计题目为中心,筛选相应资料,并确定最终的方案。
2016-12-28至2017-1-3:
以小组为单位,对方案进行筛选。
确定方案后,小组讨论方案制作的步骤和过程。
先确定方案电路的原理图器件,做出符合方案的原理图。
然后将原理图在proteus中画出来。
最后,撰写相应的C语言源程序。
完成后,将方案进行整理,制定成报告,并装袋。
2017-1-3至2017-1-4:
找老师进行答辩,并修改报告中的错误。
三、参考资料或参考文献
[1]51单片机C语言教程—入门、提高、开发、拓展全攻略郭天祥
[2]51单片机原理及其应用秦实宏徐春辉
本科生课程设计成绩评定表
姓名
付乐天
专业班级
测控2班
学号
1404200108
基于单片机的八路抢答器
课程设计答辩记录:
(手写)
成绩评定依据:
项目
得分
比例
考勤记录
设计结果
报告撰写
答辩成绩
备注:
成绩评定依据的项目内容和项目分值比例可以由老师按指导的专业进行调整,但成绩评定依据的项目数不得少于3项。
最终评定成绩:
指导教师签名:
年月日
一摘要
抢答器作为一种工具,已广泛应用于各种智力和知识竞赛场合。
但抢答器的使用频率较低,且有的要么制作复杂,要么可靠性低。
作为一个单位,如果专门购一台抢答器虽然在经济上可以承受,但每年使用的次数极少,往往因长期存放使(电子器件的)抢答器损坏,再购置的麻烦和及时性就会影响活动的开展,因此设计了本抢答器。
本设计是以八路抢答为基本理念。
考虑到依需设定限时回答的功能,利用AT89C51单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。
用开关做键盘输出,扬声器发生提示。
同时系统能够实现:
在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;
抢答限定时间和回答问题的时间可在1-99s设定;
可以显示是哪位选手有效抢答和无效抢答,正确按键后有音乐提示;
抢答时间和回答问题时间倒记时显示,满时后系统计时自动复位及主控强制复位;
按键锁定,在有效状态下,按键无效非法。
二、方案设计与论证
方案一:
系统各部分采用中小规模集成数字电路,用机械开关按钮作为控制开关,完成抢答输入信号的触发。
该方案的特点是中小规模集成电路应用技术成熟,性能可靠,能方便地完成选手抢答的基本功能,但是由于系统功能要求较高,所以电路连接集成电路相对较多,而且过于复杂,并且制作过程工序比较烦琐,使用不太方便。
方案二:
该系统采用51系列单片机AT89C51作为控制核心,该系统可以完成运算控制、信号识别以及显示功能的实现。
由于用了单片机,使其技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。
整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩张和更改。
MCS-51单片机特点如下:
<
1>
可靠性好:
单片机按照工业控制要求设计,抵抗工业噪声干扰优于一般的CPU,程序指令和数据都可以写在ROM里,许多信号通道都在同一芯片,因此可靠性高,易扩充。
<
2>
单片机有一般电脑所必须的器件,如三态双向总线,串并行的输入及输出引脚,可扩充为各种规模的微电脑系统。
3>
控制功能强:
单片机指令除了输入输出指令,逻辑判断指令外还有更丰富的条件分支跳跃指令。
方案比较及其选用依据,显然方案二比方案一简单的多,不但从性能上优于方案一,而且在使用上及其功能的实现上都较方案一简洁,并且由于单片机具有优越的高集成电路性,使其工作速度更快、效率更高。
另外80C51单片机采用12MHz的晶振,提高了信号的测量精度,并且使该系统可以通过软件改进来扩张功能。
而方案一采用了中小规模集成电路,有其复杂的电路性能,从而可能会使信号的输入输出产生延时及不必要的误差。
依此依据选择方案二比较适合。
其原理框图如下:
三、硬件电路设计
3.1抢答器的电路框图
如图11、1所示为电路框图。
其工作原理为:
接通电源后,主持人将开关拨到“清除”状态,抢答器处于禁止状态,编号显示器灭灯,定时器显示设定时间;
主持人将开关置,“开始”状态,宣布“开始”抢答器工作。
定时器倒计时,扬声器给出声响提示。
选手在定时时间内抢答时,抢答器完成:
优先判断、编号锁存、编号显示、扬声器提示。
当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。
如果再次抢答必须由主持人再次操作"
开始、停止"
状态开
图1抢答器电路的接口电路原理图
如图1所示为电路图。
如果再次抢答必须由主持人再次操作“开始、停止”状态开关。
3.2单元电路设计
(1)抢答器电路
参考电路如图11.2所示。
该电路完成两个功能:
一是分辨出选手按键的先后,并锁存优先抢答者的编号,同时译码显示电路显示编号;
二是禁止其他选手按键操作无效。
如有再次抢答需由主持人将S开关重新置,“清除”然后再进行下一次抢答。
(2)时序控制电路设计
时序控制电路是抢答器设计的关键,它要完成以下功能:
a.主持人将控制开关拨到"
位置时,扬声器发声,抢答电路和定时电路进人正常抢答工作状态。
b.当参赛选手按动抢答键时,扬声器发声,抢答电路和定时电路停止工作。
(3)复位电路的设计
外部中断和内部中断并存,单片机硬件复位端,只要持续4个机器周期的高电平即可实现复位,硬件复位后的各状态可知寄存器以及存储器的值都恢复到了初始值,因为本设计中功能中有倒计时时间的记忆功能,所以不能对单片机进行硬件复位,只能用软件复位,软件复位实际上就是当程序执行完之后,将程序通过一条跳转指令让它完成复位。
复位电路如下图示:
图2复位电路
3.3外部震荡电路
外部震荡电路单片机必须在AT89C51的驱动下才能工作,在单片机内部有一个时钟震荡电路,只需要外接一个振荡器就能产生一定的时钟信号送到单片机内部的各个单元,外部震荡电路如下图。
图3外部震荡电路
3.4报警电路设计
报警电路用于报警,当遇到报警信号时,发出警报。
一般喇叭是一种电感性
图11.4报警电路图。
8951驱动喇叭的信号为各种频率的脉冲。
因此,最简单的喇叭驱动方式就是利用达林顿晶体管,或者以两个常用的小晶体管连接成达林顿架势。
在右图中电阻R为限流电阻,在此利用晶体管的高电流增益,以达到电路快速饱和的目的。
不过,如果要由P0输出到此电路,还需要连接一个10K的上拉电阻。
选手在设定的时间内抢答时,实现:
如果再次抢答必须由主持人再次*作"
清除"
和"
状态开关。
图面是数字抢答器的报警电路图。
其中555构成多谐振荡器,振荡频率fo=1.43/[(RI+2R2)C],其输出信号经三极管推动扬声器。
PR为控制信号,当PR为高电平时,多谐振荡器工作,反之,电路停振。
图4报警电路
四、软件设计
4.1系统主程序设计
为了能够达到抢答的公平、公正、合理,应该在主持人发布抢答命令之前必须先设定抢答的时间,因而在编开始抢答前的程序得先编写设定时间的程序,当时间设好了之后,主持人发布抢答命令按下P1.7按键,程序开始打开定时中断开始倒计时,然后调用键盘扫描子程序,编写键盘扫描程序。
当在扫描到有人按下了答题键,马上关闭T0、调用显示程序、封锁键盘。
(1)主程序流程图
4.2主程序清单
#include<
reg52.h>
/*-----------------------------------------------------------
4.2.1宏定义
------------------------------------------------------------*/
#defineuintunsignedint
#defineucharunsignedchar
共阴极数码管编码表0-f显示
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
变量定义
sbitstart_stop=P3^6;
sbitreset=P3^7;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitkey5=P1^4;
sbitkey6=P1^5;
sbitkey7=P1^6;
sbitkey8=P1^7;
sbitstate=P3^4;
sbitkaishi=P3^1;
bitstart_stop_flag=0;
bitkey1_flag=0;
bitkey2_flag=0;
bitkey3_flag=0;
bitkey4_flag=0;
bitkey5_flag=0;
bitkey6_flag=0;
bitkey7_flag=0;
bitkey8_flag=0;
bitreset_flag=0;
bitaction=0;
bitkaishi_flag=0;
ucharsecond=20;
uchartimer0_count=0;
ucharnumber=0;
ucharnumber_display=0;
4.2.2延时函数
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
4.2.3数码管显示驱动函数
voiddisplay(ucharnumber,ucharsecond)
ucharsecond_first,second_second;
second_first=second/10;
second_second=second%10;
P2=0xfe;
P0=table[number];
delay
(2);
P2=0xfd;
P0=0x40;
P2=0xfb;
P0=table[second_first];
P2=0xf7;
P0=table[second_second];
4.2.4开始键扫描函数
voidstart_stop_keyscan()
if(start_stop==0)
{
delay(8);
if((start_stop==0)&
&
(!
start_stop_flag))
{
start_stop_flag=1;
action=1;
TR0=1;
state=0;
}
}
else
start_stop_flag=0;
}
4.2.5八位抢答键扫描函数
ucharkey_scan8()
if(key1==0)
if((key1==0)&
key1_flag))
key1_flag=1;
number=1;
number_display=number;
key1_flag=0;
number=0;
if(key2==0)
if((key2==0)&
key2_flag))
key2_flag=1;
number=2;
key2_flag=0;
if(key3==0)
if((key3==0)&
key3_flag))
key3_flag=1;
number=3;
key3_flag=0;
if(key4==0)
if((key4==0)&
key4_flag))
key4_flag=1;
number=4;
key4_flag=0;
if(key5==0)
if((key5==0)&
key5_flag))
key5_flag=1;
number=5;
key5_flag=0;
if(key6==0)
if((key6==0)&
key6_flag))
key6_flag=1;
number=6;
key6_flag=0;
if(key7==0)
if((key7==0)&
key7_flag))
key7_flag=1;
number=7;
key7_flag=0;
if(key8==0)
if((key8==0)&
key8_flag))
key8_flag=1;
number=8;
key8_flag=0;
if(number_display!
=0)
return1;
return0;
4.2.6复位键扫描函数
voidreset_keyscan()
if(reset==0)
if((reset==0)&
reset_flag))
{second=20;
reset_flag=1;
number_display=0;
state=1;
reset_flag=0;
/*
4.2.7开机函数*/
voidkaishi_keyscan()
if(kaishi==0)
if((kaishi==0)&
kaishi_flag))
kaishi_flag=1;
kaishi_flag=0;
4.2.8主函数
voidmain()
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=0;
while
(1)
{while((kaishi==0)&
{start_stop_keyscan();
reset_keyscan();
while(action)
while(!
key_scan8())
{
display(number_display,second);
if(second==0)
{
second=20;
break;
}
}
TR0=0;
second=0;
action=0;
break;
display(number_display,second);
4.2.9中断服务函数
-----