基于51单片机的 6路抢答器

第1章 六路抢答器设计功能要求

单片机把我们带入了智能化的电子领域,许多繁琐的系统若由单片机进行设计,便能收到电路更简单、功能更齐全的良好效果。若把经典的电子系统当作一个僵死的电子系统,那么智能化的现代电子系统则是一个具有“生命”的电子系统。

而随着技术的进步,单片机与串口通信的结合更多地应用到各个电子系统中已成一种趋势。本设计就是基于单片机设计抢答系统,通过串口通信动态传输数据,使抢答系统有了更多更完善的功能。单片机系统的硬件结构给予了抢答系统“身躯”,而单片机的应用程序赋予了其新的“生命”,使其在传统的抢答器面前具有电路简单、成本低、运行可靠等特色。对于抢答器我们大家都知道那是用于选手做抢答题时用的,选手进行抢答,抢到题的选手来回答问题。抢答器不仅考验选手的反应速度同时也要求选手具备足够的知识面和一定的勇气。选手们都站在同一个起跑线上,体现了公平公正的原则。

1.1 数字抢答器的概述

对于抢答器我们大家都知道那是用于选手做抢答题时用的,选手进行抢答,抢到题的选手来回答问题。抢答器不仅考验选手的反应速度同时也要求选手具备足够的知识面和一定的勇气。选手们都站在同一个起跑线上,体现了公平公正的原则。 本实验设计的数字抢答器由主体电路与扩展电路组成。优先编码电路、锁存器、译码电路将参赛队的输入信号在显示器上输出;用控制电路和主持人开关启动报警电路,以上两部分组成主体电路。通过定时电路和译码电路将秒脉冲产生的信号在显示器上输出实现计时功能,构成扩展电路。经过布线、焊接、调试等工作后数字抢答器成形。更具有实用性。

1.2 设计任务与要求

任务:设计一款6路智能抢答器

1、基本要求

(1)抢答器同时供6名选手或6个代表队比赛,分别用6个按钮S1 ~ S6表示。

(2)设置一个系统清除和抢答控制开关,该开关由主持人控制。

(3) 抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,并在LED 数码管上显示,同时扬声器发出报警声响提示。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。

(4)抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(初设15秒)。当主持人启动" 开始" 键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间0.5秒左右,开始抢答指示灯亮。

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

(6)如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示FFF 。

优点:与普通抢答器相比,本作品有以下几方面优势: 1、具有清零装置和抢答控制,可由主持人操纵避免有人在主持人说“开始”前提前抢答违反规则。

2、具有定时功能,在30秒内无人抢答表示所有参赛选手获参赛队对本题弃权。 3、15秒内(抢答时间可以由主持人在1-99s 调整)仍无人抢答其报警电路工作表示抢答时间耗尽并禁止抢答。

1.3 系统主要功能

抢答器原理:该抢答器供不多于6路的抢答比赛使用。每个选手的座位前安装一只抢答按钮开关和一只信号灯。主持人的座位前安装一只复原按钮开关、一只蜂鸣器和一只抢答器工作状态指示灯。每当主持人按下开始键后,哪个队先按下座位上的按钮开关,该座位的信号灯就先被点亮,同时封锁其他按钮开关的活动。并且熄灭主持人座位上的状态指示灯和发出 3 声类似于电话振铃的提示声,以“声明”此次抢答动作已经完成。在主持人确认后,按下复原按钮,状态指示灯重新点亮,并且同时发出“笛——笛——”声,为下一次的抢答作好准备。电

路中的蜂鸣器 LSI 是一只带有助音腔的压电陶瓷蜂鸣器,用于模拟发出报警声的功率放大器和喇叭。在 FM 发声的同时,灯 D6 也在发光。LSI 可以看作是一个电容性负载,本身不能流过直流电流。发声的原理是,作用在两个电极极板的电位在发生变化时,陶瓷材料就发生弯曲,从而振动空气发出声音。按钮开关和指示灯与座位的对应关系如表1所示。

第2章 方案论证

1、抢答器同时供6名选手或6个代表队比赛,分别用6个按钮S1- S6表示。

2、设置一个系统清除和抢答控制开关,该开关由主持人控制。

3、抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,并在共阴极数码管上显示,同时扬声器发出报警声响提示。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。

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

5、参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示FF 6、66路抢答器可以利用硬件电子元器件实现,但电路结构复杂,调试困难,涉及到的外围元件多,不便于安装,实验给实际操作带来很大的麻烦。

如果有选手在规定的时间以前完成问题,主持人通过结束按键复位,开始新的问题作答,因为程序不是很大不需要扩展存储空间,选手按键跳入相应的子程序,回答倒记时,通过单片机实现功能可以更人性化,只需单电源供电更方便,

容易实现。电路结构简单,外围扩展的电路不是很多,锻炼我们所学的知识应用到现实生活当中。为我们提供实践的机会。单片机是电子专业发展的方向,更好的使用单片机可以是我们的产品小型化,使用更方便,性能更稳定,功能更齐全,所以我们选用单片机加一定的外围设备实现本次课程设计的要求

第3章 抢答器的系统概述

3.1 系统的主要功能

本系统是借用单片机采用模块化设计的智能抢答器,主控与参赛者设为终端分系统。参赛者分系统设有:抢答按纽、计时显示、提示功能等(根据需要可另设或多设相关功能);主控分系统有:开始与结束控制按钮、时限设定、各种相关显示调控功能等(根据需要也可另设或多设相关功能)。

参赛者系统,除享有抢答按纽的权利功能外,还有人性化的提示功能和时间提示功能,也可设定由主控控制在参赛者终端表现的趣味性功能等;主控系统的控制按钮做开始与结束控制,根据活动参赛者的层次,对提前抡答者的行为设定为非法或阻隔,若设有非法抢答控制功能时,在主控处带有公示性显示的非法抡答者的台位号,对抢答限时及回答问题限时设为倒计时式,并有公示性显示。

图3-1 系统主要功能模块

本系统采用模块化设计智能抢答器,在抢答比赛中广泛应用,各组分别有一

个抢答按钮。主持人有开始和结束复位键。在后台主持人可以修改,抢答时间和选手回答问题的时间设置,原始状态下抢答时间为15s ,通过加键和减键修改抢答时间,改完后结束键确定,新时间开始有效,回答问题时间为30s 。主持人按键开始后,选手开始抢答为有效,数码显示屏显示抢答时间倒计时和选手号,选手相应的指示灯点亮,在最后五秒扬声器发生提示。如果主持人没有按下开始键而选手就抢答视为犯规,数码显示屏显示犯规者的代号,扬声器持续发声。主持人可按键结束,新一轮抢答开始。系统的主要功能模块方框图如2-1所示。

抢答主板:抢答主板是整个抢答器的核心,其关键是单片机AT89C51。内部电路设计用汇编语言编写。它完成了时间参数的设定,抢按号码的译码,保存;显示;输出,抢按及答题倒计时功能等。

显示及指示:本设计中,有一个共阴的数码管组,四个数码管。其中两个显示时间,一个空位,一个显示抢答号码。主持人依次按下结束键,开始键后开始抢答。可以抢按:超时数码管显示“FFF ”,当抢按超过规定时间或答题超过规定时间后数码管显“FFF ”。若有选手在规定时间内抢按成功,则可以答题,数码管显示抢答时间的同时也显示选手号码。若在按开始键前抢答表示违规,数码管显示“FF ”并显示选手号码。

3.2 系统需求分析

1、在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效。

2、抢答限定时间和回答问题的时间可是在1~99s 设定。

3、可以显示是哪位选手有效抢答和无效抢答,正确按键后有音乐提示。

4、抢答时间和回答问题时间倒记时显示,时间完后系统自动复位。

5、按键锁定,在有效状态下,按键无效非法。

3.3 抢答器的工作流程

抢答器的基本工作原理:在抢答竞赛或呼叫时,有多个信号同时或不同时送入主电路中,抢答器内部的寄存器工作,并识别、记录第一个号码,同时内部的定时器开始工作,记录有关时间并产生超时信号。在整个抢答器工作过程中,显示电路、语音电路等还要根据现场的实际情况向外电路输出相应信号。抢答器的

工作流程分为、系统复位、正常流程、违例流程等几部分,如图3-2所示,下面分别予以介绍。如图2-2所示

图3-2 抢答流程图

3.4 抢答器的工作过程

1、如果想调节抢答时间或答题时间, 按" 加一" 键或" 减一" 键进入调节状态, 此时会显示现在设定的抢答时间值, 如想加一秒按一下" 加1s" 键, 如果想减一秒按一下" 减1s" 键,时间数码管上会显示改变后的时间,调整范围为0~99s, 0s 时再减1s 会跳到99,99s 时再加1s 会变到0s 。

2、主持人按" 抢答开始" 键,会有提示音,指示灯“START ”点亮,并立刻进入抢答倒计时(预设15s 抢答时间),如有选手抢答,会有提示音,且选手对应的指示灯点亮,并会显示其号数并立刻进入回答倒计时(预设30s 抢答时间),不进行抢答查询,所以只有第一个按抢答的选手有效。倒数时间到小于5s 会每秒响一下提示音。

3、如倒计时期间,主持人想停止倒计时可以随时按" 停止" 按键,系统会自动进入准备状态,等待主持人按" 抢答开始" 进入下次抢答计时。

4、如果主持人未按" 抢答开始" 键,而有人按了抢答按键,犯规抢答,LED 上不断闪烁FF 和犯规号数并响个不停,直到按下" 停止" 键为止。

总而言之,本课题利用AT89C51单片机及外围接口实现的抢答系统设计了抢答器,该抢答器增加了新功能、提高了系统的可靠性、简化了电路结构、节约了成本,是一个实用的工程设计。

3.5 AT89C51的功能及简介2.7.2 AT89C51单片机

本次课设使用的微控制器为ATMAL 公司生产的AT89C51,该芯片货源充足,并且价格也比较便宜。

1、AT89C51简介

AT89C51是一种带4K 字节FLASH 存储器(FPEROM —Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K 字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL 高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU 和闪速存储器组合在单个芯片中,ATMEL 的AT89C51是一种高

效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。现在AT89S51/52已经取代了AT89C51/52。

图3-3 AT89C51封装图

2、主要特性

、与MCS-51 兼容

、4K 字节可编程FLASH 存储器

、寿命:1000写/擦循环

、数据保留时间:10年

、全静态工作:0Hz-24MHz

、三级程序存储器锁定

、128×8位内部RAM

、32可编程I/O线

、两个16位定时器/计数器

、5个中断源

、可编程串行通道

、低功耗的闲置和掉电模式

、片内振荡器和时钟电路

3、特性概述

AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM ,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz 的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU 的工作,

但允许

RAM ,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。 4管脚说明

VCC :供电电压。

GND :接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL 门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH 编程时,P0 口作为原码输入口,当FIASH 进行校验时,P0输出原码,此时P0外部必须接上拉电阻。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL 门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1口作为低八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL 门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH 编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL 门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL )这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如下表所示:

口管脚 备选功能

P3.0 RXD(串行输入口)

P3.1 TXD(串行输出口)

P3.2 /INT0(外部中断0)

P3.3 /INT1(外部中断1)

P3.4 T0(计时器0外部输入)

P3.5 T1(计时器1外部输入)

P3.6 /WR(外部数据存储器写选通)

P3.7 /RD(外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST :复位输入。当振荡器复位器件时,要保持RST 脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE 脉冲。如想禁止ALE 的输出可在SFR8EH 地址上置0。此时, ALE只有在执行MOVX ,MOVC 指令是ALE 才起作用。另外,该引脚被略微拉高。如果微

处理器在外部执行状态ALE 禁止,置位无效。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH ),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET ;当/EA端保持高电平时,此间内部程序存储器。在FLASH 编程期间,此引脚也用于施加12V 编程电源(VPP )。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:来自反向振荡器的输出。

振荡器特性:

XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

5、芯片擦除

整个PEROM 阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE 管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。

此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU 停止工作。但RAM ,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM 的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。

6、串口通讯

单片机的结构和特殊寄存器,这是你编写软件的关键。至于串口通信需要用到那些特殊功能寄存器呢,它们是SCON ,TCON ,TMOD ,SCON 等,各代表什么含义呢? SBUF 数据缓冲寄存器这是一个可以直接寻址的串行口专用寄存器。有朋友这样问起过“为何在串行口收发中,都只是使用到同一个寄存器SBUF ?而不是收发各用一个寄存器。”实际上SBUF 包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都共同使用同一个寻址地址-99H 。CPU 在读SBUF 时会指到接收寄存器,在写时会指到发送寄存器,而且接收寄存器是双缓冲寄存器,这样可以避免接收中断没有及时的被响应,数据没有被取走,下一帧数据已到来,而造成的数据重叠问题。发送器则不需要用到双缓冲,一般情况下我们在写发送程序时也不必用到发送中断去外理发送数据。操作SBUF 寄存器的方法则很简单,只要把这个99H 地址用关键字sfr 定义为一个变量就可以对其进行读写操作了,如sfr SBUF = 0x99;当然你也可以用其它的名称。通常在标准的reg51.h 或at89x51.h 等头文件中已对其做了定义,只要用#include 引用就可以了。

SCON 串行口控制寄存器通常在芯片或设备中为了监视或控制接口状态,都会引

用到接口控制寄存器。SCON 就是51 芯片的串行口控制寄存器。它的寻址地址是98H ,是一个可以位寻址的寄存器,作用就是监视和控制51 芯片串行口的工作状态。51 芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON 寄存器。它的各个位的具体定义如下:

SM0 SM1 SM2 REN TB8 RB8 TI RI

SM0、SM1 为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。串行口工作模式设置。

SM0 SM1 模式 功能 波特率

0 0 0 同步移位寄存器 fosc/12

0 1 1 8位UART 可变

1 0 2 9位UART fosc/32 或fosc/64

1 1 3 9位UART 可变

在这里只说明最常用的模式1,其它的模式也就一一略过,有兴趣的朋友可以找相关的硬件资料查看。表中的fosc 代表振荡器的频率,也就是晶振的频率。UART 为(Universal Asynchronous Receiver)的英文缩写。

SM2 在模式2、模式3 中为多处理机通信使能位。在模式0 中要求该位为0。 REM 为允许接收位,REM 置1 时串口允许接收,置0 时禁止接收。REM 是由软件置位或清零。如果在一个电路中接收和发送引脚P3.0,P3.1 都和上位机相连,在软件上有串口中断处理程序,当要求在处理某个子程序时不允许串口被上位机来的控制字符产生中断,那么可以在这个子程序的开始处加入REM=0 来禁止接收,在子程序结束处加入REM=1 再次打开串口接收。大家也可以用上面的实际源码加入REM=0 来进行实验。

TB8 发送数据位8,在模式2 和3 是要发送的第9 位。该位可以用软件根据需要置位或清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址帧还是数据帧。

RB8 接收数据位8,在模式2 和3 是已接收数据的第9 位。该位可能是奇偶位,地址/数据标识位。在模式0 中,RB8 为保留位没有被使用。在模式1 中,当SM2=0,RB8 是已接收数据的停止位。

TI 发送中断标识位。在模式0,发送完第8 位数据时,由硬件置位。其它模式中则是在发送停止位之初,由硬件置位。TI 置位后,申请中断,CPU 响应中断后,发送下一帧数据。在任何模式下,TI 都必须由软件来清除,也就是说在数据写入到SBUF 后,硬件发送数据,中断响应(如中断打开),这时TI=1,表明发送已完成,TI 不会由硬件清除,所以这时必须用软件对其清零。

RI 接收中断标识位。在模式0,接收第8 位结束时,由硬件置位。其它模式中则是在接收停止位的半中间,由硬件置位。RI=1,申请中断,要求CPU 取走数据。但在模式1 中,SM2=1时,当未收到有效的停止位,则不会对RI 置位。同样RI 也必须要靠软件清除。常用的串口模式1 是传输10 个位的,1 位起始位为0,8 位数据位,低位在先,1 位停止位为1。它的波特率是可变的,其速率是取决于定时器1 或定时器2 的定时值(溢出速率)。AT89C51 和AT89C2051 等51 系列芯片只有两个定时器,定时器0 和定时器1,而定时器2是89C52 系列芯片才有的。

波特率在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。波特率是指串行端口每秒内可以传输的波特位数。有一些初学的朋友认为波特率是指每秒传输的字节数,如标准9600 会被误

认为每秒种可以传送9600个字节,而实际上它是指每秒可以传送9600 个二进位,而一个字节要8 个二进位,如用串口模式1 来传输那么加上起始位和停止位,每个数据字节就要占用10 个二进位,9600 波特率用模式1 传输时,每秒传输的字节数是9600÷10=960 字节。51 芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M 的晶振来计算,那么它的波特率可以达到1M 。模式2 的波特率是固定在fosc/64 或fosc/32,具体用那一种就取决于PCON 寄存器中的SMOD 位,如SMOD 为0,波特率为focs/64,SMOD 为1,波特率为focs/32。模式1 和模式3 的波特率是可变的,取决于定时器1 或2(52 芯片)的溢出速率。那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。

波特率=(2SMOD ÷32)×定时器1 溢出速率

上式中如设置了PCON 寄存器中的SMOD 位为1 时就可以把波特率提升2 倍。通常会使用定时器1 工作在定时器工作模式2 下,这时定时值中的TL1 做为计数,TH1 做为自动重装值 ,这个定时模式下,定时器溢出后,TH1 的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式2 下定时器1 溢出速率的计算公式如下:

溢出速率=(计数速率)/(256-TH1)

上式中的“计数速率”与所使用的晶体振荡器频率有关,在51 芯片中定时器启动后会在每一个机器周期使定时寄存器TH 的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51 芯片的计数速率为晶体振荡器频率的1/12,一个12M 的晶振用在51 芯片上,那么51 的计数速率就为1M 。通常用11.0592M 晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。如我们要得到9600 的波特率,晶振为11.0592M 和12M ,定时器1 为模式2,SMOD 设为1,分别看看那所要求的TH1 为何值。代入公式:

11.0592M

9600=(2÷32)×((11.0592M/12)/(256-TH1))

TH1=250

12M

9600=(2÷32)×((12M/12)/(256-TH1))

TH1≈249.49

上面的计算可以看出使用12M 晶体的时候计算出来的TH1 不为整数,而TH1 的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600 波特率。当然一定的误差是可以在使用中被接受的,就算使用11.0592M 的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。

7、AT89C51特殊功能寄存器

特殊功能寄存器也称专用寄存器,是具有特殊功能的所有寄存器的集合,简称SFR (Special Function Register)。特殊功能寄存器共含有22个不同寄存器。它们的地址分配在80H ~FFH 中,即在RAM 地址中。虽然特殊功能寄存器地址在80H ~FFH 之中,但在80H ~FFH 的地址单元中,不是所有的单元都被特殊

功能寄存器占用,未被占用的单元,其内容是不确定的,如果对这些单元进行操作,得到的是一些随机数,而写入则无效。所以,用户编程时不应该将数据写入这些未确定的地址单元,它们是公司留待将来开发新产品时使用的。

8、AT89C51单片机的内部结构图

AT89C51单片机内部由CPU 、4KB 的FPEROM ,128B 的RAM ,两个16位的定时/计数器T0和T1,4个8位的I/O端P0、P1、P2、P3等组成。单片微机内部最核心的部分是CPU 。CPU 主要功能是产生各种控制信号,控制存储器、输入/输出端口的数据传输、数据的算术运算、逻辑运算以及位操作处理等,CPU 按其功能可分为运算器和控制器两部分。控制器由程序计数器PC 、指令储存器、指令译码器、实时控制与条件转移逻辑电路等组成。它的功能是对来自存储器中的指令进行译码,通过实时控制电路,在规定的时刻发出各种操作所需的内部和外部的控制信号,使各部分协调工作,完成指令所规定的操作。运算器由算术逻辑器部件ALU 、累加器ACC 、暂存器、程序状态字寄存器PSW ,BCD 码运算调整电路等组成。

图3-4 AT89C51单片机的内部结构图

为了提高数据处理和位操作功能,片内增加了一个通用寄存器B 和一些专用寄存器,还增加了位处理逻辑电路的功能, 其内部结构如图2-4所示。

第4章 系统硬件设计

为使硬件电路设计尽可能合理,应注意以下几方面:

(1) 尽可能采用功能强的芯片,以简化电路,功能强的芯片可以代替若干普通芯片,随着生产工艺的提高,新型芯片的的价格不断下降,并不一定比若干普通芯片价格的总和高。

(2) 留有设计余地。在设计硬件电路时,要考虑到将来修改扩展的方便。因为很少有一锤定音的电路设计,如果现在不留余地,将来可能要为一点小小的修改或扩展而被迫进行全面返工。

(3) 程序空间,选用片内程序空间足够大的单片机,本设计采用AT89C51单片机。

(4) I/O端口,在样机研制出来后进行现场试用时,往往会发现一些被忽视的问题,而这些问题不是靠单纯的软件措施来解决的。如有些新的信号需要采集,就必须增加输入检测端;有些物理量需要控制,就必须增加输出端。如果在硬件电路设计就预留出一些I/O端口,虽然当时空着没用,那么用的时候就派上用场了。

4.1 单片机控制系统原理图

如图3-1,使用AT89C51单片机,P1.0为开始抢答,P1.7为停止,P1.1-P1.6为六路抢答输入,P3.0、 P3.1、P3.7通过与74LS138 3线8线译码器相连扩展接口,控制7个指示灯,数码管段选P0口,位选P2口低3位,蜂鸣器输出为P3.6口。P3.2为抢答时间加1S 调整,P3.3为时间减1S 调整(主持人可以根据问题的不同难度,适当调整抢答的时间)。

图4-1 抢答器原理图

4.2 单片机主机系统电路

该六路抢答器的设计细分为时钟频率电路的设计,复位电路的设计,显示电路的设计和键盘扫描电路的设计等。

4.3 时钟频率电路的设计

单片机必须在时钟的驱动下才能工作. 在单片机内部有一个时钟振荡电路, 只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元, 决定单片机的工作速度,这里所用的时钟振荡电路频率为12MHZ 。

图4-2 外部振荡源电路

一般选用石英晶体振荡器。此电路在加电大约延迟10ms 后振荡器起振, 在XTAL2引脚产生幅度为3V 左右的正弦波时钟信号, 其振荡频率主要由石英晶振的频率确定。电路中两个电容 C1,C2的作用有两个:一是帮助振荡器起振; 二是对振荡器的频率进行微调。C1,C2的典型值为30PF 。

单片机在工作时, 由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。其大小是时钟信号频率的倒数, 常用fosc 表示。此时时钟频率为12MHz, 即fosc=12MHz,则时钟周期为1/12µs。

4.4 复位电路的设计

单片机的第9脚RST 为硬件复位端, 只要将该端持续4个机器周期的高电平即可实现复位, 复位后单片机的各状态都恢复到初始化状态,其电路图如图3-3所示:

图4-3 复位电路

值得注意的是, 在设计当中使用到了硬件复位和软件复位两种功能, 由上面的硬件复位后的各状态可知寄存器及存储器的值都恢复到了初始值, 而前面的功能介绍中提到了倒计时时间的记忆功能, 该功能的实现的前提条件就是不能对单片机进行硬件复位, 所以设定了软复位功能。软复位实际上就是当程序执行完毕之后, 将程序指针通过一条跳转指令让它跳转到程序执行的起始地址。

4.5 显示电路的设计

显示功能与硬件关系极大,当硬件固定后,如何在不引起操作者误解的前提下提供尽可能丰富的信息,全靠软件来解决。

4.6 显示模块在系统软件中的安排

操作者主要设计从显示设备上获取微机系统的信息的,因此,操作者每操作一下,显示设备商都应该有一定的反应。这说明,显示模块与操作有关,即监控程序是需要调用显示模块。不同的操作需要显示不同的内容,这又说明各执行模块对显示模块的驱动方式是不同的。另一方面,在操作者没有进行操作时,显示内容也是变化的,如显示现场各物理量的变化情况。这时显示模块不是由操作者通过命令键来驱动,而是由各类自动执行的功能模块来驱动。自动执行的各类模块在安排在各种中断子程序中,这就是说,各种中断子程序也要调用显示模块。如果监控安排在中断子程序中,两者的要求就统一了,问题比较好解决,如果监控程序安排在主程序中,在监控程序调用显示模块的过程中发生了中断,中断子程序也调用显示模块,这时就容易出问题。一种比较妥善的办法是只让一处调用显示模块,其他各处均不得直接调用显示模块,但有权申请显示。这就要设置一个显示申请标志,当某模块需要显示时,将申请标志置位,同时设定有关显示内容(或指针)。由于一处调用显示模块,故不会发生冲突。为了使显示模块能及时反应系统需要,应将显示模块安排在一个重复执行的循环(如监控循环或时钟中断子程序)中。当监控程序(键盘解释程序)安排在时钟中断子程序中时,处理比较方便,只要在监控程序的汇合处调用显示模块就可以了。例如用DISP 作显示申请标志,就可以这样安排显示模块的调用,即

DISP BIT 2DH.4 ;显示申请标志

SKEYEND: JNB DISP,RETI0 ;有显示申请否?

LCALL DISPLAY ;调用显示模块,更新显示内容 CLR DISP ;清除申请

RETI ;中断返回

KEYEND 为键盘解释程序的最后汇集点,这时如果发现有显示申请,就进行集中操作,更新显示内容,否则就跳过这一步。

这里将显示功能集中到一起,作为一个功能模块,就要求它的功能全面,能根据系统软件提供的信息自动完成显示内容的查找,变换和输出驱动。这样设计使得各功能模块都不必考虑显示问题,只要给出一个简单的信息(如显示格式编码)甚至不用再提供额外信息,直接利用当前状态变量和软件标志就可以完成所需的显示要求。

如果编写这样一个集中显示模块有困难,也可以将显示模块编小一些,只完成显示缓冲区的内容输出到显示器件上的工作。这时各功能模块在提出显示申请时,还需要将显示内容按需要的格式送入显示缓冲区中。这样分而治之比较容易编程,但要小心出现显示混乱。例如后台程序需要调用显示,将有关信息送入到现实缓冲区进行显示;中断返回后,后台程序继续送完后半部分显示内容,但前半部分内容已经变了,这样就出现了显示错误。解决的办法是,在申请显示前,先检查是否已经有显示申请,如果有,就不再申请,等待下次机会;如果没有,则先申请标志位,再将显示内容送入显示缓冲区。这时就不必担心其他前台模块来打扰了,就可以得到一次完整的显示机会。

在这里我们使用的是七段数码管显示,通常在显示上我们采用的方法一般包括两种:一种是静态显示,一种是动态显示。其中静态显示的特点是显示稳定不闪烁,程序编写简单,但占用端口资源多;动态显示的特点是显示稳定性没静态好,程序编写复杂,但是相对静态显示而言占用端口资源少。在本设计中根据实际情况采用的是动态显示方法。并通过查表法,将其在数码管上显示出来,其中P0口为字型码输入端,P2口低3位为字选段输入端。在这里我们通过查表将字型码送给7段数码管显示的数字,

MOV A,R5

MOVC A,@A+DPTR ;查字型码

MOV P2,#01H ;送位选码

MOV P0,A ;送字型码

ACALL DELAY ;调延时,去闪烁

1、在七段数码管显示中可分为共阳极和共阴极两种类型极。以共阴为例,要想a 段亮,向a 段送1就是,返之送0,共阳刚好相反。数码管与P0口相接,P0口作为I/O口使用,外接10K Ω上拉电阻。

图4-4 共阴极数码管显示电路

2、按键对应的指示灯。通过74ls138 3线8线译码器与P3.0、P3.1、P3.7相连扩展接口,可以控制7指示灯,六路抢答S0-S7对应D1-D7灯,开始键对应START 灯。当有按键按下时,对应的指示灯点亮。

图4-5 按键指示灯电路

4.7 键盘扫描电路的设计

键盘是人与微机系统打交道的主要设备。关于键盘硬件电路的设计方法也可以在文献和书籍中找到,配合各种不同的硬件电路,这些书籍中一般也提供了相应的键盘扫描程序。站在系统监控软件设计的立场上来看,仅仅完成键盘扫描,读取当前时刻的键盘状态是不够的,还有不少问题需要妥善解决,否则,人们在操作键盘就容易引起误操作和操作失控现象。在单片机应用中键盘用得最多的形式是独立键盘及矩阵键盘。

其中独立键盘硬件电路简单,而且在程序设计上也不复杂,一般用在对硬件电路要求不高的简单电路中;矩阵键盘与独立键盘有很大区别,首先在硬件电路上它要比独立键盘复杂得多,而且在程序算法上比它要烦琐,但它在节省端口资源上有优势得多,因此它更适合于多按键电路。其次就是消除在按键过程中产生的“毛刺”现象。抢答器使用的按键数量较少,故采用独立按键,使用延时重复扫描法,延时法的原理为:因为“毛刺”脉冲一般持续时间短,约为几ms ,而我们按键的时间一般远远大于这个时间, 所以当单片机检测到有按键动静后再延时一段时间(这里我们取7ms) 后再判断此电平是否保持原状态, 如果是则为有效按键,否则无效。

图4-6 6路抢答按键电路

图4-7 启动和结束按键电路

图4-8 抢答时间调整电路

4.8 发声

我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调,使喇叭发出不同的声音。

图4-9 扬声器电路

4.9 系统复位

使CPU 进入初始状态,从0000H 地址开始执行程序的过程叫系统复位。

从实

现系统复位的方法来看,系统复位可分为硬件复位和软件复位。硬件复位必须通过CPU 外部的硬件电路给CPU 的RESET 端加上足够时间的高电位才能实现。上电复位,人工按钮复位和硬件看门狗复位均为硬件复位。硬件复位后,各专用寄存器的状态均被初始化,且对片内通用寄存器的内容没有影响。但是,硬件复位还能自动清除中断激活标志,使中断系统能够正常工作,这样一个事实却容易为不少编码人员所忽视。软件复位就是用一系列指令来模拟硬件复位功能,最后通过转移指令使程序从0000H 地址开始执行。对各专用寄存器的复位操作是容易的,也没有必要完全模拟,可根据实际需要去主程序初始化过程中完成。而对中断激活标志的清除工作常被遗忘,因为它没有明确的位地址可供编程。有的编程人员用020000(LJMP 0000H)作为软件陷阱,认为直接转向0000H 地址就完成了软件复位,就是这类错误的典型代表。软件复位是使用软件陷阱和软件看门狗后必须进行的工作,这时程序出错完全有可能发生在中断子程序中,中断激活标志已置位,它将阻止同级中断响应。由于软件看门是高级中断,它将阻止说要中断响应,由此可见清除中断激活标志的重要性。

在所有的指令中,只有RETI 指令能够清除中断激活标志。前文各处提案到的出错处理程序ERR 主要完成这一功能,其他的善后工作交由复位后的系统去完成。这部分程序如下:

POWER DATA 67H ;上电标志存放单元 ERR: CLR EA ;关中断 MOV DPTR,#ERR1 ;准备返回地址

PUSH DPL PUSH DPH

RETI ;清除高级中断激活标志

ERR1: MOV POWER,#0AAH;重建上电标志 CLR A ;准备复位地址 PUSH ACC ;压入复位地址0000H

PUSH ACC

RETI ;清除低级中断激活标志,从程序0000H 开始执行。

这段程序先关中断,以便后续处理能顺利进行,然后用两个RETI 指令代替

两个LJMP 指令,从而清除了两级中断激活标志。有相应软件陷阱捕捉来的程序可能没有全部激活两个标志,这也无妨。

第5章 软件设计

5.1 主程序系统结构图

图5-1软件系统结构图

5.2软件任务分析

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

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

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

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

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

5.3 程序流程图

在本设计中包括了以下八个主要的程序:主程序;非法抢答序;抢答时间调整程序;回答时间调整程序;倒计时程序;正常抢答处理程序;犯规处理程序;显示及发声程序。主流程图如4-2所示。

图5-2 程序设计流程图

第6章 实验仿真系列组图

汇编程序仿真:

PROTEUS 仿真系列图: 启动抢答器:

按下开始键:

扬声器响,指示灯“start ”亮

无人抢答:

没人抢答,倒计时5s ,扬声器1s 响一次:

抢答键S2按下:

扬声器响,D2点亮,数码管显示倒计时和抢答号2

抢答键S5按下:

扬声器响,D5点亮,数码管显示倒计时和抢答号5

违规抢答:

开始键没按下,S2抢答: 数码管闪烁“FF ”,显示2

调整抢答时间

使用“加1s ”键增加抢答时间

使用“减1s ”键减少抢答时间

结束复位:

主持人按下结束键:

第8章 实验程序

OK EQU 20H;抢答开始标志位

RING EQU 22H;响铃标志位 ORG 0000H AJMP MAIN ORG 0003H AJMP INT0SUB ORG 000BH AJMP T0INT

ORG 0013H AJMP INT1SUB ORG 001BH AJMP T1INT ORG 0040H

MAIN: MOV R1,#0FH MOV R2,#0AH MOV TMOD,#11H MOV TH0,#0F0H MOV TL0,#0FFH MOV TH1,#3CH

MOV TL1,#0B0H;50ms为一次溢出中断

SETB EA SETB ET0 SETB ET1 SETB EX0 SETB EX1 CLR OK CLR RING

SETB TR1

SETB TR0 ;=====查询程序===== START: SETB P3.0 SETB P3.1 SETB P3.7

MOV R5,#0BH MOV R4,#0BH MOV R3,#0BH ACALL DISPLAY

JB P1.0,NEXT ACALL DELAY

JB P1.0,NEXT; 去抖动, 如果" 开始键" 按下就向下执行, 否者跳到非法抢答查询

ACALL BARK;按键发声

CLR P3.0 SETB P3.1 SETB P3.7 MOV A,R1

MOV R6,A;送R1->R6,因为R1中保存了抢答时间

SETB OK;抢答标志位, 用于COUNT 程序中判断是否查询抢答

MOV R3,0AH;抢答只显示计时, 灭号数

AJMP COUNT;进入倒计时程序," 查询有效抢答的程序" 在COUNT 里面

NEXT: JNB P1.1,FALSE1 JNB P1.2,FALSE2 JNB P1.3,FALSE3 JNB P1.4,FALSE4 JNB P1.5,FALSE5 JNB P1.6,FALSE6 AJMP START

;=====非法抢答处理程序===== FALSE1: ACALL BARK MOV R3,#01H AJMP ERROR FALSE2: ACALL BARK MOV R3,#02H

AJMP ERROR

FALSE3: ACALL BARK MOV R3,#03H AJMP ERROR FALSE4: ACALL BARK MOV R3,#04H AJMP ERROR FALSE5: ACALL BARK MOV R3,#05H AJMP ERROR FALSE6: ACALL BARK MOV R3,#06H AJMP ERROR

;=====INT0(抢答时间R1调整程序)===== INT0SUB:MOV A,R1 MOV B,#0AH

DIV AB MOV R5,A MOV R4,B MOV R3,#0AH ACALL DISPLAY

JNB P3.2,INC0;P3.2为+1s键, 如按下跳到INCO JNB P3.3,DEC0;P3.3为-1s 键, 如按下跳到DECO JNB P1.7,BACK0;P1.7为确定键, 如按下跳到BACKO AJMP INT0SUB INC0: MOV A,R1

CJNE A,#63H,ADD0;如果不是99,R2加1, 如果加到99了,R1就置0,重新加起。

MOV R1,#00H ACALL DELAY1

AJMP INT0SUB ADD0: INC R1

ACALL DELAY1 AJMP INT0SUB DEC0: MOV A,R1

JZ SETR1;如果R1为0, R1就置99, DEC R1

ACALL DELAY1 AJMP INT0SUB SETR1: MOV R1,#63H ACALL DELAY1 AJMP INT0SUB BACK0: RETI

;=====INT1(回答时间R2调整程序)===== INT1SUB:MOV A,R2 MOV B,#0AH DIV AB MOV R5,A MOV R4,B MOV R3,#0AH ACALL DISPLAY JNB P3.2,INC1 JNB P3.3,DEC1 JNB P1.7,BACK1 AJMP INT1SUB INC1: MOV A,R2

CJNE A,#63H,ADD1 MOV R2,#00H ACALL DELAY1

AJMP INT1SUB

ADD1: INC R2

ACALL DELAY1 AJMP INT1SUB DEC1: MOV A,R2 JZ SETR2 DEC R2

ACALL DELAY1 AJMP INT1SUB SETR2: MOV R2,#63H ACALL DELAY1 AJMP INT1SUB BACK1: RETI

;=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)===== COUNT: MOV R0,#0000 MOV TH1,#3CH MOV TL1,#0B0H

RECOUNT:MOV A,R6;R6保存了倒计时的时间, 之前先将抢答时间或回答时间给R6 MOV B,#0AH

DIV AB;除十分出个位/十位 MOV 30H,A;十位存于(30H) MOV 31H,B;个位存于(31H) MOV R5,30H;取十位 MOV R4,31H;取个位 MOV A,R6 SUBB A,#07H

JNC LARGER;大于5s 跳到LARGER, 小于等于5s 会提醒 MOV A,R0

CJNE A,#0AH,FULL;1s中0.5s 向下运行 CLR RING AJMP CHECK

FULL: CJNE A,#14H,CHECK;下面系1s 的情况, 响并显示号数并清R0, 重新计时 SETB RING MOV A,R6

JZ QUIT;计时完毕 MOV R0,#00H

DEC R6;一秒标志减1 AJMP CHECK LARGER: MOV A,R0

CJNE A,#14H,CHECK;如果1s 向下运行, 否者跳到查" 停/显示" DEC R6;计时一秒R6自动减1

MOV R0,#00H

CHECK: JNB P1.7,QUIT;如按下停止键退出 ACALL DISPLAY

JB OK,ACCOUT; 如果是抢答倒计时, 如是则查询抢答, 否者跳过查询继续倒数

AJMP RECOUNT ACCOUT: JNB P1.1,TRUE1 JNB P1.2,TRUE2 JNB P1.3,TRUE3 JNB P1.4,TRUE4 JNB P1.5,TRUE5 JNB P1.6,TRUE6 AJMP RECOUNT

QUIT: CLR OK;如果按下了" 停止键" 执行的程序 CLR RING AJMP START

;=====正常抢答处理程序===== TRUE1: ACALL BARK;按键发声 CLR P3.0 CLR P3.1 CLR P3.7 MOV A,#1EH;抢答后回答时间30s MOV R6,A;抢答时间R2送R6

MOV R3,#01H

CLR OK;因为答题的计时不再查询抢答, 所以就锁了抢答 AJMP COUNT TRUE2:ACALL BARK; SETB P3.0 CLR P3.1 CLR P3.7 MOV A,#1EH MOV R6,A MOV R3,#02H CLR OK

AJMP COUNT TRUE3:ACALL BARK; CLR P3.0 SETB P3.1 CLR P3.7

MOV A,#1EH MOV R6,A MOV R3,#03H CLR OK

AJMP COUNT TRUE4:ACALL BARK; SETB P3.0 SETB P3.1 CLR P3.7

MOV A,#1EH MOV R6,A MOV R3,#04H CLR OK

AJMP COUNT TRUE5: ACALL BARK; CLR P3.0 CLR P3.1 SETB P3.7

MOV A,#1EH MOV R6,A MOV R3,#05H CLR OK

AJMP COUNT TRUE6: ACALL BARK; SETB P3.0 CLR P3.1 SETB P3.7

MOV A,#1EH MOV R6,A

MOV R3,#06H CLR OK

AJMP COUNT ;=====犯规抢答程序===== ERROR: MOV R0,#00H MOV TH1,#3CH MOV TL1,#0B0H

MOV 34H,R3;犯规号数暂存与(34H) HERE: MOV A,R0

CJNE A,#0AH,FLASH;0.5s向下运行->灭并停响 CLR RING

MOV R3,#0AH MOV R4,#0AH

MOV R5,#0AH;三灯全灭 AJMP CHECK1

FLASH: CJNE A,#14H,CHECK1;下面系1s 的情况, 响并显示号数并清R0, 重新计 SETB RING MOV R0,#00H

MOV R3,34H;取回号数 MOV R5,#0BH

MOV R4,#0BH;显示FF 和号数 AJMP CHECK1 CHECK1: JNB P1.7,QUIT1 ACALL DISPLAY AJMP HERE QUIT1: CLR RING CLR OK

AJMP START ;=====显示程序=====

; 入口参数:R5,R4,R3存入的分别为第一,二,三为数码所显示的位码 ; 出口参数:无 DISPLAY:

MOV DPTR,#DAT1;查表显示程序, 利用P0口做段选码口输出/P2低三位做位选码输出,

MOV A,R5

MOVC A,@A+DPTR MOV P2,#01H MOV P0,A ACALL DELAY

MOV DPTR,#DAT2 MOV A,R4

MOVC A,@A+DPTR MOV P2,#02H MOV P0,A ACALL DELAY MOV A,R3

MOVC A,@A+DPTR MOV P2,#04H MOV P0,A ACALL DELAY RET DAT1:

DB 00H,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H

;" 灭","1","2","3","4","5","6","7","8","9"," 灭","F"

DAT2: DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H ; 第一个为零, 其他与上相同, 因为十位如果为零显示熄灭 ;====加减时间延时(起到不会按下就加N 个数)====== DELAY1: MOV 35H,#20H LOOP0: ACALL DISPLAY DJNZ 35H,LOOP0 RET

;=====延时(显示和去抖动用到)=====

DELAY: MOV 32H,#12H LOOP: MOV 33H,#0AFH LOOP1: DJNZ 33H,LOOP1 DJNZ 32H,LOOP RET

;=====发声程序===== BARK: SETB RING ACALL DELAY1 ACALL DELAY1 CLR RING;按键发声 RET

;=====TO溢出中断(响铃程序)===== T0INT:MOV TH0,#0ECH MOV TL0,#0FFH JNB RING,OUT

CPL P3.6 ;RING标志位为1时候P3.6口不短取反使喇叭发出一定频率的声音

OUT:RETI

;=====T1溢出中断(计时程序)===== T1INT: MOV TH1,#3CH MOV TL1,#0B0H INC R0 RETI END

第9章 实验仿真器件

参考文献

1. 《单片机原理与接口技术》(第二版) 主编:李晓林等 电子工业出版社 2. 《嵌入式系统设计与实践》 主编:张晓林等 北京航空航天大学出版社 3. 《单片机技术及应用系统设计》 主编:谢克明等. 兵器工业出版社 4. 《51单片机应用开发25例——基于Proteus 仿真》

主编:张新等 电子工业出版社

第1章 六路抢答器设计功能要求

单片机把我们带入了智能化的电子领域,许多繁琐的系统若由单片机进行设计,便能收到电路更简单、功能更齐全的良好效果。若把经典的电子系统当作一个僵死的电子系统,那么智能化的现代电子系统则是一个具有“生命”的电子系统。

而随着技术的进步,单片机与串口通信的结合更多地应用到各个电子系统中已成一种趋势。本设计就是基于单片机设计抢答系统,通过串口通信动态传输数据,使抢答系统有了更多更完善的功能。单片机系统的硬件结构给予了抢答系统“身躯”,而单片机的应用程序赋予了其新的“生命”,使其在传统的抢答器面前具有电路简单、成本低、运行可靠等特色。对于抢答器我们大家都知道那是用于选手做抢答题时用的,选手进行抢答,抢到题的选手来回答问题。抢答器不仅考验选手的反应速度同时也要求选手具备足够的知识面和一定的勇气。选手们都站在同一个起跑线上,体现了公平公正的原则。

1.1 数字抢答器的概述

对于抢答器我们大家都知道那是用于选手做抢答题时用的,选手进行抢答,抢到题的选手来回答问题。抢答器不仅考验选手的反应速度同时也要求选手具备足够的知识面和一定的勇气。选手们都站在同一个起跑线上,体现了公平公正的原则。 本实验设计的数字抢答器由主体电路与扩展电路组成。优先编码电路、锁存器、译码电路将参赛队的输入信号在显示器上输出;用控制电路和主持人开关启动报警电路,以上两部分组成主体电路。通过定时电路和译码电路将秒脉冲产生的信号在显示器上输出实现计时功能,构成扩展电路。经过布线、焊接、调试等工作后数字抢答器成形。更具有实用性。

1.2 设计任务与要求

任务:设计一款6路智能抢答器

1、基本要求

(1)抢答器同时供6名选手或6个代表队比赛,分别用6个按钮S1 ~ S6表示。

(2)设置一个系统清除和抢答控制开关,该开关由主持人控制。

(3) 抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,并在LED 数码管上显示,同时扬声器发出报警声响提示。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。

(4)抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(初设15秒)。当主持人启动" 开始" 键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间0.5秒左右,开始抢答指示灯亮。

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

(6)如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示FFF 。

优点:与普通抢答器相比,本作品有以下几方面优势: 1、具有清零装置和抢答控制,可由主持人操纵避免有人在主持人说“开始”前提前抢答违反规则。

2、具有定时功能,在30秒内无人抢答表示所有参赛选手获参赛队对本题弃权。 3、15秒内(抢答时间可以由主持人在1-99s 调整)仍无人抢答其报警电路工作表示抢答时间耗尽并禁止抢答。

1.3 系统主要功能

抢答器原理:该抢答器供不多于6路的抢答比赛使用。每个选手的座位前安装一只抢答按钮开关和一只信号灯。主持人的座位前安装一只复原按钮开关、一只蜂鸣器和一只抢答器工作状态指示灯。每当主持人按下开始键后,哪个队先按下座位上的按钮开关,该座位的信号灯就先被点亮,同时封锁其他按钮开关的活动。并且熄灭主持人座位上的状态指示灯和发出 3 声类似于电话振铃的提示声,以“声明”此次抢答动作已经完成。在主持人确认后,按下复原按钮,状态指示灯重新点亮,并且同时发出“笛——笛——”声,为下一次的抢答作好准备。电

路中的蜂鸣器 LSI 是一只带有助音腔的压电陶瓷蜂鸣器,用于模拟发出报警声的功率放大器和喇叭。在 FM 发声的同时,灯 D6 也在发光。LSI 可以看作是一个电容性负载,本身不能流过直流电流。发声的原理是,作用在两个电极极板的电位在发生变化时,陶瓷材料就发生弯曲,从而振动空气发出声音。按钮开关和指示灯与座位的对应关系如表1所示。

第2章 方案论证

1、抢答器同时供6名选手或6个代表队比赛,分别用6个按钮S1- S6表示。

2、设置一个系统清除和抢答控制开关,该开关由主持人控制。

3、抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,并在共阴极数码管上显示,同时扬声器发出报警声响提示。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。

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

5、参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示FF 6、66路抢答器可以利用硬件电子元器件实现,但电路结构复杂,调试困难,涉及到的外围元件多,不便于安装,实验给实际操作带来很大的麻烦。

如果有选手在规定的时间以前完成问题,主持人通过结束按键复位,开始新的问题作答,因为程序不是很大不需要扩展存储空间,选手按键跳入相应的子程序,回答倒记时,通过单片机实现功能可以更人性化,只需单电源供电更方便,

容易实现。电路结构简单,外围扩展的电路不是很多,锻炼我们所学的知识应用到现实生活当中。为我们提供实践的机会。单片机是电子专业发展的方向,更好的使用单片机可以是我们的产品小型化,使用更方便,性能更稳定,功能更齐全,所以我们选用单片机加一定的外围设备实现本次课程设计的要求

第3章 抢答器的系统概述

3.1 系统的主要功能

本系统是借用单片机采用模块化设计的智能抢答器,主控与参赛者设为终端分系统。参赛者分系统设有:抢答按纽、计时显示、提示功能等(根据需要可另设或多设相关功能);主控分系统有:开始与结束控制按钮、时限设定、各种相关显示调控功能等(根据需要也可另设或多设相关功能)。

参赛者系统,除享有抢答按纽的权利功能外,还有人性化的提示功能和时间提示功能,也可设定由主控控制在参赛者终端表现的趣味性功能等;主控系统的控制按钮做开始与结束控制,根据活动参赛者的层次,对提前抡答者的行为设定为非法或阻隔,若设有非法抢答控制功能时,在主控处带有公示性显示的非法抡答者的台位号,对抢答限时及回答问题限时设为倒计时式,并有公示性显示。

图3-1 系统主要功能模块

本系统采用模块化设计智能抢答器,在抢答比赛中广泛应用,各组分别有一

个抢答按钮。主持人有开始和结束复位键。在后台主持人可以修改,抢答时间和选手回答问题的时间设置,原始状态下抢答时间为15s ,通过加键和减键修改抢答时间,改完后结束键确定,新时间开始有效,回答问题时间为30s 。主持人按键开始后,选手开始抢答为有效,数码显示屏显示抢答时间倒计时和选手号,选手相应的指示灯点亮,在最后五秒扬声器发生提示。如果主持人没有按下开始键而选手就抢答视为犯规,数码显示屏显示犯规者的代号,扬声器持续发声。主持人可按键结束,新一轮抢答开始。系统的主要功能模块方框图如2-1所示。

抢答主板:抢答主板是整个抢答器的核心,其关键是单片机AT89C51。内部电路设计用汇编语言编写。它完成了时间参数的设定,抢按号码的译码,保存;显示;输出,抢按及答题倒计时功能等。

显示及指示:本设计中,有一个共阴的数码管组,四个数码管。其中两个显示时间,一个空位,一个显示抢答号码。主持人依次按下结束键,开始键后开始抢答。可以抢按:超时数码管显示“FFF ”,当抢按超过规定时间或答题超过规定时间后数码管显“FFF ”。若有选手在规定时间内抢按成功,则可以答题,数码管显示抢答时间的同时也显示选手号码。若在按开始键前抢答表示违规,数码管显示“FF ”并显示选手号码。

3.2 系统需求分析

1、在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效。

2、抢答限定时间和回答问题的时间可是在1~99s 设定。

3、可以显示是哪位选手有效抢答和无效抢答,正确按键后有音乐提示。

4、抢答时间和回答问题时间倒记时显示,时间完后系统自动复位。

5、按键锁定,在有效状态下,按键无效非法。

3.3 抢答器的工作流程

抢答器的基本工作原理:在抢答竞赛或呼叫时,有多个信号同时或不同时送入主电路中,抢答器内部的寄存器工作,并识别、记录第一个号码,同时内部的定时器开始工作,记录有关时间并产生超时信号。在整个抢答器工作过程中,显示电路、语音电路等还要根据现场的实际情况向外电路输出相应信号。抢答器的

工作流程分为、系统复位、正常流程、违例流程等几部分,如图3-2所示,下面分别予以介绍。如图2-2所示

图3-2 抢答流程图

3.4 抢答器的工作过程

1、如果想调节抢答时间或答题时间, 按" 加一" 键或" 减一" 键进入调节状态, 此时会显示现在设定的抢答时间值, 如想加一秒按一下" 加1s" 键, 如果想减一秒按一下" 减1s" 键,时间数码管上会显示改变后的时间,调整范围为0~99s, 0s 时再减1s 会跳到99,99s 时再加1s 会变到0s 。

2、主持人按" 抢答开始" 键,会有提示音,指示灯“START ”点亮,并立刻进入抢答倒计时(预设15s 抢答时间),如有选手抢答,会有提示音,且选手对应的指示灯点亮,并会显示其号数并立刻进入回答倒计时(预设30s 抢答时间),不进行抢答查询,所以只有第一个按抢答的选手有效。倒数时间到小于5s 会每秒响一下提示音。

3、如倒计时期间,主持人想停止倒计时可以随时按" 停止" 按键,系统会自动进入准备状态,等待主持人按" 抢答开始" 进入下次抢答计时。

4、如果主持人未按" 抢答开始" 键,而有人按了抢答按键,犯规抢答,LED 上不断闪烁FF 和犯规号数并响个不停,直到按下" 停止" 键为止。

总而言之,本课题利用AT89C51单片机及外围接口实现的抢答系统设计了抢答器,该抢答器增加了新功能、提高了系统的可靠性、简化了电路结构、节约了成本,是一个实用的工程设计。

3.5 AT89C51的功能及简介2.7.2 AT89C51单片机

本次课设使用的微控制器为ATMAL 公司生产的AT89C51,该芯片货源充足,并且价格也比较便宜。

1、AT89C51简介

AT89C51是一种带4K 字节FLASH 存储器(FPEROM —Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K 字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL 高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU 和闪速存储器组合在单个芯片中,ATMEL 的AT89C51是一种高

效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。现在AT89S51/52已经取代了AT89C51/52。

图3-3 AT89C51封装图

2、主要特性

、与MCS-51 兼容

、4K 字节可编程FLASH 存储器

、寿命:1000写/擦循环

、数据保留时间:10年

、全静态工作:0Hz-24MHz

、三级程序存储器锁定

、128×8位内部RAM

、32可编程I/O线

、两个16位定时器/计数器

、5个中断源

、可编程串行通道

、低功耗的闲置和掉电模式

、片内振荡器和时钟电路

3、特性概述

AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM ,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz 的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU 的工作,

但允许

RAM ,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。 4管脚说明

VCC :供电电压。

GND :接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL 门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH 编程时,P0 口作为原码输入口,当FIASH 进行校验时,P0输出原码,此时P0外部必须接上拉电阻。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL 门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1口作为低八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL 门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH 编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL 门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL )这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如下表所示:

口管脚 备选功能

P3.0 RXD(串行输入口)

P3.1 TXD(串行输出口)

P3.2 /INT0(外部中断0)

P3.3 /INT1(外部中断1)

P3.4 T0(计时器0外部输入)

P3.5 T1(计时器1外部输入)

P3.6 /WR(外部数据存储器写选通)

P3.7 /RD(外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST :复位输入。当振荡器复位器件时,要保持RST 脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE 脉冲。如想禁止ALE 的输出可在SFR8EH 地址上置0。此时, ALE只有在执行MOVX ,MOVC 指令是ALE 才起作用。另外,该引脚被略微拉高。如果微

处理器在外部执行状态ALE 禁止,置位无效。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH ),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET ;当/EA端保持高电平时,此间内部程序存储器。在FLASH 编程期间,此引脚也用于施加12V 编程电源(VPP )。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:来自反向振荡器的输出。

振荡器特性:

XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

5、芯片擦除

整个PEROM 阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE 管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。

此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU 停止工作。但RAM ,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM 的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。

6、串口通讯

单片机的结构和特殊寄存器,这是你编写软件的关键。至于串口通信需要用到那些特殊功能寄存器呢,它们是SCON ,TCON ,TMOD ,SCON 等,各代表什么含义呢? SBUF 数据缓冲寄存器这是一个可以直接寻址的串行口专用寄存器。有朋友这样问起过“为何在串行口收发中,都只是使用到同一个寄存器SBUF ?而不是收发各用一个寄存器。”实际上SBUF 包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都共同使用同一个寻址地址-99H 。CPU 在读SBUF 时会指到接收寄存器,在写时会指到发送寄存器,而且接收寄存器是双缓冲寄存器,这样可以避免接收中断没有及时的被响应,数据没有被取走,下一帧数据已到来,而造成的数据重叠问题。发送器则不需要用到双缓冲,一般情况下我们在写发送程序时也不必用到发送中断去外理发送数据。操作SBUF 寄存器的方法则很简单,只要把这个99H 地址用关键字sfr 定义为一个变量就可以对其进行读写操作了,如sfr SBUF = 0x99;当然你也可以用其它的名称。通常在标准的reg51.h 或at89x51.h 等头文件中已对其做了定义,只要用#include 引用就可以了。

SCON 串行口控制寄存器通常在芯片或设备中为了监视或控制接口状态,都会引

用到接口控制寄存器。SCON 就是51 芯片的串行口控制寄存器。它的寻址地址是98H ,是一个可以位寻址的寄存器,作用就是监视和控制51 芯片串行口的工作状态。51 芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON 寄存器。它的各个位的具体定义如下:

SM0 SM1 SM2 REN TB8 RB8 TI RI

SM0、SM1 为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。串行口工作模式设置。

SM0 SM1 模式 功能 波特率

0 0 0 同步移位寄存器 fosc/12

0 1 1 8位UART 可变

1 0 2 9位UART fosc/32 或fosc/64

1 1 3 9位UART 可变

在这里只说明最常用的模式1,其它的模式也就一一略过,有兴趣的朋友可以找相关的硬件资料查看。表中的fosc 代表振荡器的频率,也就是晶振的频率。UART 为(Universal Asynchronous Receiver)的英文缩写。

SM2 在模式2、模式3 中为多处理机通信使能位。在模式0 中要求该位为0。 REM 为允许接收位,REM 置1 时串口允许接收,置0 时禁止接收。REM 是由软件置位或清零。如果在一个电路中接收和发送引脚P3.0,P3.1 都和上位机相连,在软件上有串口中断处理程序,当要求在处理某个子程序时不允许串口被上位机来的控制字符产生中断,那么可以在这个子程序的开始处加入REM=0 来禁止接收,在子程序结束处加入REM=1 再次打开串口接收。大家也可以用上面的实际源码加入REM=0 来进行实验。

TB8 发送数据位8,在模式2 和3 是要发送的第9 位。该位可以用软件根据需要置位或清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址帧还是数据帧。

RB8 接收数据位8,在模式2 和3 是已接收数据的第9 位。该位可能是奇偶位,地址/数据标识位。在模式0 中,RB8 为保留位没有被使用。在模式1 中,当SM2=0,RB8 是已接收数据的停止位。

TI 发送中断标识位。在模式0,发送完第8 位数据时,由硬件置位。其它模式中则是在发送停止位之初,由硬件置位。TI 置位后,申请中断,CPU 响应中断后,发送下一帧数据。在任何模式下,TI 都必须由软件来清除,也就是说在数据写入到SBUF 后,硬件发送数据,中断响应(如中断打开),这时TI=1,表明发送已完成,TI 不会由硬件清除,所以这时必须用软件对其清零。

RI 接收中断标识位。在模式0,接收第8 位结束时,由硬件置位。其它模式中则是在接收停止位的半中间,由硬件置位。RI=1,申请中断,要求CPU 取走数据。但在模式1 中,SM2=1时,当未收到有效的停止位,则不会对RI 置位。同样RI 也必须要靠软件清除。常用的串口模式1 是传输10 个位的,1 位起始位为0,8 位数据位,低位在先,1 位停止位为1。它的波特率是可变的,其速率是取决于定时器1 或定时器2 的定时值(溢出速率)。AT89C51 和AT89C2051 等51 系列芯片只有两个定时器,定时器0 和定时器1,而定时器2是89C52 系列芯片才有的。

波特率在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。波特率是指串行端口每秒内可以传输的波特位数。有一些初学的朋友认为波特率是指每秒传输的字节数,如标准9600 会被误

认为每秒种可以传送9600个字节,而实际上它是指每秒可以传送9600 个二进位,而一个字节要8 个二进位,如用串口模式1 来传输那么加上起始位和停止位,每个数据字节就要占用10 个二进位,9600 波特率用模式1 传输时,每秒传输的字节数是9600÷10=960 字节。51 芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M 的晶振来计算,那么它的波特率可以达到1M 。模式2 的波特率是固定在fosc/64 或fosc/32,具体用那一种就取决于PCON 寄存器中的SMOD 位,如SMOD 为0,波特率为focs/64,SMOD 为1,波特率为focs/32。模式1 和模式3 的波特率是可变的,取决于定时器1 或2(52 芯片)的溢出速率。那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。

波特率=(2SMOD ÷32)×定时器1 溢出速率

上式中如设置了PCON 寄存器中的SMOD 位为1 时就可以把波特率提升2 倍。通常会使用定时器1 工作在定时器工作模式2 下,这时定时值中的TL1 做为计数,TH1 做为自动重装值 ,这个定时模式下,定时器溢出后,TH1 的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式2 下定时器1 溢出速率的计算公式如下:

溢出速率=(计数速率)/(256-TH1)

上式中的“计数速率”与所使用的晶体振荡器频率有关,在51 芯片中定时器启动后会在每一个机器周期使定时寄存器TH 的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51 芯片的计数速率为晶体振荡器频率的1/12,一个12M 的晶振用在51 芯片上,那么51 的计数速率就为1M 。通常用11.0592M 晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。如我们要得到9600 的波特率,晶振为11.0592M 和12M ,定时器1 为模式2,SMOD 设为1,分别看看那所要求的TH1 为何值。代入公式:

11.0592M

9600=(2÷32)×((11.0592M/12)/(256-TH1))

TH1=250

12M

9600=(2÷32)×((12M/12)/(256-TH1))

TH1≈249.49

上面的计算可以看出使用12M 晶体的时候计算出来的TH1 不为整数,而TH1 的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600 波特率。当然一定的误差是可以在使用中被接受的,就算使用11.0592M 的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。

7、AT89C51特殊功能寄存器

特殊功能寄存器也称专用寄存器,是具有特殊功能的所有寄存器的集合,简称SFR (Special Function Register)。特殊功能寄存器共含有22个不同寄存器。它们的地址分配在80H ~FFH 中,即在RAM 地址中。虽然特殊功能寄存器地址在80H ~FFH 之中,但在80H ~FFH 的地址单元中,不是所有的单元都被特殊

功能寄存器占用,未被占用的单元,其内容是不确定的,如果对这些单元进行操作,得到的是一些随机数,而写入则无效。所以,用户编程时不应该将数据写入这些未确定的地址单元,它们是公司留待将来开发新产品时使用的。

8、AT89C51单片机的内部结构图

AT89C51单片机内部由CPU 、4KB 的FPEROM ,128B 的RAM ,两个16位的定时/计数器T0和T1,4个8位的I/O端P0、P1、P2、P3等组成。单片微机内部最核心的部分是CPU 。CPU 主要功能是产生各种控制信号,控制存储器、输入/输出端口的数据传输、数据的算术运算、逻辑运算以及位操作处理等,CPU 按其功能可分为运算器和控制器两部分。控制器由程序计数器PC 、指令储存器、指令译码器、实时控制与条件转移逻辑电路等组成。它的功能是对来自存储器中的指令进行译码,通过实时控制电路,在规定的时刻发出各种操作所需的内部和外部的控制信号,使各部分协调工作,完成指令所规定的操作。运算器由算术逻辑器部件ALU 、累加器ACC 、暂存器、程序状态字寄存器PSW ,BCD 码运算调整电路等组成。

图3-4 AT89C51单片机的内部结构图

为了提高数据处理和位操作功能,片内增加了一个通用寄存器B 和一些专用寄存器,还增加了位处理逻辑电路的功能, 其内部结构如图2-4所示。

第4章 系统硬件设计

为使硬件电路设计尽可能合理,应注意以下几方面:

(1) 尽可能采用功能强的芯片,以简化电路,功能强的芯片可以代替若干普通芯片,随着生产工艺的提高,新型芯片的的价格不断下降,并不一定比若干普通芯片价格的总和高。

(2) 留有设计余地。在设计硬件电路时,要考虑到将来修改扩展的方便。因为很少有一锤定音的电路设计,如果现在不留余地,将来可能要为一点小小的修改或扩展而被迫进行全面返工。

(3) 程序空间,选用片内程序空间足够大的单片机,本设计采用AT89C51单片机。

(4) I/O端口,在样机研制出来后进行现场试用时,往往会发现一些被忽视的问题,而这些问题不是靠单纯的软件措施来解决的。如有些新的信号需要采集,就必须增加输入检测端;有些物理量需要控制,就必须增加输出端。如果在硬件电路设计就预留出一些I/O端口,虽然当时空着没用,那么用的时候就派上用场了。

4.1 单片机控制系统原理图

如图3-1,使用AT89C51单片机,P1.0为开始抢答,P1.7为停止,P1.1-P1.6为六路抢答输入,P3.0、 P3.1、P3.7通过与74LS138 3线8线译码器相连扩展接口,控制7个指示灯,数码管段选P0口,位选P2口低3位,蜂鸣器输出为P3.6口。P3.2为抢答时间加1S 调整,P3.3为时间减1S 调整(主持人可以根据问题的不同难度,适当调整抢答的时间)。

图4-1 抢答器原理图

4.2 单片机主机系统电路

该六路抢答器的设计细分为时钟频率电路的设计,复位电路的设计,显示电路的设计和键盘扫描电路的设计等。

4.3 时钟频率电路的设计

单片机必须在时钟的驱动下才能工作. 在单片机内部有一个时钟振荡电路, 只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元, 决定单片机的工作速度,这里所用的时钟振荡电路频率为12MHZ 。

图4-2 外部振荡源电路

一般选用石英晶体振荡器。此电路在加电大约延迟10ms 后振荡器起振, 在XTAL2引脚产生幅度为3V 左右的正弦波时钟信号, 其振荡频率主要由石英晶振的频率确定。电路中两个电容 C1,C2的作用有两个:一是帮助振荡器起振; 二是对振荡器的频率进行微调。C1,C2的典型值为30PF 。

单片机在工作时, 由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。其大小是时钟信号频率的倒数, 常用fosc 表示。此时时钟频率为12MHz, 即fosc=12MHz,则时钟周期为1/12µs。

4.4 复位电路的设计

单片机的第9脚RST 为硬件复位端, 只要将该端持续4个机器周期的高电平即可实现复位, 复位后单片机的各状态都恢复到初始化状态,其电路图如图3-3所示:

图4-3 复位电路

值得注意的是, 在设计当中使用到了硬件复位和软件复位两种功能, 由上面的硬件复位后的各状态可知寄存器及存储器的值都恢复到了初始值, 而前面的功能介绍中提到了倒计时时间的记忆功能, 该功能的实现的前提条件就是不能对单片机进行硬件复位, 所以设定了软复位功能。软复位实际上就是当程序执行完毕之后, 将程序指针通过一条跳转指令让它跳转到程序执行的起始地址。

4.5 显示电路的设计

显示功能与硬件关系极大,当硬件固定后,如何在不引起操作者误解的前提下提供尽可能丰富的信息,全靠软件来解决。

4.6 显示模块在系统软件中的安排

操作者主要设计从显示设备上获取微机系统的信息的,因此,操作者每操作一下,显示设备商都应该有一定的反应。这说明,显示模块与操作有关,即监控程序是需要调用显示模块。不同的操作需要显示不同的内容,这又说明各执行模块对显示模块的驱动方式是不同的。另一方面,在操作者没有进行操作时,显示内容也是变化的,如显示现场各物理量的变化情况。这时显示模块不是由操作者通过命令键来驱动,而是由各类自动执行的功能模块来驱动。自动执行的各类模块在安排在各种中断子程序中,这就是说,各种中断子程序也要调用显示模块。如果监控安排在中断子程序中,两者的要求就统一了,问题比较好解决,如果监控程序安排在主程序中,在监控程序调用显示模块的过程中发生了中断,中断子程序也调用显示模块,这时就容易出问题。一种比较妥善的办法是只让一处调用显示模块,其他各处均不得直接调用显示模块,但有权申请显示。这就要设置一个显示申请标志,当某模块需要显示时,将申请标志置位,同时设定有关显示内容(或指针)。由于一处调用显示模块,故不会发生冲突。为了使显示模块能及时反应系统需要,应将显示模块安排在一个重复执行的循环(如监控循环或时钟中断子程序)中。当监控程序(键盘解释程序)安排在时钟中断子程序中时,处理比较方便,只要在监控程序的汇合处调用显示模块就可以了。例如用DISP 作显示申请标志,就可以这样安排显示模块的调用,即

DISP BIT 2DH.4 ;显示申请标志

SKEYEND: JNB DISP,RETI0 ;有显示申请否?

LCALL DISPLAY ;调用显示模块,更新显示内容 CLR DISP ;清除申请

RETI ;中断返回

KEYEND 为键盘解释程序的最后汇集点,这时如果发现有显示申请,就进行集中操作,更新显示内容,否则就跳过这一步。

这里将显示功能集中到一起,作为一个功能模块,就要求它的功能全面,能根据系统软件提供的信息自动完成显示内容的查找,变换和输出驱动。这样设计使得各功能模块都不必考虑显示问题,只要给出一个简单的信息(如显示格式编码)甚至不用再提供额外信息,直接利用当前状态变量和软件标志就可以完成所需的显示要求。

如果编写这样一个集中显示模块有困难,也可以将显示模块编小一些,只完成显示缓冲区的内容输出到显示器件上的工作。这时各功能模块在提出显示申请时,还需要将显示内容按需要的格式送入显示缓冲区中。这样分而治之比较容易编程,但要小心出现显示混乱。例如后台程序需要调用显示,将有关信息送入到现实缓冲区进行显示;中断返回后,后台程序继续送完后半部分显示内容,但前半部分内容已经变了,这样就出现了显示错误。解决的办法是,在申请显示前,先检查是否已经有显示申请,如果有,就不再申请,等待下次机会;如果没有,则先申请标志位,再将显示内容送入显示缓冲区。这时就不必担心其他前台模块来打扰了,就可以得到一次完整的显示机会。

在这里我们使用的是七段数码管显示,通常在显示上我们采用的方法一般包括两种:一种是静态显示,一种是动态显示。其中静态显示的特点是显示稳定不闪烁,程序编写简单,但占用端口资源多;动态显示的特点是显示稳定性没静态好,程序编写复杂,但是相对静态显示而言占用端口资源少。在本设计中根据实际情况采用的是动态显示方法。并通过查表法,将其在数码管上显示出来,其中P0口为字型码输入端,P2口低3位为字选段输入端。在这里我们通过查表将字型码送给7段数码管显示的数字,

MOV A,R5

MOVC A,@A+DPTR ;查字型码

MOV P2,#01H ;送位选码

MOV P0,A ;送字型码

ACALL DELAY ;调延时,去闪烁

1、在七段数码管显示中可分为共阳极和共阴极两种类型极。以共阴为例,要想a 段亮,向a 段送1就是,返之送0,共阳刚好相反。数码管与P0口相接,P0口作为I/O口使用,外接10K Ω上拉电阻。

图4-4 共阴极数码管显示电路

2、按键对应的指示灯。通过74ls138 3线8线译码器与P3.0、P3.1、P3.7相连扩展接口,可以控制7指示灯,六路抢答S0-S7对应D1-D7灯,开始键对应START 灯。当有按键按下时,对应的指示灯点亮。

图4-5 按键指示灯电路

4.7 键盘扫描电路的设计

键盘是人与微机系统打交道的主要设备。关于键盘硬件电路的设计方法也可以在文献和书籍中找到,配合各种不同的硬件电路,这些书籍中一般也提供了相应的键盘扫描程序。站在系统监控软件设计的立场上来看,仅仅完成键盘扫描,读取当前时刻的键盘状态是不够的,还有不少问题需要妥善解决,否则,人们在操作键盘就容易引起误操作和操作失控现象。在单片机应用中键盘用得最多的形式是独立键盘及矩阵键盘。

其中独立键盘硬件电路简单,而且在程序设计上也不复杂,一般用在对硬件电路要求不高的简单电路中;矩阵键盘与独立键盘有很大区别,首先在硬件电路上它要比独立键盘复杂得多,而且在程序算法上比它要烦琐,但它在节省端口资源上有优势得多,因此它更适合于多按键电路。其次就是消除在按键过程中产生的“毛刺”现象。抢答器使用的按键数量较少,故采用独立按键,使用延时重复扫描法,延时法的原理为:因为“毛刺”脉冲一般持续时间短,约为几ms ,而我们按键的时间一般远远大于这个时间, 所以当单片机检测到有按键动静后再延时一段时间(这里我们取7ms) 后再判断此电平是否保持原状态, 如果是则为有效按键,否则无效。

图4-6 6路抢答按键电路

图4-7 启动和结束按键电路

图4-8 抢答时间调整电路

4.8 发声

我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调,使喇叭发出不同的声音。

图4-9 扬声器电路

4.9 系统复位

使CPU 进入初始状态,从0000H 地址开始执行程序的过程叫系统复位。

从实

现系统复位的方法来看,系统复位可分为硬件复位和软件复位。硬件复位必须通过CPU 外部的硬件电路给CPU 的RESET 端加上足够时间的高电位才能实现。上电复位,人工按钮复位和硬件看门狗复位均为硬件复位。硬件复位后,各专用寄存器的状态均被初始化,且对片内通用寄存器的内容没有影响。但是,硬件复位还能自动清除中断激活标志,使中断系统能够正常工作,这样一个事实却容易为不少编码人员所忽视。软件复位就是用一系列指令来模拟硬件复位功能,最后通过转移指令使程序从0000H 地址开始执行。对各专用寄存器的复位操作是容易的,也没有必要完全模拟,可根据实际需要去主程序初始化过程中完成。而对中断激活标志的清除工作常被遗忘,因为它没有明确的位地址可供编程。有的编程人员用020000(LJMP 0000H)作为软件陷阱,认为直接转向0000H 地址就完成了软件复位,就是这类错误的典型代表。软件复位是使用软件陷阱和软件看门狗后必须进行的工作,这时程序出错完全有可能发生在中断子程序中,中断激活标志已置位,它将阻止同级中断响应。由于软件看门是高级中断,它将阻止说要中断响应,由此可见清除中断激活标志的重要性。

在所有的指令中,只有RETI 指令能够清除中断激活标志。前文各处提案到的出错处理程序ERR 主要完成这一功能,其他的善后工作交由复位后的系统去完成。这部分程序如下:

POWER DATA 67H ;上电标志存放单元 ERR: CLR EA ;关中断 MOV DPTR,#ERR1 ;准备返回地址

PUSH DPL PUSH DPH

RETI ;清除高级中断激活标志

ERR1: MOV POWER,#0AAH;重建上电标志 CLR A ;准备复位地址 PUSH ACC ;压入复位地址0000H

PUSH ACC

RETI ;清除低级中断激活标志,从程序0000H 开始执行。

这段程序先关中断,以便后续处理能顺利进行,然后用两个RETI 指令代替

两个LJMP 指令,从而清除了两级中断激活标志。有相应软件陷阱捕捉来的程序可能没有全部激活两个标志,这也无妨。

第5章 软件设计

5.1 主程序系统结构图

图5-1软件系统结构图

5.2软件任务分析

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

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

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

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

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

5.3 程序流程图

在本设计中包括了以下八个主要的程序:主程序;非法抢答序;抢答时间调整程序;回答时间调整程序;倒计时程序;正常抢答处理程序;犯规处理程序;显示及发声程序。主流程图如4-2所示。

图5-2 程序设计流程图

第6章 实验仿真系列组图

汇编程序仿真:

PROTEUS 仿真系列图: 启动抢答器:

按下开始键:

扬声器响,指示灯“start ”亮

无人抢答:

没人抢答,倒计时5s ,扬声器1s 响一次:

抢答键S2按下:

扬声器响,D2点亮,数码管显示倒计时和抢答号2

抢答键S5按下:

扬声器响,D5点亮,数码管显示倒计时和抢答号5

违规抢答:

开始键没按下,S2抢答: 数码管闪烁“FF ”,显示2

调整抢答时间

使用“加1s ”键增加抢答时间

使用“减1s ”键减少抢答时间

结束复位:

主持人按下结束键:

第8章 实验程序

OK EQU 20H;抢答开始标志位

RING EQU 22H;响铃标志位 ORG 0000H AJMP MAIN ORG 0003H AJMP INT0SUB ORG 000BH AJMP T0INT

ORG 0013H AJMP INT1SUB ORG 001BH AJMP T1INT ORG 0040H

MAIN: MOV R1,#0FH MOV R2,#0AH MOV TMOD,#11H MOV TH0,#0F0H MOV TL0,#0FFH MOV TH1,#3CH

MOV TL1,#0B0H;50ms为一次溢出中断

SETB EA SETB ET0 SETB ET1 SETB EX0 SETB EX1 CLR OK CLR RING

SETB TR1

SETB TR0 ;=====查询程序===== START: SETB P3.0 SETB P3.1 SETB P3.7

MOV R5,#0BH MOV R4,#0BH MOV R3,#0BH ACALL DISPLAY

JB P1.0,NEXT ACALL DELAY

JB P1.0,NEXT; 去抖动, 如果" 开始键" 按下就向下执行, 否者跳到非法抢答查询

ACALL BARK;按键发声

CLR P3.0 SETB P3.1 SETB P3.7 MOV A,R1

MOV R6,A;送R1->R6,因为R1中保存了抢答时间

SETB OK;抢答标志位, 用于COUNT 程序中判断是否查询抢答

MOV R3,0AH;抢答只显示计时, 灭号数

AJMP COUNT;进入倒计时程序," 查询有效抢答的程序" 在COUNT 里面

NEXT: JNB P1.1,FALSE1 JNB P1.2,FALSE2 JNB P1.3,FALSE3 JNB P1.4,FALSE4 JNB P1.5,FALSE5 JNB P1.6,FALSE6 AJMP START

;=====非法抢答处理程序===== FALSE1: ACALL BARK MOV R3,#01H AJMP ERROR FALSE2: ACALL BARK MOV R3,#02H

AJMP ERROR

FALSE3: ACALL BARK MOV R3,#03H AJMP ERROR FALSE4: ACALL BARK MOV R3,#04H AJMP ERROR FALSE5: ACALL BARK MOV R3,#05H AJMP ERROR FALSE6: ACALL BARK MOV R3,#06H AJMP ERROR

;=====INT0(抢答时间R1调整程序)===== INT0SUB:MOV A,R1 MOV B,#0AH

DIV AB MOV R5,A MOV R4,B MOV R3,#0AH ACALL DISPLAY

JNB P3.2,INC0;P3.2为+1s键, 如按下跳到INCO JNB P3.3,DEC0;P3.3为-1s 键, 如按下跳到DECO JNB P1.7,BACK0;P1.7为确定键, 如按下跳到BACKO AJMP INT0SUB INC0: MOV A,R1

CJNE A,#63H,ADD0;如果不是99,R2加1, 如果加到99了,R1就置0,重新加起。

MOV R1,#00H ACALL DELAY1

AJMP INT0SUB ADD0: INC R1

ACALL DELAY1 AJMP INT0SUB DEC0: MOV A,R1

JZ SETR1;如果R1为0, R1就置99, DEC R1

ACALL DELAY1 AJMP INT0SUB SETR1: MOV R1,#63H ACALL DELAY1 AJMP INT0SUB BACK0: RETI

;=====INT1(回答时间R2调整程序)===== INT1SUB:MOV A,R2 MOV B,#0AH DIV AB MOV R5,A MOV R4,B MOV R3,#0AH ACALL DISPLAY JNB P3.2,INC1 JNB P3.3,DEC1 JNB P1.7,BACK1 AJMP INT1SUB INC1: MOV A,R2

CJNE A,#63H,ADD1 MOV R2,#00H ACALL DELAY1

AJMP INT1SUB

ADD1: INC R2

ACALL DELAY1 AJMP INT1SUB DEC1: MOV A,R2 JZ SETR2 DEC R2

ACALL DELAY1 AJMP INT1SUB SETR2: MOV R2,#63H ACALL DELAY1 AJMP INT1SUB BACK1: RETI

;=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)===== COUNT: MOV R0,#0000 MOV TH1,#3CH MOV TL1,#0B0H

RECOUNT:MOV A,R6;R6保存了倒计时的时间, 之前先将抢答时间或回答时间给R6 MOV B,#0AH

DIV AB;除十分出个位/十位 MOV 30H,A;十位存于(30H) MOV 31H,B;个位存于(31H) MOV R5,30H;取十位 MOV R4,31H;取个位 MOV A,R6 SUBB A,#07H

JNC LARGER;大于5s 跳到LARGER, 小于等于5s 会提醒 MOV A,R0

CJNE A,#0AH,FULL;1s中0.5s 向下运行 CLR RING AJMP CHECK

FULL: CJNE A,#14H,CHECK;下面系1s 的情况, 响并显示号数并清R0, 重新计时 SETB RING MOV A,R6

JZ QUIT;计时完毕 MOV R0,#00H

DEC R6;一秒标志减1 AJMP CHECK LARGER: MOV A,R0

CJNE A,#14H,CHECK;如果1s 向下运行, 否者跳到查" 停/显示" DEC R6;计时一秒R6自动减1

MOV R0,#00H

CHECK: JNB P1.7,QUIT;如按下停止键退出 ACALL DISPLAY

JB OK,ACCOUT; 如果是抢答倒计时, 如是则查询抢答, 否者跳过查询继续倒数

AJMP RECOUNT ACCOUT: JNB P1.1,TRUE1 JNB P1.2,TRUE2 JNB P1.3,TRUE3 JNB P1.4,TRUE4 JNB P1.5,TRUE5 JNB P1.6,TRUE6 AJMP RECOUNT

QUIT: CLR OK;如果按下了" 停止键" 执行的程序 CLR RING AJMP START

;=====正常抢答处理程序===== TRUE1: ACALL BARK;按键发声 CLR P3.0 CLR P3.1 CLR P3.7 MOV A,#1EH;抢答后回答时间30s MOV R6,A;抢答时间R2送R6

MOV R3,#01H

CLR OK;因为答题的计时不再查询抢答, 所以就锁了抢答 AJMP COUNT TRUE2:ACALL BARK; SETB P3.0 CLR P3.1 CLR P3.7 MOV A,#1EH MOV R6,A MOV R3,#02H CLR OK

AJMP COUNT TRUE3:ACALL BARK; CLR P3.0 SETB P3.1 CLR P3.7

MOV A,#1EH MOV R6,A MOV R3,#03H CLR OK

AJMP COUNT TRUE4:ACALL BARK; SETB P3.0 SETB P3.1 CLR P3.7

MOV A,#1EH MOV R6,A MOV R3,#04H CLR OK

AJMP COUNT TRUE5: ACALL BARK; CLR P3.0 CLR P3.1 SETB P3.7

MOV A,#1EH MOV R6,A MOV R3,#05H CLR OK

AJMP COUNT TRUE6: ACALL BARK; SETB P3.0 CLR P3.1 SETB P3.7

MOV A,#1EH MOV R6,A

MOV R3,#06H CLR OK

AJMP COUNT ;=====犯规抢答程序===== ERROR: MOV R0,#00H MOV TH1,#3CH MOV TL1,#0B0H

MOV 34H,R3;犯规号数暂存与(34H) HERE: MOV A,R0

CJNE A,#0AH,FLASH;0.5s向下运行->灭并停响 CLR RING

MOV R3,#0AH MOV R4,#0AH

MOV R5,#0AH;三灯全灭 AJMP CHECK1

FLASH: CJNE A,#14H,CHECK1;下面系1s 的情况, 响并显示号数并清R0, 重新计 SETB RING MOV R0,#00H

MOV R3,34H;取回号数 MOV R5,#0BH

MOV R4,#0BH;显示FF 和号数 AJMP CHECK1 CHECK1: JNB P1.7,QUIT1 ACALL DISPLAY AJMP HERE QUIT1: CLR RING CLR OK

AJMP START ;=====显示程序=====

; 入口参数:R5,R4,R3存入的分别为第一,二,三为数码所显示的位码 ; 出口参数:无 DISPLAY:

MOV DPTR,#DAT1;查表显示程序, 利用P0口做段选码口输出/P2低三位做位选码输出,

MOV A,R5

MOVC A,@A+DPTR MOV P2,#01H MOV P0,A ACALL DELAY

MOV DPTR,#DAT2 MOV A,R4

MOVC A,@A+DPTR MOV P2,#02H MOV P0,A ACALL DELAY MOV A,R3

MOVC A,@A+DPTR MOV P2,#04H MOV P0,A ACALL DELAY RET DAT1:

DB 00H,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H

;" 灭","1","2","3","4","5","6","7","8","9"," 灭","F"

DAT2: DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H ; 第一个为零, 其他与上相同, 因为十位如果为零显示熄灭 ;====加减时间延时(起到不会按下就加N 个数)====== DELAY1: MOV 35H,#20H LOOP0: ACALL DISPLAY DJNZ 35H,LOOP0 RET

;=====延时(显示和去抖动用到)=====

DELAY: MOV 32H,#12H LOOP: MOV 33H,#0AFH LOOP1: DJNZ 33H,LOOP1 DJNZ 32H,LOOP RET

;=====发声程序===== BARK: SETB RING ACALL DELAY1 ACALL DELAY1 CLR RING;按键发声 RET

;=====TO溢出中断(响铃程序)===== T0INT:MOV TH0,#0ECH MOV TL0,#0FFH JNB RING,OUT

CPL P3.6 ;RING标志位为1时候P3.6口不短取反使喇叭发出一定频率的声音

OUT:RETI

;=====T1溢出中断(计时程序)===== T1INT: MOV TH1,#3CH MOV TL1,#0B0H INC R0 RETI END

第9章 实验仿真器件

参考文献

1. 《单片机原理与接口技术》(第二版) 主编:李晓林等 电子工业出版社 2. 《嵌入式系统设计与实践》 主编:张晓林等 北京航空航天大学出版社 3. 《单片机技术及应用系统设计》 主编:谢克明等. 兵器工业出版社 4. 《51单片机应用开发25例——基于Proteus 仿真》

主编:张新等 电子工业出版社


相关文章

  • 最新电子信息工程毕业论文题目参考
  • 1. 家庭防盗报警系统 2. 单片机实现单步进电机及8位流水灯控制的设计 3. 篮球竞赛计时系统 4. 单片机89C51在直流调速控制系统中的应用 5. 八路数字抢答器 6. 基于51机的直流电机设计 7. 基于51单片机的步进电机控制系统 ...查看


  • 基于单片机的三路抢答器的设计 王辉
  • 基于单片机的三路抢答器的设计 1课程设计的任务与要求 1.1 课程设计的任务 (1)设计一个可供3人进行的抢答器. (2)系统设置复位按钮,按动后,重新开始抢答. (3)抢答器开始时数码管显示序号00,选手抢答实行优先显示,优先抢答选手的编 ...查看


  • 基于51单片机的无线抢答器设计
  • 基于51单片机的无线抢答器设计 [摘要]抢答器是为参赛者答题时进行抢答而设计的一种优先判决器.本次采用STC89C51单片机作为主机与终端控制单元,采用315M 无线收发模块为从机控制单元.315M 无线收发模块是通过红外遥控的专用芯片SC ...查看


  • 电子信息工程毕业设计题目大全
  • 1 压力容器液位测量 2 多功能遥控小车 3基于RS232的仓库多点温度.湿度.气 4压检测系统 5自动控制升降旗系统 6基于RS485的温度报警系统 7基于模糊算法的水温控制系统的设计 8多分机电话交换机 9简易火灾自动报警系统 10基于 ...查看


  • 89c51抢答器制作
  • 郑州科技学院 本科课程设计论文 题 目 专 业 姓 名 学 号 指导老师 郑州科技学院信息工程学院 二〇一四年 摘要 ............................................................. ...查看


  • 基于51单片机的八位抢答器课程设计
  • 电子技术应用综合课程设计 -51单片机八位抢答器 目录 第一章:内容提要„„„„„„„„„„„„„„„„„„„„„„„„„„4 1.1设计要求„„„„„„„„„„„„„„„„„„„„„„„„4 1.2总体设计方案„„„„„„„„„„„„„„ ...查看


  • 单片机课设报告抢答器
  • 武汉理工大学华夏学院 课程设计报告书 课 程 名 称 单片机原理及应用课程设计 课程设计总评成绩 学生姓名.学 号 学 生 专 业 班级 自动化1133 指 导 教 师 姓名 课程设计起止日期 2015.12.21~2015.12.31 目 ...查看


  • 四路智能抢答器课程设计
  • 摘 要 近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测日新月异.此次设计提出一种用AT89C52单片机作为核心控制元件与电阻.液晶显示屏.蜂鸣器等构成硬件条件,再利用C语言编程来控制抢答器的功能实现. 本论文对抢答 ...查看


  • 基于单片机的八路智能抢答器系统设计毕业论文
  • 摘 要 随着科学技术的发展和普及,各种各样的竞赛越来越多,其中抢答器的作用也 越来越重要.本文设计出以AT89S51单片机为核心的八路抢答器,采用了数字显示 器直接指示,自动锁存显示结果,并自动复位的设计思想,它能根据不同的抢答输 入信号, ...查看


  • 单片机 四人抢答器 课程设计4
  • 四人抢答器模拟实验报告 一.目的与要求 1. 目的: (1)培养学生综合利用MCS-51单片机的软硬件知识进行程序设计的能力,解决一些实际问题. (2)进一步加深对MCS-51单片机内部结构和程序设计方法的理解. (3)提高学生建立程序文档 ...查看


热门内容