毕 业 设 计
学院名称
论文提交日期
智能竞赛抢答器 指导教师 工程学院 专业名称 自动化 2010年 5 月 论文答辩日期 年 月
答辩委员会主席 ____________
评 阅 人 ____________
摘 要
抢答器是一种电子产品,广泛应用于各种智力和知识竞赛场合,是竞赛问答中一种常用的必备装置;从原理上讲,它是一种典型的数字电路,其中包括了组合逻辑电路和时序逻辑电路.电路结构形式多种多样,可以利用简单的与非门构成,也可以利用触发器构成,也可以利用单片机来完成.利用单片机来设计抢答器,使得电路更简单,功能更优越。
本设计是基于单片机控制的六路抢答器,当抢答开始则时间进入倒数,数码管能够正确地显示时间倒数过程。用独立式键盘输入抢答命令,蜂鸣器发声提示。在抢答中,只有按下启动键后的抢答才有效;抢答时间限定为30s;回答正确与错误有不同的音乐作为提示;另外还有计分功能,可以记录每个组抢答所得的积分;再次按下启动键则进入下一轮的抢答,各个组所得的积分会被保存;按下复位键则抢答结束,同时积分会被清零。
本系统由于是采用51系列单片机,因此使用Keil C语言进行开发,仿真软件选择的是能够很好仿真单片机系统的Proteus,它能够将电路的运行结果实时动态地显示在界面上,此外它还能和Keil软件经行联接调试,使得调试的工作更加方便。
关键词:单片机 显示 抢答 计分
目 录
1 设计意义 ................................................................................................................................ 1
2 系统总体设计 ........................................................................................................................ 1
2.1 抢答器的设计要求 ............................................................................................................. 1
2.2 设计要点 ............................................................................................................................. 2
3 智能抢答器系统的硬件电路设计 ........................................................................................ 2
3.1 抢答器显示模块 ................................................................................................................. 2
3.2 抢答器的控制模块 ............................................................................................................. 3
3.3 抢答器的输入模块 ............................................................................................................. 5
3.4 抢答器其他模块 ................................................................................................................. 6
3.5 抢答器的硬件电路的确定 ................................................................................................. 7
3.5 系统主体部分电路图 ......................................................................................................... 8
4 程序设计说明 ........................................................................................................................ 8
4.1 抢答主体程序 ..................................................................................................................... 8
4.1.1 程序流程图 ...................................................................................................................... 8
4.1.2 程序注释 ........................................................................................................................ 10
4.2 数码管显示程序 ............................................................................................................... 10
4.2.1 程序流程图 .................................................................................................................... 10
4.2.2 程序注释 ........................................................................................................................ 11
4.3 计分程序主体部分 ........................................................................................................... 12
4.3.1 程序流程图 .................................................................................................................... 12
4.3.2 程序注释 ........................................................................................................................ 12
4.4 蜂鸣器发声程序 ............................................................................................................... 13
4.4.1程序流程图 ....................................................................................................................... 13
4.4.2程序注释 ........................................................................................................................... 14
5 软件使用说明 ...................................................................................................................... 14
5.1 编程软件 ........................................................................................................................... 15
5.2 仿真软件 ........................................................................................................................... 15
6 设计调试及性能测定 .......................................................................................................... 15
7 结论 ...................................................................................................................................... 16
致谢 ............................................................................................................................................ 17
参考文献 .................................................................................................................................... 18
英文摘要 .................................................................................................................................... 19 附录1 元器件清单
附录2 程序清单
毕业设计成绩评定表
1 设计意义
电子技术在不断地发展,基于单片机的控制系统已广泛应用于工业、农业、电力、电子、智能楼宇等行业,微型计算机作为嵌入式控制系统的主体与核心,代替了传统的控制系统的常规电子线路。电子技术和微型计算机的迅速发展,促进微型计算机测量和控制技术的迅速发展和广泛应用,单片机的应用已经渗透到国民经济的各个部门和领域,它起到了越来越重要的作用。本文就是单片机的其中一个具体应用,将其与抢答器的设计有机地结合起来。
在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。因为在抢答的过程中,靠视觉是很难判断出哪组先答题。利用单片机系统来设计抢答器,就可以很好地解决上述的问题,因为单片机的动作是极其迅速的,即使两组的抢答相差的时间是微秒级的,也可轻松分辨出是哪组优先答题,本文的抢答组数可以在六组以内任意使用,当然通过扩展抢答的组数是可以大于6组的。此外还对抢答器的功能进行了一些扩展,如用不同的音乐提示回答是正确还是错误;也新增了计分功能,当抢答结束,可以知道各个组别的积分的多少。
而对我们大学生来讲,通过本次毕业设计可以巩固和加深对电子电路基本知识的理解,提高综合运用专业所学知识的能力。与此同时也培养了根据设计需要选学参考书籍,查阅相关手册、图表和文献资料的自学能力。通过设计方案的分析、论证和比较,设计计算和选取元器件、电路焊接、系统的功能调试和检测等环节,掌握了一个设计由概念到成品设计过程的各个环节,也通过电路的调试和性能指标的测试,提高实际动手能力和综合的电子设计能力。
2 系统总体设计
2.1 抢答器的设计要求
(1)系统设置复位按钮,按动后,重新开始抢答。
(2)抢答器开始时数码管显示序号0,选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。抢答后显示优先抢答者序号,并且不出现其他抢答者的序号。
(3)抢答器具有定时抢答功能。
(4)主持人按下复位开关,使得抢答器再次进入禁止状态,选手编号的LED数字显示器灯熄灭,电路进入原来的初始状态,准备进入下一轮的抢答。
(5)扩展功能为音乐提醒和积分功能。
2.2 设计要点
根据控制系统的工作原理和执行装置,可以将系统设计分为硬件和软件两大部分。硬件设计部分,包括编写电路原理图、合理选择元器件、焊接各个元器件,然后对硬件性能进行调试、测试,以达到设计要求。软件设计部分,首先在设计之前完成系统总框图和确定各个功能模块,然后进行具体设计,包括各模块的流程图,选择合适的编程语言和软件应用程序,进行编程设计等;最后是通过软件对程序进行调试、测试,以及仿真,以达到性能的最优化。
下面是软硬件设计方法确定的。软件设计的方法与开发环境的选取有着直接的关系,本系统由于是采用51系列单片机,因此使用Keil C语言进行开发。此编程工具相比汇编语言具有结构化、适用范围大、可移植性好等特点。本系统软件设计采用模块化系统设计方法,先编写各个功能模块子程序,然后进行组合与调整,经过调试后,可以进行仿真测试,已达到设计功能要求。为配合软件的灵活设计,硬件电路是采用结构化系统设计方法,该方法保证设计电路的标准化、模块化。硬件电路的设计最重要的选择用于控制的单片机,再确定与之配套的外围芯片,使所设计的系统既经济又高性能。硬件电路设计可以在焊接元器件之前画出详细电路图,标出芯片的型号、器件参数值,根据电路图在仿真软件上进行调试,发现设计错误时立即修改,高效,准确地完成硬件设计。 3 智能抢答器系统的硬件电路设计
3.1 抢答器显示模块
抢答器必须用到一些显示模块,对于一般的电子设计主要考虑以下两种显示方案。 方案一:使用液晶屏显示。液晶显示屏具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影像稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强的特点。但由于选手和编号信息量比较少,且由于液晶是以点阵的模式显示各种符号,编程工作量大,控制器的资源占用较多,其成本也偏高。在使用时,不能有静电干扰,否则易烧坏液晶显示芯片,不易维护。
方案二:在使用传统的数码管显示。数码管具有:低能耗、低损耗、低压、寿命长、耐老化、防晒、防潮、防火、防高(低)温,对外界环境要求低,易于维护,同时其精度高,称量快,精确可靠,操作简单。数码显示是采用BCD编码显示数字,程序编译容易,资源占用较少。
综上所述,选用方案二,这里使用四位共阴极数码管作为显示模块。
图1 四位共阴极数码管
3.2 抢答器的控制模块
控制器主要用于各模块控制对显示、抢答、音乐、计分等。控制器的选择有以下两钟方案。
方案一:采用FPGA(现场可编程门列阵)作为系统的控制器。FPGA可以实现各种复杂的逻辑功能,规模大,密度高,它将所有器件集成在一块芯片上,减小了体积,提高了稳定性,并且可以应用EDA软件仿真、调试,易于进行功能扩展。但由于本设计对数据处理的速度要求不高,FPGA的高速处理的优势得不到充分体现,并且由于其集成度高,使其成本偏高,同时由于芯片的引脚较多,实物硬件电路板布线复杂,加重了电路设计和实际焊接的工作。
方案二:采用ATMEL公司的AT89S52作为系统控制器的CPU方案。单片机算术运算功能强,软件编程灵活、自由度大,可以用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等优点,使其在各个领域应用广泛。
通过以上分析,采用方案二,选用AT89S52作为控制模块。
AT89S52单片机是一种低功耗、高性能CMOS 8位微控制器,具有8k在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52单片机为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52引脚图如图2所示。
图2 AT89S52引脚图
AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路[1]。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
89S52基本外围电路:
①时钟电路:
单片机的时钟信号用来提供单片机片内各种微操作的时间基准,时钟信号通常用两种电路形式得到:内部振荡和外部振荡。AT89S52单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTALl和XTAL2分别是此放大电器的输入端和输出端,由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式,如图3所示在其外接晶体振荡器(简称晶振)或陶瓷谐振器就构成了内部振荡方式,片内高增益反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器并产生振荡时钟脉冲[2]。图3中外接晶体以及电容C9和C10构成并联谐振电路,它们起稳定振荡频率、快速起振的作用,其值均为30pF左右,晶振频率选12MHz。
图3 晶振电路
②复位电路:
为了初始化单片机内部的某些特殊功能寄存器,必须采用复位的方式,复位后可使CPU及系统各部件处于确定的初始状态,并从初始状态开始正常工作。单片机的复位是靠外电路来实现的,在正常运行情况下,只要RST引脚上出现两个机器周期时间以上的高电平,即可引起系统复位,但如果RST引脚上持续为高电平,单片机就处于循环复位状态。复位后系统将I/O口寄存器置为0FFH,堆栈指针SP置为07H,SBUF内置为不定值,其余的寄存器全部清0,内部RAM的状态不受复位的影响,在系统上电时RAM的内容是不定的。复位操作有两种情况,即上电复位和手动(开关)复位。本系统采用手动复位和上电复位组合方式。
复位电路如图4所示。
图4 复位电路
3.3 抢答器的输入模块
键盘是单片机不可缺少的输入设备,是实现人机对话的纽带。键盘的类型很多,常用的有独立式键盘,行列式键盘等。
方案一:行列式键盘
行列式键盘是用N条I/O线作为行线,M条I/O线作为列线组成的键盘,在行线和列线的每个交叉点上,设置一个按键中按键的个数是M*N个。这种形式的键盘结构,能够有效的提高单片机系统中I/O的利用率。
CPU对键盘的扫描可以采用取程序控制的随机方式,即只有在CPU空闲是时才去扫描键盘,响应操作人员的键盘输入,但CPU在执行应用程序的过程中,不能响应键盘输入,对键盘的扫描可以采用定时方式,即利用单片机内部定时器每隔一定时间对键盘扫描一次,这样控制方式,不管键盘上有无键闭合,CPU总是定时的关心键盘状态。
方案二:独立式键盘
键盘接口中使用多少根I/O线,键盘中就有几个按键,这种类型的键盘,其按键比较少,且键盘中各按键的工作互不干扰。因此可以根据实际需要对键盘中的按键灵活的编码[3]。
最简单的编码方式就是根据I/O输入口所直接反映的相应按键,按下的状态进行编码,称按键直接状态码,对于这样编码的独立式键盘,CPU可以通过直接读取I/O口的状态来获取按键的直接状态编码值,根据这个值直接进行按键识别,这样形式的键盘结构简单,按键识别容易。
独立式键盘的缺点是需要占用比较多的I/O口线,当单片机应用系统键盘中需要的按键比较少或I/O口线比较富余时,可以采用这样类型的键盘。
通过分析本系统中所需的按键比较少,选用方案二独立式键盘。
图5 独立式键盘
3.4 抢答器其他模块
发声模块:经过一个三极管和电容组成的电流放大电路驱动蜂鸣器,改变通电频率从而改变发声的音调。
蜂鸣器驱动电路如图7所示。
图7 蜂鸣器驱动电路
LED灯模块:本设计采用6路led灯的共阴极连接,用于显示抢答成功的组数。电路如图8所示。
图8 LED电路
3.5 抢答器的硬件电路的确定
抢答器同时供6名选手或6个代表队比赛,分别用6个按钮表示。设置一个系统清除和抢答控制按扭,以及两个分别表示答对或答错的的按钮,控制加减分,以上三按钮由均由主持人控制。控制模块使用单片机,型号为AT89S52,由单片机执行程序控制各个组件实现功能。显示方面使用4位共阴极的数码管,用动态扫描的显示方式显示数字[4]。外加6个发光二极管表示成功抢答的选手,并且有一个蜂鸣器发声,答对或答错用不同
音乐提醒。
3.5 系统主体部分电路图
控制芯片采用单片机AT89S52,显示功能采用4位的共阴极数码管,输入硬件是用独立式键盘,用蜂鸣器发声来提示抢答的正确与否,每个选手前有一个发光二极管,用于提示成功抢答的小组。
系统仿真电路图如图9所示。
图9 主体部分电路图
4 程序设计说明
4.1 抢答主体程序 4.1.1 程序流程图
程序不断地扫描单片机的各个输入端口,即各个选手的按键。当有按键按下时将成功抢答的选手组号显示在数码管上,同时蜂鸣器响起,直到启动键再次被按下时则继续扫描各个输入端口,进入下一轮的抢答。
程序流程图如图10所示。
图10 程序抢答部分流程图
4.1.2 程序注释
程序如下所示: if(n)
/*n时间到后不能再按*/
{if(m1==0) t=1;
else if(m2==0) t=2; /*扫描按键,确定抢答成功的小组*/
else if(m3==0) t=3; else if(m4==0) t=4; else if(m5==0) t=5;
else if(m6==0) t=6; else if(m7==0) t=7;
while(t)
/*t不为零即有键按下*/
}
{
if(m==0)
{switch(t) /*判断按键并作出相应的操作*/
{ case 1:{TR0=0;i=1;second=0;led1=1;beept(100);m=1;break;}
case 2:{TR0=0;i=2;second=0;led2=1;beept(100);m=1;break;} case 3:{TR0=0;i=3;second=0;led3=1;beept(100);m=1;break;}
case 4:{TR0=0;i=4;second=0;led4=1;beept(100);m=1;break;}
case 5:{TR0=0;i=5;second=0;led5=1;beept(100);m=1;break;} case 6:{TR0=0;i=6;second=0;led6=1;beept(100);m=1;break;} case 7:{i=0;second=29;m=1;t=0;beept(100);while(!m7); TR0=1;break;}
} }
4.2 数码管显示程序 4.2.1 程序流程图
在写程序之前需要先测出数码管显示数字时它各个引脚的电平情况,从而得出各个数字的代码,控制单片机输出不同的代码,就能显示不同的数字。本次的程序采取动态扫描的编程方式,一般显示的频率在50hz左右,眼睛不会感到有闪烁感,因此应该适当地选择显示延时的时间。
程序流程图如图11所示。
图11 数码管显示程序流程图
4.2.2 程序注释
数码管显示程序如下:
void display(uchar shiwei,uchar gewei,uchar xuanshou) {P2=0xfd;
/*位选*/
P0=shiwei; /*段选*/ delay_us(80); /*延时显示*/ P2=0xfe; P0=gewei; delay_us(80); P2=0xf7; P0=xuanshou; delay_us(80);
}
4.3 计分程序主体部分 4.3.1 程序流程图
当有选手成功抢答并回答完问题后,回答正确的按下加分键,则分数加5分,按下减分键则分数减5分。分数上限是80分,下限是0分。数码管实时显示分数值,直到按下复位键后,分数才会被清零。
程序流程图如图12所示。
图12 计分程序流程图
4.3.2 程序注释 计分程序如下:
uint tab1[]={0,0,0,0,0,0,0} ;
if(m1==0) t=1; /*扫描按键,确定抢答成功的小组*/ else if(m2==0) t=2;
else if(m3==0) t=3; else if(m4==0) t=4; else if(m5==0) t=5; else if(m6==0) t=6; i=t;
if(bu1==0)
if(tab1[i]
if(tab1[i]!=0) tab1[i]=tab1[i]-5; /*最低分0分,每按一下减分键 减五分*/ 4.4 蜂鸣器发声程序 4.4.1程序流程图
发声部分主要是通过改变蜂鸣器的通断频率去改变声调,具体是改变高低电平的延迟时间,频率越高则声调越高,频率越低则声调越低。
程序流程图如图13所示。
图13 蜂鸣器发声程序流程
4.4.2程序注释
蜂鸣器发声程序如下:
void sound_ok() /*回答正确子程序*/ { uchar a,b; TR1=0;
for(a=4;a>0;a--) {for(b=900;b;b--)
{ beep=1; /*开蜂鸣器*/
delay_us((a+5)*10); /*改变高电平持续时间*/ beep=0; /*关蜂鸣器*/
delay_us((a+5)*10); /*改变低电平持续时间*/ } } }
void sound_err(void) /*回答错误子程序*/ {uchar a,b; TR1=0;
for(a=1;a
{ beep=1; /*开蜂鸣器*/
delay_us((a+5)*10); /*改变高电平持续时间*/ beep=0; /*关蜂鸣器*/
delay_us((a+5)*10); /*改变低电平持续时间*/ } } }
5 软件使用说明
5.1 编程软件
本系统由于是采用51系列单片机,因此使用Keil C语言进行开发,此编程工具相
比汇编语言具有结构化、适用范围大、可移植性好等特点。本系统软件设计采用模块化系统设计方法,先编写各个功能模块子程序,然后进行组合与调整达到设计功能要求。编程软件选择Keil uVision3,Keil软件是目前最流行开发MCS-51系列单片机的软件,Keil提供包括C编译器,宏编译,连接器,库管理器和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。 5.2 仿真软件
仿真软件我选择的是能够很好仿真单片机系统的Proteus,下面就这一软件作一些说明。
Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:①实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。②支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。④具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。
6 设计调试及性能测定
首先是数码管的调试,因为在硬件各模块中出错机会比较大的就是数码管的显示混乱。按照设计前测出的位码和段码编写一小程序,四位同时依次显示0至9,测试段码的编码是否正确,看是否有显示错误的段位。与此同时,因为本设计采用的是动态扫描的显示方式,因此要设定每一位的显示时间,根据人的视觉残留的特性,为保持视觉上的没有闪烁感,每位的显示时间应小于1ms,经过多次测试,发现在80微妙的时候具有较好的显示效果。然后是位码的测试,将程序改为让数码管的1至4位依次显示数字1~4,经测试后,显示正常。数码管经测试功能正常。
然后是最重要也是最困难的,就是程序的调试。
首先根据功能要求编写程序,在单独测试中各个模块的程序功能正常,但将各个部分结合在一起的时候遇到了一个问题,就是显示程序与发声程序之间有一定的冲突,例如要求在倒计时开始和结束的时候要求有一声0.5秒左右的鸣叫声,但是发现在发声的这段时间里数码管没有了显示,因为单片机在同一个时间里只能执行一条程序。经过一番努力终于想到的解决的方法,因为原来的数码管显示间隔与计时倒数是公用同一个定时器的,因此间隔过大,解决方案为:数码管显示程序用另外一个定时器来调用,并使用较小的显示间隔,这样当要发声时数码管上仍然有显示,因为这时程序在发声和显示模块之间快速的来回跳动,而且数码管没有闪烁感。
再而是发声程序的调试,本设计是利用通过给蜂鸣器不同的频率使其发出不同的响声,从而区别开回答正确与否的不同音乐声。首先在仿真软件上调试,回答正确是用频率由低到高的四声鸣叫表示,而回答错误则是用频率由高到低的四声鸣叫表示,经过多次频率的测试得到了较好的效果。最后是实物调试,因为毕竟仿真跟实物是有一定的区别的,果然,在实物调试时效果不是很理想,通过实物的在线调试后,其发声效果达到一个较满意的效果。
另外是其余部分的调试,包括键盘响应和发光二极管的亮暗,经调试其余部分功能正常。
设计各个部分功能调试完毕,显示正常,发声正常,抢答正常,计分正常, 并且性能良好。
7 结论
本设计是基于单片机的智能竞赛抢答器。系统设置复位按钮,按动后,抢答器进入禁止状态,数码管显示序号0,所有数据复位。按下启动按钮,抢答开始,选手抢答实行优先锁存,优先抢答选手的编号保持显示,其LED亮起。抢答器具有定时抢答功能,倒数时间为30s。主持人再次按下启动按钮,选手编号的LED数字显示器灯熄灭,进入下一轮的抢答倒数。扩展功能为音乐提醒和积分功能,回答的正确与否用不同的音调提示,并且可以记录各个选手的积分,一直保存直到按下复位键后清零。
致 谢
时光的流逝也许是客观的,然而流逝的快慢却纯是一种主观的感受。忽然间意识到,原来四年已经过去,到了该告别的时候了。一念至此,不禁有些惆怅。想到自己要踏上人生的另外一个征途,激动之余也有点不舍。
回想大学四年,首先要感谢的就是所有教导过我的老师,他们都有在不同的领域给了我启发,提升了我的专业知识与技能,也使我学到了很多为人处事的道理,这就是一种成长的过程。然后要感谢的是我大学所有的朋友,有了你们互相扶持,互相鼓励,我的大学生活才会添上各种不同的色彩,虽然我们都没有明说,我知道我们都很珍惜彼此。还有就是我的父母,你们的养育与培养之恩我毕生不忘,我会努力变强,承担照顾你们的责任。
参 考 文 献
[1]谢振辉. 改进式MCS-51单片机实验. 北京:科学出版社,2006: 121-156
[2]李朝青. 单片机原理及接口技术. 北京:北京航空航天大学出版社,2006: 112-132 [3]康华光,邹寿彬. 电子技术基础数字部分. 第五版. 北京:高等教育出版社,2005: 72-96
[4]胡伟,季晓衡. 单片机C程序设计及应用实例. 北京:人民邮电出版社,2003: 84-112 [5]曹建树,夏云生,曾林春. 51单片机实用教程. 北京:中国石化出版社,2008: 66-87 [6]Murray. Single chip microcomputers and their applications. Bell Laboratories,2006: 121-143
Intellectual Competition Responder
Liang Zhanpeng
(College of Engineering,South China Agricultural University,Guangzhou 510642,China) Abstract:Responder is an electronic product which is widely used in intelligence competitions and knowledge competitions, is a popular and necessary equipment in quiz ;,It is a typical digital circuits, including combinational logic circuit and sequential logic circuits. The responder’s circuit has various forms, you use a simple NAND gate to structure, you can also use triggers or single-chip devices. Using the single-chip device can make the circuits more simple, and make the function superior.
This design is a six-way responder based on a single-chip device. When the responder turn on the time begin to count down, and the Digital tube can show the process correctly. It use a stand-alone keyboard as the output equipment. and use a buzzer as the audible device. During the quiz game, only after the start button being pressed the answer is available. The answer is in a limited time of 30 seconds. The right answer and the wrong answer have different music as a reminder. The responder also have scoring function, it can record the score. When the start button is pressed again, then begin to respond the next question, and the scores are saved. When the reset button is pressed, then the game is over, the score is cleared.
Since this system is based on 51 series, we use Keil C language to develop. Simulation software we choose Proteus that can simulate the single-chip very well. It can display the circuit operating results on the interface dynamically. In addition, it can debug with the Keil to make the debugging much more convenient
Key words:Single-Chip Microcomputer Display Respond Score
元器件清单 AT89S52 4位公阴数码管
晶振 发光二极管
按键 蜂鸣器 排阻 电阻(10k) 电阻(220) 电容(33pf) 电容(100pf)
数量 1 1 1 6 10 1 1 1 6 2 1
#define uchar unsigned char #define uint unsigned int #include sbit m1=P1^0; sbit m2=P1^1; sbit m3=P1^2; sbit m4=P1^3; sbit m5=P1^4; sbit m6=P1^5; sbit m7=P1^6; sbit beep=P1^7; sbit led1=P3^2; sbit led2=P3^3; sbit led3=P3^4; sbit led4=P3^5; sbit led5=P3^6; sbit led6=P3^7; sbit bu1=P3^0; sbit bu2=P3^1; uchar
code tab[]={0x77,0x11,0x6D,0x3D,0x1B,0x3E,0x7E,0x15,0x7f,0x3F};//数码 uint tab1[]={0,0,0,0,0,0,0} ; 管编码 uchar shiwei; uchar gewei; uchar count; uchar xuanshou; uchar m; uchar n;
uchar p; uchar i; uchar fen;
static unsigned char second=30;
void delay(unsigned int x); void delay_us(uint i); void timer(); void sound_ok() ; void sound_err(); void beept(int a);
void display(uchar shiwei,uchar gewei,uchar xuanshou); main() {uint t=0; beep=0; P3=0; i=0; n=1; p=1; fen=0;
shiwei=tab[0]; gewei=tab[0]; xuanshou=tab[0]; timer(); while(m7); if(m7==0) {beept(100); timer(); delay(10); while(1)
{P3=0x03;
shiwei=tab[second/10];
gewei=tab[second%10]; xuanshou=0; m=0;
//n为0表示时间到不能再按键
if(n)
{if(m1==0) t=1;
else if(m2==0) t=2;
else if(m3==0) t=3; else if(m4==0) t=4; else if(m5==0) t=5;
else if(m6==0) t=6; else if(m7==0) t=7;
}
while(t)
//有按键按下后
{
if(m==0) {switch(t)
{ case 1:{TR0=0;i=1;second=0;led1=1;beept(100);m=1;break;}
case 2:{TR0=0;i=2;second=0;led2=1;beept(100);m=1;break;} case 3:{TR0=0;i=3;second=0;led3=1;beept(100);m=1;break;}
case 4:{TR0=0;i=4;second=0;led4=1;beept(100);m=1;break;}
case 5:{TR0=0;i=5;second=0;led5=1;beept(100);m=1;break;} case 6:{TR0=0;i=6;second=0;led6=1;beept(100);m=1;break;} case 7:{i=0;second=29;m=1;t=0;beept(100);while(!m7); TR0=1;break;}
} }
shiwei=tab[tab1[i]/10];
gewei=tab[tab1[i]%10]; xuanshou=tab[i];
if(m7==0) {i=0;t=0;n=1;second=30;TR0=1;beept(100);fen=0;}
if(bu1==0) sound_ok(); }
if(second==0&&p==1) {TR0=0; n=0;p=0;beept(300);} if(m7==0) {i=0;t=0;n=1;p=1;second=30;TR0=1;}
if(bu2==0) sound_err();
} } }
void timer() //定时器初始化 {TMOD=0x11;
TH0=(65536-50000)/256; TL0=(65536-50000)%256;
TH1 = (65536-1000)/256 ; // 预置定时常数64536(fc18),产生1ms TL1 = (65536-1000)%256 ; 间隔用于动态显示 EA = 1; // 开总中断
ET0 = 1; // 定时/计数器0允许中断 ET1 = 1; TR0=1; TR1=1; }
void time0() interrupt 1 using 1 //定时器0中断倒数子程序 {TH0=(65536-50000)/256; TL0=(65536-50000)%256;
count++; if(count==20) {count=0; second--; } }
void time1() interrupt 3 //定时器1中断显示子程序 {
display( shiwei,gewei,xuanshou);
TH1 = (65536-1000)/256 ; // 预置定时常数64536(fc18),产生1ms TL1 = (65536-1000)%256 ; 间隔用于动态显示 }
void sound_ok() //回答正确调用子程序 {
uchar a,b; TR1=0;
for(a=4;a>0;a--) {
for(b=900;b;b--) {
beep=1; //开蜂鸣器 delay_us((a+5)*10); //延时 beep=0; //关蜂鸣器 delay_us((a+5)*10); } }
if(tab1[i]
}
void sound_err(void) //回答错误调用子程序 {
uchar a,b; TR1=0;
for(a=1;a
for(b=900;b;b--) {
beep=1; //开蜂鸣器 delay_us((a+5)*10);
beep=0; //关蜂鸣器 delay_us((a+5)*10); } }
if(tab1[i]!=0) tab1[i]=tab1[i]-5; //回答错误减5分
TR1=1; }
void delay(unsigned int x) //延迟子程序 {uchar j; while(x--)
{for(j=0;j
; }
}
void display(uchar shiwei,uchar gewei,uchar xuanshou) //显示子程序
{P2=0xfd; //段选 P0=shiwei; //位选 delay_us(80); //显示延迟 P2=0xfe;
P0=gewei;
delay_us(80);
P2=0xf7;
P0=xuanshou;
delay_us(80);
}
void delay_us(uint i) // {
for(;i;i--)
{;}
}
void beept(int a) //{ beep=1;
delay(a);
beep=0;
}
延迟子程序(微秒)发声子程序
毕 业 设 计
学院名称
论文提交日期
智能竞赛抢答器 指导教师 工程学院 专业名称 自动化 2010年 5 月 论文答辩日期 年 月
答辩委员会主席 ____________
评 阅 人 ____________
摘 要
抢答器是一种电子产品,广泛应用于各种智力和知识竞赛场合,是竞赛问答中一种常用的必备装置;从原理上讲,它是一种典型的数字电路,其中包括了组合逻辑电路和时序逻辑电路.电路结构形式多种多样,可以利用简单的与非门构成,也可以利用触发器构成,也可以利用单片机来完成.利用单片机来设计抢答器,使得电路更简单,功能更优越。
本设计是基于单片机控制的六路抢答器,当抢答开始则时间进入倒数,数码管能够正确地显示时间倒数过程。用独立式键盘输入抢答命令,蜂鸣器发声提示。在抢答中,只有按下启动键后的抢答才有效;抢答时间限定为30s;回答正确与错误有不同的音乐作为提示;另外还有计分功能,可以记录每个组抢答所得的积分;再次按下启动键则进入下一轮的抢答,各个组所得的积分会被保存;按下复位键则抢答结束,同时积分会被清零。
本系统由于是采用51系列单片机,因此使用Keil C语言进行开发,仿真软件选择的是能够很好仿真单片机系统的Proteus,它能够将电路的运行结果实时动态地显示在界面上,此外它还能和Keil软件经行联接调试,使得调试的工作更加方便。
关键词:单片机 显示 抢答 计分
目 录
1 设计意义 ................................................................................................................................ 1
2 系统总体设计 ........................................................................................................................ 1
2.1 抢答器的设计要求 ............................................................................................................. 1
2.2 设计要点 ............................................................................................................................. 2
3 智能抢答器系统的硬件电路设计 ........................................................................................ 2
3.1 抢答器显示模块 ................................................................................................................. 2
3.2 抢答器的控制模块 ............................................................................................................. 3
3.3 抢答器的输入模块 ............................................................................................................. 5
3.4 抢答器其他模块 ................................................................................................................. 6
3.5 抢答器的硬件电路的确定 ................................................................................................. 7
3.5 系统主体部分电路图 ......................................................................................................... 8
4 程序设计说明 ........................................................................................................................ 8
4.1 抢答主体程序 ..................................................................................................................... 8
4.1.1 程序流程图 ...................................................................................................................... 8
4.1.2 程序注释 ........................................................................................................................ 10
4.2 数码管显示程序 ............................................................................................................... 10
4.2.1 程序流程图 .................................................................................................................... 10
4.2.2 程序注释 ........................................................................................................................ 11
4.3 计分程序主体部分 ........................................................................................................... 12
4.3.1 程序流程图 .................................................................................................................... 12
4.3.2 程序注释 ........................................................................................................................ 12
4.4 蜂鸣器发声程序 ............................................................................................................... 13
4.4.1程序流程图 ....................................................................................................................... 13
4.4.2程序注释 ........................................................................................................................... 14
5 软件使用说明 ...................................................................................................................... 14
5.1 编程软件 ........................................................................................................................... 15
5.2 仿真软件 ........................................................................................................................... 15
6 设计调试及性能测定 .......................................................................................................... 15
7 结论 ...................................................................................................................................... 16
致谢 ............................................................................................................................................ 17
参考文献 .................................................................................................................................... 18
英文摘要 .................................................................................................................................... 19 附录1 元器件清单
附录2 程序清单
毕业设计成绩评定表
1 设计意义
电子技术在不断地发展,基于单片机的控制系统已广泛应用于工业、农业、电力、电子、智能楼宇等行业,微型计算机作为嵌入式控制系统的主体与核心,代替了传统的控制系统的常规电子线路。电子技术和微型计算机的迅速发展,促进微型计算机测量和控制技术的迅速发展和广泛应用,单片机的应用已经渗透到国民经济的各个部门和领域,它起到了越来越重要的作用。本文就是单片机的其中一个具体应用,将其与抢答器的设计有机地结合起来。
在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。因为在抢答的过程中,靠视觉是很难判断出哪组先答题。利用单片机系统来设计抢答器,就可以很好地解决上述的问题,因为单片机的动作是极其迅速的,即使两组的抢答相差的时间是微秒级的,也可轻松分辨出是哪组优先答题,本文的抢答组数可以在六组以内任意使用,当然通过扩展抢答的组数是可以大于6组的。此外还对抢答器的功能进行了一些扩展,如用不同的音乐提示回答是正确还是错误;也新增了计分功能,当抢答结束,可以知道各个组别的积分的多少。
而对我们大学生来讲,通过本次毕业设计可以巩固和加深对电子电路基本知识的理解,提高综合运用专业所学知识的能力。与此同时也培养了根据设计需要选学参考书籍,查阅相关手册、图表和文献资料的自学能力。通过设计方案的分析、论证和比较,设计计算和选取元器件、电路焊接、系统的功能调试和检测等环节,掌握了一个设计由概念到成品设计过程的各个环节,也通过电路的调试和性能指标的测试,提高实际动手能力和综合的电子设计能力。
2 系统总体设计
2.1 抢答器的设计要求
(1)系统设置复位按钮,按动后,重新开始抢答。
(2)抢答器开始时数码管显示序号0,选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。抢答后显示优先抢答者序号,并且不出现其他抢答者的序号。
(3)抢答器具有定时抢答功能。
(4)主持人按下复位开关,使得抢答器再次进入禁止状态,选手编号的LED数字显示器灯熄灭,电路进入原来的初始状态,准备进入下一轮的抢答。
(5)扩展功能为音乐提醒和积分功能。
2.2 设计要点
根据控制系统的工作原理和执行装置,可以将系统设计分为硬件和软件两大部分。硬件设计部分,包括编写电路原理图、合理选择元器件、焊接各个元器件,然后对硬件性能进行调试、测试,以达到设计要求。软件设计部分,首先在设计之前完成系统总框图和确定各个功能模块,然后进行具体设计,包括各模块的流程图,选择合适的编程语言和软件应用程序,进行编程设计等;最后是通过软件对程序进行调试、测试,以及仿真,以达到性能的最优化。
下面是软硬件设计方法确定的。软件设计的方法与开发环境的选取有着直接的关系,本系统由于是采用51系列单片机,因此使用Keil C语言进行开发。此编程工具相比汇编语言具有结构化、适用范围大、可移植性好等特点。本系统软件设计采用模块化系统设计方法,先编写各个功能模块子程序,然后进行组合与调整,经过调试后,可以进行仿真测试,已达到设计功能要求。为配合软件的灵活设计,硬件电路是采用结构化系统设计方法,该方法保证设计电路的标准化、模块化。硬件电路的设计最重要的选择用于控制的单片机,再确定与之配套的外围芯片,使所设计的系统既经济又高性能。硬件电路设计可以在焊接元器件之前画出详细电路图,标出芯片的型号、器件参数值,根据电路图在仿真软件上进行调试,发现设计错误时立即修改,高效,准确地完成硬件设计。 3 智能抢答器系统的硬件电路设计
3.1 抢答器显示模块
抢答器必须用到一些显示模块,对于一般的电子设计主要考虑以下两种显示方案。 方案一:使用液晶屏显示。液晶显示屏具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影像稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强的特点。但由于选手和编号信息量比较少,且由于液晶是以点阵的模式显示各种符号,编程工作量大,控制器的资源占用较多,其成本也偏高。在使用时,不能有静电干扰,否则易烧坏液晶显示芯片,不易维护。
方案二:在使用传统的数码管显示。数码管具有:低能耗、低损耗、低压、寿命长、耐老化、防晒、防潮、防火、防高(低)温,对外界环境要求低,易于维护,同时其精度高,称量快,精确可靠,操作简单。数码显示是采用BCD编码显示数字,程序编译容易,资源占用较少。
综上所述,选用方案二,这里使用四位共阴极数码管作为显示模块。
图1 四位共阴极数码管
3.2 抢答器的控制模块
控制器主要用于各模块控制对显示、抢答、音乐、计分等。控制器的选择有以下两钟方案。
方案一:采用FPGA(现场可编程门列阵)作为系统的控制器。FPGA可以实现各种复杂的逻辑功能,规模大,密度高,它将所有器件集成在一块芯片上,减小了体积,提高了稳定性,并且可以应用EDA软件仿真、调试,易于进行功能扩展。但由于本设计对数据处理的速度要求不高,FPGA的高速处理的优势得不到充分体现,并且由于其集成度高,使其成本偏高,同时由于芯片的引脚较多,实物硬件电路板布线复杂,加重了电路设计和实际焊接的工作。
方案二:采用ATMEL公司的AT89S52作为系统控制器的CPU方案。单片机算术运算功能强,软件编程灵活、自由度大,可以用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等优点,使其在各个领域应用广泛。
通过以上分析,采用方案二,选用AT89S52作为控制模块。
AT89S52单片机是一种低功耗、高性能CMOS 8位微控制器,具有8k在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52单片机为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52引脚图如图2所示。
图2 AT89S52引脚图
AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路[1]。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
89S52基本外围电路:
①时钟电路:
单片机的时钟信号用来提供单片机片内各种微操作的时间基准,时钟信号通常用两种电路形式得到:内部振荡和外部振荡。AT89S52单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTALl和XTAL2分别是此放大电器的输入端和输出端,由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式,如图3所示在其外接晶体振荡器(简称晶振)或陶瓷谐振器就构成了内部振荡方式,片内高增益反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器并产生振荡时钟脉冲[2]。图3中外接晶体以及电容C9和C10构成并联谐振电路,它们起稳定振荡频率、快速起振的作用,其值均为30pF左右,晶振频率选12MHz。
图3 晶振电路
②复位电路:
为了初始化单片机内部的某些特殊功能寄存器,必须采用复位的方式,复位后可使CPU及系统各部件处于确定的初始状态,并从初始状态开始正常工作。单片机的复位是靠外电路来实现的,在正常运行情况下,只要RST引脚上出现两个机器周期时间以上的高电平,即可引起系统复位,但如果RST引脚上持续为高电平,单片机就处于循环复位状态。复位后系统将I/O口寄存器置为0FFH,堆栈指针SP置为07H,SBUF内置为不定值,其余的寄存器全部清0,内部RAM的状态不受复位的影响,在系统上电时RAM的内容是不定的。复位操作有两种情况,即上电复位和手动(开关)复位。本系统采用手动复位和上电复位组合方式。
复位电路如图4所示。
图4 复位电路
3.3 抢答器的输入模块
键盘是单片机不可缺少的输入设备,是实现人机对话的纽带。键盘的类型很多,常用的有独立式键盘,行列式键盘等。
方案一:行列式键盘
行列式键盘是用N条I/O线作为行线,M条I/O线作为列线组成的键盘,在行线和列线的每个交叉点上,设置一个按键中按键的个数是M*N个。这种形式的键盘结构,能够有效的提高单片机系统中I/O的利用率。
CPU对键盘的扫描可以采用取程序控制的随机方式,即只有在CPU空闲是时才去扫描键盘,响应操作人员的键盘输入,但CPU在执行应用程序的过程中,不能响应键盘输入,对键盘的扫描可以采用定时方式,即利用单片机内部定时器每隔一定时间对键盘扫描一次,这样控制方式,不管键盘上有无键闭合,CPU总是定时的关心键盘状态。
方案二:独立式键盘
键盘接口中使用多少根I/O线,键盘中就有几个按键,这种类型的键盘,其按键比较少,且键盘中各按键的工作互不干扰。因此可以根据实际需要对键盘中的按键灵活的编码[3]。
最简单的编码方式就是根据I/O输入口所直接反映的相应按键,按下的状态进行编码,称按键直接状态码,对于这样编码的独立式键盘,CPU可以通过直接读取I/O口的状态来获取按键的直接状态编码值,根据这个值直接进行按键识别,这样形式的键盘结构简单,按键识别容易。
独立式键盘的缺点是需要占用比较多的I/O口线,当单片机应用系统键盘中需要的按键比较少或I/O口线比较富余时,可以采用这样类型的键盘。
通过分析本系统中所需的按键比较少,选用方案二独立式键盘。
图5 独立式键盘
3.4 抢答器其他模块
发声模块:经过一个三极管和电容组成的电流放大电路驱动蜂鸣器,改变通电频率从而改变发声的音调。
蜂鸣器驱动电路如图7所示。
图7 蜂鸣器驱动电路
LED灯模块:本设计采用6路led灯的共阴极连接,用于显示抢答成功的组数。电路如图8所示。
图8 LED电路
3.5 抢答器的硬件电路的确定
抢答器同时供6名选手或6个代表队比赛,分别用6个按钮表示。设置一个系统清除和抢答控制按扭,以及两个分别表示答对或答错的的按钮,控制加减分,以上三按钮由均由主持人控制。控制模块使用单片机,型号为AT89S52,由单片机执行程序控制各个组件实现功能。显示方面使用4位共阴极的数码管,用动态扫描的显示方式显示数字[4]。外加6个发光二极管表示成功抢答的选手,并且有一个蜂鸣器发声,答对或答错用不同
音乐提醒。
3.5 系统主体部分电路图
控制芯片采用单片机AT89S52,显示功能采用4位的共阴极数码管,输入硬件是用独立式键盘,用蜂鸣器发声来提示抢答的正确与否,每个选手前有一个发光二极管,用于提示成功抢答的小组。
系统仿真电路图如图9所示。
图9 主体部分电路图
4 程序设计说明
4.1 抢答主体程序 4.1.1 程序流程图
程序不断地扫描单片机的各个输入端口,即各个选手的按键。当有按键按下时将成功抢答的选手组号显示在数码管上,同时蜂鸣器响起,直到启动键再次被按下时则继续扫描各个输入端口,进入下一轮的抢答。
程序流程图如图10所示。
图10 程序抢答部分流程图
4.1.2 程序注释
程序如下所示: if(n)
/*n时间到后不能再按*/
{if(m1==0) t=1;
else if(m2==0) t=2; /*扫描按键,确定抢答成功的小组*/
else if(m3==0) t=3; else if(m4==0) t=4; else if(m5==0) t=5;
else if(m6==0) t=6; else if(m7==0) t=7;
while(t)
/*t不为零即有键按下*/
}
{
if(m==0)
{switch(t) /*判断按键并作出相应的操作*/
{ case 1:{TR0=0;i=1;second=0;led1=1;beept(100);m=1;break;}
case 2:{TR0=0;i=2;second=0;led2=1;beept(100);m=1;break;} case 3:{TR0=0;i=3;second=0;led3=1;beept(100);m=1;break;}
case 4:{TR0=0;i=4;second=0;led4=1;beept(100);m=1;break;}
case 5:{TR0=0;i=5;second=0;led5=1;beept(100);m=1;break;} case 6:{TR0=0;i=6;second=0;led6=1;beept(100);m=1;break;} case 7:{i=0;second=29;m=1;t=0;beept(100);while(!m7); TR0=1;break;}
} }
4.2 数码管显示程序 4.2.1 程序流程图
在写程序之前需要先测出数码管显示数字时它各个引脚的电平情况,从而得出各个数字的代码,控制单片机输出不同的代码,就能显示不同的数字。本次的程序采取动态扫描的编程方式,一般显示的频率在50hz左右,眼睛不会感到有闪烁感,因此应该适当地选择显示延时的时间。
程序流程图如图11所示。
图11 数码管显示程序流程图
4.2.2 程序注释
数码管显示程序如下:
void display(uchar shiwei,uchar gewei,uchar xuanshou) {P2=0xfd;
/*位选*/
P0=shiwei; /*段选*/ delay_us(80); /*延时显示*/ P2=0xfe; P0=gewei; delay_us(80); P2=0xf7; P0=xuanshou; delay_us(80);
}
4.3 计分程序主体部分 4.3.1 程序流程图
当有选手成功抢答并回答完问题后,回答正确的按下加分键,则分数加5分,按下减分键则分数减5分。分数上限是80分,下限是0分。数码管实时显示分数值,直到按下复位键后,分数才会被清零。
程序流程图如图12所示。
图12 计分程序流程图
4.3.2 程序注释 计分程序如下:
uint tab1[]={0,0,0,0,0,0,0} ;
if(m1==0) t=1; /*扫描按键,确定抢答成功的小组*/ else if(m2==0) t=2;
else if(m3==0) t=3; else if(m4==0) t=4; else if(m5==0) t=5; else if(m6==0) t=6; i=t;
if(bu1==0)
if(tab1[i]
if(tab1[i]!=0) tab1[i]=tab1[i]-5; /*最低分0分,每按一下减分键 减五分*/ 4.4 蜂鸣器发声程序 4.4.1程序流程图
发声部分主要是通过改变蜂鸣器的通断频率去改变声调,具体是改变高低电平的延迟时间,频率越高则声调越高,频率越低则声调越低。
程序流程图如图13所示。
图13 蜂鸣器发声程序流程
4.4.2程序注释
蜂鸣器发声程序如下:
void sound_ok() /*回答正确子程序*/ { uchar a,b; TR1=0;
for(a=4;a>0;a--) {for(b=900;b;b--)
{ beep=1; /*开蜂鸣器*/
delay_us((a+5)*10); /*改变高电平持续时间*/ beep=0; /*关蜂鸣器*/
delay_us((a+5)*10); /*改变低电平持续时间*/ } } }
void sound_err(void) /*回答错误子程序*/ {uchar a,b; TR1=0;
for(a=1;a
{ beep=1; /*开蜂鸣器*/
delay_us((a+5)*10); /*改变高电平持续时间*/ beep=0; /*关蜂鸣器*/
delay_us((a+5)*10); /*改变低电平持续时间*/ } } }
5 软件使用说明
5.1 编程软件
本系统由于是采用51系列单片机,因此使用Keil C语言进行开发,此编程工具相
比汇编语言具有结构化、适用范围大、可移植性好等特点。本系统软件设计采用模块化系统设计方法,先编写各个功能模块子程序,然后进行组合与调整达到设计功能要求。编程软件选择Keil uVision3,Keil软件是目前最流行开发MCS-51系列单片机的软件,Keil提供包括C编译器,宏编译,连接器,库管理器和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。 5.2 仿真软件
仿真软件我选择的是能够很好仿真单片机系统的Proteus,下面就这一软件作一些说明。
Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:①实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。②支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。④具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。
6 设计调试及性能测定
首先是数码管的调试,因为在硬件各模块中出错机会比较大的就是数码管的显示混乱。按照设计前测出的位码和段码编写一小程序,四位同时依次显示0至9,测试段码的编码是否正确,看是否有显示错误的段位。与此同时,因为本设计采用的是动态扫描的显示方式,因此要设定每一位的显示时间,根据人的视觉残留的特性,为保持视觉上的没有闪烁感,每位的显示时间应小于1ms,经过多次测试,发现在80微妙的时候具有较好的显示效果。然后是位码的测试,将程序改为让数码管的1至4位依次显示数字1~4,经测试后,显示正常。数码管经测试功能正常。
然后是最重要也是最困难的,就是程序的调试。
首先根据功能要求编写程序,在单独测试中各个模块的程序功能正常,但将各个部分结合在一起的时候遇到了一个问题,就是显示程序与发声程序之间有一定的冲突,例如要求在倒计时开始和结束的时候要求有一声0.5秒左右的鸣叫声,但是发现在发声的这段时间里数码管没有了显示,因为单片机在同一个时间里只能执行一条程序。经过一番努力终于想到的解决的方法,因为原来的数码管显示间隔与计时倒数是公用同一个定时器的,因此间隔过大,解决方案为:数码管显示程序用另外一个定时器来调用,并使用较小的显示间隔,这样当要发声时数码管上仍然有显示,因为这时程序在发声和显示模块之间快速的来回跳动,而且数码管没有闪烁感。
再而是发声程序的调试,本设计是利用通过给蜂鸣器不同的频率使其发出不同的响声,从而区别开回答正确与否的不同音乐声。首先在仿真软件上调试,回答正确是用频率由低到高的四声鸣叫表示,而回答错误则是用频率由高到低的四声鸣叫表示,经过多次频率的测试得到了较好的效果。最后是实物调试,因为毕竟仿真跟实物是有一定的区别的,果然,在实物调试时效果不是很理想,通过实物的在线调试后,其发声效果达到一个较满意的效果。
另外是其余部分的调试,包括键盘响应和发光二极管的亮暗,经调试其余部分功能正常。
设计各个部分功能调试完毕,显示正常,发声正常,抢答正常,计分正常, 并且性能良好。
7 结论
本设计是基于单片机的智能竞赛抢答器。系统设置复位按钮,按动后,抢答器进入禁止状态,数码管显示序号0,所有数据复位。按下启动按钮,抢答开始,选手抢答实行优先锁存,优先抢答选手的编号保持显示,其LED亮起。抢答器具有定时抢答功能,倒数时间为30s。主持人再次按下启动按钮,选手编号的LED数字显示器灯熄灭,进入下一轮的抢答倒数。扩展功能为音乐提醒和积分功能,回答的正确与否用不同的音调提示,并且可以记录各个选手的积分,一直保存直到按下复位键后清零。
致 谢
时光的流逝也许是客观的,然而流逝的快慢却纯是一种主观的感受。忽然间意识到,原来四年已经过去,到了该告别的时候了。一念至此,不禁有些惆怅。想到自己要踏上人生的另外一个征途,激动之余也有点不舍。
回想大学四年,首先要感谢的就是所有教导过我的老师,他们都有在不同的领域给了我启发,提升了我的专业知识与技能,也使我学到了很多为人处事的道理,这就是一种成长的过程。然后要感谢的是我大学所有的朋友,有了你们互相扶持,互相鼓励,我的大学生活才会添上各种不同的色彩,虽然我们都没有明说,我知道我们都很珍惜彼此。还有就是我的父母,你们的养育与培养之恩我毕生不忘,我会努力变强,承担照顾你们的责任。
参 考 文 献
[1]谢振辉. 改进式MCS-51单片机实验. 北京:科学出版社,2006: 121-156
[2]李朝青. 单片机原理及接口技术. 北京:北京航空航天大学出版社,2006: 112-132 [3]康华光,邹寿彬. 电子技术基础数字部分. 第五版. 北京:高等教育出版社,2005: 72-96
[4]胡伟,季晓衡. 单片机C程序设计及应用实例. 北京:人民邮电出版社,2003: 84-112 [5]曹建树,夏云生,曾林春. 51单片机实用教程. 北京:中国石化出版社,2008: 66-87 [6]Murray. Single chip microcomputers and their applications. Bell Laboratories,2006: 121-143
Intellectual Competition Responder
Liang Zhanpeng
(College of Engineering,South China Agricultural University,Guangzhou 510642,China) Abstract:Responder is an electronic product which is widely used in intelligence competitions and knowledge competitions, is a popular and necessary equipment in quiz ;,It is a typical digital circuits, including combinational logic circuit and sequential logic circuits. The responder’s circuit has various forms, you use a simple NAND gate to structure, you can also use triggers or single-chip devices. Using the single-chip device can make the circuits more simple, and make the function superior.
This design is a six-way responder based on a single-chip device. When the responder turn on the time begin to count down, and the Digital tube can show the process correctly. It use a stand-alone keyboard as the output equipment. and use a buzzer as the audible device. During the quiz game, only after the start button being pressed the answer is available. The answer is in a limited time of 30 seconds. The right answer and the wrong answer have different music as a reminder. The responder also have scoring function, it can record the score. When the start button is pressed again, then begin to respond the next question, and the scores are saved. When the reset button is pressed, then the game is over, the score is cleared.
Since this system is based on 51 series, we use Keil C language to develop. Simulation software we choose Proteus that can simulate the single-chip very well. It can display the circuit operating results on the interface dynamically. In addition, it can debug with the Keil to make the debugging much more convenient
Key words:Single-Chip Microcomputer Display Respond Score
元器件清单 AT89S52 4位公阴数码管
晶振 发光二极管
按键 蜂鸣器 排阻 电阻(10k) 电阻(220) 电容(33pf) 电容(100pf)
数量 1 1 1 6 10 1 1 1 6 2 1
#define uchar unsigned char #define uint unsigned int #include sbit m1=P1^0; sbit m2=P1^1; sbit m3=P1^2; sbit m4=P1^3; sbit m5=P1^4; sbit m6=P1^5; sbit m7=P1^6; sbit beep=P1^7; sbit led1=P3^2; sbit led2=P3^3; sbit led3=P3^4; sbit led4=P3^5; sbit led5=P3^6; sbit led6=P3^7; sbit bu1=P3^0; sbit bu2=P3^1; uchar
code tab[]={0x77,0x11,0x6D,0x3D,0x1B,0x3E,0x7E,0x15,0x7f,0x3F};//数码 uint tab1[]={0,0,0,0,0,0,0} ; 管编码 uchar shiwei; uchar gewei; uchar count; uchar xuanshou; uchar m; uchar n;
uchar p; uchar i; uchar fen;
static unsigned char second=30;
void delay(unsigned int x); void delay_us(uint i); void timer(); void sound_ok() ; void sound_err(); void beept(int a);
void display(uchar shiwei,uchar gewei,uchar xuanshou); main() {uint t=0; beep=0; P3=0; i=0; n=1; p=1; fen=0;
shiwei=tab[0]; gewei=tab[0]; xuanshou=tab[0]; timer(); while(m7); if(m7==0) {beept(100); timer(); delay(10); while(1)
{P3=0x03;
shiwei=tab[second/10];
gewei=tab[second%10]; xuanshou=0; m=0;
//n为0表示时间到不能再按键
if(n)
{if(m1==0) t=1;
else if(m2==0) t=2;
else if(m3==0) t=3; else if(m4==0) t=4; else if(m5==0) t=5;
else if(m6==0) t=6; else if(m7==0) t=7;
}
while(t)
//有按键按下后
{
if(m==0) {switch(t)
{ case 1:{TR0=0;i=1;second=0;led1=1;beept(100);m=1;break;}
case 2:{TR0=0;i=2;second=0;led2=1;beept(100);m=1;break;} case 3:{TR0=0;i=3;second=0;led3=1;beept(100);m=1;break;}
case 4:{TR0=0;i=4;second=0;led4=1;beept(100);m=1;break;}
case 5:{TR0=0;i=5;second=0;led5=1;beept(100);m=1;break;} case 6:{TR0=0;i=6;second=0;led6=1;beept(100);m=1;break;} case 7:{i=0;second=29;m=1;t=0;beept(100);while(!m7); TR0=1;break;}
} }
shiwei=tab[tab1[i]/10];
gewei=tab[tab1[i]%10]; xuanshou=tab[i];
if(m7==0) {i=0;t=0;n=1;second=30;TR0=1;beept(100);fen=0;}
if(bu1==0) sound_ok(); }
if(second==0&&p==1) {TR0=0; n=0;p=0;beept(300);} if(m7==0) {i=0;t=0;n=1;p=1;second=30;TR0=1;}
if(bu2==0) sound_err();
} } }
void timer() //定时器初始化 {TMOD=0x11;
TH0=(65536-50000)/256; TL0=(65536-50000)%256;
TH1 = (65536-1000)/256 ; // 预置定时常数64536(fc18),产生1ms TL1 = (65536-1000)%256 ; 间隔用于动态显示 EA = 1; // 开总中断
ET0 = 1; // 定时/计数器0允许中断 ET1 = 1; TR0=1; TR1=1; }
void time0() interrupt 1 using 1 //定时器0中断倒数子程序 {TH0=(65536-50000)/256; TL0=(65536-50000)%256;
count++; if(count==20) {count=0; second--; } }
void time1() interrupt 3 //定时器1中断显示子程序 {
display( shiwei,gewei,xuanshou);
TH1 = (65536-1000)/256 ; // 预置定时常数64536(fc18),产生1ms TL1 = (65536-1000)%256 ; 间隔用于动态显示 }
void sound_ok() //回答正确调用子程序 {
uchar a,b; TR1=0;
for(a=4;a>0;a--) {
for(b=900;b;b--) {
beep=1; //开蜂鸣器 delay_us((a+5)*10); //延时 beep=0; //关蜂鸣器 delay_us((a+5)*10); } }
if(tab1[i]
}
void sound_err(void) //回答错误调用子程序 {
uchar a,b; TR1=0;
for(a=1;a
for(b=900;b;b--) {
beep=1; //开蜂鸣器 delay_us((a+5)*10);
beep=0; //关蜂鸣器 delay_us((a+5)*10); } }
if(tab1[i]!=0) tab1[i]=tab1[i]-5; //回答错误减5分
TR1=1; }
void delay(unsigned int x) //延迟子程序 {uchar j; while(x--)
{for(j=0;j
; }
}
void display(uchar shiwei,uchar gewei,uchar xuanshou) //显示子程序
{P2=0xfd; //段选 P0=shiwei; //位选 delay_us(80); //显示延迟 P2=0xfe;
P0=gewei;
delay_us(80);
P2=0xf7;
P0=xuanshou;
delay_us(80);
}
void delay_us(uint i) // {
for(;i;i--)
{;}
}
void beept(int a) //{ beep=1;
delay(a);
beep=0;
}
延迟子程序(微秒)发声子程序