八路抢答器设计报告

 

摘  要

现如今,各种智力知识竞赛已经成为人们的一种娱乐形式,人们答题的过程中不仅可以享受到乐趣,还可以学习到一些科学知识和生活常识。然而在抢答过程中,单靠视觉是很难判断出那组最先完成抢答操作。为辨别哪一组或哪一位选手获得答题权,必须要设计一个智能抢答控制系统——智能抢答器。

本设计是以八路抢答为基本理念,考虑到依需设定限时回答的功能,利用STC89C52单片机及外围接口实现的抢答系统,利用单片机控制原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时系统能够实现;在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;可以显示是哪位选手有效抢答和无效抢答,正确按键后LED灯点亮,数码管显示相应的抢答者序号。

目 录

设计要求... 1

1 方案论证与对比... 1

1.1 方案一:采用数字电路控制... 1

1.2 方案二:采用单片机控制... 2

1.3 方案对比与选择... 2

2 单元电路设计... 3

2.1 抢答器显示模块的设计... 3

2.2 控制器模块电路的设计... 4

2.3 晶振电路设计... 5

2.4 按键电路设计... 5

3 程序清单... 6

4 调试功能说明... 9

4.1硬件的调试... 9

4.2软件仿真... 10

4.3软硬件系统联合调式... 10

4.4焊接的问题及解决... 11

5 详细仪器清单... 11

6总结与致谢... 12


八路抢答器

设计要求

基本要求:

1.显示:采用数码管可以显示抢答组别,同时蜂鸣器报警。

2.实现8组抢答。

发挥部分:

1.增加超前违规抢答警示功能。

2.增加答题时间限制功能。

1方案论证与对比

在电视和学校中我们会经常看到一些智力抢答的节目,如果要是让抢答者用举手等方法,主持人很容易误判,会造成抢答的不公平,比赛中为了准确、公正、直观地判断出第一抢答者,所设计的抢答器通常由数码显示、灯光、音响等多种手段指示出第一抢答者。为了使这种不公平不发生,只有靠电子产品的高准确性来保障抢答的公平性。

1.1 方案一:采用数字电路控制

抢答器的总体框图[1]如图1所示,主体电路完成基本的抢答功能,即开始抢答后,当选手按动抢答键时,能显示选手的编号,同时能封锁输入电路,禁止其他选手抢答。

抢答器的工作过程是:接通电源时,节目主持人按下开始开关前,抢答器处于禁止工作状态,显示器显示0,当节目主持人宣布“抢答开始”,同时按下开始按钮,抢答器处于工作状态。当选手在定时时间内按动抢答键时,抢答器要完成以下三项工作:

(1)优先编码电路立即分辨出抢答者的编号,并由锁存器进行锁存,然后由译码显示电路显示编号;

(2)控制电路要对输入编码电路进行封锁,避免其他选手再次进行抢答;

(3)当主持人松开开始开关时系统回复到初始状态。

原理框图如图1所示:

图 1方案一系统方框图

1.2 方案二:采用单片机控制

此电路[2]完成的功能如图2所示,当主持人宣布抢答开始的时候,按下开始按钮,此时电路进入抢答状态,选手的输入采用了键盘扫描式的输入,之后把相应的信息送往单片机,再由单片机输出到显示输出电路中,并用LED显示装置显示。此时有人第一按下相应的抢答按钮,经过单片机的控制选择,在八段显示器上显示相应的号码,并锁存,同时禁止其他按钮的输入。在预备状态,若有人按键,经过单片机的控制选择在显示电路中显示犯规选手的号码。

图 2 方案二系统方框图

1.3方案对比与选择

数字电路的制作方案比较容易实现,并且在原理方面也是较简单,但这种方式制作过程复杂,而且准确性与可靠性不高,成品面积大,安装、维护困难,在具体的应用过程中也容易出问题。利用了单片机设计的抢答器具有实时显示抢答选手的号码和抢答时间的特点,还有开始按键,使其再开始新的一轮的答题和比赛,同时还可编程功能,使其实现其他一些基本的功能。

单片机的系统实用性强、判断精确、操作简单、扩展功能强。它的功能实现是比赛开始,主持人读完题之后按下开始键,即抢答开始,单片机检测选手有无按键的按下。一旦有人抢答时立刻在数码管上显示抢答者的号码,同时锁存该号码,防止有其他人在此进行抢答。同时还可加入超前违规抢答功能,也就是在主持人没按下开始抢答按钮时有选手抢答时会在数码管上短暂的显示该选手的号码。运用单片机灵活的实现了多个功能。

综合考虑采用第二种方案来完成本次八路抢答器课程设计。

2 单元电路设计

2.1 抢答器显示模块的设计

显示模块主要是显示抢答的时间、组别号码等,使用传统的数码管及发光二极管显示。数码管[3]具有:低能耗、低损耗、低压、寿命长、耐老化、防晒、防潮、防火、防高(低)温,对外界环境要求低,易于维护,同时其具有精度高、称量快、操作简单等特点。数码显示是采用BCD编码显示数字,程序编译容易,资源占用较少。

数码显示管用来作为时间的显示输出,一般用7段6位数码显示管。本次设计中采用一位共阳数码显示管应用简单、可靠性高、成本低,作为显示输出。连接时段选信号接在STC89C52P1口的P1.0~P1.7八个I/O口上。

其模块接口电路如图3所示:

图 3 显示模块接口电路

一位共阳极数字代码如表1所示。

表1  七段LED字型码

2.2 控制器模块电路的设计

采用ATMEL公司的STC89C52作为系统控制器的CPU(Central Processing Unit)。其芯片引脚如图4所示:

      

图 4 STC89C52的引脚图

2.3晶振电路设计

MSC-51单片机的定时控制功能是用时钟电路[4]和振荡器完成的,而根据硬件电路的不同,连接方式分为内部时钟方式和外部时钟方式。本设计中采用内部时钟方式。

单片机内部有一个反相放大器,XTAL1、XTAL2分别为反相放大器的输入端和输出端,外接定时反馈元件组成振荡器(内部时钟方式),产生时钟送至单片机内部各元件。时钟频率越高,单片机控制器的控制节拍就越快,运算速度也就越快。

一般来说单片机内部有一个带反馈的线性反相放大器,外界晶振(或接陶瓷振荡器)和电容就可组成振荡器,如图5所示。加电以后延时一段时间(约10ms)振荡器产生时钟,不受软件控制,图中Y1为晶振,震荡产生的时钟频率主要由Y1确定。电容C1,C2的作用有两个:一是帮助振荡器起振,二是对振荡器的频率起微调作用,典型值为30pF。电路如图6所示:

图 5 晶振电路

2.4按键电路设计

     选手按键电路一共用到8个按键,分别将它们接到STC89C52的P2.0~P2.7上。电路图如图6所示。

图6 按键电路接口图

3 程序清单

#include<reg52.h>

unsigned char xl[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

sbit s1=P2^0;

sbit s2=P2^1;

sbit s3=P2^2;

sbit s4=P2^3;

sbit s5=P2^4;

sbit s6=P2^5;

sbit s7=P2^6;

sbit s8=P2^7;

sbit sp=P3^0;

sbit gd=P3^1;

sbit rd=P3^2;

main()

{

    unsigned char flag;

       while(1)

       {      P0=0;

              if(sp==1)

              {

                     flag=0;

                     gd=1;

                     rd=0;

                     while(s1==0)

                     {

                     P1=xl[1];

                     }

                     while(s2==0)

                     {

                     P1=xl[2];

                     }

                     while(s3==0)

                     {

                     P1=xl[3];

                     }

                     while(s4==0)

                     {

                     P1=xl[4];

                     }

                     while(s5==0)

                     {

                     P1=xl[5];

                     }

                     while(s6==0)

                     {

                     P1=xl[6];

                     }

                     while(s7==0)

                     {

                     P1=xl[7];

                     }

                     while(s8==0)

                     {

                     P1=xl[8];

                     }     

                     if(P2==0xff)

                     P1=xl[0];

              }

              if(sp==0)

              {

                     flag=1;

                     gd=0;

                     rd=1;

             

                     if(s1==0)

                     {

                            while(flag)

                            {     

                                   P1=xl[1];

                                   flag=!sp;

                            }

                     }

                     if(s2==0)

                     {

                            while(flag)

                            {     

                                   P1=xl[2];

                                   flag=!sp;

                            }

                     }                   

                     if(s3==0)

                     {

                            while(flag)

                            {     

                                   P1=xl[3];

                                   flag=!sp;

                            }

                     }

                     if(s4==0)

                     {

                            while(flag)

                            {     

                                   P1=xl[4];

                                   flag=!sp;                                 

                            }

                     }

                     if(s5==0)

                     {

                            while(flag)

                            {     

                                   P1=xl[5];

                                   flag=!sp;

                            }

                     }

                     if(s6==0)

                     {

                            while(flag)

                            {     

                                   P1=xl[6];

                                   flag=!sp;

                            }

                     }

                     if(s7==0)

                     {

                            while(flag)

                            {     

                                   P1=xl[7];

                                   flag=!sp;

                            }

                     }

                     if(s8==0)

                     {

                            while(flag)

                            {     

                                   P1=xl[8];

                                   flag=!sp;

                            }

                     }

                     if(P2==0xff)

                     P1=xl[0];

         }

  }

}

4调试功能说明

4.1硬件的调试

系统调试包括硬件调试和软件调试,而且两者是密不可分的。设计好的硬件电路和软件程序,只有经过联合调试,才能验证其正确性;软硬件的配人情况以及是否达到设计任务的要求,也只有经过调试,才能发现问题并加以解决、完善,最终开发成实用产品。

4.1.1 电路板的制作与检查

当智能抢答器的硬件和软件程序设计完成后,为了事先验证硬件和软件的相容性以及整体方案设计的可行性,本设计用Proteus软件对智能抢答器进行仿真,如果软件仿真能够达到设计要求的话,证明整体设计方案具有可行性,可以进行实物电路的焊接,进行软硬件的联合调试。

    Proteus相当于硬件开发,只是虚拟的,可以看到程序代码是怎么样一步一步运行。考虑到本系统所用元器件较少,大部分功能都是通过软件编程来实现,同时也出于对毕业设计成本的考虑,因此所用到的板子是自己手工制作的PCB板。在电路板的制作中,首先要进行线路的排布。利用PROTEL 软件模拟实际电路板的线路走向,尽量避免线路出现交叉短路,电源线路尽量安排在电路板的最外圈。PCB板刻录完成之后,开始进行焊接工作。焊接完后进行电路板检查,将原线路图与实际焊接的电路板进行对比,由于线路不多,所以用万用表的欧姆档或是短路声响指示功能来做焊点的检测,如此可以避免焊接时漏焊、虚焊和配线错误的问题,同时保证了所制作出来的线路与原设计线路的一致性。

4.1.2 电路模块调试

本设计硬件部分主要为显示模块按键模块。硬件电路功能检测主要针对这两部分进行测试。

对于显示电路,由于使用的是三联数码管显示屏,首先要确定数码管的共阴还是共阳极。因此先用万用表检测是什么极性。然后再先固定下,检查显示电路能否正常显示。最后再焊接上去。

    对于按键部分,首先要确定各个按键是否完好,先自己接到一个简易的电路上测试下,确定完好后再焊接。

4.2软件仿真

4.3软硬件系统联合调式

将烧录好的STC89S52芯片固定在电路板底座上。接下来给系统通电,系统正常工作时,可以看到:当主持人没有按下“开始抢答键” ,显示装置显示0,红色二极管发光。如果此时有选手发生抢答(例如1号选手),则显示装置短暂的显示“1”,属于犯规;当主持人按下“开始抢答键”时,蓝色二极管发光,如果有选手抢答,则显示抢答选手的参赛号,如果无人抢答主持人松开开始按钮时系统回到初始状态。

上述情况均是智能抢答器正常工作的情况,如果在软硬件的调试过程中不能做到以上几点,应该努力排错修改,不断完善智能抢答器的功能。

4.4焊接的问题及解决

一般来说,造成硬件问题的首要问题就是焊接了,也就是说焊接的好与坏直接响产品的正常运行。造成焊接质量不高的常见原因是:

(1)焊锡用量过多,形成焊点的锡堆积;焊锡过少,不足以包裹焊点。

(2)冷焊。焊接时烙铁温度过低或加热时间不足,焊锡未完全熔化、浸润、焊锡表面不光亮(不光滑),有细小裂纹。

(3)夹松香焊接,焊锡与元器件或印刷板之间夹杂着一层松香,造成电连接不良。若夹杂加热不足的松香,则焊点下有一层黄褐色松香膜;若加热温度太高,则焊点下有一层碳化松香的黑色膜。对于有加热不足的松香膜的情况,可以用烙铁进行补焊。对于已形成黑膜的,则要"吃"净焊锡,清洁被焊元器件或印刷板表面,重新进行焊接才行。

(4)焊锡连桥。指焊锡量过多,造成元器件的焊点之间短路。这在对超小元器件及细小印刷电路板进行焊接时要尤为注意。

(5)焊剂过量,焊点明围松香残渣很多。当少量松香残留时,可以用电烙铁再轻轻加热一下,让松香挥发掉,也可以用蘸有无水酒精的棉球,擦去多余的松香或焊剂。

(6)焊点表面的焊锡形成尖锐的突尖。这多是由于加热温度不足或焊剂过少,以及烙铁离开焊点时角度不当浩成的内。

最小系统的电路不工作,首先应该确认电源电压是否正常。用电压表测量接地引脚跟电源引脚之间的电压,看是否符合电源电压,常用的是5V左右。接下来就是检测复位引脚的电压是否正常,EA引脚的电压要正常为5V左右。

5 详细仪器清单

                             表1  仪器清单

6总结与致谢

课程设计是培养我们综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体锻练和考察过程。回顾这次单片机课程设计,我感慨颇多。从选题到定稿,从理论到用于实践,在两个星期的日子里不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合的重要性,提高自己的实际动手能力和独立思考的能力。在设计的过程中我学会了用C语言去完成各种功能,了解到它的可读性和可移植性高。对于单片机设计,其硬件电路是比较简单的,主要是解决程序设计中的问题。

这两个星期经过自己不断的摸索努力以及指导老师的耐心指导和热情帮助,本设计已经基本完成。在这段时间里,老师严谨的治学态度和热忱的工作态度令我十分敬佩,老师的指导使我获益匪浅。在此对指导老师和同学的帮助表示深深的感谢,让我如期完成了课程设计。

通过这次单片机课程设计,深刻地认识到学好专业知识的重要性,也理解了理论不能脱离实际。虽然在这次设计中对于知识的运用和衔接还不够熟练,对某些知识了解的不够透彻,但是我将在以后的工作和学习中继续努力,不断完善自己,不断提高自己。这将近两个星期的课程设计是对过去所学知识的系统提高和扩展的过程,为今后的发展打下了坚实的基础。


相关推荐