基于单片机的智能电梯控制系统设计
页脚内容 高校图书馆电子资源建设读者满意度调查
摘 要
本文介绍了一种采用单片机STC89C52芯片进行电梯控制系统的设计方法,主要阐述如何使用单片机进行编程来实现四层电梯的智能控制,利用单片机编程简洁而又多变的设计方法,缩短了研发周期,同时使电梯控制系统体积更小功能更强大。本设计实现了电梯控制系统所需的一些基本功能,能通过电梯内按键或者电梯外上升、下降按键选择楼层,数码管显示实时楼层数,LED显示实时电梯运行状态。原理图和PCB部分采用protel99se专业软件来设计,实现将设计产品化。本次设计更注重了把一些新的思路加入到设计中。主要包括采用了STC89C52芯片,使用C语言进行编程,使其具有了更强的移植性,更加利于产品升级。
关键词:STC89C52;电梯控制系统;protel99se;C语言
页脚内容 高校图书馆电子资源建设读者满意度调查
Abstract
This paper introduces a design method of using STC89C52 chip for elevator control system, mainly describes how to use microcontroller programming to achieve the intelligent four storey elevator control, the design method of microcontroller programming simple and variable, shortens the development cycle, at the same time that the elevator control system smaller and more powerful. Some of the basic functions of the design and implementation of elevator control system required by the elevator, elevator buttons or rise, decline the key to select the floor, digital tube display real-time number of floors, LED display real-time operating state of elevator. Schematic and PCB design using Protel99SE software, the design of products. This design pays more attention to some new ideas into the design. Including the use of the STC89C52 chip, the use of C language programming, which has portability stronger, more conducive to the upgrading of products. Keywords: STC89C52; elevator control system; Protel99SE; C language
页脚内容 高校图书馆电子资源建设读者满意度调查
第一章 绪论
随着人类社会已经逐步进入信息化的时代,信息社会的快速发展更是离不开电子产品的进步。单片机的出现使人类可以利用编程来代替复杂的硬件电路搭建,单片机的可靠程序运行,修改程序的灵活多样是普通的硬件电路不可比拟的。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!
目前工业自动化水平已成为衡量各行各业现代化水平的一个重要标志。同时,控制理论的发展也经历了古典控制理论、现代控制理论和智能控制理论三个阶段。智能控制的典型实例是模糊全自动洗衣机等。自动控制系统可分为开环控制系统和闭环控制系统。一个控制系统包括控制器﹑传感器﹑变送器﹑执行机构﹑输入输出接口。控制器的输出经过输出接口﹑执行机构﹐加到被控系统上﹔控制系统的被控量﹐经过传感器﹐变送器﹐通过输入接口送到控制器。不同的控制系统﹐其传感器﹑变送器﹑执行机构是不一样的。
单片机应用的主要领域非常广,智能化家用电器、办公自动化设备商业营销设备、工业自动化控制、智能化仪表、智能化通信产品、汽车电子产品、航空航
页脚内容 高校图书馆电子资源建设读者满意度调查
天系统和国防军事、尖端武器等领域。
单片机应用的意义不仅在于它的广阔范围及所带来的经济效益,更重要的意义在于,单片机的应用从根本上改变了控制系统传统的设计思想和设计方法。以前采用硬件电路实现的大部分控制功能,正在用单片机通过软件方法来实现。以前自动控制中的PID调节,现在可以用单片机实现具有智能化的数字计算控制、模糊控制和自适应控制。这种以软件取代硬件并能提高系统性能的控制技术称为微控技术。随着单片机应用的推广,微控制技术将不断发展完善。
电路的集成化不仅对硬件电路的设计相关,与电路的布局同样相关。印刷版的出现使得电路产品更加规范,体积更小。Protel99se是一款专业的绘制电路及印刷版的软件,近年来的不断升级使得其功能更加完善,出现了altium designer 、protel dxp等升级版本。
第二章 硬件设计
1.设计目标
本设计的主要任务是对各楼层用户按钮信号的检测和处理,按预定的运行规则和程序,发出控制信号对电机进行调节,从而控制电梯的启停、速度;电梯运行所在楼层指示、设有电梯所处位置指示装置以及电梯运行模式(上升或下降)指示装置、关门延时设置、电梯到达有停站请求楼层,电梯门打开,开门延时一定时间后,电梯门关闭(开门指示灯熄灭),电梯继续运行,直至执行完最后一个请求信号后停留在当前楼层、每一层电梯入口处设有上下请求开关,电梯内设有顾客到达层次的停站请求开关、报警系统等。
2.设计原理
控制方式分为开环系统与闭环系统。 2.1、开环控制系统
开环控制系统(open-loop control system)是指被控对象的输出(被控制量)对
页脚内容 高校图书馆电子资源建设读者满意度调查
控制器(controller)的输出没有影响。在这种控制系统中,不依赖将被控量反送回来以形成任何闭环回路。
2.2、闭环控制系统
闭环控制系统(closed-loop control system)的特点是系统被控对象的输出(被控制量)会反送回来影响控制器的输出,形成一个或多个闭环。闭环控制系统有正反馈和负反馈,若反馈信号与系统给定值信号相反,则称为负反馈( Negative Feedback),若极性相同,则称为正反馈,一般闭环控制系统均采用负反馈,又称负反馈控制系统。闭环控制系统的例子很多。比如人就是一个具有负反馈的闭环控制系统,眼睛便是传感器,充当反馈,人体系统能通过不断的修正最后作出各种正确的动作。如果没有眼睛,就没有了反馈回路,也就成了一个开环控制系统。另例,当一台真正的全自动洗衣机具有能连续检查衣物是否洗净,并在洗净之后能自动切断电源,它就是一个闭环控制系统。
我们这里设计通过拨码开关控制电梯到达某个位置,来实现系统总的闭环控制。设计原理图及PCB使用Protel 99se绘制,原理图如图2.1所示。MCU选用STC89C52单片机,关于此单片机在本设计中的管脚分配如表2.1所示。
页脚内容
高校图书馆电子资源建设读者满意度调查
图2.1电梯智能控制原理图
表2.1 单片机STC89C52管脚分配表
管脚序号 管脚1 管脚2 管脚3 管脚4 管脚5 管脚6 管脚7 管脚8 管脚9 管脚10 管脚11 管脚12 管脚13 管脚14 管脚15 管脚16 管脚17 管脚18 管脚19 管脚20 管脚21 管脚22 管脚能 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RST R3.0 R3.1 R3.2 R3.3 R3.4 R3.5 R3.6 R3.7 XTAL2 XTAL1 VSS P2.0 P2.1 用途 数码管共阳极 数码管a 数码管b 数码管c 数码管d 数码管e 数码管f 数码管g 复位 RX TX 备用 备用 1层内按键 2层内按键 3层内按键 4层内按键 晶振 晶振 GND 1层上升按键 2层上升按键 页脚内容 高校图书馆电子资源建设读者满意度调查
管脚23 管脚24 管脚25 管脚26 管脚27 管脚28 管脚29 管脚30 管脚31 管脚32 管脚33 管脚34 管脚35 管脚36 管脚37 管脚38 管脚39 管脚40 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 PSEN PROG EA P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 VCC 2层下降按键 3层上升按键 3层下降按键 4层下降按键 开门按键 关门按键 报警输出 上升输出 下降输出 开/关门输出 电梯4层检测 电梯3层检测 电梯2层检测 电梯1层检测 5V 3.单元模块设计
3.1单片机最小系统模块
单片机最小系统包括主芯片,复位电路和晶振脉冲产生电路。晶振为12MHz晶振,与30Pf电容并联,产生1us的脉冲信号作为单片机的“心脏”部分。复位电路是开关与10uf电容并联组成的上电自动复位电路,在RST端为高电平时单片机清零,也即开关按下会产生清零信号。管脚10、管脚11为数据输入/输出端口,通过电脑编程能将程序通过此接口烧录入单片机中。
页脚内容 高校图书馆电子资源建设读者满意度调查
3.2按键控制模块
采用独立按键方式,这样可以在编程时很方便操作。此按键模块当按下时端口电平为0,松开后为1。 3.3输出部分
电机输出部分采用P0.5、P0.6的组合控制LED灯的方式来代表电梯的运行状态。当P0.5、P0.6组合为01时代表上升,当为10时代表下降,当为常态时为11。 3.4显示部分
电梯运行位置显示采用7段数码管来显示,因为此单片机端口输出能力不强,所以使用一个三极管来扩流达到驱动数码管发光的效果,其中单片机的管脚P2.0对应数码管共阳极,其余P2.1-P2.7方分别对应数码管的a-g 7段。 3.5报警部分
报警采用8550三极管驱动蜂鸣器。当P0.7口送高电平时,三极管处于截止状态,三极管Vce电压约为VCC,蜂鸣器只有很少电流流过,没法驱动其发声。当PO口送低电平时,三极管处于饱和导通状态,三极管Vce约为0.3V,蜂鸣器有较大电流流过,能驱动其报警发声。 4.主MCU单片机(STC89C52)硬件资源介绍 4.1单片机的外部结构
拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。
1、 电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40引脚,负极(地)接20引脚。
2、 振蒎电路:单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶振,
页脚内容 高校图书馆电子资源建设读者满意度调查
电容,连上就可以了,按图2.1接上即可。
3、 复位引脚:按图2.1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。
4、 EA引脚:EA引脚接到正电源端。 至此,一个单片机就接好,通上电,单片机就开始工作了。
在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。在一个51单片机的内部包含了这么多的东西。我们已知,对并行I/O口的读写只要将数据送入到相应I/O口的锁存器就可以了,那么对于定时/计数器,串行I/O口等怎么用呢?在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。事实上,我们已接触过P1这个特殊功能寄存器了,还有哪些呢?看表2.2
符号 地址 功能介绍 B寄存器 累加器 程序状态字 中断优先级控制寄存器 P3口锁存器 中断允许控制寄存器 B ACC PSW IP P3 IE F0H E0H D0H B8H B0H A8H 页脚内容 高校图书馆电子资源建设读者满意度调查
P2 SBUF A0H 99H P2口锁存器 串行口锁存器 串行口控制寄存器 P1口锁存器 定时器/计数器1(高8位) 定时器/计数器1(低8位) 定时器/计数器0(高8位) 定时器/计数器0(低8位) 定时器/计数器方式控制寄存器 定时器/计数器控制寄存器 数据地址指针(高8位) 数据地址指针(低8位) 堆栈指针 P0口锁存器 电源控制寄存器 SCON 98H P1 TH1 TH0 TL1 TL0 90H 8DH 8CH 8BH 8AH TMOD 89A TCON 88H DPH DPL SP P0 83H 82H 81H 80H PCON 87H 表2.2 STC89C52单片机内部寄存器表
堆栈介绍:日常生活中,我们都注意到过这样的现象,家里洗的碗,一只一只摞起来,最晚放上去的放在最上面,而最早放上去的则放在最下面,在取的时候正好相反,先从最上面取,这种现象我们用一句话来概括:“先进后出,后进
页脚内容 高校图书馆电子资源建设读者满意度调查
先出”。请大家想想,还有什么地方有这种现象?其实比比皆是,建筑工地上堆放的砖头、材料,仓库里放的货物,都是“先进后出,后进先出”,这实际是一种存取物品的规则,我们称之为“堆栈”。
在单片机中,我们也可以在RAM中构造这样一个区域,用来存放数据,这个区域存放数据的规则就是“先进后出,后进先出”,我们称之为“堆栈”。为什么需要这样来存放数据呢?存储器本身不是可以按地址来存放数据吗?对,知道了地址的确就可以知道里面的内容,但如果我们需要存放的是一批数据,每一个数据都需要知道地址那不是麻烦吗?如果我们让数据一个接一个地放置,那么我们只要知道第一个数据所在地址单元就可以了(看图2)如果第一个数据在27H,那么第二、三个就在28H、29H了。所以利用堆栈这种方法来放数据可以简化操作
那么51中堆栈什么地方呢?单片机中能存放数据的区域有限,我们不能够专门分配一块地方做堆栈,所以就在内存(RAM)中开辟一块地方,用于堆栈,但是用内存的哪一块呢?还是不好定,因为51是一种通用的单片机,各人的实际需求各不相同,有人需要多一些堆栈,而有人则不需要那么多,所以怎么分配都不合适,怎样来解决这个问题?分不好干脆就不分了,把分的权利给用户(编程者),根据自已的需要去定吧,所以51单片机中堆栈的位置是可以变化的。而这种变化就体现在SP中值的变化,看图2.2,SP中的值等于27H不就相当于是一个指针指向27H单元吗?当然在真正的51机中,开始指针所指的位置并非就是数据存放的位置,而是数据存放的前一个位置,比如一开始指针是指向27H单元的,那么第一个数据的位置是28H单元,而不是27H单元,为什么会这样,我们在学堆栈命令时再说明。其它的SFR,我们在用到时再介绍。
页脚内容 高校图书馆电子资源建设读者满意度调查
图2.2堆栈指示
第三章 软件设计
1.程序设计流程图
主程序流程图如图3.1所示。程序编写为了达到可读性强,所有功能都做了划分,分别封装成不同的子程序,要执行哪个子程序只要在主程序当中调用即可。
页脚内容
高校图书馆电子资源建设读者满意度调查
图3.1主程序流程图
按键排队子程序流程图如图3.2所示。这部分实现的主要功能是按照时间的先后顺序分别将四层电梯的电梯外及电梯内的按键动作做好排队。等待按键处理程序的调用。排队原则按照先按键的先排队,后按后排对,同一按键按下并排队后,在未处理前,不做再次排队的原则。
页脚内容
高校图书馆电子资源建设读者满意度调查
图3.2按键子程序流程图
按键处理子程序流程图如图3.3所示。按键处理原则为先按先执行。平层时呼叫信号消失,并进行开门、关门操作,平层结束时给出提示信号。电梯上升途中只响应上升呼叫,下降途中只响应下降呼叫,任何反方向呼叫均无效。这样就达到了电梯的智能控制。
页脚内容
高校图书馆电子资源建设读者满意度调查
图3.3按键处理子程序流程图
2.单片机开发环境介绍
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
Keil 版本目前分为Keil μVision2、Keil μVision3、Keil μVision4、Keil μVision5
KeiluVision2是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,使用接近于传统c语言的语法来开发,与汇编相比,C语言易学易用,而且大大的提高了工作效率和项目开发周期,他还能嵌入汇编,您可以在关键的位置嵌入,使程序达到接近于汇编的工作效率。KEILC51标准C编译器为8051
页脚内容
高校图书馆电子资源建设读者满意度调查
微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强,使你可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。uVision2 IDE可为它们提供单一而灵活的开发环境。
Keil μVision3,2006年1月30日ARM推出全新的针对各种嵌入式处理器的软件开发工具,集成Keil μVision3的RealView MDK开发环境。RealView MDK开发工具KeilμVision3源自Keil公司。RealView MDK集成了业内领先的技术,包括Keil μVision3集成开发环境与RealView编译器。支持ARM7、ARM9和最新的Cortex-M3核处理器,自动配置启动代码,集成Flash烧写模块,强大的 Simulation设备模拟,性能分析等功能,与ARM之前的工具包ADS等相比,RealView编译器的最新版本可将性能改善超过20%。
Keil μVision4,2009年2月发布Keil μVision4,Keil μVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来开发应用程序。新版本支持更多最新的ARM芯片,还添加了一些其他新功能。
2011年3月ARM公司发布最新集成开发环境RealView MDK开发工具中集成了最新版本的Keil uVision4,其编译器、调试工具实现与ARM器件的最完美匹配。
Keil μVision5,2013年10月,Keil正式发布了keil uVision5 IDE。 keil优点:
1.Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,
页脚内容 高校图书馆电子资源建设读者满意度调查
容易理解。在开发大型软件时更能体现高级语言的优势。
2.与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。
Keil C51是一款十分流行的MCS-51内核单片机C语言开发环境,在这里将介绍C51的开发,内容和C语言的基础知识差不多,由于篇幅有限,如需要深入了解的读者可以参考一些C 语言的教程。C51源程序结构与一般C 语言基本一致,C51 源程序文件的扩展名为\".c\" ,如Add. c 、Max. c 等。一个C51 源程序大体上是一个函数定义的集合,在这个集合中有 且仅有一个名为main( )的函数,也称为该程序的主函数。主函数是程序的入口,它是一个特殊的函数,程序的执行都是从main( )函数开始的。主函数中的所有语句执行完毕,则程序执行结束。C 语言的数据结构是以数据类型决定的,数据类型可分为基本数据类型和复杂数据类型,复杂数据类型是由基本数据类型构造而成的。 在标准C语言中基本的数据类型为char、int、short、 long、float和double,而在C51编译器中int和short相 同,float和double相同。在程序运行过程中不能改变值的量称为常量,在程序运行过程中不断变化的量称为变量。可以使用所有C51编 译器支持的数据类型定义一个变量,而常量的数据类型只限于整型、浮点型、字符型、字符串型和位标量。
3.程序代码部分
3.1主程序代码如下:
/*************************************************************** * 函 数 名 : main * 函数功能
: 主函数
* 输 入 : 无
页脚内容 高校图书馆电子资源建设读者满意度调查
* 输 出 : 无
****************************************************************/ void main(void) {
Init(); //调用初始化函数 }
什么是主程序呢?工具书给出的解释是包含调用子程序的程序称为主程序。主程序不能被它的子程序调用。主程序和子程序两者是相对的。比如,某主程序在某个过程中调用了子程序A,子程序A在某个过程中又调用了子程序B,那么A对主程序而言是子程序,但对B而言它又成了主程序。我么这里主程序中调用了Init();(调用初始化函数),elevator_check();(调用电梯检测函数)key_check_all();
elevator_order_check(elevator_layer);四个子程序。其中后三个子程序在
{
elevator_check(); key_check_all();
elevator_order_check(elevator_layer); }
//调用电梯检测函数
while(1)
while循环中无限循环的一直调用下去。本设计中还包括了定时中断程序。 3.2电梯运行位置检测程序如下:
/**************************************************************** * 函 数 名 : elevator_check
页脚内容 高校图书馆电子资源建设读者满意度调查
* 函数功能 : 实时检测电梯位置并用数码管显示,当电梯停止在错
误状态或有报警时,输出报警信号,并于电梯门打开3秒后自动关闭
* 输 入 : 无 * 输 出 : 无
****************************************************************/ void elevator_check() {
if
((elevator_one_in==0)&&(elevator_two_in==1)&&(elevator_three_in==1)&&(elevator_four_in==1)) //如果停在1楼
{
elevator_layer=1; //电梯层检测变量赋值1层
Layer=Number_Char [1] ;
elevator_alarm_out=1; //取消报警
} else
if
((elevator_one_in==1)&&(elevator_two_in==0)&&(elevator_three_in==1)&&(elevator_four_in==1)) //如果停在2楼
{
elevator_layer=2; //电梯层检测变量赋值2层
Layer=Number_Char [2] ;
elevator_alarm_out=1; //取消报警
页脚内容 高校图书馆电子资源建设读者满意度调查
} else
if
((elevator_one_in==1)&&(elevator_two_in==1)&&(elevator_three_in==0)&&(elevator_four_in==1)) //如果停在3楼
{
elevator_layer=3; //电梯层检测变量赋值3层
Layer=Number_Char [3] ;
elevator_alarm_out=1; //取消报警 } else
if
((elevator_one_in==1)&&(elevator_two_in==1)&&(elevator_three_in==1)&&(elevator_four_in==0)) //如果停在4楼
{
elevator_layer=4; //电梯层检测变量赋值4层
Layer=Number_Char [4] ;
elevator_alarm_out=1; //取消报警
} else {
Layer=Number_Char [0] ; //显示F,代表错误状态,报警显示
// elevator_alarm_out=0; //报警输出 }
页脚内容 高校图书馆电子资源建设读者满意度调查
if (Time>Time_target) //定时时间到 {
elevator_open_door_out=1; //关闭电梯门
if (elevator_goto==1) //如果是电梯上升过程中中断,则延时
后继续执行
{
elevator_up_out=0; //电梯上升
elevator_down_out=1; //电梯上升
elevator_goto=0; //恢复初始值 }
else if (elevator_goto==2) //如果是电梯下降过程中中断,则
延时后继续执行
{
elevator_up_out=1; //电梯下降
elevator_down_out=0; //电梯下降
elevator_goto=0; //恢复初始值 }
else if (elevator_goto==3) {
elevator_goto=0; }
Time=0; //清零
页脚内容 高校图书馆电子资源建设读者满意度调查
Time_target=0; //定时时间清零
}
if (close_door_key==0) //如果电梯门关闭按键按下 { }
3.3按键检测排队程序如下:
/**************************************************************** * 函数名 : key_check_all * 函数功能
: 按键检测函数总调用
elevator_open_door_out=1; //关闭电梯门 }
* 输入 : 无 * 输出 : 无
****************************************************************/ void key_check_all() {
key_check(one_up_key,1); //按键检测 key_check(two_up_key,2); //按键检测 key_check(two_down_key,3); //按键检测 key_check(three_up_key,4);
//按键检测
//按键检测
key_check(three_down_key,5);
key_check(four_down_key,6); //按键检测
页脚内容 高校图书馆电子资源建设读者满意度调查
key_check(elevator_one_key,7); key_check(elevator_two_key,8);
//按键检测 //按键检测
key_check(elevator_three_key,9); //按键检测 key_check(elevator_four_key,10); //按键检测 }
/**************************************************************** * 函数名 : key_check(unsigned char key,unsigned char n) * 函数功能
: 按键检测函数
* 输入 : key,n * 输出 : 无
****************************************************************/ void key_check(unsigned char key,unsigned char n) {
if (key==0) //1楼电梯外按键按下 {
if (zero==0) //如果此处优先级未排队 {
zero=n; }
else if((one==0)&&(zero!=n)) //如果此处优先级未排队并且前面已
经排队序号未有本按键的排队
{
页脚内容 高校图书馆电子资源建设读者满意度调查
one=n; }
else if((two==0)&&(zero!=n)&&(one!=n)) //如果此处优先级未排队
并且前面已经排队序号未有本按键的排队
{
two=n; }
else if((three==0)&&(zero!=n)&&(one!=n)&&(two!=n)) //如果此处
优先级未排队并且前面已经排队序号未有本按键的排队
{
three=n; }
else if((four==0)&&(zero!=n)&&(one!=n)&&(two!=n)&&(three!=n))
//如果此处优先级未排队并且前面已经排队序号未有本按键的排队
{
four=n; }
else
if((five==0)&&(zero!=n)&&(one!=n)&&(two!=n)&&(three!=n)&&(four!=n)) //如果此处优先级未排队并且前面已经排队序号未有本按键的排队
{
five=n;
页脚内容 高校图书馆电子资源建设读者满意度调查
}
else
if((six==0)&&(zero!=n)&&(one!=n)&&(two!=n)&&(three!=n)&&(four!=n)&&(five!=n)) //如果此处优先级未排队并且前面已经排队序号未有本按键的排队
{
six=n; }
else
if((seven==0)&&(zero!=n)&&(one!=n)&&(two!=n)&&(three!=n)&&(four!=n)&&(five!=n)&&(six!=n)) //如果此处优先级未排队并且前面已经排队序号未有本按键的排队
{
seven=n; }
else
if((eight==0)&&(zero!=n)&&(one!=n)&&(two!=n)&&(three!=n)&&(four!=n)&&(five!=n)&&(six!=n)&&(seven!=n)) //如果此处优先级未排队并且前面已经排队序号未有本按键的排队
{
eight=n; }
else
页脚内容 高校图书馆电子资源建设读者满意度调查
if((nine==0)&&(zero!=n)&&(one!=n)&&(two!=n)&&(three!=n)&&(four!=n)&&(five!=n)&&(six!=n)&&(seven!=n)&&(eight!=n)) //如果此处优先级未排队并且前面已经排队序号未有本按键的排队
}
3.4定时器0中断程序如下:
/**************************************************************** * 函数名 : Timer0() * 函数功能
: 定时器0中断函数 ,50ms定时器
{ }
nine=n; }
* 输入 : 无 * 输出 : 无
****************************************************************/ void Timer0() interrupt 1 {
TH0 = 0x3C; //设置初始值 TL0 = 0xB0;
Time++;
if (Time>Time_target) {
页脚内容 高校图书馆电子资源建设读者满意度调查
EA=0; //关闭总中断
ET0=0; //关闭定时器0中断
// Time=0; //计时变量清零
// Time_target=0; //目标定时变量清零
TF0=0; //清除中断标志
}
}
3.5按键处理程序如下:
/**************************************************************** * 函数名 : elevator_order_check * 函数功能
: 电梯命令检测
* 输入 : layer * 输出 : 无
****************************************************************/ void elevator_order_check(unsigned char layer) {
if (layer==1) //如果电梯在一层
{
if ((elevator_up_out==1)&&(elevator_down_out==1)) 果电梯停在一楼并且前面未有任何排队命令
{
elevator_door_key(); //电梯门按键检测函数
页脚内容 //如
高校图书馆电子资源建设读者满意度调查
elevator_1_stop (); //调用电梯停在一楼函数
}
else if ((elevator_up_out==1)&&(elevator_down_out==0))
//如果电梯下降到1楼
}
else if (layer==2)
//如果电梯在二层
{
TimerConfiguration();
temp(1,1,0,0);
}
{
if (elevator_goto==0) //电梯继续运行标志为零时
{
if ((elevator_up_out==1)&&(elevator_down_out==1)) //
如果电梯停在二楼并且前面未有任何排队命令
{
elevator_door_key(); //电梯门按键检测函数
elevator_2_stop (); //调用电梯停在二楼函数
}
}
if ((elevator_up_out==0)&&(elevator_down_out==1)) //如果电梯在上升过程中经过2楼
页脚内容 高校图书馆电子资源建设读者满意度调查
{
if (order_layer==2) //判断前一个排队命令如果是到
2楼停止的请求
{
TimerConfiguration(); //调用定时配置函数
temp(1,1,0,3);
order_ctrl(0); //命令移动一次
}
order_check_t(2); //命令临时变量检测函数 order_check_t(8); //命令临时变量检测函数
}
else if ((elevator_up_out==1)&&(elevator_down_out==0))
//如果电梯在下降过程中经过2楼
{
if (order_layer==2) //判断前一个排队命令如果是到
2楼停止的请求
{
TimerConfiguration(); temp(1,1,0,3);
order_ctrl(0); //命令移动一次
}
页脚内容 高校图书馆电子资源建设读者满意度调查
order_check_t(3); //命令临时变量检测函数 order_check_t(8); //命令临时变量检测函数
}
else if (layer==3)
//如果电梯在三层
}
{
if (elevator_goto==0) //电梯继续运行标志为零时
{
if ((elevator_up_out==1)&&(elevator_down_out==1)) //
如果电梯停在二楼并且前面未有任何排队命令
{
elevator_door_key(); //电梯门按键检测函数
elevator_3_stop (); //调用电梯停在三楼函数
}
}
if ((elevator_up_out==0)&&(elevator_down_out==1)) //如果电梯在上升过程中经过3楼
{
if (order_layer==3) //判断前一个排队命令如果是到
3楼停止的请求
{
TimerConfiguration();
页脚内容 高校图书馆电子资源建设读者满意度调查
temp(1,1,0,3);
order_ctrl(0); //命令移动一次
}
order_check_t(4); //命令临时变量检测函数 order_check_t(9); //命令临时变量检测函数
}
else if ((elevator_up_out==1)&&(elevator_down_out==0))
//如果电梯在下降过程中经过3楼
{
if (order_layer==3) //判断前一个排队命令如果是到
3楼停止的请求
{
TimerConfiguration();
temp(1,1,0,3);
order_ctrl(0); //命令移动一次
}
order_check_t(5); //命令临时变量检测函数 order_check_t(9); //命令临时变量检测函数
}
else if (layer==4)
//如果电梯在四层
}
{
页脚内容 高校图书馆电子资源建设读者满意度调查
if ((elevator_up_out==1)&&(elevator_down_out==1)) //
如果电梯停四楼并且前面未有任何排队命令
{
elevator_door_key(); //电梯门按键检测函数
elevator_4_stop (); //调用电梯停在四楼函数
}
else if ((elevator_up_out==0)&&(elevator_down_out==1))
//如果电梯上升到4楼
{
TimerConfiguration(); //调用定时配置函数
temp(1,1,0,0); }
3.6初始化子程序如下:
初始化就是把变量赋为默认值,把控件设为默认状态,把没准备的准备好。 但是如果是整个系统初始化那就不一样了。在汇编语言中,为变量分配空间时,初始化过的变量的初值位于可执行文件代码段数据后,会占用一定空间,不必要的初始化会造成磁盘空间的浪费。在C语言等高级语言中,为每一个变量赋初值被视为良好的编程习惯,有助于减少出现Bugs的可能性。因此,是否对不必要的变量初始化依情况而定。我们这里将一些主要参数都进行了数据初始化处理。具体可参照程序注释。
/****************************************************************
页脚内容 }
}
高校图书馆电子资源建设读者满意度调查
* 函 数 名 : Init * 函数功能
: 初始化函数,将程序中参数初始化
* 输 入 : 无 * 输 出 : 无
****************************************************************/ void Init() {
Time=0; //初始化参数 Time_target=0;
elevator_up_out=1; //电梯上升输出停止 elevator_down_out=1; zero=0; //队列0 one=0; //队列1 two=0; //队列2 three=0; //队列3 four=0; //队列4 five=0; //队列5 six=0; //队列6 seven=0; //队列7 eight=0; //队列8 nine=0; //队列9 order_layer=0; //命令层变量
页脚内容 //电梯下降输出停止
高校图书馆电子资源建设读者满意度调查
elevator_goto=0; //电梯继续运行标志 order_ctrl_s=0; //命令移动执行标志赋值0 order_ctrl_s1=11; //命令移动执行标志初值为11常数 }
设计总结
通过此次电梯控制系统的设计,我收获颇丰。设计的核心内容就是利用单片机C51的编程来实现控制外围各电路的运行以及protel99se绘制PCB版图。通过本次设计,我熟练掌握了程控系统设计的一般步骤,熟练掌握了protel99se软件的用法,并对编程能力起到了一定的提高作用。
在绘制PCB的过程中,我学习了如何制作元件库,如何制作封装库,如何调用原始封装。在画PCB版图时,通过手工布线,练习了PCB布局,掌握了PCB绘制的一般规则,同时掌握了如何对PCB版镀铜。通过对单片机的编程掌握了51单片机使用方法,熟悉了设计电子设备的常用电路知识。
感谢学校给我们这次机会,锻炼了我们的动手能力及运用专业软件的能力。通过这次课设让我明白了理论和实际操作之间差距,而且也让我很明确得意识到自己在数电、模电上有很多的知识漏洞,以后应该多钻研一下。
页脚内容 高校图书馆电子资源建设读者满意度调查
参考文献
[1] 李朝青.单片机通讯技术与工程实践.北京:航空航天大学出版,2007.2 [2] 李群芳.单片机原理接口与应用.北京:清华大学出版社,2005.6 [3] 杨志亮. Protel 99 SE电路原理图设计技术.西安:西北工业大学出版社,2002.2
[4] 马忠梅.单片机C语言应用程序设计.北京:航空航天大学出版社,1997.10 [5] 谢自美.电子线路设计.武汉:华中科技大学出版社,2000.5
[6] 中国电器工业协会微电机分会.微特电机应用手册.福建:福建科技出版社,2010.4
[7] 胡烨.Protel99SE电路设计与仿真教程.北京:机械工业出版社,2005.5
页脚内容
因篇幅问题不能全部显示,请点此查看更多更全内容