多路抢答器课程设计报告专业:电子信息工程课程:多路抢答器设计学生姓名学号:201312700053方秋实201312700107李炳均201312700103吴桐光201312700102钟燏201312700078孔健2016年 6月多路抢答器设计摘要随着电子技术的飞速发展,基于单片机的控制系统已应用于工业、农业、电力、电子、智能楼宇等行业,微型计算机作为嵌入式控制系统的主体与核心,代替了传统的控制系统的常规电子线路。
抢答器作为一种工具,已广泛应用于各种智力和知识竞赛场合。
但抢答器的使用频率较低,且有的要么制作复杂,要么可靠性低。
作为一个单位,如果专门购一台抢答器虽然在经济上可以承受,但每年使用的次数极少,往往因长期存放使(电子器件的)抢答器损坏,再购置的麻烦和及时性就会影响活动的开展,因此设计了本抢答器。
本设计是以四路抢答为基本理念。
考虑到依需设定限时回答的功能,利用STC89C52单片机及外围接口实现的抢答系统,利用单片机的单线程无线循环的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时。
同时使数码管能够正确地显示时间,并且给出指令的提示。
系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间和回答问题的时间可在20S设定;可以显示是哪位选手有效抢答,正确回答后,主持人按下加分按键,基本分是选手分数加10分,选手答错扣10分;回答问题时间倒记时显示,倒计时完后系统自动跳回时钟模式。
关键词:STC89C52;单片机;数码管;抢答器;智能1 引言目前各种各样的竞赛越来越多,无论是学校、工厂、军队还是益智性电视节目,其中用到抢答器的概率非常大。
目前很多抢答器基本上采用小规模数字集成电路设计,使用起来不够理想。
因此设计一款更易于使用和区分度高的抢答器成了非常迫切的任务。
现在单片机已进入各个领域,以其功耗小、智能化而著称。
所以若利用单片机来设计抢答器,便使以上问题得以解决。
针对以上情况,本课程设计出以STC89C52单片机为核心的多路抢答器。
它能根据不同的抢答输入信号,经过单片机的控制处理并产生不同的与输入信号相对应的输出信号,最后通过数码管显示相应的路数和答题时间以及各项命令等,使竞赛真正达到公正、公开、公平。
2 设计任务与要求概述2.1 题目多路路比赛抢答器2.2 设计任务利用8052单片机,制作一个有4个按键的比赛抢答器,可供5名选手比赛的抢答,每组设置一个抢答按钮,按钮的编号与选手的编号对应,主持人设置控制开关,用来控制系统的复位,在有人按键时进行对应选手显示。
2.3 设计要求1 完成系统的硬件电路设计与软件设计;2 采用汇编或C语言编程;3 采用KeilC等软件实现系统的软件部分;4 论文要求思路清晰,结构合理,语言流畅,书写格式符合要求。
2.4 设计目的1 综合运用相关课程中所学的理论知识去完成这一设计课题。
2 通过查阅手册和相关文献资料,培养自己独立分析和解决问题的能力。
3 进一步熟悉单片机和常用接口电路,加深对专业知识和理论知识学习的认识和理解。
4 学会电路的设计与程序的调试。
5 学会撰写课程设计论文。
6 培养严肃认真的工作作风和严谨的科学态度。
3 方案总体设计3.1 方案3.1.1 控制芯片我们采用51系列单片机STC89C52作为控制核心,该系统可以完成运算控制、信号识别以及显示功能的实现。
单片机技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。
整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩张和更改。
STC89C52单片机特点如下:a、可靠性好:单片机按照工业控制要求设计,抵抗工业噪声干扰优于一般的CPU,程序指令和数据都可以写在ROM里,许多信号通道都在同一芯片,因此可靠性高,易扩充。
b、控制功能强:单片机指令除了输入输出指令,逻辑判断指令外还有更丰富的条件分支跳跃指令。
3.1.2 显示方式在实现基本功能时,我们采用了八位数码管显示,后两位显示倒计时时间,第一位默认为00,第三位置选手的分数,在此基础上还在程序里加了更改抢答时间和倒计时时间的模块,也可通过数码管显示,成为一个比较完整的系统。
后来在实现拓展功能时,我加入DS1302时钟模块,不使用抢答功能的时候可以用作一个时钟(可调),另外八个数码管能够显示出选手的得分情况,答题所用的时间,能清楚地看到比赛进行的整个过程。
3.1.3流程框图流程框图4 硬件电路设计4.1 抢答器的工作原理在系统正常运行的状态下,正常为一个实时时钟,本系统有两种模式,一种是抢答模式,另一种为校时模式,当按键按下,系统判定工作模式之后,分别进入不同的工作状态,然后在各自状态下,扫描抢答键的状态,判断是哪个选手按下的,以此来实现抢答功能。
4.2 单元电路设计4.2.1 抢答器电路该电路有八个按钮分别接于P1.0~P1.7可实现两个功能:一是分辨出选手按键的先后,并锁存优先抢答者的编号,同时数码管显示显示编号;二是禁止其他选手按键操作无效。
如有再次抢答需等待20S倒计时结束重置,“清除”然后再进行下一次抢答。
如图4.1图4.1 抢答器按键电路4.2.3复位按键输入电路的设计复位是计算机的一个重要工作状态。
开始和复位键分别接于P3.0和P3.1口,在单片机工作时,接电之前,断电后也要复位。
在抢答器中复位则为恢复初始状态,在抢答之前要按下抢答模式按键。
按了复位键,将返回时钟模式。
如图4.3图4.3复位电路4.2.4 时钟震荡电路CPU的操作需要精确的定时,可用一个晶体振荡器产生稳定的时钟脉冲来控制AT89C51单片机上的XTAL1和XTAL2分别为振荡电路的输入和输出。
如图4.4图4.4时钟振荡电路4.2.5 显示电路的设计本系统通过数码管来显示各提示信息。
如图4.6图4.6 显示时间电路74HC595芯片样图74HC595控制时序图Q0…Q7 pin15, pin1~ 7 并行数据输出GND pin8 地Q’7 pin 9 串行数据输出~MR 10 低电平是将移位寄存器的数据清零,(接VCC)SH-CP pin 11 移位寄存器时钟输入ST-CP pin 12 存储寄存器时钟输入~OE pin 13 输出有效(低电平) (接GND)DS pin 14 串行数据输入VCC pin 16 电源4.2.6 实时时钟芯片DS1302DS1302的控制字为8位7位必须为1,否则不能把数据写入6位0表示存取阳历时钟数据,1表示存取RAM 数据1~5表示操作单元地址0 位 1:读操作,0:写操作控制字总是从最低位开始输出。
在控制字指令输入后的下一个SCLK 时钟的上升沿时,数据被写入 DS1302,数据输入从最低位(0位)开始。
同样,在紧跟8 位的控制字指令后的下一个 SCLK 脉冲的下降沿,读出 DS1302 的数据,读出的数据也是从最低位到最高位。
5 设计总结通过这次课程设计,我更进一步地认识了抢答器的工作原理,掌握了它的调整及测试方法。
本系统通过采用STC89C52单片机作为核心,以5个按键输入抢答信号,以数码管显示,根据烧录到单片机中的程序控制整个系统的工作流程,整体性好,效率高,实现了抢答器的智能化。
在这过程之中也遇到了一些问题,C语言基础也需要加强,编程能力有待提高。
6 致谢通过此次的课程设计,让我更进一步的巩固了单片机的各种知识。
但在设计的过程中,遇到了很多的问题,有一些知识已经不太清楚了,但是通过一些资料又重新的翻阅并且认真的复习了相关教科书中的内容。
此次的课程设计树立了对自己工作能力的信心,相信会对今后的学习工作生活都有非常重要的影响,而且大大的提高了动手能力,使我充分的体会到了创造过程中的探索的艰难和成功的喜悦。
虽然这次做出的作品还存在很多需要改进的地方,但是在整个设计过程中所学习到的东西是这次实训所得到的最大收获跟财富,使我终身受益。
最后,我要感谢指导老师和同学们的帮助!附录一系统电路图图附录系统电路图附录二部分程序清单#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit beep = P2^3;sbit we = P2^7;sbit du = P2^6;sbit S2 = P3^0;sbit S3 = P3^1;sbit S4 = P3^2;sbit S5 = P3^3;uchar code leddata[]={0x06,0x5B,0x4F,0x66,};unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管各位的码表unsigned char code duan[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f};//1-8的码表0x00是全灭0x7d 是6void sel(unsigned int num){P0=wei[num];we=1;we=0;}void seg(unsigned int num){P0=duan[num];du=1;du=0;}uint i=0;uint j;uint m;uint counter=20;uint num = 0;uint socek_1[] = {1,1,1,1,1};void delay(uint z){uint x,y;for(x = z; x > 0; x--)for(y = 120; y > 0 ; y--);}display_empty(){int i;for(i=0; i<8; i++){P0=wei[i];we=1;we=0;P0=duan[0];du=1;du=0;}}display_socer(int i, int socer) {while(1){sel(0);seg(socer);delay(2);sel(1);seg(0);delay(2);sel(2);seg(0);delay(2);sel(3);seg(0);delay(2);sel(4);seg(0);delay(2);sel(5);seg(0);delay(2);sel(6);seg(0);delay(2);sel(7);seg(i+1);delay(2);if(S5 == 0){delay(5);if(S5 == 0){while( !S5 );break;}}}}void display(uint j){we = 1;P0 = 0x7f;we = 0;du = 1;P0 = leddata[j];du = 0;delay(1);}void key(){if(S2 == 0){delay(5);if(S2 == 0){m=1;num = 1;display(0);while( !S2 );}}if(S3 == 0){delay(5);if(S3 == 0){m=1;num = 2;display(1);while( !S3 );}}if(S4 == 0){delay(5);if(S4 == 0){m=1;num = 3;display(2);while( !S4 );}}if(S5 == 0){delay(5);//软件消抖if(S5 == 0){m=1;num = 4;display(3);while( !S5 );}}if(m==1){beep=0;delay(3000);beep=1;}}void main(){while(1){if(S2 == 0){delay(5);if(S2 == 0){while( !S2 );break;}}}TMOD = 0x01;TH0 = (65536 - 46082)/256;TL0 = (65536 - 46082)%256;TR0 = 1;/************选手开始抢答***************/staring:while(1){if(TF0 == 1){TF0 = 0;TH0 = 0x4b;TL0 = 0xfe;counter++;}if(counter==20){counter=0;switch(i++){case 0: P1 = 0X00;break;case 1: P1 = 0X01;break;case 2: P1 = 0X03;break;case 3: P1 = 0X07;break;case 4: P1 = 0X0f;break;case 5: P1 = 0X1f;break;case 6: P1 = 0X3f;break;case 7: P1 = 0X7f;break;case 8: P1 = 0Xff; beep=0;delay(3000);beep=1; break;}}第15页if(i==9){while(1){if(S5 == 0){delay(5);if(S5 == 0){while( !S5 );i=0;delay(50);goto staring;}}}}key();if(m==1)break;}i=0;/************选手开始答题,倒计时*****/while(1){if(m == 1){if(TF0 == 1){TF0 = 0;TH0 = 0x4b;TL0 = 0xfe;counter++;}if(counter==20){counter=0;switch(i++)第16页{case 0: P1 = 0X00;break;case 1: P1 = 0X01;break;case 2: P1 = 0X03;break;case 3: P1 = 0X07;break;case 4: P1 = 0X0f;break;case 5: P1 = 0X1f;break;case 6: P1 = 0X3f;break;case 7: P1 = 0X7f;break;case 8: P1 = 0Xff; beep=0;delay(3000);beep=1; break;}}if(i == 9){display_socer(num, --socek_1[num]);display_empty();i=0;m=0;delay(50);goto staring;}if(S2 == 0){delay(5);if(S2 == 0){while( !S2 );display_socer(num, ++socek_1[num]);display_empty();i=0;m=0;delay(50);goto staring;}}if(S3 == 0){delay(5);if(S3 == 0){第17页while( !S3 );if(--socek_1[num] == 0 )socek_1[num] = 1;display_socer(num, socek_1[num]);display_empty();i=0;m=0;delay(50);goto staring;}}}}while(1);}。