八路抢答器论文

更新时间:2024-05-10 08:19:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

毕业设计(论文)

题目: 基于单片机的八路抢答器

学 院 物理科学与工程技术 专 业 电子科学与技术 班 级 2010级01班 学 号 1012270105 姓 名 袁 敏 指导老师 李宜滨老师

二O一四年 五 月 三十 日

摘 要

此次设计提出了用AT89C52单片机为核心控制元件,设计一个简易的8路抢答器,本方案以STC89C52单片机作为主控核心,与数码管、蜂鸣器等构成8路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时/中断等电路,设计的抢答器具有实时显示抢答选手的号码和抢答时间的特点,还有复位电路,使其再开始新的一轮的答题和比赛,同时还利用C语言编程,使其实现一些基本的功能。

本设计的系统实用性强、判断精确、操作简单、扩展功能强。它的功能实现是比赛开始,主持人读完题之后按下开始开关,即计时开始,此时数码管开始进行30秒倒计时,直到有一个选手抢答时,对应的会在数码管上显示出该选手的编号以及剩余时间,同时蜂鸣器也会发出声音,以提示有人抢答本题,在规定的最后5秒时间内还没有做出抢答,蜂鸣器发出报警,提示选手尽快作答,如果30秒内无人作答则此题作废,即开始重新一轮的抢答。

关键词:STC89C52 独立键盘 LED显示管 蜂鸣器

2

Microcontroller-based eight-Responder

Abstract

The design presented as the core control element AT89C52 microcontroller design a simple 8-way Responder, the program to STC89C52 MCU as the master core, with digital control, buzzer, etc. constitute 8-way Responder, use of the microcontroller delay circuit, key reset circuit, clock circuits, timer / interruption circuit design Responder number and answer period with the characteristics of real-time display Responder players, as well as a reset circuit to re-start a new round of answer and competition, but also the use of the C programming language, making some basic functions.

The design of the system is practical to determine the precise, simple, powerful extension. Its function is to realize the start of the game, the host start switch is pressed after reading the title, that is the start time, when digital countdown starts 30 seconds until a contestant answer, the corresponding in the digital display of the player's number and the remaining time, the buzzer will sound to alert someone answer this question, in the last five seconds of time required to make answer yet, buzzer alarm, prompting players to answer as soon as possible, if 30 seconds no one answered this question in the void, that began to re-answer round.

Keywords: STC89C52 separate keyboard LED display tubes buzzer

3

目录

1 引言 ...............................................................................................................5

1.1 目的和意义 ........................................................................................5 1.2 本系统主要研究内容 ........................................................................5 2. 总体方案论证与设计 ..................................................................................6

2.1主控模块 .............................................................................................6

2.1.3 STC89C52单片机的中断系统 .............................................10 2.1.4 STC89C52单片机的定时/计数器 ........................................10 2.2数码管模块设计 ...............................................................................10 2.2.1 数码管原理介绍 ...........................................................................10 2.2.1 数码管电路设计 ........................................................................... 11 2.3键盘模块设计 ...................................................................................12

2.3.1矩阵键盘原理介绍 ................................................................12 2.3.2键盘模块设计 ........................................................................13 2.4蜂鸣器模块设计 ...............................................................................13 3.系统软件设计 ..............................................................................................15

3.1系统软件总体设计 ...........................................................................15 3.2程序设计原理 ...................................................................................16 4.系统调试 ......................................................................................................17

4.1硬件调试 ...........................................................................................17 4.2软件调试 ...........................................................................................17 4.3调试结果 ...........................................................................................17 5.结论 ..............................................................................................................19 致谢 .................................................................................................................20 附录 .................................................................................................................22 系统整体原理图 .............................................................................................22 系统PCB设计图 ............................................................................................23 系统源程序 .....................................................................................................23

4

基于单片机的八路抢答器

1 引言

1.1 目的和意义

二十世纪,跨越了三个“电”的时代,即电气时代,计算机时代,现在已经进入了电子时代。然而,这样的一台计算机,通常是指个人计算机,简称为PC。它由一台主机,键盘,显示器等组成。另一种类型的计算机,而不是大多数人是如何熟悉。这台电脑是考虑到各种智能机微控制器(也称为微控制器) 。正如其名称所暗示的,只用一块集成电路的最小的这样的计算机系统,可以执行简单的算术运算和控制。因为它小,通常隐藏在被告机械的“肚子”里。它是在设备中起着人类心灵的作用是什么样子,它出了毛病,整个系统就瘫痪了。现在,使用这种微控制器领域有着非常广泛,如智能仪表,实时工控,通讯设备,导航系统,家用电器等。一旦微控制器花各类产品,可以起到产品升级换代的功效,经常在前面加上形容词的产品名称“智能型”。

在知识竞赛中,往往都会用到抢答器。故此我们就选择利用单片机编程来设计抢答器,即使两组的抢答时间相差几微秒,也能轻松的分辨出哪一组(或哪个选手)先抢答到题。

本系统采用单片机作为整个控制核心。控制系统的四个模块为:显示模块、存储模块、语音模块、抢答开关模块。该系统通过开关电路四个按键输入抢答信号,利用一个数码管来完成显示功能,用按键来让选手进行抢答,在数码管上显示哪一组先答题的,从而实现整个抢答过程。工作时,用按键通过开关电路输入各路的抢答信号,经单片机的处理, 输出控制信号,单片机控制的智能抢答器设计。

1.2 本系统主要研究内容

本系统设计制作一个基于单片机的8路抢答器。能实现以下几种功能:

(1)键盘扫描,显示当前按键。

(2)检测是否有参赛者违规操作,如果在主持人按下开始按键以前按下则利用蜂鸣器报警并显示参赛者编号。

(3)当主持人按下开始按键后,计数器开始倒数,在30秒倒数结束之前如果有参赛者按下按键,则在数码管上显示参赛者编号和剩余的时间。

5

2. 总体方案论证与设计

该系统以STC89C52单片机作为控制核心,对系统进行初始化,主要完成对键盘的响应、数码管显示等功能的控制,起到总控和协调各模块之间工作的作用。单片机通过驱动蜂鸣器发响声。

供电电源蜂鸣器报警模块单片机主控模块数码管模块按键模块 图2-1系统结构框图

本系统结构如图2-1所示,本设计可分为以下模块:单片机主控模块、键盘模块、按键模块、蜂鸣器报警模块。下面对各个模块的设计方案逐一进行论证分析。

2.1主控模块

STC89C52单片机最初是由Intel 公司开发设计的,但后来Intel 公司把51 核的设计方案卖给了几家大的电子设计生产商,譬如 SST、Philip、Atmel 等大公司。如是市面上出现了各式各样的但均以51 为内核的单片机,倒是Intel 公司自己的单片机却显得逊色了。这些各大电子生产商推出的单片机都兼容51 指令、并在51 的基础上扩展一些功能而内部结构是与51 一致的。

STC89C52有40个引脚,4个8位并行I/O口,1个全双工异步串行口,同时内含5个中断源,2个优先级,2个16位定时/计数器。STC89C52的存储器系统由4K的程序存储器(掩膜ROM),和128B的数据存储器(RAM)组成。

STC89C52单片机的基本组成框图见图2-2。

6

XTAL2时钟电路XTAL1RAM128BSFR 21个定时个/计数器2VccCPUROM/EPROM/Flash 4KB总线控制中断系统5个中断源2个优先级串行口全双工1个4个并行口VssRSTEAPSENALEP0P1P2P3

图2-2 STC89C52单片机结

2.1.1 STC89C52单片机主要特性

1. 一个8 位的微处理器(CPU)。

2. 片内数据存储器RAM(128B),用以存放可以读/写的数据,如运算的中间结果、最终结果以及欲显示的数据等,SST89 系列单片机最多提供1K 的RAM。

3. 片内程序存储器ROM(4KB),用以存放程序、一些原始数据和表格。但也有一些单片机内部不带ROM/EPROM,如8031,8032,80C31 等。目前单片机的发展趋势是将RAM 和ROM 都集成在单片机里面,这样既方便了用户进行设计又提高了系统的抗干扰性。SST 公司推出的89 系列单片机分别集成了16K、32K、64K Flash 存储器,可供用户根据需要选用。

4. 四个8 位并行I/O 接口P0~P3,每个口既可以用作输入,也可以用作输出。

5. 两个定时器/计数器,每个定时器/计数器都可以设置成计数方式,用以对外部事件进行计数,也可以设置成定时方式,并可以根据计数或定时的结果实现计算机控制。为方便设计串行通信,目前的52 系列单片机都会提供3 个16 位定时器/计数器。

6. 五个中断源的中断控制系统。现在新推出的单片机都不只5 个中断源,例如SST89E58RD 就有9 个中断源。

7. 一个全双工UART(通用异步接收发送器)的串行I/O 口,用于实现单片机之间或单机与微机之间的串行通信。

8. 片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。最高允许振荡频率为12MHz。SST89V58RD 最高允许振荡频率达40MHz,因而大大的提高了指令的执行速度。

2.1.2 STC89C52单片机管脚图

7

图2-3 89S52单片机管脚图

部分引脚说明:

1. 时钟电路引脚XTAL1 和XTAL2:

XTAL2(18 脚):接外部晶体和微调电容的一端;在8051 片内它是振荡电路反相放大器的输出端,振荡电路的频率就是晶体固有频率。若需采用外部时钟电路时,该引脚输入外部时钟脉冲。

要检查8051/8031 的振荡电路是否正常工作,可用示波器查看XTAL2 端是否有脉冲信号输出。

XTAL1(19 脚):接外部晶体和微调电容的另一端;在片内它是振荡电路反相放大器的输入端。在采用外部时钟时,该引脚必须接地。

2. 控制信号引脚RST,ALE,PSEN 和EA:

RST/VPD(9 脚):RST 是复位信号输入端,高电平有效。当此输入端保持备用电源的输入端。当主电源Vcc 发生故障,降低到低电平规定值时,将+5V 电源自动两个机器周期(24个时钟振荡周期)的高电平时,就可以完成复位操作。RST 引脚的第二功能是VPD,即接入RST 端,为RAM 提供备用电源,以保证存储在RAM 中的信息不丢失,从而合复位后能继续正常运行。

ALE/PROG(30 脚):地址锁存允许信号端。当8051 上电正常工作后,ALE 引脚不断向外输出正脉冲信号,此频率为振荡器频率fOSC 的1/6。CPU 访问片外存储器时,ALE 输出信号作为锁存低8 位地址的控制信号。

平时不访问片外存储器时,ALE 端也以振荡频率的1/6 固定输出正

8

脉冲,因而ALE 信号可以用作对外输出时钟或定时信号。如果想确定8051/8031 芯片的好坏,可用示波器查看ALE端是否有脉冲信号输出。如有脉冲信号输出,则8051/8031 基本上是好的。

ALE 端的负载驱动能力为8 个LS 型TTL(低功耗甚高速TTL)负载。

此引脚的第二功能PROG 在对片内带有4KB EPROM 的8751 编程写入(固化程序)时,作为编程脉冲输入端。

PSEN(29 脚):程序存储允许输出信号端。在访问片外程序存储器时,此端定时输出负脉冲作为读片外存储器的选通信号。此引肢接EPROM 的OE 端(见后面几章任何一个小系统硬件图)。PSEN 端有效,即允许读出EPROM/ROM 中的指令码。PSEN 端同样可驱动8 个LS 型TTL 负载。要检查一个8051/8031 小系统上电后CPU 能否正常到EPROM/ROM 中读取指令码,也可用示波器看PSEN 端有无脉冲输出。如有则说明基本上工作正常。

EA/Vpp(31 脚):外部程序存储器地址允许输入端/固化编程电压输入端。当EA 引脚接高电平时,CPU只访问片内EPROM/ROM并执行内部程序存储器中的指令,但当PC(程序计数器)的值超过0FFFH(对8751/8051 为4K)时,将自动转去执行片外程序存储器内的程序。当输入信号EA 引脚接低电平(接地)时,CPU 只访问外部EPROM/ROM 并执行外部程序存储器中的指令,而不管是否有片内程序存储器。对于无片内ROM 的8031 或8032,需外扩EPROM,此时必须将EA 引脚接地。此引脚的第二功能是Vpp 是对8751 片内EPROM固化编程时,作为施加较高编程电压(一般12V~21V)的输入端。

3. 输入/输出端口P0/P1/P2/P3:

P0口(P0.0~P0.7,39~32 脚):P0口是一个漏极开路的8 位准双向I/O口。作为漏极开路的输出端口,每位能驱动8 个LS 型TTL 负载。当P0 口作为输入口使用时,应先向口锁存器(地址80H)写入全1,此时P0 口的全部引脚浮空,可作为高阻抗输入。作输入口使用时要先写1,这就是准双向口的含义。在CPU 访问片外存储器时,P0口分时提供低8 位地址和8 位数据的复用总线。在此期间,P0口内部上拉电阻有效。

P1口(P1.0~P1.7,1~8 脚):P1口是一个带内部上拉电阻的8 位准双向I/O口。P1口每位能驱动4 个LS 型TTL 负载。在P1口作为输入口使用时,应先向P1口锁存地址(90H)写入全1,此时P1口引脚由内部上拉电阻拉成高电平。

P2口(P2.0~P2.7,21~28 脚):P2口是一个带内部上拉电阻的8 位准双向I/O口。P口每位能驱动4个LS 型TTL 负载。在访问片外EPROM/RAM 时,它输出高8 位地址。

P3口(P3.0~P3.7,10~17 脚):P3口是一个带内部上拉电阻的8 位准双向I/O口。P3口每位能驱动4个LS型TTL负载。P3口与其它I/O 端

9

口有很大的区别,它的每个引脚都有第二功能,如下:

P3.0:(RXD)串行数据接收。 P3.1:(RXD)串行数据发送。 P3.2:(INT0#)外部中断0输入。 P3.3:(INT1#)外部中断1输入。

P3.4:(T0)定时/计数器0的外部计数输入。 P3.5:(T1)定时/计数器1的外部计数输入。 P3.6:(WR#)外部数据存储器写选通。 P3.7:(RD#)外部数据存储器读选通。

2.1.3 STC89C52单片机的中断系统

STC89C52系列单片机的中断系统有5个中断源,2个优先级,可以实现二级中断服务嵌套。由片内特殊功能寄存器中的中断允许寄存器IE控制CPU是否响应中断请求;由中断优先级寄存器IP安排各中断源的优先级;同一优先级内各中断同时提出中断请求时,由内部的查询逻辑确定其响应次序。

2.1.4 STC89C52单片机的定时/计数器

在单片机应用系统中,常常会有定时控制需求,如定时输出、定时检测、定时扫描等;也经常要对外部事件进行计数。89C52单片机内集成有两个可编程的定时/计数器:T0和T1,它们既可以工作于定时模式,也可以工作于外部事件计数模式,此外,T1还可以作为串行口的波特率发生器。

2.2数码管模块设计 2.2.1 数码管原理介绍

数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;

按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

10

数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。

静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。

数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划\的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

图2-4 四位数码管内部结构图

2.2.1 数码管电路设计

如下图所示为一位共阳数码管的硬件电路连接图,由于数码管内部实际为8个LED灯,如果把LED的阴级直接单片机的IO的口,会使LED通过的电流过大从而把数码管烧毁,因此在设计的时候在LED的阴级和单片机的IO之间加上了限流电阻从而起到限流作用。根据经验,这里选取了1K电阻。程序编写的时候我们预先根据要显示的字符,编写了个对

11

应要显示的数组,这样可以使程序更加简化。

图2-5四位共阳数码管硬件电路连接图

2.3键盘模块设计

2.3.1矩阵键盘原理介绍

矩阵式键盘模式以N个端口连接控制N*N个按键,实时在LED数码管上显示按键信息。显示按键信息,省下了很多的I/O端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。并且在实际应用中经常要用到输入数字、字母、符号等操作功能,如电子密码锁、电话机键盘、计算器按键等,至少都需要12到16个按键。矩阵式键盘简介:矩阵式键盘又称行列键盘,它是用N条I/O线作为行线,N条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为N*N个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。

最常见的键盘布局如图1所示。一般由16个按键组成,在单片机中正好可以用一个P口实现16个按键功能,这也是在单片机系统中最常用的形式,本设计就采用这个键盘模式。

12

图2-6键盘布局

矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。

2.3.2键盘模块设计

图2-7键盘模块电路图

硬件电路设计图如上图所示。把单片机的P2.0-P2.7端口通过8联拨动拨码开关连接到“4*4行列式键盘”,其中P2.0-P2.3作为列线,P2.4-P2.7作为行线,系统首先通过CPU对全部键盘进行扫描,即把第一根行线置为“0”状态,其余行线置于“1”状态,读入输入缓冲器的状态,若其状态全为“1”表明该行无键按下,再将第二根行线置为“0”状态,同样读入输入缓冲器的状态,如其状态也全为“1”,则置第一根行线置为“0”状态,以此类推[5]。如读入输入缓冲器的状态不全为“1”,确定哪一根列线为“0”状态,当某个键的行线和列线都为“0”状态时,表明该键按下。

2.4蜂鸣器模块设计

由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O口是无法直

13

接驱动的,所以要利用放大电路来驱动,一般使用三极管来进行放大电流。

蜂鸣器模块的电路图如下图所示。

图2-8蜂鸣器驱动电路图

14

3.系统软件设计

3.1系统软件总体设计

在本设计中包括了以下主要的程序:主程序,查询程序,非法抢答程序,抢答时间调整程序,回答时间调整程序,倒计时程序,正常抢答处理程序,犯规处理程序,显示程序等。

开始N主持人按下?YN设置定时器其他人按下?Y选手按下?YN显示犯规选手,蜂鸣器响显示按下选手时间递减倒计时到?NY关闭定时器结束

图3-1系统流程图

15

3.2程序设计原理

软件任务分析和硬件电路设计结合进行,哪些功能由硬件完成,哪些任务由软件完成,在硬件电路设计基本定型后,也就基本上决定下来了。

软件任务分析环节是为软件设计做一个总体规划。从软件的功能来看可分为两大类:一类是执行软件,它能完成各种实质性的功能,如测量,计算,显示,打印,输出控制和通信等,另一类是监控软件,它是专门用来协调各执行模块和操作者的关系,在系统软件中充当组织调度角色的软件。这两类软件的设计方法各有特色,执行软件的设计偏重算法效率,与硬件关系密切,千变万化。

软件任务分析时,应将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义(输入输出定义)。在各执行模块进行定义时,将要牵扯到的数据结构和数据类型问题也一并规划好。

各执行模块规划好后,就可以监控程序了。首先根据系统功能和键盘设置选择一种最适合的监控程序结构。相对来讲,执行模块任务明确单纯,比较容易编程,而监控程序较易出问题。这如同当一名操作工人比较容易,而当一个厂长就比较难了。

软件任务分析的另一个内容是如何安排监控软件和各执行模块。整个系统软件可分为后台程序(背景程序)和前台程序。后台程序指主程序及其调用的子程序,这类程序对实时性要求不是太高,延误几十ms甚至几百ms也没关系,故通常将监控程序(键盘解释程序),显示程序和打印程序等与操作者打交道的程序放在后台程序中执行;而前台程序安排一些实时性要求较高的内容,如定时系统和外部中断(如掉电中断)。也可以将全部程序均安排在前台,后台程序为“使系统进入睡眠状态”,以利于系统节电和抗干扰。

智力竞赛抢答器要求有记忆功能,一次时间设置完,复位后不需重新进行时间设定,通过键盘扫描输出按键信息,再通过单片机将它转换成能在七段数码管上显示字型码。

当抢答完毕时,会在数码管上显示抢答者数字号码提示以表示抢答成功,同时显示其分数,分数的加减可有裁判手动进行。采取独立式键盘,可以实现8路抢答。在显示时使用的是七段数码管显示在本设计中根据实际情况采用的是动态显示方法。臂并通过查表发将其在数码管上显示出来,其中P1口为字型码输入端,P2口低6位为字选段输入端。通过查表将字型码送给7段数码管显示的数字。软件去抖动,如果“开始键”

按下就向下执行,否则就跳到开始。采用发声报警,起到报警作用。

主持人按\抢答开始\键,并立刻进入抢答倒计时(预设30s抢答时间),如有选手抢答,会有提示音,并会显示其号数并立刻进入回答倒计时(预

16

设30s抢答时间),不进行抢答查询,所以只有第一个按抢答的选手有效。

如倒计时期间,主持人想停止倒计时可以随时按\停止\按键,系统会

自动进入准备状态,等待主持人按\抢答开始\进入下次抢答计时。

4.系统调试

4.1硬件调试

抢答器的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会刺破带有包皮的导线,则会对电路造成短路现象。

在本抢答器的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:

(1)数码管选用的时候没有注意采用的是共阴还是共阳,导致调试的时候数码管一直不能显示。

解决:把共阴数码管换成数码管。

(2)最开始的时候以为单片机IO口直接可以驱动蜂鸣器发声,后来调试的时候久久不能出声音。

解决:经过查找相关资料,知道扬声器需要三极管来驱动,后来把三极管放大器加上系统便可以正常工作。

4.2软件调试

抢答器是多功能的数字型,可以完成记录最先按下抢答器的选手,并能记录违规操作的选手。抢答器功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。在软件的调试过程中主要遇到的问题如下:

1.烧入程序后,LED数码管显示闪动,而且亮度不均匀。

解决:首先对调用的延时进行逐渐修改,可以解决显示闪动问题。其次,由于本作品使作动态扫描方式显示的数字,动态扫描很快,人的肉眼是无法看出,但是调用的显示程序时,如果不在反回时屏蔽掉最后的附值,则会出现很亮的现象,所以在显示的后面加了屏蔽子令,最后解决了此问题。

2.当用户按下按键的时候,单片机读取的数值跟设定的数值不对。 解决:重新检查矩阵键盘电路的连接,重新建立一个新的对应关系。

4.3调试结果

17

(1)在测试中遇到LED数码管为不显示时,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏.

(2)LED 数码管显示不正常,还有亮度不够,首先使用试测仪对电路进行测试,观察电路是否存在短路现象。查看烧写的程序是否正确无误,对程序进行认真修改。

经过一系列的问题查找后系统最终能正常工作,并完成所有的功能。 以下为系统仿真图:

C1U130pF191P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39P0.038P0.137P0.236P0.335P0.434P0.533P0.632P0.721P2.022P2.123P2.224P2.325P2.426P2.527P2.628P2.710P3.011P3.112P3.213P3.314P3.415P3.516P3.617P3.723456789RESPACK-8P1.1P1.0P1.4P1.6P1.7P1.2P1.3P1.5RP1XTAL1LS1P3.0X1CRYSTAL18C230pFXTAL2SOUNDER9RSTC310uR110K293031PSENALEEAP2.0P2.1P2.2P2.4P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.712345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7AT89C52P2.5P2.6P2.7P2.3 图4-1系统仿真图

18

5.结论

通过这次毕业设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。经过我长时间的设计及调试,本系统基本能实现抢答器的所有功能。但由于仿真系统原因,本设计音频效果不是很好。不足之处有:1.硬件的稳定性有待进一步提高2.系统人性化还不足。

我的综合设计主要涉及硬件和软件两方面的内容,通过这些我的硬件和软件开发能力都获得了提高。首先硬件方面,基本了解了电子产品的开发流程和所要做的工作。基本掌握了Protel99SE原理图的方法,并设计了一个单片机最小系统。通过开发板的设计和硬件搭建的过程,使我对51系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法,如LED数码管,键盘等。并且我学会了分析问题解决问题的能力,加深了对所学理论知识的理解和运用。我的动手能力得到了很大的提高,创新意识得到了锻炼。

19

致谢

该毕业论文是在我的导师李宜滨老师的亲切关怀与细心指导下完成的。虽然李老师工作繁忙,但是在我做毕业设计的每个阶段,从查阅资料到设计草案的确定和修改,中期详细设计,后期论文修改等整个过程中都给予了悉心的指导,一直以来李老师都孜孜不倦的为我答疑解惑,李老师的治学严谨的态度和诲人不倦的精神是我永远学习的榜样,并将积极影响我今后的学习和工作,在此向刘老师致以深深的敬意。另外,我还要感谢那些我曾经教导过我的每一位老师,感谢你们的刻苦钻研技术、对技术精益求精、严谨治学的精神,是你们教会我做人做事的道理及学业知识。

感谢广西大学,给我提供了这么好的学习和生活环境,在校学习和生活的日子是我一生中一段难忘的经历!

在论文即将完成之际,我的心情无法平静,从开始进入设计到论文的顺利完成,有多少可敬的老师、同学、朋友给了我莫大的帮助,在这里请接受我诚挚的谢意!最后我还要感谢含辛茹苦培养我长大的父母,谢

谢你们!

20

参考文献

[1] 彭伟.单片机C语言程序设计实训100例.电子工业出版社.2009年 [2] 吴运昌.模拟电子线路基础.广州:华南理工大学出版社,2004年 [3] 阎石.数字电子技术基础.北京:高等教育出版社,1997年 [4] 张晓丽等.数据结构与算法.北京:机械工业出版社,2002年 [5] 马忠梅等. ARM&Linux嵌入式系统教程.北京:北京航空航天大学出版社,2004年

[6] 李建忠.单片机原理及应用.西安:西安电子科技大学,2002年 [7] 韩志军等.单片机应用系统设计[M].机械工业出版社,2004

[8] 周润景等. Proteus在MCS-51&ARM7系统中的应用百例[M].电子工业出版社,2006

[9] 马忠梅等.单片机的C语言应用程序设计[M].北京航空航天大学出版社,2006

[10] 刘树中,孙书膺,王春平.单片机和液晶显示驱动器串行接口的实现[J].微计算机信息,2007

21

系统整体原理图

附录

1

系统PCB设计图 3440393837363555121110484039383749543635343332103111305312295013281427152616251724182352192251202142434445464741 系统源程序 //**************************************************** //抢答器设计

//****************************************************

//使用说明:本程序为8位抢答器的设计程序具体要求如下: // 要求有违例抢答的判别,即在主持人未发出可 // 以抢答的指令前进行抢答的,要能给出违例抢 // 答的声音提示;当参赛者成功抢答之后,能用 // 五寸以上的数码管显示抢答成功的组别,并给 // 出抢答成功的提示音;主持人发出可以开始抢 // 答指令30秒以后,如果无人进行抢答,能发出 // 与抢答成功不同的声音进行提示,并同时用两 // 位数码管显示倒计时的情况。 #include

//**************************************************** //端口函数说明

//**************************************************** sbit seg_1 = P1^0; //显示选手的数码管

1

sbit seg_2 = P1^3; //显示倒计时的时位 sbit seg_3 = P1^2

; //显示倒计时的个位

sbit key_9 = P1^7; //主持人的按键 sbit beep = P1^4; //蜂鸣器 #define dat P0

#define OPEN 0 //对于共阴和共阳的数码管,他们需要51提供不同的电平来选通,现在是高电平选通

#define OFF 1 //低电平关闭。

#define Key_port P2 //八个选手的案件 P1.0~7分别对应选手1~8

unsigned int T0count=0; //计数器计数 unsigned char Time_Left = 30; //倒计时时间 bit flag1 = 0; //当主持人按下按键时,标志位置1 bit flag2 = 0; //当有选手按下按键时,标志位置1

const unsigned char code seg_dat[]={//实测的数码管的显示,对应数字0~f 0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xff };

unsigned char key_scan(void); //键盘扫描函数,返回值为按下的键的序号

void buzzer(unsigned char t); //蜂鸣器发声函数

void dis_1(unsigned char num1); //1个数码管的显示函数 显示的是哪一位选手按下了

void dis_2(unsigned char num2); //2个数码管的显示函数 显示的是倒计时时间

void delayms(unsigned int i); //延时大约ims void delayus(unsigned int i); //延时大约ius

//**************************************************** //子函数

//**************************************************** unsigned char key_scan(void) //键盘扫描函数 ,返回值为按下的键的序号 {

unsigned char get_port = 0; //每次都清0 Key_port = 0xff; //每次扫描前,先将接键盘的引脚口拉高

1

key_9 = 1; //主持人按键,每次扫描前先拉高 get_port = Key_port; //从端口采回值 if(get_port != 0xff) //如果检测到有键按下 { delayms(10); //延时10ms,进行消抖操作。 get_port = Key_port; //再次采回端口值 if(get_port != 0xff) { get_port = Key_port; switch (Key_port) //标志位置位 并返回相应的值 { case 0xfe:flag2 = 1;return 1; case 0xfd:flag2 = 1;return 2; case 0xfb:flag2 = 1;return 3; case 0xf7:flag2 = 1;return 4; case 0xef:flag2 = 1;return 5; case 0xdf:flag2 = 1;return 6; case 0xbf:flag2 = 1;return 7; case 0x7f:flag2 = 1;return 8; } while(!Key_port); //松手检测 } }

if(key_9 == 0) //如果主持人按下按键 { delayms(10); //延时10ms if(key_9 == 0) //再次判断是否确实按下按键,进行消抖操作。 { flag1 = 1; //标志位置1 return 9; //返回值为9 } while(!key_9); //松手检测 }

return 0; }

1

void buzzer(unsigned char t) //蜂鸣器发声函数,改变传入参数t的值可以改变发出声音 {

unsigned char i; for(i = 0;i<100;i++) { beep = 1; //脉冲使蜂鸣器发声 delayus(t); //控制脉冲周期 可以改变发生频率,即声音 }

beep = 0; //发声完后,端口给低 }

void dis_1(unsigned char num1) //1个数码管的显示函数 显示的是哪一位选手按下了 {

seg_1 = OPEN; //开数码管的显示 seg_2 = OFF; seg_3 = OFF;

dat = seg_dat[num1]; //让数码管显示对应的数值 delayms(5); //短暂的延时可以增加亮度 dat = seg_dat[10]; //关闭显示,避免在动态显示时,这一次的值对下一次的值造成干扰。 }

void dis_2(unsigned char num2) //2个数码管的显示函数 显示的是倒计时时间 {

unsigned char shi,ge;

shi = num2/10; //提取出各个位的值 ge = num2; seg_1 = OFF; seg_2 = OPEN; //开数码管的显示 seg_3 = OFF;

dat = seg_dat[shi]; //让数码管显示十位的数值 delayms(5); //短暂的延时可以增加亮度

1

dat = seg_dat[10]; //关闭显示,避免在动态显示时,这一次的值对下一次的值造成干扰。

seg_1 = OFF; seg_2 = OFF; seg_3 = OPEN; //开数码管的显示

dat = seg_dat[ge]; //让数码管显示十位的数值 delayms(5); //短暂的延时可以增加亮度 dat = seg_dat[10]; //关闭显示,避免在动态显示时,这一次的值对下一次的值造成干扰。 }

void delayms(unsigned int i) //延时大约ims {

unsigned int x,y; for(x = 0;x

void delayus(unsigned int i) //延时大约ius {

unsigned int x; for(x = 0;x

//**************************************************** //主函数

//****************************************************

void main(void) {

unsigned char x=0; //用来储存键值

while(!flag1) //当主持人没有按下按键时,其他人按下按键,蜂鸣器响 {

1

x = key_scan(); while(flag2 == 1) //当主持人没有按下,而其他人按下时,选手数码管上显示犯规选手的序号,同时蜂鸣器发声报警 { buzzer(2); //蜂鸣器发声 dis_1(x); //显示犯规选手的序号 seg_1 = OFF; seg_2 = OPEN; //开数码管的显示 seg_3 = OFF; dat = 0x74; //让数码管显示十位的数值 delayms(5); //短暂的延时可以增加亮度 dat = seg_dat[10]; //关闭显示,避免在动态显示时,这一次的值对下一次的值造成干扰 seg_1 = OFF; seg_2 = OFF; //开数码管的显示 seg_3 = OPEN; dat = 0x74; //让数码管显示十位的数值 delayms(5); //短暂的延时可以增加亮度 dat = seg_dat[10]; //关闭显示,避免在动态显示时,这一次的值对下一次的值造成干扰 } while(flag1) //当主持人按下按键后 设置定时器,开始倒计时 { TMOD = 0x01; //定时器工作模式1 TH0 = (65536 - 50000)/256; //单次计时时间为50ms TL0 = (65536 - 50000)%6; TR0 = 1; //计数器开始计数 ET0 = 1; //开启计数器0中断 EA = 1; //开总中断 } dis_1(0); //初始时,选手的数码管显示0 dis_2(30); //初始时,倒计时的数码管显示30 }

1

flag2 = 0; //主持人标志位清零 x = 0; //键值储存清零 while(!flag2) //此时抢答环节开始,倒计时,并判断是否有选手抢答 { x = key_scan(); if(T0count >= 20 ) //当TOcount=20时,表示计时1s { T0count = 0; //清零 Time_Left --; } if (Time_Left == 0) //当倒计时为0时,蜂鸣器响, { buzzer(20); //蜂鸣器响 dis_2(0); //数码管显示0 dis_1(0); //数码管显示0 TR0 = 0; //关闭定时器 } dis_2(Time_Left); //倒计时显示 dis_1(x); }

TR0 = 0; //关闭定时器 while(1) //整个环节结束,显示倒计时时间和抢搭选手的序号 ,蜂鸣器响 {

dis_2(Time_Left); dis_1(x); buzzer(2); } }

//**************************************************** //T0中断函数

//**************************************************** void timer0(void) interrupt 1 //计数器0中断 {

1

}

TH0 = (65536 - 50000)/256; //重装初值 TL0 = (65536 - 50000)%6; T0count++;

1

本文来源:https://www.bwwdw.com/article/avrg.html

Top