当前位置:文档之家› 3位竞赛抢答器课程设计报告分解

3位竞赛抢答器课程设计报告分解

《单片机控制技术》期末课程设计题目:三位竞赛抢答器设计报告专业:电子科学与技术班级:成员:完成日期:2015年12月25日三位竞赛抢答器设计报告1设计意义及要求1.1设计意义在很多关于智力竞赛的电视节目上,经常会出现抢答环节,参赛选手们在得到主持人发出的特定口令之后,都会争先恐后地按下抢答器,但每次抢答环节只有可能产生一位抢答成功的选手,同时可以断定这位参赛选手肯定是反应最快按下抢答器的。

设计一个功能类似的三位抢答器不仅能够让大家进一步了解这种抢答器的工作原理,而且还能在功能上提出一些好的想法和思想,甚至可以实现部分新的功能,如果人们不断的进行具有创新性的设计实验,也许过不久那些竞赛类的电视的抢答模式就会发生一定的改变和创新,从而增加了节目的观赏性,进一步丰富大家的娱乐生活。

1.2设计要求1.以单片机为核心,设计一个3位竞赛抢答器:同时供3名选手或3个代表队比赛,分别用3个按钮S0~S2表示。

2.设置一个系统清除和抢答器控制开关S,开关有主持人控制。

3.抢答器具有锁存与显示功能,即选手按按钮,锁存相应的编号,并在优先抢答器选手的编号一直保持主持人将系统清楚为止。

4.抢答器具有定时抢答功能且一次抢答的时间由主持人设定(如30秒),当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,持续时间0.5S左右。

5.参赛选手在设定的时间内进行抢答,抢答有效,定时器工作停止,显示器上显示选手的编号和抢答的时间并保持到主持人将系统清除为止,6.如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。

2成员分工及方案设计2.1成员分工:编写C 语言并使用Protuce 软件仿真; :负责制作本课程设计报告; :负责最后答辩;2.2方案设计2.2.1模块化设计框架图图2-2-1模块化设计框架图2.2.2各个模块的实现 (1)脉冲发生器的实现根据本实验的具体要求,锁存器需要有脉冲信号的输入,及需要有相应的脉冲发生器。

(2)数据锁存部分的实现实验设计要求是制作一个三位竞赛抢答器,需要对代表三位参赛选手的状态( “0”或“1” )进行相应的锁存,为了电路的简化,应该采用D 触发器来实现锁存功能,则对于要实现对三位数据的锁存这一功能,可以使用两块集成了四个D 触发器的74LS175芯片。

(3)数据编码部分的实现编码部分是对锁存的数据进行编码,由于只有三个参赛选手,故只需要用三个不同的数字便可以代表所有的参赛选手,只要采用能对三位数据进行编码并能有三种或三种以上的输出的编码器即可达到要求。

(4)数据显示部分的实现对于这样的一个仅需要显示数字的设计,很容易联想到使用七段数码管来实现的数字的显示,而且七段数码管可以显示16种不同的输出,对于这种只需要有不少于三种的输出的设计来说,七段数码管完全可以达到要求。

一般的七段数码管有10个数据输入端,所以需要有相应的译码器对输送过来的编码后的数据进行译码操作,并且这种译码器的选择必须结合数码管是共阴还是共阳的情况而定。

2.2.3关于实现功能拓展的设计思路(1)实验设计的基本要求中没有提到主持人实现清零后,数码管该显示什么,这样在设计过程中我们就可以有多重选择了,本设计中设计的是让主持人清零之后,数码管显示F FF。

这一功能可以通过基本的门电路来实现,把主持人和参赛选手接入的信号作为输入信号,通过门电路整合,使得到的输出信号来控制数据显示部分。

(2)设计要求中没有提到参赛选手提前抢答会造成犯规的这一功能,理论上会存在有参赛选手犯规的情况的发生,这样实际中增加一个抢答犯规的功能是有一定的必要性的,同样要实现这一功能,可以通过门电路的组合,收集主持人和参赛选手接入的信号,把输出信号接到一个报警装置上,实现当主持人还未发出开始抢答指令的时候,若有参赛选手抢答了,报警装置会报警的功能。

2.3总体功能框图下图所示为总体方框图。

其工作原理为:接通电源后,主持人将开关断开,抢答器处于禁止状态,定时器显示设定时间;主持人将开关接通,宣布开始抢答器工作。

定时器倒计时,扬声器给出声响提示。

选手在定时时间内抢答时,抢答器完成:优先判断、编号锁存、编号显示、扬声器提示。

当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。

如果再次抢答必须由主持人再次操作状态开关。

2.3总体功能框图2.4元器件清单仿真图中所需要的各种元器件如表2.4表2.4 元器件清单3 硬件设计3.1 元器件及其作用在三位抢答器的设计中,我们主要用到了AT89C51型号单片机、晶振、电容、排阻、电阻、电源、拨码开关、7SEG-MPX4-CC-BLUE数码管等元器件。

芯片是由ISIS 7 PROFESSIONAL仿真软件系统提供(AT89C51)。

它主要由CPU,存储器和管脚组成。

所谓排阻就是若干个参数完全相同的电阻,它们的一个引脚都连到一起,作为公共引脚。

其余引脚正常引出。

所以如果一个排阻是由n个电阻构成的,那么它就有n+1只引脚,一般来说,最左边的那个是公共引脚。

它在排阻上一般用一个色点标出来。

排阻一般应用在数字电路上,比如:作为某个并行口的上拉或者下拉电阻用。

使用排阻比用若干只固定电阻更方便。

排阻有a型和b型的区别。

a型排阻的引脚总是奇数的。

它的左端有一个公共端(用白色的圆点表示),常见的排阻有4、7、8个电阻,所以引脚共有5或8或9个。

B型排阻的引脚总是偶数的。

它没有公共端,常见的排阻有4个电阻,所以引脚共有8个。

图3.1 AT89C51单片机图示及引脚排列3.2 原理图设计根据设计要求及用protues仿真软件做出三位竞赛抢答器电路图如下:4 软件设计4.1 软件设计思路当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,持续时间0.5S左右。

参赛选手在设定的时间内进行抢答,抢答有效,定时器工作停止,显示器上显示选手的编号和抢答的时间并保持到主持人将系统清除为止。

如果定时时间已到,无人抢答,系统报警并禁止抢答。

4.2 C语言源程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intchar s;uchar num=0;char time=20; //抢答时间char datitime=30; //答题限时时间uint tt,t1; //T0,T1定时器定一秒时bit flag,s_flag=1,b_flag,fall_flag; //标志位bit K_startcountflag,K_timecountflag; //时间调整标志位sbit K0=P3^0;sbit beep=P3^7; //蜂鸣器sbit rled=P3^1; //指示灯sbit K1=P1^0; //1号参赛选手sbit K2=P1^1; //2号参赛选手sbit K3=P1^2; //3号参赛选手sbit K_Time=P3^2; //答题计时键sbit K_startcount=P3^3; //开始抢答时间调整键sbit K_timecount=P3^4; //答题计时时间调整键void delay(uchar ms){uchar y;for(;ms>0;ms--)for(y=120;y>0;y--);}uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极字型码uchar code tablewe[]={0XFE,0XFD,0XFB,0XF7};void T0_Init(void){TMOD=0X01; //设T0(T1)为定时模式,由TR0(TR1)控制启动和停止,且T1工作于方式0,T0工作于方式1TH0=(65536-2000)/256; //初始化T0的高8位TL0=(65536-2000)%256; //初始化T0的低8位TH1=(65536-2000)/256; //初始化T1的高8位TL1=(65536-2000)%256; //初始化T1的低8位ET0=1; //允许T0中断ET1=1; //允许T1中断EA=1; //中断允许P0=0;}void Key_Scan(void) //开始键扫描{if(K0==0){delay(10);if(K0==0){while(!K0);TR0=1; //启动定时器T0s=time;tt=0;flag=1; //定义开始键按下s_flag=1; //定义抢答键按下b_flag=1; //定义嘟声响应标志位num=0; //数码显示管显示0beep=1; //定义扬声器不发声rled=1; //定义红灯不亮fall_flag=0; //清除违规标志位K_startcountflag=0; //调整开始位为0K_timecountflag=0; //调整开始时间为0}}}void Scan(void) //三路热键扫描(哪个键先按下,哪个优先级最高) {if(K1==0) //判断1号键是否按下{delay(10); //延迟一段时间,判断是否为抖动if(K1==0) //还有按键,说明不是抖动{while(!K1); //等待按键松开num=1; //数码管显示1号"1"TR0=0; //关闭定时器0,时间停止TR1=1; //打开定时器1,使扬声器响一声s_flag=0; //关闭开始键标志位,使再按其他俩个键不会响应}}if(K2==0) //下面俩个键的处理同上{delay(10);if(K2==0){while(!K2);num=2;TR0=0;TR1=1;s_flag=0;}}if(K3==0){delay(10);if(K3==0){while(!K3);num=3;TR0=0;TR1=1;s_flag=0;}}}void display(void){if(flag==1) //开始键按下,开始计时抢答{if(num!=0) //如果有人抢答,则显示相应的几号{P0=tabledu[num]; //显示几号抢到了P2=tablewe[0];delay(2);P0=0;P2=0XFF;}else //否则没人抢答,则前面不显示几号{P0=0;P2=0XFF;}P0=tabledu[s/10]; //下面为显示抢答倒计时P2=tablewe[2];delay(2);P0=0;P2=0XFF;P0=tabledu[s%10];P2=tablewe[3];delay(2);P2=0XFF;P0=0;}else //如果开始键没有按下,则显示F FF(若有违规者,则显示违规号码及 FF)或时间调整{if(fall_flag==1) //违规显示{if(num!=0){P0=tabledu[num]; //显示几号违规了P2=tablewe[0];delay(2);P0=0;P2=0XFF;P0=tabledu[15]; //下面显示 FF,表示违规了P2=tablewe[2];delay(2);P0=0; //消隐P2=0XFF;P0=tabledu[15];P2=tablewe[3];delay(2);P0=0;P2=0XFF;}else{P0=0;P2=0XFF;}}else //没有人违规才显示调整时间{if(K_startcountflag==1){P0=0X77; //第一位数码管显示"A"(表示抢答时间调整)P2=tablewe[0];delay(2);P0=0;P2=0XFF;P0=tabledu[time/10]; //下面显示调整的抢答时间P2=tablewe[2];delay(2);P0=0;P2=0XFF;P0=tabledu[time%10];P2=tablewe[3];delay(2);P0=0;P2=0XFF;}else if(K_timecountflag==1){P0=0X07; //第一位与第二位数码管合起来显示"T",表示答题时间调整P2=tablewe[0];delay(2);P0=0;P2=0XFF;P0=0X31;P2=tablewe[1];delay(2);P0=0;P2=0XFF;P0=tabledu[datitime/10];P2=tablewe[2];delay(2);P0=0;P2=0XFF;P0=tabledu[datitime%10];P2=tablewe[3];delay(2);P0=0;P2=0XFF;}else //否则显示F FF{P0=tabledu[15];P2=tablewe[0];delay(2);P0=0;P0=tabledu[15];P2=tablewe[2];delay(2);P0=0; //消隐P2=0XFF;P0=tabledu[15];P2=tablewe[3];delay(2);P0=0;P2=0XFF;}}}}void Time_Scan(void) //调整时间键扫描{if(K_startcount==0) //抢答时间调整{delay(10);if(K_startcount==0){while(!K_startcount);time++;if(time==50) //抢答时间上限50s{time=20;}K_startcountflag=1; //将抢答时间标志位置1K_timecountflag=0; //同时关闭答题时间标志位}}if(K_timecount==0) //答题时间调整{delay(10);if(K_timecount==0){while(!K_timecount);datitime++;if(datitime==60) //答题上限60s{datitime=30;}K_timecountflag=1; //将答题时间标志位置1K_startcountflag=0; //同时关闭抢答时间标志位}}}void main(void){T0_Init();while(1){Key_Scan(); //开始键扫描if((flag==0)&(s_flag==1)) //当开始键没按下及没有人违规时才可进行时间调整{Time_Scan();}if((flag==1)&(s_flag==0)) //当开始键按下及有人抢答才进行开始回答计时倒计时{if(K_Time==0){delay(10);if(K_Time==0){while(!K_Time);s=datitime;TR0=1;tt=0;TR1=1;}}}if((flag==0)&(s_flag==1)) //违规{Scan();if(num!=0) //开始键没有按下时,有人按下了抢答器,则置违规标志位{fall_flag=1; //置违规标志位rled=0; //红灯亮}}if((flag==1)&(s_flag==1)) //如果开始键按下且抢答键没有人按下,则进行三路抢答键扫描{Scan();}display(); //显示到数码管上}}void timer0(void) interrupt 1{TH0=(65536-2000)/256; //2msTL0=(65536-2000)%256;if(b_flag) //开始(START)键按下,嘟一声(长1秒),表示开始抢答{beep=~beep;}elsebeep=1;if(s<5) //抢答时间快到报警,隔1秒响一声且红灯闪烁,响三声{if(s%2==0){b_flag=1;rled=0;}else{b_flag=0;rled=1;}}tt++;if(tt==500) //1秒{tt=0;s--;b_flag=0; //关闭开始键按下响一秒的嘟声if(s==-1){s=20;TR0=0;flag=0; //显示F FFs_flag=1;num=0;rled=1;}}}void timer1(void) interrupt 3 //定时器1处理有人按下抢答器嘟一声(长1秒) {TH1=(65536-2000)/256;TL1=(65536-2000)%256;beep=~beep;t1++;if(t1==500){t1=0;TR1=0;}5软件仿真调试在软件硬件都已连接设计好以后,我们需要用Keil、preoteus软件对其进行仿真调试。

相关主题