1.1 课题的背景简介
1.1.1 电梯的历史与发展
电梯进入人们的生活已经150年了。一个半世纪的风风雨雨,翻天覆地的是历史的变迁,永恒不变的是电梯提升人类生活质量的承诺。 生活在继续,科技在发展,电梯也在进步。150年来,电梯的材质由黑白到彩色,样式由直式到斜式,在操纵控制方面更是步步出新——手柄开关操纵、按钮控制、信号控制、集选控制、人机对话等等,多台电梯还出现了并联控制,智能群控;双层轿厢电梯展示出节省井道空间,提升运输能力的优势;变速式自动人行道扶梯的出现大大节省了行人的时间;不同外形——扇形、三角形、半菱形、半圆形、整圆形的观光电梯则使身处其中的乘客的视线不再封闭。如今,以美国奥的斯公司为代表的世界各大著名电梯公司各展风姿,仍在继续进行电梯新品的研发,并不断完善维修和保养服务系统。调频门控、智能远程监控、主机节能、控制柜低噪音耐用,一款款集纳了人类在机械、电子、光学等领域最新科研成果的新型电梯竞相问世,冷冰冰的建筑因此散射出人性的光辉,人们的生活因此变得更加美好。
中国最早的一部电梯出现在上海,是由美国奥的斯公司于1901年安装的。1932年由美国奥的斯公司安装在天津利顺德酒店的电梯至今还在安全运转着。1951年,党中央提出要在天安门安装一台由我国自行制造的电梯,天津从庆生电机厂荣接此任,四个月后不辱使命,顺利地完成了任务。十一届三中全会后,沐浴着改革开放的春风,我国电梯业进入了高速发展的时期。在我国任何一个城市,电梯都在被广泛应用着。电梯给人们的生活带来了便利,也为我国现代化建设的加速发展提供了强大的保障。电梯是高层建筑中安全、可靠、垂直上下的运载工具,对改善劳动条件、减轻劳动强度起到很
47
4747哈尔滨工程大学本科生毕业论文 大的作用。电梯的应用范围很广,可用于宾馆、饭店、办公大楼、商场、娱乐场所、仓库以及居民住宅大楼等。在现代社会中,电梯已成为人类必不可少的垂直运输交通工具。
1.2 课题的主要研究内容及设计步骤
本课题的主要任务是完成一个电梯系统的调度模块,即根据每个楼层不同顾客的按键需求,让电梯做出合理的判断,正确高效地知道电梯完成各项载客任务。根据此任务,本课题需要研究的内容有:
1、根据系统的技术要求,进行系统硬件的总体方案设计; 2、学习单片机的相关知识,并且加以运用;
3、研究C语言编程,并且规定电梯的工作规则,用C语言加以实现; 4、对软件和硬件进行调试,让其协调工作,完成指定任务。 结合以上内容,本课题的设计方案步骤如下: 关于硬件部分:
首先,对实际的电梯系统进行模拟,一般情况下,一个电梯应该具备相关按键、二极管、数码管等,由于这是一个调度模块,故没有设计具体的轿厢等机械部分。然后,结合这些实物,选择恰当的芯片,并分成若干模块,安排好各自之间的关系。由于其有诸多按键和显示环节,而单片机的I/O口管脚资源实在有限,故需要I/O口扩展,用以管理二极管;同时要有专门的按键控制芯片,从而便于按键管理。在此,我分别选择了82C55和8279芯片。接着,要完成电路图的设计,画出PCB板,焊接相关器件后进行硬件调试,看是否好用并加以适当的更正。
关于软件部分:
处于最底层的是对两个芯片的寄存器读写工作,完成后方可进行更高层的应用程序调试。为了使硬件简单化,我选择了模拟时序的方法读写寄存器,这比总线操作的方法节省了锁存器。然后是关于电梯调度时所遵循的原则作
47
4747哈尔滨工程大学本科生毕业论文 出规定,其必须基于高效与人性化两个原则。最后是使用C语言将规定程序化,以便电梯真正的运作。
当然,二者的关系并不是分离的,它们是相辅相成,硬件依据软件来验证,软件依据硬件来调试。经过一个个的发现问题、一个个的解决问题,最终做出完美的电梯调度模块。
1.3 课题的开发环境简介
1.3.1 电路图制作软件Altium designer 7.0
Altium Designer 7.0 不断通过为高速设计提供各种功能来提高用户生产力,这些功能包括交互式长度调整和 PCB 层片增强等功能。新增的库工具和各种新功能将 Altium Designer 提升成为统一的电子产品开发解决方案。这款最新的更新程序将进一步增强您的能力,让您能够在更短的“设计到制造”周期内生产更为尖端、更具创新性的电子产品。(Altium Designer完全取代了Protel)
Altium Designer Summer 08新增汇入Allegro PCB(*.brd)的转文件功能。
Altium Designer 提供了唯一一款统一的应用方案,其综合电子产品一体化开发所需的所有必须技术和功能。Altium Designer 在单一设计环境中集成板级和FPGA系统设计、基于FPGA和分立处理器的嵌入式软件开发以及PCB版图设计、编辑和制造。并集成了现代设计数据管理功能,使得Altium Designer成为电子产品开发的完整解决方案-一个既满足当前,也满足未来开发需求的解决方案。 1.3.2 C51的程序开发软件Keil
单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是
47
4747哈尔滨工程大学本科生毕业论文 机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM 语言和 C 语言的程序设计,界面友好,易学易用。
1.4 设计功能要求
本设计是为一八层电梯设计一调度系统,即使电梯能够合理高效地运行,完成各楼层顾客的接送任务。形象地说,就是要应对不同楼层顾客的不同需求,作出合理高效的判断,使所有顾客在整体运用时间最短的条件下将其运往各自的目的地。
这个设计的成品应该可以作为真实电梯的控制系统一样,遵守以下两个原则:一是高效性,二是人性化。而实际电梯所面临的情况无比复杂,故本设计的难点除了硬件上面外,还有对这些复杂的情况归类化,分为若干个基
47
4747哈尔滨工程大学本科生毕业论文 本情况,另外是用恰当的C语言描述来表达这些复杂的逻辑。
1.5 本文内容安排
在本设计制作的过程中,我查阅阅了大量的相关资料、期刊,并在导师的指导帮助下仔细地进行了斟酌。现将论文的章节安排再次做些简要的说明:
第一章,即绪论部分,先对电梯的背景知识等做些介绍,并且对与本设计的设计步骤与重点加以说明,简单介绍了两个与毕设有关的开发软件。
第二章,详细地阐述了设计中所用到的各个模块的硬件电路及其工作原理。其中包括单片机最小系统、82C55发光二极管控制模块、8279键盘控制模块和串口下载模块等。
第三章,以硬件的物理连接作为基石,以读写芯片内部数据与命令寄存器作为基础,以电梯判决函数作为核心,本章详细地讲述了软件系统的工作原理,并对各个重要函数都有相关的说明。
47
第二章 系统的硬件设计
2.1 引言
由于电梯要运送不同楼层的客人,所以要有很多按键才可以让满足不同楼层顾客的需求。而且,电梯还要有人性化的显示,如哪个按钮按下了,就把它对应楼层按钮的二极管点亮,还要有一个数码管实时显示电梯所在层数,用发光二极管组成的上下箭头来表示电梯当前的运行方向等等。而这些零碎的原件,又需要高效的芯片来控制,它们相互之间的物理连接问题这些就是本章所要叙述的硬件设计部分。 2.1.1 硬件芯片的选择
合理的硬件设计是一个设计成功的基石,所以在设计之初,我便把自己的主要任务集中于筹划硬件的搭建工作,当然其中需要兼顾软件设计的需求。
由于本设计所模拟的楼层共有八层,其中所需要控制的器件较多,如每层都需有两个上下的指示灯,电梯轿厢内也需有去几层的指示灯等,而现有单片机的管脚资源无法满足需求,故第一步需要想法扩展单片机的I/O口管脚资源。在此,我选择了扩展I/O口最典型的芯片82C55。其可把一组八位I/O管脚扩展为PA、PB、PC三组管脚,并通过寄存器对各组管脚进行配置,从而满足了本次设计的要求。
考虑到电梯会有多个按键,而传统的依据单片机自身的I/O口布局键盘的方法显然也是不可行的,故本设计选择了典型的管理键盘的芯片82C79,其重要意义不仅在于减轻了单片机I/O口的开支负担,而且可以代替单片机完成各个按键的键值编写工作,单片机只要从其FIFO寄存器中直接读取键值即可得知哪个按键被按下,进而进行相应的操作。
另外,电路板上还有一些扩展的子电路模块,例如MAX232串口下载模块,U口供电模块等等,当然这些都是方便程序的下载与调试的。并考虑到电路板的面积与价格问题,一些芯片与二极管、电阻等用的是贴片封装。
47
2.2 硬件电路
2.2.1 单片机最小系统模块
单片机是指一个集成在一块芯片上的完整计算机系统。尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备。而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。
在本设计中,最小系统应该包括:单片机、晶振电路、复位电路等。如图2.1所示,晶振电路由C1与C2和晶振组成,晶振是给单片机提供工作信号脉冲的。它的速率就是单片机的工作速率,简单地说,没有晶振,就没有时钟周期,没有时钟周期,就无法执行程序代码,单片机就无法工作。并在晶振的两引脚处接入两个10pF-50pF的瓷片电容接地用来削减偕波对电路的稳定性的影响。复位电路采取的为手动按键复位电路,由电容C13,电阻R11、R12和开关RESET组成,当单片机的复位引脚RESET出现2个机器周期以上的高电平时,单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位状态。每次复位后,单片机的程序都会从第一条开始从新执行。另外,还额外设计了滤波防干扰电路,由C13与R12组成,电源先经过它们再接入单片机的Vcc,可以有效的减少其中的杂波带来的干扰。 2.2.2 可编程I/O扩展芯片82C55模块
8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。 其各口功能可由软件选择,使用灵活,通用性强。8255可作为单片机与多种外设连接时的中间接口电路。其芯片引脚图如图2.2所示。
47
图2. 1 单片机最小系统
图2.2 82C55引脚分布
47
D7~D0(data bus):三态、双向数据线,与CPU数据总线连接,用来传送数据。
(chip select):片选信号线,低电平有效时,芯片被选中。 A1, A0(port address):地址线,用来选择内部端口。
(read):读出信号线,低电平有效时,允许数据读出。 (write):写入信号线,低电平有效时,允许数据写入。
RESET(reset):复位信号线,高电平有效时,将所有内部寄存器(包括控制寄存器)清0。
PA7~PA0(port A):A口输入/输出信号线。 PB7~PB0(port B):B口输入/输出信号线。 PC7~PC0(port C):C口输入/输出信号线。 VCC:+5V电源。 GND:电源地线。
8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。同时必须具有与外设连接的接口A、B、C口。由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。
1、与CPU连接部分
根据定义,8255能并行传送8位数据,所以其数据线为8根D0~D7。由于8255具有3个通道A、B、C,所以只要两根地址线就能寻址A、B、C口及控制寄存器,故地址线为两根A0~A1。此外CPU要对8255进行读、写与片选操作,所以控制线为片选、复位、读、写信号。各信号的引脚编号如下:
47
(1)数据总线DB:编号为D0~D7,用于8255与CPU传送8位数据。 (2)地址总线AB:编号为A0~A1,用于选择A、B、C口与控制寄存器。 (3)控制总线CB:片选信号CS、复位信号RST、写信号WR、读信号RD。当CPU要对8255进行读、写操作时,必须先向8255发片选信号CS选中8255芯片,然后发读信号RD或写信号WR对8255进行读或写数据的操作。
2、与外设接口部分
根据定义,8255有3个通道A、B、C与外设连接,每个通道又有8根线与外设连接,所以8255可以用24根线与外设连接,若进行开关量控制,则8255可同时控制24路开关。各通道的引脚编号如下:
(1)A口:编号为PA0~PA7,用于8255向外设输入输出8位并行数据。 (2)B口:编号为PB0~PB7,用于8255向外设输入输出8位并行数据。 (3)C口:编号为PC0~PC7,用于8255向外设输入输出8位并行数据,当8255工作于应答I/O方式时,C口用于应答信号的通信。
3、控制器
8255将3个通道分为两组,即PA0~PA7与PC4~PC7组成A组,PB0~PB7与PC0~PC3组成B组。如图7.5所示,相应的控制器也分为A组控制器与B组控制器,各组控制器的作用如下:
(1)A组控制器:控制A口与上C口的输入与输出。 (2)B组控制器:控制B口与下C口的输入与输出。
在本设计中,8255与单片机间的通信采取的时模拟时序的方法。单片机的P0口只是用作了数据线,这样与以往的采用P0口数据地址线分时复用的方法相比,简化了电路构造(因为这样可以少用一个芯片74HC573)。
具体的电路子模块如图2.3所示,三组扩展管脚均得到了充分的利用。PA口与PB口负责每层楼的上下按键显示灯的亮灭,而PC口负责电梯所到达当前楼层的楼层显示工作。同时,由于干扰等原因,82C55所输出的电压值偶尔偏低,这样直接驱动二极管时,可能会出现显示昏暗甚至不亮的问题,
47
故而在此加上了一个非门,可以起到提高电平值的作用。P1与P2为两个220欧的排阻,用于限流作用,以防二极管由于电压过高所导致的可能被烧坏。
芯片82C55的数据口D0~D7分别与单片机的P0口各管脚相连,进行数据的传输。而
和
也当然与单片机的
和
相连,方便数据或者命
令的读与写。其寻址管脚A0与A1分别与单片机的P2^0与P2^1相连,操作时只需对P2口的对应两管脚输出合理的高低电平组合,即可选中芯片82C55的相应寄存器,进而进行相应操作。芯片的片选由单片机的P2^6控制,且低电平有效。其复位管脚RESET与单片机的复位管脚可直接相连。当然,有时芯片82C55的反应没有单片机快速,此时可以进行“软复位”,即让其复位管脚RESET与单片机的某个闲置的I/0管脚相连,通过人为的控制此管脚
图2.3 82C55数码管控制模块
的高低电平及其时间来对芯片82C55进行复位。即让此I/O管脚输出高电平,且保持一段时间,保证在此时间段内,芯片82C55有足够的时间复位后,再让此管脚恢复低电平即可。
另外,本设计中所用的数码管为共阳型。其引脚分布如图2.4所示。有
47
图可知,当要显示特定字符时,只需向其相应段的管脚输入低电平,此段即亮;反之同理,若要其某段不亮,只需输入高电平即可。了解此原理便可方便对其的编程工作。
图2.4 共阳极数码管内部结构
2.2.3 可编程按键控制芯片82C79模块
Intel8279芯片是一种通用的可编程序的键盘、显示接口器件,单个芯片就能完成键盘输入和LED显示控制两种功能。其引脚分布如图2.5所示。8279包括键盘输入和显示输出两个部分。
键盘部分提供的扫描方式,可以和64个按键或传感器的阵列相连。能自动消除开关抖动以及为N个键同时按下提供保护。
47
图2.5 8279引脚分布
主要管脚的定义为: (片选):输入线,当
否则被禁止。
A0(数据选择):输入线。当A0=1时CPU写入数据为命令字,读出数据为状态字;A0=0时CPU读、写的字节均为数据。
DB0~DB7:与单片机通信的数据引脚,用于传送数据。 Vcc、GND:电源端与地端,用于给芯片提供电源。
、
(读、写信号):输入线。低电平有效,来自CPU的控制信
=0时8279被选中,允许CPU对其读、写,
号,控制8279的读、写操作。
IRQ(中断请求):输出线。高电平有效。
在键盘工作方式中,当FIFO/传感器RAM存有数据时,IRQ为高电平。CPU每次从RAM中读出数据时,IRQ变为低电平。若RAM中仍有数据,则IRQ再次恢复高电平。
47
在传感器工作方式中,每当检测到传感器状态变化时,IRQ就出现高电平。
SL0~SL3(扫描线):输出线。用来扫描键盘和显示器。它们可以编程设定为编码(4中取1)或译码输出(16取1)。
RL0~RL7(回复线):输入线。它们是键盘矩阵或传感矩阵的列(或行)信号输入线。
SHIFT(移位信号):输入线、高电平有效。该输入信号是键盘数据的最高位(D7),通常用来扩充键开关的功能,作为控制功能键用。
在选通输入方式时,该信号的上升沿可将来自RL0~RL7的数据存入FIFO RAM中。
在传感器输入下,该信号无效。
OUTA0~OUTA3(A组显示信号):输出线。 OUTB0~OUTB3(B组显示信号):输出线。
这两组引线都是显示数据输出线,与多位数字显示的扫描线SL0~SL3同步,两组可以独立使用,也可以合并使用。
BD(显示消隐):输出线。低电平有效。该信号在数字切换显示或使用消隐命令时,将显示消隐。
其在本设计中的工作电路图模块如图2.6所示:
47 图2.6 8279键盘控制模块
由图可知,其八位并行数据管脚分别与单片机的P0口各管脚相连。读写信号端也分别与单片机的对应。而其片选由P2^7控制,低电平有效。其CLK管脚与ALE相连,单片机正常工作时,ALE管脚输出方波,频率为单片机工作频率的六分之一。而芯片82C79的扫描键盘的频率正是由此而产生,当然i用这么高的频率,还需要继续对其分频后方可供82C79使用。复位键同样与单片机的复位键相通。而至于有些管脚如BD、SHIFT、CNTL/S等由于在此设计中无甚意义,故均将其接地处理。
其工作机理为:82C79的SL0~SL2在芯片工作时,不断以固定的频率输出低电平,当然是同一时间只选择其中一根线为低电平,其他还未高电平,同时扫描RL0~RL7端,若得到某各端口返回低电平,在经过消抖处理后仍为低电平,则说明SL0~SL2当前输出低电平的那根线与RL0~RL7当前返回低电平的那根线的交叉处的那个开关被按下了。那么芯片82C79会自动将该按键按照规定的协议翻译为相应的键值(每个按键都有自己唯一的键值标示,这便于在编写程序时读取键值进而进行散转),存储与FIFO寄存器中,同时,由于该寄存器中存有单片机未读取的值,IRQ管脚就会自动输出高电平,再经过非门后对单片机的INT0产生中断,此时只需在编程时在中断程序中对其进行相应处理即可。
2.2.4 MAX232串口下载模块与附加电源模块等
由于程序绝不可能第一次编写完就可以达到预设的目的,其间要经过很多次的更改修正,故为了便于程序的调试工作,我在此电路板上增设了一个MAX232串口下载模块,这样便可以不用取下单片机去其他的电路板上下载,而直接便可以在此电路板上完成了。同时为便于电源的引入,我选择了电脑USB口输出的5V直流电源,这样无需再用大型的电源设备,随处便可以调
47
试。他们的电路图如图2.7所示:
图2.7 串口下载模块
MAX232电路时该芯片数据手册中提供的典型应用图。MAX232是一个电荷泵器件,它采用开关电容技术将5V电压升压和获取负电压。
至于电源模块,便比较简单了,USB口通常有四条引出线,其中边缘两根便为电源线,一个为+5V直流端,一个为地端。中间两根为差分信号线D+与D-,负责信号的串行通信。但由于此处只用做电源功能,故中间两根无需接入。+5V直流端通过一个按键开关并经过一10微法的电容滤波后接入Vcc,供整个电路板供电。当电源导通后,电源指示二极管会高亮。
同时,基于人性化处理,在电梯上下行时,我专门用若干个二极管排列成上下箭头的形状,如图所示。中间的四个发光二极管组成一竖线型,并处于常亮状态,当电梯上行时,与单片机P1^3管脚连接的UP端将输出低电平,经过一非门后使组成上三角的四个发光二极管点亮,从而形成以向上箭头;同理,当下行时,与单片机P1^1脚相连的DOWN端将输出低电平,使组成下三角的四个发光二极管导通,形成向下箭头,如图2.8所示。
47
点。
显示。
2.3 本章小结
47
图2.8 上下行箭头显示模块
管显示模块、串口下载模块、电源模块等。它们均具有不可或缺的功能及特
整个硬件系统的工作机理为:单片机最小系统为整个系统提供最基本的
本章对设计中的硬件环节作了详细的介绍,并将其分为若干模块,分别
运行环境,8279通过扫描按键是否按下,向单片机发出中断,单片机进行相
应处理,并通过82C55控制发光二极管的两灭、通过8279控制当前楼层的
为单片机最小系统模块、82C55发光二极管显示模块、8279键盘控制与数码
第三章 芯片基本读写的实现
3.1 引言
本设计主要用到三个芯片,即单片机82C82、I/O口扩展芯片82C55、按键控制芯片8279。它们之间只有完美无误地进行通信,才可以保证更高程序思想的实现。本章就以此为目的,详细探讨两芯片的内部协议,包括引脚排列,内部寄存器的数据结构,操作特点等等。最后是两芯片的初始化函数。
3.2 单片机对芯片82C55的基本读写
与一般其他的芯片类似,对82C55芯片的操作,一般也即对其内部寄存器的操作。其内部寄存器分为两类,一类为命令寄存器,另一类为数据寄存器。很明显,由于82C55的功能为将一组单片机I/O口扩展为三组I/O口,
47
那么肯定要有三组数据寄存器,分别对应着它的三组I/O口,即PA口,PB口与PC口,那么82C55芯片便有四个寄存器,正好可以用两位的地址线进行寻址(即管脚A0与A1)。大概得其读寄存器的流程图3.1
开始使能片选选择寄存器地址读信号为低准备数据读信号为高片选无效P0置高电平开始使能片选选择寄存器地址写信号为低准备数据写信号为高片选无效P0置高电平
图3.1 读写寄存器流程图
具体的说,其过程为:开始选中该芯片(低电平有效),而后设置好所要读写的寄存器的地址,也即设置好A0与A1的数值组合,若为读寄存器,则让单片机读引脚P3^7为低电平,反之若为写寄存器,则让单片机写引脚P3^6为低电平,然后把要读或者写的数据放到数据口P0口上(需要注意的是,当单片机读寄存器时,对于其自身来说,是输入数据,故此时需先让P0口值为高电平0xff为下一步的输入做准备,而此流程图的最后一步即为这种情况做准备的),一段短短的稳定时间后再让读引脚或者写引脚为高电平,则在由低到高的跳变中,数据得到了转移。然后再片选无效,以防以后的数据传输产生相互干扰。最后数据口P0置为0xff,为方便下次可能的输入做准备。
47
3.3 芯片82C55的初始化
3.3.1 芯片82C55的逻辑构造
该芯片的逻辑构造如图3.2所示,
图3.2 82C55逻辑构造图
1、三个并行输入/输出端口(端口A、端口B、端口C) 8255A有A、B、C三个并行输入/输出端口(简称为A口、B口、C口),其功能全部由程序设定,每个端口都有自己的特点。A口、B口通常作为独立的I/O端口使用,C口也可以作为一般的I/O端口使用,但当A口、B口作为应答式的I/O口使用时,C口分别用来为A口、B口提供应答控制信号。
2、读/写控制逻辑
读/写控制逻辑用于管理数据、控制字或状态字的传送,其控制信号有以下几种:
(1) (2)
47
片选信号,低电平有效允许8255A与CPU交换信息。
读信号,低电平有效允许CPU从8255A端口中读取数据或状态
信息。
(3) 中。
(4) RESET,复位信号,高电平有效。清除8255A所有控制寄存器内容,并将各端口置成输入方式。
(5) A1、A0,8255A片内端口寻址地址。 3、A组和B组控制电路
A组和B组控制电路接受读/写控制逻辑的信号和CPU送入的控制字,然后决定各端口的功能。A组控制电路控制A口和C口的高4位(PC7~PC4);B组控制电路控制B口和C口的低4位(PC3~PC0)。还可根据控制字的要求对C口的某位实现置0或置1的操作。
4、数据总线缓冲器
数据总线缓冲器是一个双向三态的8位缓冲器,可与系统的数据总线直接相连,实现CPU和8255A之间的信息传送。
82C55芯片内部有四个寄存器,即命令寄存器、PA口寄存器、PB口寄存器、PC口寄存器。其中,向命令中写入数据可以控制芯片各扩展口的工作方式。向后三者寄存器中写入数据,芯片会自动将其取出,并以高低电平的形式分布于各相应管脚。并且,三组扩展口在作为输出时,均具有锁存功能。
由于有四组口,故相应的应该有两位地址来对其寻址。芯片上的A0、A1即为此而设计,当A0=0,A1=0时,寻址的为PA口寄存器;当A0=1,A1=0时,寻址的为PB口寄存器;当A0=0,A1=1时,寻址的为PC口寄存器;当A0=1,A1=1时,寻址的为命令(控制)寄存器。具体的端口选择与操作功能如表3.1所示
表3.1 8255A端口选择及操作功能表
A1 A0 0 47
,写信号,低电平有效允许CPU将数据、控制字写入到8255A
0 1 0 端口及操作功能 端口A→数据总线 输入操作0 0 1 0 0 1 1 × 1 × 1 0 0 1 0 1 × 1 × 0 0 1 1 1 1 × 0 1 1 1 0 0 0 0 × 1 1 0 0 0 0 0 0 1 0 0 端口B→数据总线 端口C→数据总线 数据总线→端口A 数据总线→端口B 数据总线→端口C 数据总线→控制寄存器 未选中8255A,数据总线→三态 非法状态(不能读控制寄存器) 数据总线→三态 输出操作(写) (读) 3.3.2 芯片82C55的工作方式
该芯片具有三种可选的工作方式,分别便于不同情况时供使用者以更为方便的选择。现对其工作方式做一简要介绍如下:
1、方式0—基本输入输出方式 (1) 方式0的工作特点
方式0称为基本输入输出方式,该方式下可将3个数据端口划分为4个独立的部分:A口和B口作为两个8位端口,C口的高4位和低4位可以用作两个4位端口(当然也可以作为一个8位端口),各个端口都可以独立用作输入或输出。其特性如下:
1. 任何端口都具有输出及输入功能。
2. 输出时,各Port 均有锁定功能,能将信号锁定在最后一次的输出状态上。
3. 输入无锁定功能,数据收到后,端口上的信号将不会保留最后一次输入的状态。
4. 有2 个8 位端口(PA 和PB)及2 个4 位端口(PC0~PC3 和PC4~PC7)可供利 用。
47
5. 共可组成16 种不同的输出入状态。 (2) 方式0的使用场合
方式0使用在无条件传送和查询式传送两种场合。 2、方式1—选通输入输出方式 (1) 方式1的工作特点
方式1是一种选通输入输出方式。在这种工作方式下,端口A、端口B和端口C被分为两个组。端口A和端口B用作数据的输入/输出,端口C的一些引脚信号被规定为端口A、B的联络信号,这些联络信号和C口的各引脚保持固定的对应关系,不能用程序改变。
1. A/B口输入的联络信号
STB :输入选通信号,低电平有效,外设输入;当该信号有效时,使8255的A/B口接收外设的8位数据。信号通过PC4/ A口、 PC2/ B口引入。
IBF:输入满信号,高电平有效,8255输出;当该信号有效时,表示8255已接收数据。信号通过PC5/ A口、 PC1/ B口引出。
INTR:中断请求信号,高电平有效,8255输出;当该信号有效时, 8255向CPU申请中断(读取数据),信号通过PC3/ A口、 PC0/ B口引出。
INTE:中断允许标志,是否允许发出中断申请( INTR );当设置PC4=1( A口的标志), PC2=1 ( B口的标志)时,中断允许。
2. A/B口输出的联络信号
OBF :输出满信号,低电平有效, 8255输出; 当该信号有效时,通知外设,A/B口的数据准备好。信号通过PC7/ A口、 PC1/ B口引出。
ACK:外设回答信号,低电平有效;当该信号有效时,表示外设已空闲。信号通过PC6/ A口、 PC2/ B口引入。
INTR:中断请求信号,高电平有效,8255输出;当该信号有效时, 8255向CPU申请中断(输入数据),信号通过PC3/ A口、 PC0/ B口引出。
INTE:中断允许标志,是否允许发出中断申请( INTR );当设置PC6=1( A
47
口的标志), PC2=1 ( B口的标志)时,中断允许。
方式1的工作特点可归纳如下:
端口A和端口B均可工作在方式1输入或输出方式。
若端口A和端口B中只有一个工作在方式1,而另一个工作在方式0,则端口C中有3位作为方式1的联络信号,端口C其余5位均可工作在方式0的输入或输出方式。
若端口A和端口B都工作在方式1,则C口中6位作其联络信号,剩下的2位还可工作在方式0的输入输出方式。
方式1有两种用法:
(1) 中断方式。将两个INTE置为1,A组和B组可以使用各自的INTR信号申请中断。
(2) 查询方式。微处理器通过读端口C,可以查询IBF、OBF#信号的当前状态,决定是否立即进行数据传输。
3、方式2—双向输入输出方式
方式2只适用于端口A,是双向的输入输出传输方式。在方式2,外设可以在A口的8位数据线上分时向8255A发送数据或从8255A接收数据,但不能同时进行。该方式需占用端口C的5位作为联络信号。端口A工作于方式2时,端口B可选方式0或方式1。 3.3.3 芯片82C55的初始化
由以上的分析可知,对芯片82C55的初始化,实质上即是规定好它每个扩展口是作为什么方式使用,即是输入还是输出,并且工作于何种方式。
47
图3.3 8255A工作方式控制字格式
根据本设计的需求可知,我们只需用到两组扩展口PA和PB,并且他们均是用于控制二极管的亮灭,可见是作为输出使用的;并且他们不需要其他的控制,即只要求作为最基本的输出即可,也即工作于方式0便可。而这一切,均可以通过芯片的方式控制字来加以限定。由以上要求,再结合图3.3我们可以得到该控制字的数值为0x80(二进制为1000 0000)。最后,再把这一命令控制字发送到82C55的命令寄存器即可,命令寄存器对应的地址为A0=1,A1=1。
3.4 对芯片8279的基本读写与初始化
3.4.1 芯片8279的基本读写
与82C55类似,由于未用诸如74HC573之类的锁存器,P0口无法实现数据与地址的复用功能,对8279的读写控制也是基于模拟时序的基础上进行的。并且他们的时序操作图大概类似,故在此不再赘述。 3.4.2 芯片8279的初始化
对该芯片的初始化,也即规定好该芯片的工作方式等,当然由于其功能
47
较为强大,故对其操作的语句也相对多些。一般来说,对8279操作的命令分为八种,分别为:1、键盘/显示器方式命令;2、时钟编程命令;3、读键字命令;4、读显示缓冲器命令;5、写显示缓冲器命令;6、显示器禁止写入/熄灭命令;7、清楚命令;8、结束中断/错误方式设置命令。现分别介绍如下:
1、键盘/显示方式设置命令字(表3.2)
表3.2 键盘/显示方式设置命令格式
D7 0 D6 0 D5 0 D4 D D3 D D2 K D1 K D0 K 其中:D7、D6、D5=000方式设置命令特征位。
DD(D4、D3):来设定显示方式,其定义如下(表3.3):
表3.3 D3、D4显示方式
D4 D3 0 0 0 1 1 0 1 1 显示方式 8个字符显示,左入口开始 16个字符显示,左入口开始(复位后状态) 8个字符显示,右入口开始 16个字符显示,右入口开始 所谓左入口,即显示位置从最左一位(最高位)开始,以后逐次输入的显示字符逐个向右顺序排列; 所谓右入口,即显示位置从最右一位(最低位)开始,以后逐次输入的显示字符时,已有的显示字符逐个向左顺序移动。
KKK(D2、 D1、 D0):用来设定七种键盘、显示工作方式(表3. 4):
表3.4 D2、D1、D0操作方式
D2 D1 D0 47
操作方式 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 外部编码扫描键盘(16取1),双键互锁 内部译码扫描键盘(4取1),双键互锁 外部编码扫描键盘N键依次读出 内部译码扫描键盘N键依次读出 外部译码扫描传感器矩阵方式 内部译码扫描传感器矩阵方式 选通输入方式,外部编码显示扫描 选通输入方式,内部译码显示扫描 双键锁定与N键轮回是多键按下时的两种不同的保护方式。双键锁定为两键同时按下提供的保护方法。再消颤周期里,如果有两键同时按下,则只有其中一个键弹起,而另一个键保持在按下位置时,才被认可。N键轮回为N键同时按下的保护方法。当有若干键按下时,键盘扫描能够根据发现他们的顺序,依次将它们的状态送入FIFO RAM中。
2、程序时钟命令(表3.5)
表3.5 程序时钟命令格式
D7 0 D6 0 D5 1 D4 P D3 P D2 P D1 P D0 P 其中:D7、D6、D5=001为时钟命令特征位。
PPPPP( D4、D3、D2、D1、D0)用来设定外部输入CLK端的时钟进行分频的分频数N。N取值为2~31。例如外部时钟频率为2MHZ,PPPPP被置为10100(N=20),则对输入的外部时钟20分频,以获得8279内部要求的100KMZ的基本频率。
3、读FIFO/传感器RAM命令(表3.6)
表3.6 读FIFO/传感器RAM命令格式
47
D7 0 D6 1 D5 0 D4 AI D3 X D2 A D1 A D0 A 其中:D7D6D5 =010为读FIFO/传感器RAM命令特征位。该命令字只在传感器方式时使用。在CPU读传感器RAM之前,必须使用这条命令来设定传感器RAM中的8个地址(每个地址一个字节)。
AAA(D2、D1、D0)为传感器RAM中的八个字节地址。
AI(D4)为自动增量特征位。当AI=1时,每次读出传感器RAM后地址自动加1使地址指针指向下一个存储单元。这样,下一个数据便从下一个地址读出,而不必重新设置读FIFO/传感器RAM命令。
在键盘工作方式中,由于读出操做严格按照先入先出顺序,因此,不需使用此命令。
4、读显示RAM命令(表3.7)
表3.7 读显示RAM命令格式
D7 0 D6 1 D5 1 D4 AI D3 A D2 A D1 A D0 A 其中:D7D6D5 =011为读显示RAM命令字的特征位。该命令用来设定将要读出的显示RAM地址。
AAAA(D3、D2、D1、D0)用来寻址显示RAM命令字的特征位。由位显示RAM中有16个字节单元故需要4位寻址。
AI(D4)为自动增量特征位。当AI=1时,每次读出后地址自动加1指向下一地址。
5、写显示RAM命令(表3.8)
表3.8 写显示RAM命令格式
47
D7 1 D6 0 D5 0 D4 AI D3 A D2 A D1 A D0 A 其中:D7D6D5 =100为写显示RAM命令字的特征位。在写显示器RAM之前用该命令用来设定将要写入的显示RAM地址。
AAAA(D3、D2、D1、D0)为将要写入的存储单元地址。
AI(D4)为自动增量特征位。当AI=1时,每次写入后地址自动加1指向下一次写入地址。
6、显示禁止写入/消隐命令特征位(表3.9)
表3.9 显示禁止写入/消隐命令格式
D7 1 D6 0 D5 1 D4 X D3 IWA D2 IWB D1 BLA D0 BLB 其中:D7D6D5 =101为显示禁止写入/消隐命令特征位。
IW/A、IW/B(D3、D2)为A、B组显示RAM写入屏蔽位。由于显示寄存器分成A、B两组,可以单独送数,故用两位来分别屏蔽。当A组的屏蔽位D3=1时,A组的显示RAM禁止写入。因此,从CPU写入显示器RAM数据时,不会影响A的显示。这种情况通常在采用双4位显示器时使用。因为两个双四位显示器是相互独立的。为了给其中一个双四位显示器输入数据而又不影响另一个四位显示器,因此必须对另一组的输入实行屏蔽。
BL/A、BL/B(D1、D0)为消隐显示位。用于对两组显示输出消隐。若BL=1时,对应组的显示输出被消隐。当BL=0时,则恢复显示。
7、清除命令(表3.10)
表3.10 清除命令格式
D7 1 D6 1 D5 0 D4 CD D3 CD D2 CD D1 CF D0 CA 其中:D7D6D5 =110清除命令特征位。
47
CDCDCD(D4D3D2)用来设定清除显示RAM方式,共有四种消除方式(表3.11)。
表3.11 D4D3D2消除方式
D4 D3 D2 1 0 X 1 1 0 1 1 1 0 X X 清除方式 将显示RAM全部清零 将显示RAM清成20H(A组=0010,B组=0000) 将显示RAM全部置1 不清除(CA =0) CF(D1)用来置空FIFO存储器,当=1时,执行清除命令后,FIFO RAM被置空,使中断输出线复位。同时,传感器RAM的读出地址也被置0。
CA(D0)为总清的特征位。它兼有CD和CF的联合效能。在CD=1时,对显示的清除方式由D3、D2的编码决定。
清除显示RAM约需160µS。在此期间FIFO状态时的最高位DU=1,表示显示无效。CPU不能向显示RAM写入数据。
8、结束中断/错误方式设置命令(表3.12)
表3.12 结束中断/错误方式设置命令格式
D7 1 D6 1 D5 1 D4 E D3 X D2 X D1 X D0 X 其中:D7D6D5 =111为该命令的特征位。此命令有两种不同的作用。
(1)作为结束中断命令。在传感器工作方式中使用。每当传感器状态出现变化时,扫描检测电路将其状态写入传感器RAM,并启动中断逻辑,使IRQ变高,向CPU请求中断,并且禁止写入传感器RAM。此时,若传感器RAM读出地址的自动递增特征没有置位(AI=0),则中断请求IRQ在CPU第一次从传感器RAM读出数据时就被清除。若自动递增特征已置位(AI=1),则CPU对传感器RAM的读出并不能清除IRQ,而必须通过给8279写入结
47
束中断/错误方式设置命令才能使IRQ变低。因此在传感器工作方式中,此命令用来结束传感器RAM的中断请求。
(2)作为特定错误方式设置命令。在8279已被设定为键盘扫描N键轮回方式以后,如果CPU给8279又写入结束中断/错误方式设置命令(E=1),则8279将以一种特定的错误方式工作。这种方式的特点是:在8279的消颤周期内,如果发现多个按键同时按下,则FIFO状态字中的错误特征位S/E将置1,并产生中断请求信号和阻止写入FIFO RAM。
上述八种用于确定8279操作方式的命令字皆由D7D6D5特征位确定,输入8279后能自动寻址相应的命令寄存器。因此,写入命令字时唯一的要求是使数据选择信号A0=1。
8279只有一位地址线A0,那么当然只可以寻址两个寄存器。实际上也是如此的,当A0=0时,寻址的为其内部的数据寄存器;当A0=1时,寻址的为其内部的控制寄存器。那么其控制命令有多种,单一的一个命令寄存器又是何以分辨如此多的命令呢?如上面所示,命令寄存器的八位中,高三位为命令的分辨符。故若想输入不同的命令,只需写入相应的高三位数据即可。
开始清零寄存器(命令字0xd1)设置按键方式(命令字0x03)
图3.4 8279初始化
设置分频(命令字0x2a)在本毕设中,应该规定哪些命令呢?如流程图3.4所示,对8279的初始化供分为三步,即先后输入三个命令。首先,我们要对芯片内部的各寄存器
47
进行类似于复位的清零操作,方便以后的使用;其次,由于本设计中8279主管22各按键,而按键按下时又有多种复杂的情况,诸如同时有若干按键按下等,我们要选择此种情况的处理方式;再者,由于8279对按键实际上是通过扫描的方式确定有无按键按下,故我们还要设置好扫描的频率等,由硬件电路知道,8279有一时钟输入引脚CLK接于单片机的ALE引脚上,在单片机正常工作时,ALE引脚输出的为晶振频率六分之一的脉冲,这正是8279扫描的时钟源,当然,8279的扫描频率不可能达到单片机晶振的输出频率那么高,其实际的最大扫描频率为100KH左右,故我们需要一设置分频命令。
那么这三个命令的命令字是如何得到的呢?参考上面命令字的格式可以知道:
(1)清除寄存器命令的高三位特征位应该为110,又由于我们是将显示RAM全部清零,故D4到D2位应该选择为100,由于对显示RAM的清除方式选择由D3和D2控制,故要求其D0位为1。故最终得到的命令字为11010001,转换为十六进制即为0xd1。
(2)设置按键方式中,其特征位的代码为000。由于未用到显示功能,故其对应控制位D4与D3可以随便设置,在此均设置为00。至于按键工作方式的选择,我们只所以选择内部译码扫描键盘N键依次读出的方式,是结合实际情况的结果。双键互锁的方法是当键盘同时有两个键按下时,任何一个键值均不能进入FIFO RAM中,直至仅剩一个键保持闭合时,该键值才能进入到FIFO RAM中。而N键依次读出方式,是N个键同时按下的保护方法。当有若干个键同时按下时,在键盘的扫描过程中根据发现它们的先后顺序进行识别,并以此将它们的状态送入FIFO RAM中。对比我们可以发现,现实中偶尔会发生不同楼层会有不同人同时按下不同按键的情况发生,这时若选择双键互锁的方式,则谁的键值都不能传达给内部寄存器,这是很不方便的,故在此,我们选择了N键依次读出的方式。对于市内部译码还是外部编码的扫描方式,我们也可以根据其特点进行选择:编码方式,也称为外部译码方
47
式,计数器以二进制方式计数,4位计数状态从扫描线SL0~SL3输出,经外部译码器译出16位扫描线,为键盘和显示器提供16取1的扫描线。而译码方式,也称为内部译码方式,扫描计数器的低2位经内部译码后从SL0~SL3输出,故此时提供了4取1的扫描译码。由电路图我们可以看出,实际上我们仅仅用到了SL0~SL3中的前三根线(因为按键不是太多,三乘八的矩阵键盘已足够使用),故四取一得译码方式便成为了我们的首选,其对应代码为D2D1D0=011。最终我们得到完整的命令符为0000 0011,也即十六进制中的0x03。
(3)设置分频命令字。其对应特征位为001.由于电路板上,单片机的晶振为6MHz,ALE脚输出的脉冲频率为晶振的六分之一,即1MHz,而8279的基本频率为100KHz,故我们设置的分频系数应该为1M/100K=10(十进制),对应的二进制为01010。最后可得完整二进制与十六进制命令码分别为00101010和0x2a。
3.5 本章小结
本章重点介绍了82C55和8279两种芯片的管脚分布及使用方法,特别是两种芯片内部寄存器的数据结构,对它们的了解是参数选择的依据,只有选择正确适当,整个系统才有可能按照我们的设计去运行。最后对照其数据结构,结合我们设计的需求,详细介绍了整个系统参数选取的过程。并且用流程图的方式说明了其初始化的方式。
47
第四章 系统的高层软件设计
4.1 引言
从程序功能上来分,本设计的高层软件程序大概可以分为以下几类:一、运行与决策函数;二、中断处理函数;三、置位各状态变量函数;四、清除各状态变量函数。
其中,第一类函数起作用于按键按下的时刻,当有按键按下时,8279芯片会采集到键盘的键值,并以中断的方式发送给单片机,此时,单片机即对程序中所用到的各个状态变量进行置位并且通过82C55点亮相关发光二极管,如置位按键所对应的去向变量等,方便决策函数使用。第二类函数的功能恰好与第一类相反,这类函数起作用于电梯到达目标楼层时,这时函数负责把相关发光二极管熄灭,并且及时清除相关状态位,以免影响判别函数作出正确判断。第三类函数是程序的核心。它直接负责管理电梯下一次所要到达的楼层,并且要基于短时间、高效率、人性化等原则。每当电梯经过一楼层时,此函数即会被调用,然后返回一个变量名为aim的值,它即为下一个电梯要停留的目标楼层值。
而从程序的层次上来分,又可分为位于最底层的芯片内部寄存器操作的基层程序和位于上层的应用程序,故本章以此为顺序,先介绍基层函数的实现,继而详细介绍各高层的应用函数。
4.2 单片机中断处理函数
本设计主要用到了单片机的中断系统。当8279扫描到有按键按下时,便会将键值存储起来,并在IRQ引脚输出高电平发出中断,通知单片机进行相关处理。在此详细介绍下中断的相关设置以及中断处理中都进行了哪些操作
47
(如图4.1所示)。
读取键值分析键值来源点亮相应发光二极管置位相应状态变量
图4.1 中断处理中的相关操作
4.2.1 单片机有关中断的相关设置
主要表现为对其中的一些相关寄存器的设置。由于用到的是外部中断0,其优先级别最高,故在此只需设置单片机特殊功能寄存器里的中断允许控制寄存器IE和定时/计数器控制寄存器TCON。二者的数据结构如表4.1和表4.2所示。
表4.1 中断允许与禁止寄存器IE
EA / ET2 ES ET1 EX1 ET0 EX0 其中:EA为单片机中断允许控制位,当其置位时表示允许单片机接收中断。后面六位依次为定时器2中断、串口中断、定时器1中断、外部中断~INT1
定时器0中断和外部中断~INT0的中断允许控制位,哪一位置1,就代表允许相应的中断。
本设计中用到的为外部中断0的中断,故需将EX0和EA置位。
表4.2 定时/计数器控制寄存器TCON
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 该寄存器包含有关于定时控制与溢出和外部中断的触发方式与中断请求标志的相关设置。其中高四位和定时器有关,在此没有用到。第四位中,最
47
低两位中的IE0和IT0时与外部中断0有关的。当外部中断0有中断呼叫时,IE0会自动置一,也即作为中断发生的一种标志。而IT0是关系到中断是以何种方式触发的。当IT0=0时,则为电平触发方式;当IT0=1时,则为边沿触发方式。在此,考虑实际情况,选择边沿触发方式较为合理,故要设置IT0=1。
4.2.2 读取8279数据寄存器
当单片机收到来自于8279的中断请求时,基于3.5.1中关于中断的一些设置,单片机会自动的响应中断,由于8279是由于其扫描到有按键按下,才发出中断,故我们第一步要把它扫描到得键值读回,这样才可以判断是哪个键按下,进而进行其他后续操作。
读8279的数据寄存器时,由于其内部只有一个数据寄存器,那么如何保证所读到得正好是我们想要的键值数据呢?在8279的相关协议中,规定在读取键值之前,需要先向其命令寄存器中输入读键值命令0x40。随后键值即会自动的装入数据寄存器中,便于读出。该函数在执行完成后,便会返回一个unsigned char型的数据,也即为键值。 4.2.3 分析键值,判断哪个按键按下
单片机在读取到键值后,自然会分析该键值来自于哪一层楼的哪个按键。然后才可以把该按键对应的二极管打亮(实际中的电梯也是如此)。 那么首先,单片机是如何分析键值的呢?
8279在控制诸多按键时,按键是按照行与列均匀分布的,特定的行与特定的列处的每个按键,均对应有特定的键值。首先可以人为地规定每个按键在电梯中所处的位置。例如规定位于SL0列与RL0行的按键即为三楼上行呼叫的按键等等(具体可参照电路图)。它有自己固定的键值。那么在都回键值后,只需用一个switch-case语句进行散转即可。
在此说明下按键的键值是如何规定的,也即为8279键盘输入数据的格
47
式。在键盘扫描方式下,进入键字RAM中的键输入数据对应于该键在键盘上的行列位置。键输入数据的格式见表4.3:
表4.3 8279键盘输入数据的格式
D7 0 D6 0 D5 D4 SCAN D3 D2 D1 RETURN D0 D7D6=00,表示引脚CNTL和SHIFT均接地。
D2D1D0(RETURN)表示输入键所在的行号,有RL7~RL0的状态决定。 D5D4D3(SCAN)表示输入键所在行号,由扫描计数值SL2~SL0的状态决定。
4.2.4 点亮相应发光二极管
分析完键值的来源后,就要点亮相应的二极管。由于二极管是由芯片82C55控制且是高电平使发光二极管点亮,故一般来说,要点亮哪个二极管,只需在单片机向82C55输入的数据的特定位为1即可。但实际上没有这么简单,因为我们做的不只是要点亮目前需要点亮的二极管,还有保证以前已经被点亮且暂时还不可以被熄灭的二极管熄灭。如果仅是简单的向这一位二极管输出高电平,那么其他的二极管会灭掉的。所以,我们的解决方式是申请两个全局变量pasta和pbsta,分别表示82C55的PA口与PB口输出电平状态,当要某位为高时,只需让此位为高电平,并且与以前的pasta或pbsta相或,然后再输出即可。当然,此时的pasta和pbsta也同样需要更新,以备以后使用。
4.2.5 置位相关状态变量
这一步是整个程序得以正常运行的前提与基础。在程序开始之前,我们设置了这样一些状态变量,它们分别对应于各个按键,当某个按键按下时,其对应的状态变量就会被置位。这样做的好处是使电梯在执行判决操作时,有据可循。因为判决函数就是依靠当前都有哪些键按下以及电梯此刻所处的
47
上下行状态来判断下一个需要停留的目标楼层的。
4.3 电梯判决函数
4.3.1 电梯所处状态的分类与判定
这是整个程序成功运行的核心保证。在电梯经过一个楼层时,就会自动调用该函数,它的作用是基于短时间、高效率、人性化的基础上,合理智能的对电梯的运行进行调度,结合实际情况,最终得出电梯下一个目标停留楼层。其流程如图4.2所示。
开始按键标识全为0?否是电梯不再运行电梯向上运行电梯向下运行电梯上楼接人电梯上楼送人电梯下楼接人电梯下楼送人相关处理1相关处理2相关处理3相关处理4图4.2 电梯判决流程图
由图可知,程序中将实际情况分为四种情况来判断:电梯上行且是去送人(即电梯此时位于底层,而高层有人呼叫要上楼)、电梯上行且是去接人(即电梯此时位于底层,而高层有人呼叫要下楼)、电梯下行且是去送人(即
47
电梯此时位于高层,而低层有人呼叫要下楼)、电梯下行且是去接人(即电梯此时位于高层,而低层有人呼叫要上楼)。
而这四种情况,也就包含了实际电梯中的绝大部分情况。情况不同,分析的方法也当然不一样。这个稍后会有详细介绍,而首先,我们要了解电梯是如何得知此时它是上面四种的哪一种情况的呢?
这可以分为两个步骤:第一判断电梯是上行还是下行;第二,判断是去接人还是去送人。当然,第一个是最好判断的,因为电梯在运行时,有两个与楼层有关的变量,一个为当前所在楼层值present,一个为目标楼层值aim,当电梯运行时,会让这两个值进行比较,若前者大于后者,就为下行,从而让状态变量down清零(由于电路中上下行的箭头使用了非门,故在程序中,两表示上下行的状态变量up和down清零时表示有效);反之,当前者小于后者,即为上行,从而up清零。
至于是接人还是送人,是判别的难点。在此,巧妙地利用了两个状态变量scanup和scandown,前者等于所有上行按键和去几层按键状态变量的或,后者等于所有上行按键和去几层按键状态变量的或。由此可知,当上行按键和去几层按键均为0时,电梯仍为上行状态,那么此时,电梯的状态肯定处于上楼接人的状态中(即在高层,有人按了下行键)。反之,若它们中有一个为1(且按键所处楼层高于当前电梯所在楼层,这个由其他函数来限定,防止电梯在上行过程中受已经过楼层按键按下时的干扰),则电梯此时处于上楼送人状态,就会执行对应的子程序。其他的与此同理。 4.3.2 电梯各情况下所对应的处理方法
以电梯上行的两种状态为例。
在实际应用中,最简单的情况莫过于电梯当前为闲置状态,然后有一人按下按键呼叫,然后电梯便响应呼叫。但是,实际情况往往比这复杂的多,在第一个人按下按键电梯运行的过程中,还很有可能会有其他不同楼层的人
47
按下不同的按键(上行或者下行)的情况发生。那么就必须得为电梯规定好一个特定的优先级规则,让其依据这个规则来运行,以免乱作一团。那么这个规则就必须要高效且人性化,在此,我们规定,当电梯上行时,均不理会那些按下行按键的顾客。并且,若在上行过程中,也有人在某层按的是上行按键,但是电梯此时已经走过了该层,那么电梯也绝对不会再选择先下行接他。当然,当将高层上行的顾客送完后(此时一般来说电梯已经处于高层了),电梯便会检测下行按键,若更高层有人呼叫下行,则电梯会选择先去响应他们,然后再下行的过程中依次响应按了下行处于等待中的顾客,最后这些顾客都送完后,再去相应那些电梯上行过程中,处于比电梯低的楼层却按了上行键的顾客。
简单地说,若电梯处于上行状态,则在该过程中响应不同顾客的优先级(或者电梯响应的先后顺序)为:高层呼叫上行顾客>高层呼叫下行顾客>底层呼叫下行顾客>底层呼叫上行顾客。
那么,当电梯通过程序运行得知到相应状态后,又是如何具体的判断当天所锁定的目标楼层是否要变更呢?现以上行为例,加以详细说明:
若上行,且是送人,比如电梯当前在二层,七楼有人呼叫上楼,那么它就要响应这一呼叫,从而把自己的目标楼层锁定为七楼并向上运行,而在七楼呼叫后不久,六楼也有人呼叫上楼(且电梯此刻还未运行到六楼),那么在电梯运行中,没经过一个楼层,会做一次判决,因为六楼也有人呼叫,所以正常情况下,它应该在判决后将目标楼层定位六楼。而若六楼的顾客按下的是下行键,或者二楼的人按下呼叫键,电梯此时都会暂时不予理会。部分程序代码见附录。
由程序可以看出,当六楼有上行键呼叫时,状态变量f6up便会被置位,程序走到判别if((f6up==0)|(present>6))时,里面的内容即为假,则不再继续向下判断,而转向else语句中,里面又有一个判断,当确定此时确实有键按下且电梯当前所处楼层小于六楼时,目标楼层就会被变更到六楼,程序最终返
47
回一个aim值。由于程序中没有下行键的出现,故下行键的状态是不会影响到该程序的判决的。
此时程序的检测依据两个标准:第一,由低层像高层开始检查;第二,对于电梯已经过的楼层和按下下行键所发出的请求,电梯暂时是不予理会的。这也是很明显的,因为上行送人状态中,低层的优先权大于高层的。程序就是靠着上面这些if语句的嵌套,来完成这种优先级设置的。
至于上行接人状态时,所坚持的标准是由高层到底层的顺序进行排查,而对于上行键的呼叫暂时不予理会。下行的状态,恰好与上行相反,在此不再赘述。
4.4 电梯运行函数
该函数直接控制电梯的上行与下行、运行与停止。不过在其中其关键作用的还是判决函数给它提供的目标楼层值。其具体的流程如图4.3所示。它的功能就是判断目标楼层与当前楼层间的关系:若前者大于后者,则上行;若前者小于后者,则下行;若相等,则停止片刻把门打开。当然,之后它还要做一次判断,因为可能还有其他的楼层需要呼叫,此时程序会自动装入合适的目标楼层值,指挥电梯继续运行下去,直到所有的呼叫都完成为止。
在这个程序中,还需注意的是当到达某一目标楼层后,需要做一些后续工作,即清零相应的状态变量和熄灭相应的发光二极管。前者是为了使该状态变量不会再对判决函数的结果产生影响,因为该响应呼叫任务已经完成了,就应该把它从参考参数里去除;后者是实际需要。而熄灭二级管的方法与点亮二极管的方法正好相反,要注意不可以熄灭其中一个二极管的时候,不可以把其他的也一起熄灭了,故在此也是用到在点亮二极管中的两个PA和PB口的状态参数pasta和pbsta。
47
开始是当前楼层与目标是否相等?否当前楼层小于目标楼层?是否判决目标楼层是否改变否停止判决目标楼层是否改变是改变目标楼层判决目标楼层是否改变?是改变目标楼层否清零相应状态变量与二极管是开门上行下行当前楼层加1当前楼层减1否
图4.3 运行函数流程图
4.5 主函数
之所以把主函数放于最后才说,是因为它最为简单,它之上把上面所有的函数按照恰当的顺序排列起来,便于相互调用而已。
首先,是对82C55与8279的初始化,规定它们的工作模式与相关必要状态;由于本程序中,各按键按下的信息是通过中断来告知单片机的,故我们要对单片机中断有相应的程序语句加以说明,如开总中断,开外部中断0以及其触发方式等等。最后就是一个大的死循环了,当电梯运行到这里的时候,就一直执行判决函数,检测有目标楼层有无改变,如果有,就开始调用
47
运行函数,而运行函数没当经过一个楼层又会再次调用判决函数等等。而当有中断发生时,单片机又可以转而处理相应的中断。就这样,各子函数间通过主函数形成了一个统一的整体,使得整个系统得以完美运行。
4.6 本章小结
本章根据由程序低层到高层的顺序安排,详细介绍了本设计中用到的各主要子函数:处于最低层的是对两个芯片82C55与8279的寄存器读写操作,这是整个程序得以运行的基石;处于核心位置的电梯调度函数,直接控制决定着电梯当前的运行目标;处于最高层位置的电梯运行程序,控制着电梯的运行与否与运动方向;处于人机交互地位的显示程序,控制着二极管的亮灭与数码管关于当天楼层的显示。另外,还对本设计中用到的单片机中断系统进行了详细介绍。
47
结 论 本文对电梯控制系统这一毕业设计做了详细的报告与总结,其中包括硬件部分与软件部分两大模块,而且对其中各个重要的子模块加以了重点详细地说明。
经验证,本设计所设计的电梯完全符合当初的预想,该电梯的调度完全符合高效、省时、人性化的特点。运行结果完美无误,可以作为真实电梯的调度系统使用。
本毕设的主导思想是:当有顾客按下按键呼叫电梯时,运用单片机的中断,将该信息传递给单片机,从而单片机置位相关的状态参量,为电梯判决函数的判断提供依据,然后单片机再实时地控制82C55点亮或者熄灭相关发光二极管。其中,单片机中断系统是基础,对82C55与8279的寄存器读写是基石,电梯运行函数为主导,电梯目标楼层判决函数为关键与核心。
总的来说,由于精心设计与调试,毕设的成品还是很成功的,而且本程序的编写不仅仅是为了应对八层楼的电梯,更多层的电梯也可以实现,比如8279可以控制64各按键,如果对单片机的其他I/O再进行扩展的话,可以实现十几层电梯的需求。当然,如果更高层的电梯,就会受到单片机管脚资源的限制了。而程序本身的思想本身是可以支持更多层电梯的运行调度的,如果用其他管脚多的处理器的话(如ARM型处理器),则这一设想完全可以实现。
附 录
附录1:部分程序代码
if(up==0)
47
{
if(uptake==0) { {
if((f1up==0)|(present>1)) if((to2f==0)|(present>2))
47
{ if((f2up==0)|(present>2)) {
if((to3f==0)|(present>3))
{ if((f3up==0)|(present>3)) {
if((to4f==0)|(present>4))
{ if((f4up==0)|(present>4)) {
if((to5f==0)|(present>5))
{ if((f5up==0)|(present>5)) { if((to6f==0)|(present>6)) { if((f6up==0)|(present>6)) {
if((to7f==0)|(present>7)) { if((f7up==0)|(present>7)) {
if(to8f==0)
{up=1; } ……
else { if((present<7)&(to7f||f7up==1)) {
if(aim!=7)
{change=1; }
aim=7;
} }
}
else { if((present<7)&(to7f||f7up==1))
{ if(aim!=7)
{change=1; } } }
aim=7;
else { {
if((present<6)&(to6f|f6up==1)) if(aim!=6)
{change=1; } } }
aim=6;
else { {
if((present<6)&(to6f|f6up==1)) if(aim!=6)
{change=1; } } }
aim=6;
else
…… return aim;
47
致谢
在这几个月的时间里,从对课题的理解,方案的设计,到程序的编写,再到论文的写作,中间有着自己的努力,更有着老师和同学的关心和巨大的帮助。
首先我要对本论文的指导老师王爽老师致以衷心的感谢!从论文的选题、有关资料的收集、课题的讨论,到论文的撰写和修改,导师都给了我悉心的指导和帮助。他对学生认真负责的态度让我由衷地敬佩。
感谢母校和老师们在大学三年中对我的培养。
47
因篇幅问题不能全部显示,请点此查看更多更全内容