本科毕业设计之基于单片机的多路抢答器的设计Word格式文档下载.docx
《本科毕业设计之基于单片机的多路抢答器的设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《本科毕业设计之基于单片机的多路抢答器的设计Word格式文档下载.docx(20页珍藏版)》请在冰点文库上搜索。
优先抢答的选手的编号一直保持到主持人将系统清零为止。
(4)、如果主持人未按"
抢答开始"
键,而有人按了抢答按键,此为犯规抢答,LED上不断闪烁和犯规报警器并响个不停,直到主持人按下"
停止"
键为止。
2.3扩展功能
(1)、抢答器具有定时抢答的功能,且一次抢答的时间可以由主持人设定(比如30s)。
当节目主持人按下“开始”键后,要求定时器立即减计时,并用显示器显示,同时扬声器发出短暂的声响,声响持续时间0.5s左右。
(2)、参赛选手在设定的时间内抢答,抢答有效,定时显示器停止工作,显示器上显示选手的编号和抢答时刻的时间,并保持到主持人将系统清零为止。
(3)、如果定时器抢答的时间已到,却没有选手抢答时,本次抢答无效,系统短暂报警,并封锁输入电路,禁止选手超时后抢答。
(4)、P2.4为开始抢答,P2.5为停止,p1.0-p1.7为八路抢答输入,数码管段选P0口,位选P2口低3位,蜂鸣器输出为P3.4口。
P2.0抢答时间调整,P2.1为时间加1调整,P2.2为时间减1调整。
3.硬件电路设计
3.1单片机的选择
单片机(SCM)是单片微型计算机(SingleChipMicrocomputer)的简称。
它是把中央处理器CPU、随机存储器RAM、只读存储器ROM、I/O接口电路、定时/计数器以及输入输出适配器都集成在一块芯片上,构成一个完整的微型计算机。
它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出适配器简单,功能较低。
目前,单片机在民用和工业测控领域得到最广泛的应用,早已深深地融入人们的生活中。
近年来,AT89C51在我国非常流行,它最大的特点是内部有可以多次重复编程的ROM,并且ROM可以直接用编程器来擦写,使用起来比较方便。
本设计使用到的元器件包括:
AT89C51芯片、数码LED显示器、七段LED数码管的译码。
其中AT89C51是系统的核心,它主要负责控制各个部分的协调工作。
在其外围接上复位电路,上拉电阻,数码管,按钮以及振荡器,P1.0-P1.7为抢答输入键接口,数码管段选P0口,位选P2口,蜂鸣器输出为P3.4口。
本课题在选取单片机时,根据课本上的单片机知识,并且充分借鉴了许多成形产品使用单片机的经验,结合自己的实际情况,选择了Intel公司的89C51单片机。
单片机的引脚排列图如图3.1所示:
图3.1AT89C51单片机引脚排列
各条引脚说明如下:
外接晶振引脚XTAL1和XTAL2
①XTAL1内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。
当采用外部振荡器时,此引脚接地。
②XTAL2内部振荡电路反相放大器的输出端。
是外接晶体的另一端。
当采用外部振荡器时,此引脚接外部振荡源。
③RST复位引脚。
④
片外程序存储器开发信号引脚(输出信号)。
⑤ALE提供把地址的低字节锁存到外部锁存器,ALE引脚以不变的频率(振荡器频率的1/6)周期性地发出正脉冲信号。
因此,它可用作对外输出的时钟,或用于定时目的。
⑥
片外程序存储器使用信号引脚/编程电源输入引脚。
⑦P0.0~P0.7:
P0口8位口线,第一功能作为通用I/O接口,第二功能作为存储器扩展时的地址/数据复用口。
P1.0~P1.7:
P1口8位口线,通用I/O接口无第二功能。
P2.0~P2.7:
P2口8位口线,第一功能作为通用I/O接口,第二功能作为存储器扩展时传送高8位地址。
P3.0~P3.7:
P3口8位口线,第一功能作为通用I/O接口,第二功能作为单片机的控制信号。
3.2各模块设计
3.2.1单片机最小系统
单片机的最小系统由时钟电路和复位电路组成。
时钟电路中电容器C起稳定振荡频率、快速起振的作用,电容值一般为5~33pF。
复位电路是使单片机初始化,即使单片机重新开始执行程序。
当复位开关按下,RST由高电平变为低电平,则程序从头开始执行。
通常选择C=10~30μF,R=1K,本设计采用的电容值为22μF的电容和电阻为1K的电阻。
在此次课程设计电路中当一个问题结束主持人后按下复位开关后进行下一题的准备。
3.2.2抢答按键电路
抢答电路的功能有两个:
一是能分辨出选手按键的先后,并锁存优先抢答者的编号,供译码显示电路用;
二是要使其他选手的按键操作无效。
89C51的P1口做一个八路抢答按键。
P1口P1.0至P1.7对应1~8号8位选手,当主持人按下开始按钮后,电平由高电平变成低电平传入P3口,此时选手可以开始抢答。
此电路中采用10K的电阻起保护作用。
当某一选手按下抢答按钮后,电平由高电平变成低电平传入P1口,经单片机处理后从P0输出由数码管显示抢答者编号,扬声器给出音响提示。
当有一人抢答以后,由于系统已经接收到了一个电平信号,同一时间内它将不再接受另外的电平信号,所以其他选手将不好再抢答。
如图3.2所示。
图3.2抢答按键电路
3.2.3显示器电路
数码管的显示可以分为两种:
静态显示和动态显示。
静态显示的段选位和位选位均单独连接,因此占用的I/O接口多,无法扩展多个数码管。
而数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划的同名端连在一起,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,通过分时轮流控制各个数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
数码显示管分为共阳数码管和共阴数码管两种。
本设计采用共阴极数码显示管做显示电路。
由于采用的是共阴的数码显示管,所以只要数码管的各引脚为高电平,那么其对应的二极管就会发光。
数码管要显示抢答违规者编号、正常抢答者编号、抢答倒计时和回答问题时间倒计时,数码管采用动态显示。
段选位接P0口,P0口显示的是抢答者的编号;
位选位接P2口,P2口显示的是抢答倒计时和答题倒计时。
电源供电电压为5V,当上拉电阻选用220Ω电阻时灌电流为22mA。
不会损坏单片机的I/O口,同时也可以为数码显示管起到限制电流的保护作用,如下图3.3所示
图3.3显示器电路
3.2.4蜂鸣器音频输出电路
蜂鸣器是一种电子电路中常用的发声器件,蜂鸣器分为有源蜂鸣器和无源蜂鸣器两种。
提供蜂鸣器发声所需要较高的电流,单片机的I/O口驱动能力有限,而我们知道三极管有电流放大的作用。
蜂鸣器音频输出电路的功能是用来报警,当遇到报警信号时,发出蜂鸣声,以此来提醒操作者。
本电路通过控制不同频率的矩形脉冲来控制蜂鸣器发声。
此次课程设计中只需要一些简单的提示声音,如有抢答违规,开始抢答,抢答时间结束和回答问题时间到的提示声音。
当主持人按下开始按钮,系统接收到一个低电平,此时蜂鸣器响起;
当开始抢答后,某一选手按下抢答按钮,系统接收到一个低电平,此时蜂鸣器响起;
当还未开始抢答就有选手按下抢答按钮后,此时系统将接收到一个矩形脉冲由高低电平交换运行来控制蜂鸣器,是低电平时蜂鸣器响的起,高电平时蜂鸣器停止发声如下图3.4所示
图3.4蜂鸣器音频输出电路
4.多路抢答器的软件设计
4.1程序设计
程序设计(Programming)是指设计、编制、调试程序的方法和过程。
在进行微机控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个生产对象的实际需要设计应用程序。
在单片机控制系统中,大体上可分为数据处理、过程控制两个基本类型。
数据处理包括:
数据的采集、数字滤波、标度变换等。
过程控制程序主要是使单片机按一定的方法进行计算,然后再输出。
为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。
把一个程序分成具有多个明确任务的程序模块,分别编制、调试后再把它们连接在一起形成一个完整的程序,这样的程序设计方法称为模块化程序设计。
所谓“模块”,实质上就是能完成一定功能,并相对独立的程序段,这种程序设计方法称为模块程序设计法。
模块程序设计法的主要优点是:
(1)单个模块比起一个完整的程序易编写、调试及修改。
(2)程序的易读性好。
(3)程序的修改可局部化。
(4)模块可以共存,一个模块可以被多个任务在不同条件下调用。
(5)模块程序允许设计者分割任务和利用已有程序,为设计者提供方便。
本系统软件采用模块化结构,由主程序﹑键盘子程序、显示驱动子程序等构成。
4.2主程序设计
为了能够达到抢答的公平、公正、合理,应该在主持人发布抢答命令之前必须先设定抢答的时间,因而在编开始抢答前的程序得先编写设定时间的程序,当时间设好了之后,主持人按开始键发布抢答命令,若在主持人未按开始键之前,有选手提前答题,则为违规抢答,蜂鸣器会发出警告声,并在显示器上显示犯规的选手编号。
当有选手抢答成功,则程序打开定时中断开始倒计时,然后调用键盘扫描子程序,编写键盘扫描程序,其他选手在此之后按键无效。
当在扫描到有人按下了抢答键,马上关闭T0、调用显示程序、封锁键盘。
5.多路抢答器的调试
5.1仿真测试
由keil软件编译生成hex文件,将此文件导入单片机中,进行硬件仿真。
5.1.1初始状态仿真
主持人未按开始按钮且选手都处于准备状态时。
仿真结果如图5.1所示。
图5.1初始状态仿真图
5.1.2抢答成功仿真
主持人按下开始按钮后,30秒内抢答则为成功抢答。
仿真图为6号选手成功抢答,抢答后进入30秒倒计时答题时间。
仿真结果如图5.2所示。
图5.2抢答成功仿真图
5.1.3抢答违规仿真
若在主持人还未按下开始按钮时,选手就抢答则为抢答犯规。
图为4号选手在主持人未宣布开始时就抢答,从而造成犯规。
仿真结果如图5.3所示。
图5.3抢答违规仿真图
5.2仿真结果分析
通过对电路的仿真,可以看出基于AT89C51单片机控制的抢答器在PROTEUS软件上可以很好的实现抢答报警、抢答成功显示、抢答倒计时等一系列功能。
当仿真开始运行时,各个模块处于初始状态。
此时显示器并无状态显示,但此时抢答键和蜂鸣器都处于开启状态,若此时有选手按下抢答键,则蜂鸣器会发出报警声,并且在数码管上显示犯规的选手的编号。
主持人重新按下开始键,此时表示抢答正式开始,并且数码管显示30秒倒计时,同时蜂鸣器发出声音提醒选手抢答开始了。
选手抢答成功,同时也进入到倒计时30秒答题时间。
从仿真的测试结果来看,此设计还是能比较好的实现预期的目标。
总结
通过本次课程设计使我对Proteus仿真软件的使用和C语言有了更进一步的了解和掌握。
并且在老师的耐心指导和自己的不懈努力下,我终于顺利的完成了这次科研实践。
在最初编写过程中,我也曾经因为实践经验的缺乏失落过,也曾经因仿真成功而热情高涨。
特别是Proteus仿真软件的使用,一开始因为对软件不熟悉,要慢慢摸索,后来差不多会了以后,画仿真图又浪费了我大量的时间,最后在不断努力中终于把仿真图画出来了,最后要把写好的程序导入芯片。
其实这也是一大难事,由于对于书本上的很多知识还不能灵活运用,尤其是对程序语言的理解和运用,不能够充分理解每个语句的具体含义,导致编程的程序过于复杂。
但后来通过自己和同学的仔细的分析,并认真分析了原来已有的代码和应有的硬件后,经过多次调试和测试终于成功了。
平心而论,这次课程设计耗费了我不少的心血。
虽说这次课程设计有点辛苦,但是苦中还是有乐的,和同学们相互帮助,当LED亮了起来,喇叭响了起来是对我这段日子以来最好的告慰。
而且对于论文的总体构思也有了很多经验,相信自己经过这一次的训练与学习,对于今后的毕业论文会有更多帮助。
同时在查找资料的过程中我也学到了许多新的知识,在和同学协作的过程中增进同学友谊,使我对团队精神的积极性和重要性有了更加充分的理解,为以后进入社会奠定了一些基础。
致谢
在我的这一周学习过程中,得到了申红军老师的无私帮助的亲切指导,无论我在学习的过程中遇到的什么困难,老师都会很耐心的给我解释并帮助我在理论和实践上提高自己。
让我轻松愉快的学习,对老师的这种无私的帮助,我是很难用语言来表达自己的感谢的,正所谓感激之情,难于言表。
谢谢您老师!
在整个课程设计的过程中,我们学习到的理论知识,通过自己的坚持不懈,查阅课外知识,与同学的交流,多请教他人,课程设计就能顺利完成。
这次课程设计,感谢杨老师以及其他帮助我的老师和同学,在此让我对你们衷心的说一声:
“谢谢各位你们!
”
由于时间有限,懂得不是很多,对很多东西也不是很了解所以在设计过程中难免出现一些疏漏和错误,望各位老师和同学给予指导,我一定认真听取在以后的设计中争取做的更好。
参考文献
[1]李泉溪.《单片机原理与应用实例仿真》.北京航天航空大学出版社2009年
[2]江世明.《基于Proteus的单片机应用技术》.电子工业出版社2008年
[3]范力旻.《单片机原理与应用》.北京电子工业出版社2009年
[4]郭建江.《单片机技术与应用》.南京东南大学出版社2008年
[5]楼然苗,李光飞.《单片机课程设计指导》.北京北京航空航天大学出版社2007年
[6]万光毅.《单片机实验与实践教程》.北京航天航空大学出版社2003年
元件清单
符号
名称
型号
数量
备注
SW-PB
自复式开关
14
R
电阻
10KΩ
8
89C51
单片机芯片
0.022uf
1
74LS573
3
C
有极性电容
CON8
数码管
SPEAKER
扬声器
CON2
显示器
4
Y1
电容
Q
三极管
29
附录A
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineinputP1
#defineoutputP0
chartable[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
uinta=20,b=20,n=30,n1=30,y,z,c,d,aa;
ucharnumber,win,out;
sbitfoul=P3^0;
sbitright=P3^1;
sbitovertime=P3^2;
/*超过时间,计时为零,黄灯亮*/
sbitmiaoshan=P3^3;
sbitd0=P3^5;
sbitd1=P3^6;
sbitd2=P3^7;
sbitfeng=P3^4;
sbitadjust_key=P2^0;
sbitplus_key=P2^1;
sbitminus_key=P2^2;
sbitab_key=P2^3;
sbitstart_key=P2^4;
sbitback_key=P2^5;
sbitsuo_a=P2^6;
sbitsuo_b=P2^7;
sbitsuo_0=P0^7;
bitnumber_fu;
bitadjust_key_fu;
bitab_key_fu;
bitstart_key_fu;
bitback_key_fu;
bitshow_fu;
bitbb;
bitcc;
voidinit();
voiddelay(uintx);
voidbuzzer1();
voidbuzzer2();
voiddisplay();
voidget_number();
voidshow1();
voidshow2();
voiddelay(uinte);
voidmain()
{
while
(1)
{number=input;
P2=0xff;
output=0xff;
P3=0xff;
c=10;
if(number!
=0xff)
{get_number();
delay(100);
show1();
foul=0;
while(back_key)
{buzzer2();
}
};
if(!
adjust_key)
{adjust_key_fu=0;
while(!
adjust_key_fu)
{
show2();
show_fu=0;
show_fu)
display();
if(n!
=n1)
{show_fu=1;
n1=n;
ab_key)
show_fu=1;
adjust_key_fu=1;
ab_key);
}
start_key)
{start_key_fu=1;
win=0;
while(start_key_fu)
number=input;
{TR0=0;
get_number();
number_fu=0;
show1();
right=0;
while(--c>
0)
for(d=0;
d<
25;
++d)
{buzzer1();
init();
cc=1;
while(cc)
{if(bb)
{
show2();
miaoshan=0;
delay(600);
miaoshan=1;
if(n<
1)
{TR0=0;
right=1;
overtime=0;
TR0=0;
while(n<
{if(!
back_key)
{TR0=0;
n=n1;
cc=0;
start_key_fu=0;
}
};
if(n>
bb=0;
--n;
TR0=1;
{TR0=0;
n=n1;
cc=0;
start_key_fu=0;
}
};
{start_key_fu=0;
}
voiddelay1(uinte)
{uintg;
while(--e>
for(g=0;
g<
g++)
{;
};
voiddelay(uintx)
{uintj;
while(--x>
for(j=0;
j<
250;
j++)
;
voidinit()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
voidbuzzer1()
feng=0;
delay1(5);
feng=1;
voidbuzzer2()
{feng=0;
delay1(10);
voiddisplay(void)
plus_key)
{n=++n;
while(!
plus_key);
minus