1、毕业设计(论文)题 目: 基于51单片机的抢答器系统设计 函授站点: 中国矿业大学继续教育学院 学习层次: 专科 班级名称: 徐工技师学院 函机电2015班 姓名: 彭乾坤 学号: 中国矿业大学继续教育学院20 年 月 日摘 要随着科学技术的发展和普及,各种各样的竞赛越来越多,其中抢答器的作用也就显而易见。目前很多抢答器基本上采用小规模数字集成电路设计,使用起来不够理想。因此设计一更易于使用和区分度高的抢答器成了非常迫切的任务。现在单片机已进入各个领域,以其功耗小、智能化而著称,所以若利用单片机来设计抢答器,便使以上问题得以解决.针对以上情况,本文设计出以STC89C52RC单片机为核心的八路
2、抢答器。我们采用了数字显示器直接指示,自动锁存显示结果,并自动复位的设计思想,它能根据不同的抢答输入信号,经过单片机的控制处理并产生不同的与输入信号相对应的输出信号,最后通过LED数码管显示相应的路数,即使两组的抢答时间相差几微秒,也可分辨出是哪组优先按下的按键,它充分利用了单片机系统的优点,具有结构简单、功能强大、可靠性好、实用性强的特点。本设计是以八路抢答为基本理念。考虑到依需设定限时回答的功能,利用51单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,扬声器发
3、生提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为犯规;满时后系统计时自动复位及主控强制复位;按键锁定,在有效状态下,按键无效非法。关键词:STC89C52RC; 共阴数码管; 按键 ;蜂鸣器目 录前 言1第一章 工作原理21.1设计目标21.1.1基本功能21.1.2主要技术参数2第二章 硬件设计与原理32.1 总设计框图32.2 硬件设计分析32.2.1 电源的设计32.2.2 单片机最小系统42.2.3 数码管显示电路102.2.4 按键输入电路112.2.5 报警与指示电路14第三章 软件设计与分析153.1 软件设计的组成153.2 各部分软件分析153
4、.2.1 延时子函数153.2.2 初始化子函数153.2.3 开始键扫描子函数163.2.4 选手抢答按键扫描子函数173.2.5 显示子函数203.2.6 调整时间键扫描子函数243.2.7 定时器0中断子函数263.2.8 定时器1中断子函数273.2.9 主函数283.3 总源程序30第四章 软件仿真464.1 PROTEUS简介464.2仿真图484.3原理图494.4 元件清单504.5 仿真结果图51总结54致 谢56参考文献57前 言最近几年来,随着科技的飞速发展,单片机领域正在不断的走向社会各个角落,还带动传统控制检测日新月异更新。在实时运作和自动控制的单片机应用到系统中,单
5、片机如今是作为一个核心部件来使用,仅掌握单片机方面知识是不够的,还应根据其具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。“单片机原理及应用课程设计”是电子类专业的学科基础科,它是继“汇编语言程序设计”,“接口技术”等课程之后开出的实践环节课程。第一章 工作原理1.1设计目标1.1.1基本功能1、同时供8名选手比赛,分别用8个按钮K1 K8表示。2、设置一个系统抢答控制开关K0,该开关由主持人控制。3、抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,扬声器发出声响提示,并在七段数码管上显示选手号码。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。4
6、、抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。当主持人启动开始键后,定时器进行减计时。5、参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。在这段时间如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。1.1.2主要技术参数 1、在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为犯规。2、抢答限定时间和回答问题的时间是在1060s设定。3、可以显示是哪位选手有效抢答和无效抢答,正确按键后有音提示。4、抢答时间和回答问题时间倒记时显示,时间完后系统自动复位。5、按键
7、锁定,在有效状态下,按键无效非法。第二章 硬件设计与原理以STC89C52RC单片机为核心,起着控制作用。系统包括数码管显示电路、复位电路、时钟电路、按键输入电路和蜂鸣器报警电路。设计思路分为六个模块:复位电路、晶振电路模块、STC89C52RC、数码管显示电路、按键输入电路和蜂鸣器报警电路这六个模块。2.1 总设计框图2.2 硬件设计分析2.2.1 电源的设计系统电源使用外接直流5伏。2.2.2 单片机最小系统51单片机是对目前所有兼容intel 8031指令系统的单片机的统称。该系列单片机的始祖是intel的8031单片机,后来随着技术的发展,成为目前广泛应用的为单片机之一。单片机是在一块
8、芯片内集成了CPU、RAM、ROM、定时器计数器和多功能I/O口等计算机所需要的基本功能部件的大规模集成电路,又称为MCU。51系列单片机内包含以下几个部件:一个位CPU;一个片内振荡器及时钟电路;4KB的ROM程序存储器;一个128B的RAM数据存储器;寻址64KB外部数据存储器和64KB外部程序存储空间的控制电路;32条可编程的I/O口线;两个16位定时计数器;一个可编程全双工串行口;个中断源、两个优先级嵌套中断结构。如图2-2-1所示为STC89C52RC单片机基本构造,其基本性能介绍如下:图2-2-1 STC89C52RC单片机STC89C52RC本身内含40个引脚,32个外部双向输入
9、/输出(I/O)端口,同时内含2个外中端口,3个16位可编程定时计数器,2个全双工串行通信口,STC89C51RC可以按照常规方法进行编程,但不可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。STC89C52RC的主要特性如下表所示:兼容MCS51指令系统32个可编程I/O线4k字节可编程闪烁存储器可编程UARL通道三个16位可编程定时/计数器中断时钟频率0-24MHz2个外部中断源,共8个中断源2568bit内部RAM2个读写中断口线可直接驱动LED软件设置睡眠和唤醒功能低功耗空闲和掉电模式表2-2-1 STC89C52R
10、C主要功能描述STC89C52RC为40脚双列直插封装的8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。P0P3 为可编程通用I/O脚,其功
11、能用途由软件定义,在本设计中,P0端口(3239脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。P0口:P0口是一组8位漏极开路型双向I/O 口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位
12、)和数据总线复用,在访问期间激活内部上拉电阻。在Flash 编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2 的外部计数输入(P1.0/T2)和输入(P1.1/T2EX)。Flash编程和程序校验期间,P1接收低8位地址。
13、P2口:P2是一个带有内部上拉电阻的8 位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVX RI指令)时,P2口输出P2锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号。P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口
14、输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能P3口还接收一些用于Flash 闪速存储器编程和程序校验的控制信号。RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注
15、意的是:每当访问外部数据存储器时将跳过一个AL脉冲。对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条 MOVX 和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当STC89C51RC由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。在此期间,当访问外部数据存储器,将跳过两次PSEN信号。EA/VPP:外部访问允许。
16、欲使CPU仅访问外部程序存储器(地址为0000HFFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。XTAL2:振荡器反相放大器的输出端。单片机最小原理图如图2-2-2所示。图2-2-2 单片机最小系统单片机最小系统说明:时钟信号的产生:在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL
17、1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器,这就是单片机的时钟振荡电路。时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。一般地,电容C2和C3取30pF左右,晶体的振荡频率范围是1.2-12MHz。如果晶体振荡频率高,则系统的时钟频率也高,单片机的运行速度也就快。单片机复位使CPU和系统中的其他功能部件都处在一个确定的初始状态下,并从这个状态开始工作。单片机复位条件:必须使9脚加上持续两个机器周期(即24个振荡周期)的高电平。2.2.3 数码管显示电路显示系统采用四位一体数码管来显示
18、,LED显示屏作为大型显示设备的一种,具有亮度高、价格低、寿命长、维护简便等优点。LED数码管的结构简单,分为七段和八段两种形式,也有共阳和共阴之分。以八段共阳管为例,它有8个发光二极管(比七段多一个发光二极管,用来显示sP,即点),每个发光二极管的阳极连在一起,如图(图2-2-4)所示。这样,一个LED数码管就有I根位选线和8根段选线,要想显示一个数值,就要分别对它们的高低电平来加以控制。为方便起见,本文主要讨论共阴八段LED数码显示管,其他类形的显示管与其类似。图2-2-3 LED数码管LED 灯的显示原理:通过同名管脚上所加电平的高低来控制发光二极管是否点亮而显示不同的字形,如 H,G,
19、F,E,D,C,B,A全亮显示为8,采用共阴极连接驱动代码,代码表如下表(表2-2-2)所示。表2-2-2 驱动代码表显示数值H,G,F,E,D,C,B,A驱动代码0001111113FH10000011006H2010110115BH3010011114FH40110011066H5011011016DH6011111017DH70000011107H8011111117FH9011011116FH2.2.4 按键输入电路按键是由一组按压式或触摸式开关构成的阵列,是一种常用的输入设备。键盘可分为编码式键盘和非编码式键盘两种。1.编码键盘通过硬件电路产生被按按键的键码,这种键盘所需程序简单,但
20、硬件电路复杂、价格昂贵通常不被单片机系统采用。2.非编码键盘常用一些按键排列成行列矩阵,其硬件逻辑与按键编码不存在严格的对应关系,而要由所用的程序来决定。非编码键盘的硬件接口简单,但是要占用较多的CPU时间,通常采用可编程键盘管理芯片来克服这个缺点。本设计使用两种按键,一种是按键式非编码键盘和轻触式非编码开关。在接线时由于有四个引脚,连接时需要用万用表进行测量,然后接通两个引脚,原理图如下。要进行数据的计算就必须先进行数据的输入,也就必须确定按键输入的数值是什么,这就需要对键盘进行扫描,从而确定究竟是哪个键按下。图2-2-4 按键电路2.2.5 报警与指示电路图2-2-5 报警与指示电路第三章
21、 软件设计与分析3.1 软件设计的组成该系统由延时子函数、初始化子函数、开始键扫描子函数、选手抢答按键扫描子函数、显示子函数、调整时间键扫描子函数、定时器0中断子函数、定时器1中断子函数、主函数和数据定义这几部分组成。3.2 各部分软件分析3.2.1 延时子函数/延时子函数void delay(uchar x)uchar y;for(;x0;x-)for(y=120;y0;y-);3.2.2 初始化子函数/初始化子函数void init()TMOD=0x11;TH0=(65536-2000)/256;TL0=(65536-2000)%256;TH1=(65536-2000)/256;TL1=(
22、65536-2000)%256;ET0=1;ET1=1;EA=1;P0=0x00;time1=10;time2=10;flag2=1;3.2.3 开始键扫描子函数/开始键扫描子函数void key1()uchar i=100;if(K0=0)delay(10);if(K0=0)while(K0=0&i)i-;delay(10);TR0=1;s=time1;m=0;flag1=1;flag2=1;flag3=1;num=0;beep=1;D0=1;flag4=0;/清除违规标志位aa=0;bb=0;3.2.4 选手抢答按键扫描子函数/选手抢答按键扫描子函数void key()if(K1=0)de
23、lay(10);if(K1=0)while(!K1);num=1;/数码管显示1号1TR0=0;/关闭定时器0,时间停止TR1=1;/打开定时器1,使扬声器响一声flag2=0;/关闭开始键标志位,使再按其他七个键不会响应if(K2=0)/下面七个键的处理同上delay(10);if(K2=0)while(!K2);num=2;TR0=0;TR1=1;flag2=0;/重要if(K3=0)delay(10);if(K3=0)while(!K3);num=3;TR0=0;TR1=1;flag2=0;if(K4=0)delay(10);if(K4=0)while(!K4);num=4;TR0=0;
24、TR1=1;flag2=0;if(K5=0)delay(10);if(K5=0)while(!K5);num=5;TR0=0;TR1=1;flag2=0;if(K6=0)delay(10);if(K6=0)while(!K6);num=6;TR0=0;TR1=1;flag2=0;if(K7=0)delay(10);if(K7=0)while(!K7);num=7;TR0=0;TR1=1;flag2=0;if(K8=0)delay(10);if(K8=0)while(!K8);num=8;TR0=0;TR1=1;flag2=0;3.2.5 显示子函数/显示子函数void display()if(
25、flag1=1)/开始键按下,开始计时抢答if(num!=0)/如果有人抢答,则显示相应的几号P0=table1num;/显示几号抢到了P2=table20;delay(2);P0=0;P2=0xff;else/否则没人抢答,则前面不显示几号P0=0x00;P2=0xff;P0=table1s/10;/下面为显示抢答倒计时P2=table22;delay(2);P0=0;P2=0xff;P0=table1s%10;P2=table23;delay(2);P2=0xff;P0=0x00;else/如果开始键没有按下,则显示F FF(若有违规者,则显示违规号码及 FF)或时间调整if(flag4=
26、1)/违规显示if(num!=0)P0=table1num;/显示几号违规了P2=table20;delay(2);P0=0x00;P2=0xff;P0=table115;/下面显示 FF,表示违规了P2=table22;delay(2);P0=0x00;/消隐P2=0xff;P0=table115;P2=table23;delay(2);P0=0x00;P2=0xff;elseP0=0x00;P2=0xff;else/没有人违规才显示调整时间if(aa=1)P0=0x6d;/第一位数码管显示5(S)(表示抢答时间调整)P2=table20;delay(2);P0=0x00;P2=0xff;P
27、0=table1time1/10;/下面显示调整的抢答时间P2=table22;delay(2);P0=0x00;P2=0xff;P0=table1time1%10;P2=table23;delay(2);P0=0x00;P2=0xff;else if(bb=1)P0=0x07;/第一位与第二位数码管合起来显示T,表示答题时间调整P2=table20;delay(2);P0=0x00;P2=0xff;P0=0x31;P2=table21;delay(2);P0=0x00;P2=0xff;P0=table1time2/10;P2=table22;delay(2);P0=0x00;P2=0xff;
28、P0=table1time2%10;P2=table23;delay(2);P0=0x00;P2=0xff;else/否则显示F FFP0=table115;P2=table20;delay(2);P0=0x00;P0=table115;P2=table22;delay(2);P0=0x00;/消隐P2=0xff;P0=table115;P2=table23;delay(2);P0=0x00;P2=0xff;3.2.6 调整时间键扫描子函数/调整时间键扫描子函数void key2()uchar i=100;if(S2=0)/抢答时间调整delay(10);if(S2=0)while(S2=0&
29、i)i-;delay(10);time1+;if(time1=61)time1=10;aa=1;/将抢答时间标志位置1bb=0;/同时关闭答题时间标志位if(S3=0)/答题时间调整delay(10);if(S3=0)while(S3=0&i)i-;delay(10);time2+;if(time2=61)time2=10;bb=1;aa=0;3.2.7 定时器0中断子函数/定时器0中断子函数void t0() interrupt 1TH0=(65536-2000)/256;/2msTL0=(65536-2000)%256;if(flag3)/开始(START)键按下,嘟一声(长1秒),表示开
30、始抢答beep=beep;elsebeep=1;if(s5)/抢答时间快到报警,隔1秒响一声且红灯闪烁,响三声if(s%2=0)flag3=1;D0=0;elseflag3=0;D0=1;m+;if(m=500)/1秒m=0;s-;flag3=0;/关闭开始键按下响一秒的嘟声if(s=-1)s=20;TR0=0;flag1=0;/显示F FFflag2=1;num=0;D0=1;3.2.8 定时器1中断子函数/定时器1中断子函数void t1() interrupt 3/定时器1处理有人按下抢答器嘟一声(长1秒)TH1=(65536-2000)/256;TL1=(65536-2000)%256
31、;beep=beep;n+;if(n=500)n=0;TR1=0;3.2.9 主函数/主函数void main()uchar i=100;init();/调用初始化子函数while(1)key1();/调用开始键扫描子函数if(flag1=0)&(flag2=1)/当开始键没按下及没有人违规时才可进行时间调整key2();if(flag1=1)&(flag2=0)/当开始键按下及有人抢答才进行开始回答计时倒计时if(S1=0)delay(10);if(S1=0)while(S1=0&i)i-;delay(10);s=time2;TR0=1;m=0;TR1=1;if(flag1=0)&(flag
32、2=1)/违规key();if(num!=0)/开始键没有按下时,有人按下了抢答器,则置违规标志位flag4=1;D0=0;if(flag1=1)&(flag2=1)/如果开始键按下且抢答键没有人按下,则进行八路抢答键扫描key();display();/显示到数码管上3.3 总源程序#includetypedef unsigned char uchar;typedef unsigned int uint;sbit K0=P30;/开始抢答按键sbit beep=P37;/蜂鸣器sbit D0=P31;/指示灯sbit K1=P10;/1号选手抢答按键sbit K2=P11;/2号选手抢答按键
33、sbit K3=P12;/3号选手抢答按键sbit K4=P13;/4号选手抢答按键sbit K5=P14;/5号选手抢答按键sbit K6=P15;/6号选手抢答按键sbit K7=P16;/7号选手抢答按键sbit K8=P17;/8号选手抢答按键sbit S1=P32;/答题计时键sbit S2=P33;/开始抢答时间调整键sbit S3=P34;/答题计时时间调整键char s;uchar num=0;char time1;/抢答时间char time2;/答题限时时间uint m,n;/T0,T1定时器定一秒时bit flag1,flag2,flag3,flag4;/标志位bit a
34、a,bb;/时间调整标志位/延时子函数void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=120;y0;y-);uchar code table1=/共阴数码管段码值0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;uchar code table2=/共阴数码管位码值0xfe,0xfd,0xfb,0xf7;/初始化子函数void init()TMOD=0x11;TH0=(65536-2000)/256;TL0=(65536-2000)%256
35、;TH1=(65536-2000)/256;TL1=(65536-2000)%256;ET0=1;ET1=1;EA=1;P0=0x00;time1=10;time2=10;flag2=1;/开始键扫描子函数void key1()uchar i=100;if(K0=0)delay(10);if(K0=0)while(K0=0&i)i-;delay(10);TR0=1;s=time1;m=0;flag1=1;flag2=1;flag3=1;num=0;beep=1;D0=1;flag4=0;/清除违规标志位aa=0;bb=0;/选手抢答按键扫描子函数void key() uchar i=100;i
36、f(K1=0)delay(10);if(K1=0)while(K1=0&i)i-;delay(10);num=1;/数码管显示1号1TR0=0;/关闭定时器0,时间停止TR1=1;/打开定时器1,使扬声器响一声flag2=0;/关闭开始键标志位,使再按其他七个键不会响应if(K2=0)/下面七个键的处理同上delay(10);if(K2=0)while(K2=0&i)i-;delay(10);num=2;TR0=0;TR1=1;flag2=0;/重要if(K3=0)delay(10);if(K3=0)while(K3=0&i)i-;delay(10);num=3;TR0=0;TR1=1;flag2=0;if(K4=0)delay(10);if(K4=0)while(K4=0&i)i-;delay(10);num=4;TR0=0;TR1=1;flag2=0;if(K5=0)delay(10);if(K5=0)while(K5=0&i)i-;delay(10);num=5;TR0=0;TR1=1;flag2=0;if(K6=0)delay(10);if(K6=0)while(K6=0&i)i-;delay(10);num=6;TR0=0;TR1=1;flag2=0;if(K7=0)delay(10);if(K7=0)while(K7=0&i)i-;de