88LED点阵屏模仿电梯运行的楼层显示 下载本文

《单片机原理》课

程课程设计

题 目 8x8LED点阵屏模仿电梯运行的楼层

显示

院 (系) 信息工程学院 专 业 班 级 学 生 姓 名 学 号 设 计 地 点 计算机应用实验室 指 导 教 师

起止时间: 2014年 6月 3日至 2013 年 6 月 14 日

摘 要

伴随着我国现代化程度的提高,电梯成为高层建筑中的重要交通工具,它是高层建筑中安全、可靠、垂直上下的运载工具,对改善劳动条件、减轻劳动强度起到很大的作用。同时也给人们的生活带来了便利,为我国现代化建设的加速发展提供了强大的保障。电梯的应用范围很广,可用于宾馆、饭店、办公大楼、商场、娱乐场所,仓库以及居民住宅大楼等。因此,在现代社会中电梯已成为人类必不可少的垂直运输交通工具。利用单片机控制电梯有成本低,通用性强,灵活性大以及易于实现复杂控制等优点。

本课程设计采用了一种采用单片AT89C51芯片进行电梯控制系统的设计方法,主要阐述如何使用单片机进行编程来实现电子设计的方法,利用单片机编程实现功能,简洁而又多变的设计方法,缩短了研发周期,同时使电梯控制系统体积更小功能更强大。本设计实现了电梯控制系统所需的一些基本功能,能通过数字按键选择楼层,点阵显示实时楼层数。原理图采用proteus专业软件来设计。

关键词:单片机;电梯;系统;控制;C语言

Abstract

Along

with our country's modernization degree enhancement, the

elevator as an important traffic tools in high-rise buildings, it is safe and reliable in high-rise buildings, vertical fluctuation of transport vehicles, to improve labor condition, reduce labor intensity play a big role.At the same time, it brought convenience to people's life, for the accelerated development of China's modernization construction provides a powerful guarantee.The elevator application range is very wide, can be used in hotels, restaurants, office buildings, shopping malls, entertainment venues, warehouses, residential buildings, etc.In modern society, therefore, the elevator has become a human essential vertical transportation vehicles.Using single-chip microcomputer control elevator has low cost, strong commonality, flexible and easy to realize complex control, etc.

This course design USES a single chip AT89C51 chip is adopted to improve the design method of the elevator control system, mainly elaborates how to use the MCU programming to realize the electronic design method, using single chip microcomputer programming function, concise and changeful design method, shorten the development cycle, at the same time make the elevator control system has the function of a smaller more powerful.This design to achieve the required some of the basic features of the elevator control system, can choose floor through digital key, dot matrix display real-time several floors.The schematic diagram using proteus professional software to design.

Key words: single chip microcomputer;The elevator;System;Control;The c language

目 录

1 绪 论 ................................................................................................................................... 1

1.1课程设计要求 ......................................................................................................... 1 1.2课题设计内容 ......................................................................................................... 1 2 设计原理及方案 ................................................................................................................ 2

2.1设计原理及方法 .................................................................................................... 2 2.2方案 ............................................................................................................................... 2 3 主控制器和外围器件 ..................................................................................................... 4

3.1 AT89C51单片机 ................................................................................................. 4 3.2 74LS245 ..................................................................................................................... 6 3.3.LED点阵 .................................................................................................................... 7 3.3.按键 ............................................................................................................................. 9 4 系统硬件电路设计 ......................................................................................................... 10

4.1

单片机最小系统模块 ....................................................................................... 10

4.2按键控制模块 ....................................................................................................... 11 4.3显示模块 .................................................................................................................. 12 4.4声光模块 .................................................................................................................. 12 4.5电路总图 .................................................................................................................. 13 5 软件程序设计 ................................................................................................................... 14 6 实验测试部分 ................................................................................................................... 15

6.1测试环境 .................................................................................................................. 15 6.2测试过程中的问题 ............................................................................................. 15

6.3实际效果 .................................................................................................................. 16 致 谢 ...................................................................................................................................... 18 参考文献 ................................................................................................................................... 19

附录A 程序清单 .................................................................................................................. 20 附录B元器件目录表 ......................................................................................................... 30

1 绪 论

1.1课程设计要求

1、设计采用单片机控制8*8 LED点阵屏来模仿电梯运行的楼层显示装置。 2、单片机的Pl口的8只引脚接有8只按键开关Kl~K8,这8只按键开关K1~K8分别代表l楼~8楼。如果某一楼层的按键按下,单片机控制的点阵屏将从当前位置向上或向下平滑滚动显示到指定楼层的位置。

3、在上述功能的基础上,向电路中添加LED指示灯和蜂呜器,使系统可以同时识别依次按下的多个按键,在到达指定位置后蜂鸣器发出短暂声音且LED闪烁片刻,数字继续滚动显示。

4、如果在待去的楼层的数字中,有的在当前运行的反方向,则数字先在当

前方向运行完毕后,再依次按顺序前往反方向的数字位置。

1.2课题设计内容

本课题的主要任务是完成一个电梯系统的智能控制模块,即根据每个楼层不同顾客的按键要求,让电梯做出合理的判断,正确高效的指导电梯完成各项载客任务。设计基于单片机的电梯智能控制系统的硬件电路与软件程序,给出硬件系统的电路原理图,对硬件电路与软件分别进行调试,得到调试成功的基于单片机的电梯智能控制系统。

根据此任务,本课题需要研究的内容有:

1、根据系统的技术要求,进行系统硬件的总体方案设计; 2、学习单片机的相关知识,并且加以运用;

3、选择适当的芯片,并对其内部协议有所掌握,便于应用。

4、研究单片机C语言编程,并且规定电梯的工作规则,用C语言加以实现; 5、对软件和硬件进行调试,让其协调工作,完成指定任务。

1

2 设计原理及方案

2.1设计原理及方法

根据层次化设计理论,该设计问题自顶向下可分为单片机最小系统模块、显示模块、开关控制模块、电机驱动模块、稳压模块,其系统框图如图2.1所示。

2.2方案

本次设计的基本思想是采用AT89C51单片机作为核心,利用其丰富的I/O接口与外围电路配合进行控制。按题目要求采用8*8点阵来实时显示电梯所在楼层。由于是8层楼,采用8个独立键盘。当电梯到达目的楼层时,LED灯亮起,蜂鸣器响,此时即可进、出乘客,然后电梯根据乘客的选择判断去哪一层,继续运行。电梯的正常运行通过单片机的控制来实现。如图2.1所示。

电源模块锁存器AT89C51上电复位显示模块按键电路

图2.1 电梯控制系统框图

2

本次设计是采用键盘控制实现上下到指定楼层,通过稳压模块使电机转动带动电梯箱上下运动,到达指定楼层。显示模块是显示此时的楼层以及要求到达的楼层。

电梯初始显示0。单片机的Pl口的8只引脚接有8只按键开关K1~K8,这8只按键开关K1~K8分别代表l楼~8楼。如果按下代表某一楼层的按键,单片机控制的点阵屏将从当前位置向上或向下平滑滚动显示到指定楼层的位置。

在上述功能的基础上,向电路中添加LED指示灯和蜂呜器,使系统可以同时识别依次按下的多个按键,在到达指定位置后蜂鸣器发出短暂声音且LED闪烁片刻,数字继续滚动显示。例如,当前位置在l层时,用户依次按下6、5时,则数字分别向上滚动到5、6时暂停且LED闪烁片刻,同时蜂鸣器发出提示音。如果在待去的楼层的数字中,有的在当前运行的反方向,则数字先在当前方向运行完毕后,再依次按顺序前往反方向的数字位置。用P2口做8*8点阵的行选通,Pl口完 成按键的读取及确认。

3

3 主控制器和外围器件

3.1 AT89C51单片机

AT89C51是一个低电压,高性能CMOS8位单片机带有4K字节的可反复擦写的程序存储器(PENROM)。和128字节的存取数据存储器(RAM),这种器件采用ATMEL公司的高密度、不容易丢失存储技术生产,并且能够与MCS-51系列的单片机兼容。片内含有8位中央处理器和闪烁存储单元,有较强的功能的AT89C51单片机能够被应用到控制领域中。

采用AT89C51,它提供以下的功能标准:4K字节闪烁存储器,128字节随机存取数据存储器,32个I/O口,2个16位定时/计数器,1个5向量两级中断结构,1个串行通信口,片内震荡器和时钟电路。另外,AT89C51还可以进行0HZ的静态逻辑操作,并支持两种软件的节电模式。闲散方式停止中央处理器的工作,能够允许随机存取数据存储器、定时/计数器、串行通信口及中断系统继续工作。掉电方式保存随机存取数据存储器中的内容,但震荡器停止工作并禁止其它所有部件的工作直到下一个复位。引脚图如图3.1所示。 U191918RSTXTAL1XTAL2P00P01P02P03P04P05P06P073938373635343332293031PSENALEEA12345678P10P11P12P13P14P15P16P17P20P21P22P23P24P25P26P27P30P31P32P33P34P35P36P37212223242526272810111213141516172040GNDVCCAT89C51 图3.1 AT89C51引脚图 4

VCC:电源电压 GND:地

P0口:P0口是一组8位漏极开路双向I/O口,即地址/数据总线复用口。作为输出口时,每一个管脚都能够驱动8个TTL电路。当“1”被写入P0口时,每个管脚都能够作为高阻抗输入端。P0口还能够在访问外部数据存储器或程序存储器时,转换地址和数据总线复用,并在这时激活内部的上拉电阻。P0口在闪烁编程时,P0口接收指令,在程序校验时,输出指令,需要接电阻。

P1口:P1口一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动4个TTL电路。对端口写“1”,通过内部的电阻把端口拉到高电平,此时可作为输入口。因为内部有电阻,某个引脚被外部信号拉低时输出一个电流。闪烁编程时和程序校验时,P1口接收低8位地址。

P2口:P2口是一个内部带有上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动4个TTL电路。对端口写“1”,通过内部的电阻把端口拉到高电平,此时,可作为输入口。因为内部有电阻,某个引脚被外部信号拉低时会输出一个电流。在访问外部程序存储器或16位地址的外部数据存储器时,P2口送出高8位地址数据。

P3口:P3口是一组带有内部电阻的8位双向I/O口,P3口输出缓冲故可驱动4个TTL电路。对P3口写如“1”时,它们被内部电阻拉到高电平并可作为输入端时,被外部拉低的P3口将用电阻输出电流。P3口除了作为一般的I/O口外,更重要的用途是它的第二功能,如表3.1所示。

表3.1 P3口第二功能表 端口引脚 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 第二功能 RXD TXD INT0 INT1 T0 T1 WR RD

5

P3口还接收一些用于闪烁存储器编程和程序校验的控制信号。

RST:复位输入。当震荡器工作时,RET引脚出现两个机器周期以上的高电平将使单片机复位。

ALE/ :当访问外部程序存储器或数据存储器时,ALE输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE以时钟震荡频率的1/16输出固定的正脉冲信号,因此它可对输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲时,闪烁存储器编程时,这个引脚还用于输入编程脉冲。如果必要,可对特殊寄存器区中的8EH单元的D0位置禁止ALE操作。这个位置后只有一条MOVX和MOVC指令ALE才会被应用。此外,这个引脚会微弱拉高,单片机执行外部程序时,应设置ALE无效。

PSEN:程序储存允许输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器读取指令时,每个机器周期两次PSEN 有效,即输出两个脉冲。在此期间,当访问外部数据存储器时,这两次有效的PSEN 信号不出现。

EA/VPP:外部访问允许。欲使中央处理器仅访问外部程序存储器,EA端必须保持低电平。需要注意的是:如果加密位LBI被编程,复位时内部会锁存EA端状态。如EA端为高电平,CPU则执行内部程序存储器中的指令。闪烁存储器编程时,该引脚加上+12V的编程允许电压VPP,当然这必须是该器件是使用12V编程电压VPP。

XTAL1:片内振荡器反相放大器和时钟发生线路的输入端。使用片内振荡器时,连接外部石英晶体和微调电容。

XTAL2:片内振荡器反相放大器的输出端。当使用片内振荡器时,外接石英晶体和微调电容。

3.2 74LS245

74LS245是我们常用的芯片,用来驱动LED或者其他的设备,它是8路相同三态双向总线收发器,可双向传输数据。

74LS245还具有双向三态功能,既可以输出,也可以输入数据。当8051单片机的P0口总线负载达到或超过P0口最大负载能力时,必须接入74LS245等总线驱动器。

6

当片选端/CE低电平有效时,DIR=“0”,信号由B向A传输;(接收)DIR=“1”,信号由A向B传输;(发送)当CE为高电平时,A、B均为高组态。

由于P2口始终输出地址的高8位,接口时74LS245d 三态控制端1G和2G接地,P2口与驱动器输入线对应相连。P0口与74LS245输入端相连,E端接地,保证数据线畅通。8051的/RD和/PSEN相与后接DIR,使得RD且PSEN有效时,74LS245输入(P0.1←D1),其他时间处于输出(P01→D1),如图3.2所示。

U323456789191A0A1A2A3A4A5A6A7EDIR74LS245图3.2 74LS245芯片结构图 B0B1B2B3B4B5B6B7VCCGND18171615141312112010 3.3.LED点阵

显示屏是由发光二极管行列组成的LED点阵模块组成显示屏体。本设计中选择8*8的点阵是由64个发光二极管按规律组成的,如图3.3所示。

图3.3 LED点阵外观

7

发光二极管,行接高电平,列接低电平,导通发光。8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮。如图3.4所示。 h1h2h3h4h5h6h7h8IOL1L2L3L4L5L6L7L8 图3.4 LED点阵内部结构

8

3.3.按键

本次实验我们使用了8个按键分别表示8个楼层,按键所以的左边接地,另一边与单片机相连。如图3.5所示。

图3.5 按键结构

9

4 系统硬件电路设计

4.1单片机最小系统模块

单片机最小系统包括主芯片,复位电路和晶振脉冲产生电路。X1为12MHz晶振,与30Pf电容并联,产生1us的脉冲信号作为单片机的“心脏”部分。复位电路是开关与10uf电容并联组成的上电自动复位电路,在RST端为高电平时单片机清零,也即开关按下会产生清零信号。RP1为排阻,作为P0端的上拉电阻,接此原因是P0端口是由OC门组成。U1为数据输入端口,通过电脑编程能将程序通过此接口烧录入单片机中。

8位CPU·4kbytes,程序存储器(ROM) (52为8K),128bytes的数据存储器(RAM) (52有256bytes的RAM),32条I/O口线·111条指令,大部分为单字节指令,21个专用寄存器,2个可编程定时/计数器,5个中断源,2个优先级(52有6个),一个全双工串行通信口,外部数据存储器寻址空间为64kB,外部程序存储器寻址空间为64kB,逻辑操作位寻址功能,双列直插40PinDIP封装,单一+5V电源供电。

CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;

RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;

ROM:用以存放程序、一些原始数据和表格;

I/O口:四个8位并行I/O口,既可用作输入,也可用作输出;

T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式; 一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;

片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振荡频率为12M。如图4.1所示。

10

图4.1单片机最小系统

4.2按键控制模块

单片机的Pl口的8只引脚接有8只按键K1~K8,这8只按键K1~K8分别代表l楼~8楼。如果按下代表某一楼层的按键,单片机控制的点阵屏将从当前位置向上或向下平滑滚动显示到指定楼层的位置,系统检测按键低电平识别依次按下的多个按键。如图4.2所示。

图4.2 开关控制模块图

11

4.3显示模块

8X8点阵,它共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;P2进行行扫描,P0输入数据.如图4.3所示。

图4.3显示模块

4.4声光模块

P3.6 ,P3.7口分别控制电路中的蜂鸣器和LED指示灯,使系统可以同时识别依次按下的多个按键,在到达指定位置后蜂鸣器发出声音且LED指示灯闪烁,数字继续滚动显示。如图4.4所示。

图4.4声光模块

12

4.5电路总图

本次实验的电路总图分为声光模块,按键控制模块,led点阵模块和最小系统模块。P1口连接8个按键,P2进行行扫描,P0输入数据,P3.6 ,P3.7口分别控制电路中的蜂鸣器和LED指示灯.如图4.5所示。

RP19876543211nFC1C31nFX1C21nFCRYSTAL19RESPACK-8U2XTAL1P0.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/RD39383736353433322122232425262728101112131415161723456789191U1A0A1A2A3A4A5A6A7CEAB/BA74LS245B0B1B2B3B4B5B6B7181716151413121118XTAL29RSTR110k293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51LS1R210kSPEAKERR310kQ1PNPD1LED-RED

图4.5电路总图

13

5 软件程序设计

本次实验我们的程序设计思路是当电梯到要显示的楼层时蜂鸣器响,指示灯亮。具体的设计思路流程图如图5.1所示。

开始创建变量,数组主程序开T0中断判断上升下降标志否数组大小排列是否上升?是否计数记满?是点阵上升扫描点阵下降扫描进入T0中断否是否到达指定楼层?是否有无键按下?是点阵扫描当前楼层否蜂鸣器响,LED闪烁有无上升、下降请求是 图5.1 电梯智能控制功能实现流程图

14

6 实验测试部分

6.1测试环境

采用KEIL 开发的89c51单片机应用程序步骤:

(1) 在keil 集成开发环境中创建新项目(Project),扩展文件名为.UV2, 并为该项目选定合适的单片机CPU器件(本设计采用ATMEL 公司下的AT89C51)

(2) (2)用keil的文本编辑器编写源文件,可以是汇编文件(.c),并将该文件添加到项目中去。一个项目文件可以包含多个文件,除了源程序文件外,还可以是库文件、头文件或文本说明文件。

(3)通过keil 的相关选择项,配置编译环境、连接定位器以及Debug调试 器的功能。

(4)对项目中的源文件进行编译连接,生成绝对目标代码和可选的HEX文 件,如果出现编译连接错误则返回到第2步,修改源文件中的错误后重构整个 项目。

(5)对没有语法错误的程序进行仿真调试,调试成功后将HEX文件写入到 单片机应用系统的ROM中。

6.2测试过程中的问题

我们在这次实验过程中由于是第一次焊接单片机,所以焊接的时候出现了接触不良的现象。由于本人水平有限,本次设计还存在一些不足之处,由于仿真时用到了外部中断0,而实物并没有实现与门的焊接,所以中断不能实现,最后决定用非中断方法实现LED模拟电梯运行。

15

6.3实际效果

本次实验的实物运行效果如图6.1,6.2所示。

图6.1实际效果图

RP19876543211nFC1C31nFX1C21nFCRYSTAL19RESPACK-8U2XTAL1P0.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/RD39383736353433322122232425262728101112131415161723456789191U1A0A1A2A3A4A5A6A7CEAB/BA74LS245B0B1B2B3B4B5B6B7181716151413121118XTAL29RSTR110k293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51LS1R210kSPEAKERR310kQ1PNPD1LED-RED 图6.1实际效果图

16

总 结

本课程设计了实现单片机控制下电梯智能控制系统的设计方案。由于条件的限制,没有做成真正的电梯。但做成的电梯智能控制系统的硬件电路已能演示。可以按照乘客的要求,将乘客送到要去的目的层。但是,电梯还有很多的扩展的空间并未实现,比如电梯自动语音报站系统的设计,楼层监控系统,节能设计以及其它更多的服务。

设计的核心内容就是利用单片机C51的编程来实现控制外围各电路的运行。通过本次设计,我熟练掌握了程控系统设计的一般步骤,熟悉了编程软件的用法,并对编程能力起到了一定的提高作用。本系统具有硬件少,结构简单,容易实现,性能稳定可靠,成本低等特点。

在此次设计中,我们得到以下体会:

1、在这次点阵设计的过程让我进一步熟悉KEIL及Proteus的使用。 2、通过这次点阵设计,重新复习并进一步学习了AT8951优点,明确了研究目标。

3、在之后的设计中,既要想到电路器件的联合使用,又要灵活变通,举一反三。

通过本次设计,我收获颇丰,本人的知识领域得到进一步扩展,专业技能得到进一步提高,同时提高了分析和解决实际问题的综合能力。另外,也培养了自己严肃认真的科学态度和严谨求实的作风。

由于本人水平有限,本次设计还存在一些不足之处,请评阅与答辩的各位老师批评指正。

17

致 谢

首先,很感谢学院给我们计算机科学与技术专业的学生一次把理论加深的机会,使得我们更好的理解《单片机原理及接口技术》这门课程,通过实物的焊接以及软件仿真使得自己的动手能力有了一定的提高;其次,虽然这次课程设计不是每个人制作一个实物,但是大家一起讨论,分析,最终调试成功,使大家的思维更加开阔;最后,感谢史老师给予我们焊接工具的支持,还有理论知识的指导。

18

参考文献

[1] 李朝青.单片机通讯技术与工程实践[M].北京:航空航天大学出版,2007.2

[2] 李群芳.单片机原理接口与应用[M].北京:清华大学出版社,2005.6

[3] 朱清慧,张凤蕊,翟天嵩,王志奎.Proteus教程——电子线路设计、制作与仿真[M]. 北京:清华大学出版社,2008.

[4] 谢自美.电子线路设计[M].武汉:华中科技大学出版社,2000.5

[5]康华光,陈大钦. 电子技术基础—模拟部分(第五版)[M]. 北京:高等教育出版社,2005

[6]郭天祥.51单片机C语言教程[M].北京:电子工业出版社.2009.1

[7] 刘欣铭,张广斌.LED显示屏技术综述[J].黑龙江电力,2003, 25(4):294-296.

[8] 苏凯,刘国庆,陈国平.MCS-51系列单片机系统原理与设计[J].北京:冶金工业出版社

[9] 张毅刚.单片机原理及接口技术.北京:人民邮电出版社[M].2011.8

[10] 张毅刚.基于Proteus的单片机课程的基础实验与课程设计[M].北京:人民邮电出版社,2012.4

19

附录A 程序清单

#include #include #define uchar unsigned char #define uint unsigned int uchar code Table_of_Digits[]=

//点阵显示数组

{ 0x3C,0x24,0x24,0x3C,0x24,0x24,0x3C,0x00, //8 0x00,0x3C,0x04,0x04,0x04,0x04,0x04,0x00, //7 0x00,0x3C,0x20,0x20,0x3C,0x24,0x24,0x3C, //6 0x00,0x3C,0x20,0x20,0x3C,0x04,0x3C,0x00, //5

0x00,0x0C,0x14,0x24,0x7E,0x04,0x04,0x00, //4 0x00,0x3C,0x04,0x3C,0x04,0x04,0x3C,0x00, //3 0x00,0x3C,0x04,0x04,0x3C,0x20,0x3C,0x00, //2

0x00,0x08,0x38,0x08,0x08,0x08,0x3E,0x00, //1 0x00,0x3C,0x66,0x42,0x42,0x66,0x3C,0x00, //0 };

uchar i=0,t=0,j=0,a=0; char offset=0;

static int Current_floor=0,Pressed_key_up=0,Pressed_key_down=0,b=0,c=0,max=0,min=0;

//Current_floor-当前楼层,Pressed_key_up-上升请求,Pressed_key_down-下降请求

//i-行扫描,t-延迟

int flag;

int floor_up[8]={9,9,9,9,9,9,9,9}; int floor_down[8]={0,0,0,0,0,0,0,0}; sbit KEY1=P1^0; sbit KEY2=P1^1; sbit KEY3=P1^2; sbit KEY4=P1^3; sbit KEY5=P1^4;

20

//上升请求存放数组 //下降请求存放数组 //定义P1口按键

sbit KEY6=P1^5; sbit KEY7=P1^6; sbit KEY8=P1^7; sbit LED=P3^7; 蜂鸣器

sbit SPEAK=P3^6;

void Key_up_comparison(); 把floor_up[]按从小到大排列 void Key_down_comparison(); 按从大到小排列

void max_min_comparison(); 最小值(min) // //主函数 //

void main() { P2=0x7f; LED=0; SPEAK=0;

TMOD=0x01;

TH0=(-6000)/256;

TL0=(-6000)%6; IT0=1;

IE=0x83; TR0=1;

ET0=1;

Pressed_key_up=floor_up[0]; while(1)

{

//定义LED跟

//函数声明 , //把floor_down[]

//比较出floor_up[]的最大值(max)和floor_down[]的

//初始化

//T0方式

//6ms定时

//循环排列

21

P0=0x00;

if(KEY1==0) j=8; else if(KEY2==0) j=7;

else if(KEY3==0) j=6; else if(KEY4==0) j=5; else if(KEY5==0) j=4; else if(KEY6==0) j=3; else if(KEY7==0) j=2; else if(KEY8==0) j=1; if(j>Current_floor)

{

if(floor_down[0]==0) flag=1;

floor_up[b++]=j; if(b==8) b=0; }

else if(j

{

if(floor_up[0]==9) flag=0;

floor_down[c++]=j; if(c==8) c=0; }

else if(j==Current_floor);

//判断请求

//将上升请求放入数组 //将下降请求放入数组

22

Key_up_comparison();

Key_down_comparison(); max_min_comparison(); }

}

void LED_Screen_Display() interrupt 1

楼层 { TH0=(-6000)/256;

TL0=(-6000)%6; P0=0x00;

Pressed_key_up=floor_up[0]; Pressed_key_down=floor_down[0];

if(flag==1)

{

if(Pressed_key_up!=9)

{

if(Pressed_key_up>Current_floor)

升显示 { P0=Table_of_Digits[(8-Current_floor)*8+i+offset]; P2=_crol_(P2,1);

if(++i==8) { i=0; P2=0x7f;

}

if(++t==25)

23

//进入中断,显示

//6ms

//上升标志

//有上升请求

//点阵平滑上

//

延迟 { t=0;

if (--offset == -8)

{

offset = 0; ++Current_floor;

}

}

}

else if(Pressed_key_up

else if(Pressed_key_up==Current_floor)

楼层 { P0=Table_of_Digits[(8-Current_floor)*8+i]; P2=_crol_(P2,1);

if(++i==8) {i=0;P2=0x7f;}

LED=~LED;SPEAK=~SPEAK;

闪烁 if(++t==250)

{ t=0;

if(Current_floor==Pressed_key_up) { Current_floor=Pressed_key_up;

if(Current_floor==max||Pressed_key_down!=0)

{

flag=0;

24

//到达请求

//蜂鸣器响,LED

}

floor_up[0]=9; } }

}

}

else if(Pressed_key_up==9)

楼层 { P0=Table_of_Digits[(8-Current_floor)*8+i]; P2=_crol_(P2,1);

if(++i==8) { i=0; P2=0x7f;

}

if(++t==250)

t=0;

}

}

else if(flag==0)

{

if(Pressed_key_down!=0)

{ if(Pressed_key_down>Current_floor);

else if(Pressed_key_down

显示

{

25

//无请求,扫描显示当前

//下降标志

//有下降请求

//点阵平滑下降

P0=Table_of_Digits[(8-Current_floor)*8+i+offset]; P2=_crol_(P2,1);

if(++i==8) { i=0; P2=0x7f; }

if(++t==25)

{ t=0;

if (++offset == 8)

{

offset = 0; --Current_floor;

}

}

}

else if(Pressed_key_down==Current_floor) { P0=Table_of_Digits[(8-Current_floor)*8+i]; P2=_crol_(P2,1);

if(++i==8) {i=0;P2=0x7f;}

LED=~LED;SPEAK=~SPEAK;

烁 if(++t==250)

{

t=0;

26

//到达请求楼层

//蜂鸣器响,LED闪

if(Current_floor==Pressed_key_down||Pressed_key_up!=9) {

Current_floor=Pressed_key_down; if(Current_floor==min) { flag=1;

}

floor_down[0]=0; } }

}

}

else if(Pressed_key_down==0)

楼层 { P0=Table_of_Digits[(8-Current_floor)*8+i]; P2=_crol_(P2,1);

if(++i==8) { i=0; P2=0x7f; }

if(++t==250)

t=0;

}

}

}

27

//无请求,扫描显示当前

void Key_up_comparison() 排列 { int a1,a2,a3=0; for(a2=0;a2<7;a2++) { for(a1=0;a1<7;++a1) { if(floor_up[a1]>floor_up[a1+1]) {

a3=floor_up[a1];

floor_up[a1]=floor_up[a1+1]; floor_up[a1+1]=a3; }

if(floor_up[a1]==floor_up[a1+1]) floor_up[a1+1]=9;

}

}

}

void Key_down_comparison() 到小排列 { int a1,a2,a3=0; for(a2=0;a2<7;a2++) { for(a1=0;a1<7;++a1) {

if(floor_down[a1]

28

//把floor_up[]按从小到大

//把floor_down[]按从大

{

a3=floor_down[a1];

floor_down[a1]=floor_down[a1+1]; floor_down[a1+1]=a3; }

if(floor_down[a1]==floor_down[a1+1]) floor_down[a1+1]=0;

}

}

}

void max_min_comparison()

//求出的最小(min) {int j; for(j=1;j<=7;j++) if(floor_down[j]==0); else if(floor_down[j+1]==0)

min=floor_down[j];

else if(floor_down[j]>floor_down[j+1])

min=floor_down[j+1];

else min=floor_down[j];

for(j=1;j<=7;j++) if(floor_up[j]==9); else if(floor_up[j+1]==9)

max=floor_up[j];

else if(floor_up[j]

max=floor_up[j+1];

else max=floor_up[j];

}

29

floor_up[]的最大(max)和floor_down[]

附录B元器件目录表

序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

型 号(名称) AT89C51 74LS245 74LS21 74LS09 10kΩ排阻 8*8LED点阵显示器 按钮 22pF瓷片电容 10μF电解电容 11.0592MHz 蜂鸣器 LED 47k欧电阻 100欧电阻 三极管 数量 1 1 2 1 1 1 9 2 1 1 1 1 1 2 1 作用 单片机 锁存器 判断按键 判断按键 上拉电阻 显示数字 复位按钮等 晶振电路用 上电复位 晶振 提示 提示 驱动

30