抢答器控制系统.docx
《抢答器控制系统.docx》由会员分享,可在线阅读,更多相关《抢答器控制系统.docx(28页珍藏版)》请在冰豆网上搜索。
抢答器控制系统
1课程设计的任务与要求
1.1课程设计的任务
(1)抢答器同时供8名选手或8个代表队比赛,分别用8个按钮S1~S8表示
(2)设置一个系统重置、系统停止和抢答控制开关S,该开关由主持人控制。
(3)抢答器具有锁存与显示功能。
即选手按动按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统重置为止。
(4)抢答器具有定时提醒抢答功能,当主持人启动"开始"键后,定时器进行减计时,剩余5S时自动有声音和灯光闪烁提醒。
(5)参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统重置为止。
(6)如果定时时间已到,无人抢答,本次抢答无效,系统禁止抢答,定时显示器上显示初始时间20s
1.2课程设计的要求
(1)思路清晰,给出整体设计框图和总电路图;
(2)单元电路设计,给出具体设计思路和电路;
(3)写出设计报告;
1.3课程设计的研究基础(设计所用的基础理论)
在各类竞赛中,特别是做抢答题时,在抢答过程中,为了知道哪一组或哪一名选手先答题,必须要有一个系统来完成这个任务。
如果在抢答过程中,只靠人的视觉是很难判断出哪组先答题。
利用单片机来设计抢答器,使以上问题得以解决,即使有两组的抢答时间相差几微秒,也可分辨出哪组优先答题。
抢答器是一种应用非常广泛的设备,在各种竞赛、抢答场合中,它能迅速、客观地分辨出最先获得发言权的选手。
早期的抢答器只由几个三极管、可控硅、发光管等组成,能通过发光管的指示辨认出选手号码。
现在大多数抢答器均使用单片机(如MCS-51型)和数字集成电路,并增加了许多新功能,如选手号码显示、抢按前或抢按后的计时、选手得分显示功能。
像这类抢答器,制作过程简单,准确性与可靠性高,而且安装维护简单。
对于抢答器的应用,如早期的数字电路,随着科技的逐步发展,进而到了单片机的控制来实现其功能,而且功能齐全,电路简单,成本低,性能高,真正朝着有利的方向发展。
2抢答器控制系统方案制定
2.1方案提出(以方框图模块化设计的形式给出至少2个方案,并简要说明)
方案一(如图1)
图1PLC抢答器控制系统结构
方案二(如图2)
图2单片机抢答器控制系统结构[1]
2.2方案比较
单片机控制[1]:
优点,经济实惠,成本相对较低;缺点,用单片机制作的主控板受制版工艺、布局结构、器件质量等因素的影响导致抗干扰能力差,故障率高,不易扩展,对环境依赖性强,开发周期长。
一个采用单片机制作的主控板不经过很长时间的实际验证很难形成一个真正的产品[1]。
PLC控制:
优点:
PLC是经过几十年实际应用中检验过的控制器,其抗干扰能力强,故障率低,易于设备的扩展,便于维护,开发周期短。
缺点:
成本相对单片机要高。
2.3方案论证
抢答器的实现方式有种多样,通过纯电子器件搭建电路实现,如优先编码器,锁存器,555定时器译码器等,纯电子器件实现没有软件参与,调试简单,但是它不易于扩展和修改,而且电路结构复杂,调试困难电子,电子器件管脚很多,实际搭建起来费时费力,焊接很容易出错。
于是,我想到了用单片机实现。
单片机体积小价格低,应用方便,稳定可靠。
单片机将很多任务交给了软件编程去实现,大大简化了外围硬件电路,使外围电路的实现简单方便。
由于单片机本身不具有软件编译测试的功能,我们需要借助其他软件编译,将编译好的程序“烧”入单片机内。
在实际电路设计中,需要先通过仿真软件测试电路以及编译的程序,检查外围电路设计是否合理,软件编译是否正确,以及软件和硬件电路能否正常配合工作,能否准确的实现所设计的功能。
如果测试通过,电路仿真没有问题能完全实现功能的话就可以实际的做板子的焊接工作了。
在老师的指导下我选择了常用的单片机仿真软件proteus6.9以及keil进行仿真。
2.4方案选择
考虑到经济因素、器件的熟悉程度和应用泛围,我们选择了我们所熟悉的单片机来完成此次设计。
3抢答器控制系统方案设计
3.1各单元模块功能介绍及电路设计
(1)抢答电路
参考电路如图3所示。
该电路完成两个功能:
一是分辨出选手按键的先后,并锁存优先抢答者的编号,同时译码显示电路显示编号;二是禁止其他选手按键操作无效。
如有再次抢答需由主持人将S开关重新置,“重置”然后再进行下一次抢答,具体如图3所示。
图3抢答电路
(2)显示锁存电路
通过p10,p32~p39端口将最先抢答选手的编号和所剩的时间显示在7SRG-MPX4-CA显示屏上,具体如图4所示。
图4显示锁存电路
(3)报警电路
这里的报警电路用于提示选手赶快抢答,当时间快用完时,发出警报。
一般最简单的喇叭驱动方式就是利用达林顿晶体管,或者以两个常用的小晶体管连接成达林顿架势。
此次审计中我们选用了PNP三极管来实现此功能,不过,我们还增加了个0.5K的上拉电阻。
具体如图5所示。
图5报警电路
(4)计时电路
选手在设定的时间内抢答时,实现:
优先判断、编号锁存、编号显示、扬声器提示。
当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。
如果再次抢答必须由主持人再次作"清除"和"开始"状态开关。
这里的记录时间的电路设计如图6所示。
图6计时电路
3.2电路参数的计算及元器件的选择
AT89C51单片机、7SRG-MPX4-CA显示屏、74HC573八进制3态非反转透明锁存器、BUTTON开关、CAP电容、CRYSTAL晶振、LED-BLUE蓝光二极管、LED-RED红光二极管、LED-YELLOW黄光二极管、PNP三极管、RES电阻、RESPACK-8阻排、SPEAKER喇叭。
3.3特殊器件的介绍
(1)74HC573八进制3态非反转透明锁存器
图7高性能硅门CMOS器件
SL74HC573跟LS/AL573的管脚一样。
器件的锁存器
输入是和标准CMOS输出兼容的;加上拉电阻,他们能和LS/ALSTTL输出兼容。
当锁存使能端LE为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。
当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。
LE为锁存控制端;OE为使能端。
图8内部原理图
74HC573内部原理图
(2)respack8阻排
接在51单片机的P0口,因为P0口内部没有上拉电阻,不能输出高电平,所以要接上拉电阻。
排阻就是好多电阻连载一起,他们有一个公共端
1端为公共端接VCC或地,分清是上拉电阻还是下拉电阻,其他接你要操作的端口
3.4系统整体电路图
图9系统整体电路图
4抢答器控制系统仿真和调试
4.1仿真软件介绍
4.1.1protues仿真简介[2]
Protues[2]软件是英国Labcenterelectronics公司出版的EDA工具软件。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086、MSP430、Cortex和DSP系列处理器等,并持续增加其他系列处理器模型。
在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。
4.1.2Keil简介
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。
如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
4.2系统仿真实现
启动后,蓝色D10灯亮,显示屏上显示20-0,系统正常运行。
效果如图8所示
图10系统初始运行
当主持人按下开始键的时候,显示屏上开始计时,效果如图9所示
图11开始计时
当有选手按键抢答时,对应的灯亮,显示屏上记录下选手的编号和剩余时间,效果如图10所示
图12选手抢答
时间剩余5s时,喇叭会发出警报并伴随有红灯闪烁,效果如图11所示
图13系统报警
4.3系统测试(要求测试环境、测试仪器、测量数据)
本次课程设计是在电脑上完成的,通过使用Proteus仿真软件,和Keil单片机开发系统对步进电机控制系统进行了仿真。
结果基本符合设计要求。
但由于条件原因,未能将其做成实物。
以后会对其加以实物制作。
5总结
5.1设计小结
通过这次课程设计。
动手设计的电子智能抢答器,采用了单片机技术、软件仿真、程序编程、制作电路板等相关技术。
把在学校这一段时间所学知识连成一串。
理论联系实践,体现出大学生动手能力。
通过查资料和搜集有关的文献,培养了自学能力和动手能力。
并且由原先的被动的接受知识转换为主动的寻求知识,这可以说是学习方法上的一个很大的突破。
在以往的传统的学习模式下,我们可能会记住很多的书本知识,但是通过课程设计,我们学会了如何将学到的知识转化为自己的东西,学会了怎么更好的处理知识和实践相结合的问题。
把握重点、攻克难关,学到用到、活学活用。
5.2收获体会
通过本次基于单片机的抢答器控制系统的设计与仿真,察觉到自己在应用所学基础知识和专业知识解决问题的能力有了很大的提高。
在设计过程中,遇到了大大小小的问题,有些是以前不知道的理论知识,但通过上网查询资料,询问同学后都得以解决。
最重要的是在设计中,不但学习了新的知识,还巩固并加深了对已学知识的理解。
在仿真过程中,也碰到了结果与预想不同的地方,通过对程序的调试,使仿真结果与预期的基本一致了。
总的来说,通过这次的课程设计,让我在实际中解决问题能力有了很大的提升。
5.3展望
在设计过程中由于时间仓促有很多地方难免存在不足,硬件设计已经完成,在软件设计中有些功能还尚未开发出来。
但在以后的工作中,我们会严格要求自己,追求完美。
以后还会更深入的去研究各种复杂的控制系统,力求将每个系统做到简洁完美。
6参考文献
[1]谢维成,杨加国,等.单片机原理与应用及C51程序设计(第2版)[M].清华大学出版社,2009.7.
[2]侯玉宝,陈忠平,李成群,等.基于Proteus的51系列单片机设计与仿真[M].电子工业出版社,2008.9.
[3]谭浩强,等.C程序设计(第三版)[M].清华大学出版社,2005.
7附录
7.1系统主要功能展示图
图10系统初始运行
图11开始计时
图12选手抢答
图13系统报警
7.2器件清单
表一、器件清单表[2]
元件名称
中文名
个数
AT89C51
单片机
1
7SRG-MPX4-CA
显示屏
1
74HC573
八进制3态非反转透明锁存器
1
BUTTON
开关
11
CAP
电容
3
CRYSTAL
晶振
1
LED-BLUE
蓝光二极管
1
LED-RED
红光二极管
1
LED-YELLOW
黄光二极管
8
PNP
三极管
1
RES
电阻
12
SOUNDER
喇叭
1
RESPACK-8
阻排
1
7.3程序源代码[3]
#include
#defineuintunsignedint
#defineucharunsignedchar
/*-----------------------------------------------------------
共阴极数码管编码表0-f显示
------------------------------------------------------------*/
unsignedcharcodetable[]={0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10,0x08,0x03,
0x46,0x21,0x06,0x0e};
/*-----------------------------------------------------------
变量定义
------------------------------------------------------------*/
sbitstart=P3^6;
sbitstop=P3^5;
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;
sbitbuzzer=P3^4;
bitstart_flag=0;
bitstop_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;
ucharsecond=20;
uchartimer0_count=0;
ucharnumber=0;
ucharnumber_display=0;
/*-----------------------------------------------------------
延时函数
------------------------------------------------------------*/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*-----------------------------------------------------------
数码管显示驱动函数
------------------------------------------------------------*/
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=0x3f;
delay
(2);
P2=0xfb;
P0=table[second_first];
delay
(2);
P2=0xf7;
P0=table[second_second];
delay
(2);
}
/*-----------------------------------------------------------
开始键扫描函数
------------------------------------------------------------*/
voidstart_keyscan()
{
if(start==0)
{
delay(8);
if((start==0)&&(!
start_flag))
{
start_flag=1;
action=1;
TR0=1;
}
}
else
{
start_flag=0;
}
}
/*-----------------------------------------------------------
八位抢答键扫描函数
------------------------------------------------------------*/
ucharkey_scan8()
{
if(key1==0)
{
delay(8);
if((key1==0)&&(!
key1_flag))
{
key1_flag=1;
number=1;
number_display=number;
}
}
else
{
key1_flag=0;
number=0;
}
if(key2==0)
{
delay(8);
if((key2==0)&&(!
key2_flag))
{
key2_flag=1;
number=2;
number_display=number;
}
}
else
{
key2_flag=0;
number=0;
}
if(key3==0)
{
delay(8);
if((key3==0)&&(!
key3_flag))
{
key3_flag=1;
number=3;
number_display=number;
}
}
else
{
key3_flag=0;
number=0;
}
if(key4==0)
{
delay(8);
if((key4==0)&&(!
key4_flag))
{
key4_flag=1;
number=4;
number_display=number;
}
}
else
{
key4_flag=0;
number=0;
}
if(key5==0)
{
delay(8);
if((key5==0)&&(!
key5_flag))
{
key5_flag=1;
number=5;
number_display=number;
}
}
else
{
key5_flag=0;
number=0;
}
if(key6==0)
{
delay(8);
if((key6==0)&&(!
key6_flag))
{
key6_flag=1;
number=6;
number_display=number;
}
}
else
{
key6_flag=0;
number=0;
}
if(key7==0)
{
delay(8);
if((key7==0)&&(!
key7_flag))
{
key7_flag=1;
number=7;
number_display=number;
}
}
else
{
key7_flag=0;
number=0;
}
if(key8==0)
{
delay(8);
if((key8==0)&&(!
key8_flag))
{
key8_flag=1;
number=8;
number_display=number;
}
}
else
{
key8_flag=0;
number=0;
}
if(number_display!
=0)
{
return1;
}
else
{
return0;
}
}
/*-----------------------------------------------------------
复位键扫描函数
------------------------------------------------------------*/
voidreset_keyscan()
{
if(reset==0)
{
delay(8);
if((reset==0)&&(!
reset_flag))
{
reset_flag=1;
number_display=0;
second=20;
}
}
else
{
reset_flag=0;
}
}
voidfengming()//蜂鸣函数,脉宽t=1ms周期T=2ms频率f=0.5khz实际发现延时1ms的时候效果最好
{
//延时1ms
buzzer=0;//给P3.7口送高电平
delay(100);//延时1ms
buzzer=1;
delay(100);
}
/*-----------------------------------------------------------
主函数
------------------------------------------------------------*/
voidmain()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=0;
while
(1)
{
start_keyscan();
reset_keyscan();
while(action==1)
{if(second<=5&&second>0)
fengming();
while(!
key_scan8()&&!
stop==0)
{
display(number_display,second);
if(second==0)
{
second=20;
break;
}
}
TR0=0;