基于 单片机的六层电梯控制系统c语言程序

合集下载

51单片机模拟智能电梯系统代码及注释

51单片机模拟智能电梯系统代码及注释

#include<>#define uint unsigned int#define uchar unsigned char〃延时程序,以毫秒为单位,用软件计时,输入的参数为毫秒数void Delay_ms( uint Time);〃电梯向上走void Up();I〃电梯向下走void Down();〃报警函数void Warnning();〃获取目的楼层void Destination();//显示某一楼层void Display( uchar n, uchar a);//闪烁显示到达的楼层void Flash( uchar a);//点阵键盘扫描uchar KBScan();//延时void dl_ms();//解析出按键所代表的楼层uchar Reprsent();#include ""uchar code TAB[16]= (0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71);sbit P0_0 = P0A0;sbit P0_1 = P0A1;sbit P0_2 = P0A2;sbit P0_3 = P0A3;sbit P0_4 = P0A4;sbit P0_5 = P0A5;sbit P0_6 = P0A6;s bit P0_7 = P0A7;sbit P1_0 = P1A0;uchar lift = 1;〃电梯所在的楼层uchar destination1 = 1;〃电梯的目的楼层uchar flag = 0;〃进入电梯程序的标志uchar key;〃按键的键码uchar request[] = {0, 0, 0, 0, 0, 0, 0, 0, 0);//1-8 楼有无请求,有请求为 1uchar status = 1;//电梯往上还是往下走,1为上,0为下//报警的响声的频率产生void Timer1() interrupt 3 { P1_0=-P1_0;TH1 = 0xfc;TL1 = 0x0c;) int main(){'uchar i;P0 = 0xff;P2 = 0x76; //数码管‘H’EA = 1; //开启外部中断INT0EX0 = 1;IT0 = 1;while(1) //检查flag 标志{ //flag初始化为0if(flag == 1) 〃在中断中将其置1break;P1 = 0x01; 〃数码管跑马显示HDelay_ms( 100); //flag置1后则进入电梯程序for(i = 0; i < 5; ++i) (P1 = P1 << 1;Delay_ms( 100);) 一)while(1) 〃电梯程序的循环(if( (key = KBscan()) == 0x77) 〃若点阵按键右下角的按键(其代码为0x77)按下(Warnning(); 〃则报警) else (Destination(); 〃查询有无楼层请求到达if( destination1 >= lift) 〃请求的楼层比要到达的楼层高(Up(); 〃电梯向上走) else (〃否则电梯向下走;Down();)))return 0;)〃中断请求,将flag置1,表示要进入电梯程序void Int0() interrupt 0(flag = 1;)〃延时程序,以毫秒为单位,用软件计时,输入的参数void Delay_ms( uint Time)( 一uint i = 0, j = 0;for(i = 0; i < Time; ++i) (for(j = 0; j < 125; ++j);〃电梯向上走void Up() (uchar n, m; //n为所在楼层,m 为存储查询有无楼层请求的变量( uchar i;〃循环控制status = 1;〃置1表示电梯向上走for( n = lift; n <= destination1; ++n) 〃电梯到达目的楼层之前往上走(Display( n, 1); //没到达一楼就显示该楼层数lift = n;m = Represent(); if( m == 9) (Warnning();) else (request[m] = 1;)for(i = 1; i <= 8; ++i)〃若请求到达的楼层在所在楼层和目的楼层之间{〃则停下闪烁显示if( request[i] == 1 && i == n) //并将其对应的 request 清零{request[i] = 0; Flash( 1); ))) --n; lift = n;( Flash( 1);〃到达目的楼层闪烁显示该楼层)//电梯向下走void Down() {uchar n, m; //n为所在楼层,m 为存储查询有无楼层请求的变量uchar i;//循环控制//读取点阵键盘//报警键按下则报警〃有楼层请求到达〃将对应的request 置1for(i = 1; i <= 8; ++i)〃若请求到达的楼层在所在楼层和目的楼层之间{〃则停下闪烁显示if( request[i] == 1 && i == n) //并将其对应的 request 清零{request[i] = 0; Flash( 0);))) ++n; lift = n; Flash( 0);〃到达目的楼层闪烁显示该楼层)〃报警函数void Warnning() {TMOD = 0x10; //T1定时器初始化ET1 = 1; TH1 = 0xfc; TL1 = 0x0c; TR1 = 1; while(1) {P1=0x04; P2=0x07; Delay_ms( 5); P1=0x08; P2 = 0x3f; Delay_ms( 5); P1=0x10;status = 0;〃置1表示电梯向上走for( n = lift; n >= destinationl; --n) 〃电梯到达目的楼层之前往下走(Display( n, 0);楼层数lift = n;m = Represent(); if( m == 9) (Warnning();) else%(request[m] = 1;)//没到达一楼就显示该〃读取点阵键盘//报警键按下则报警〃有楼层请求到达〃将对应的request 置1P1=0x02; P2 = 0x6D; Delay_ms( 5); //显示STOPP2=0x73;Delay_ms( 5);if( KBScan() != 0x77) 〃报警键没有按{ 〃则跳出,并停止喇叭响break;) ))¥〃获取目的楼层void Destination() {uchar j, n; 〃j循环控制变量,n存储度点阵键盘变量n = Represent(); 〃有键按下request[n] = 1; 〃其对应的楼层request 置 1if( status == 1) 〃若电梯向上走则从高楼层到低楼层扫描〃以此达到判断优先级的目的!{for(j = 8; j >= 1; --j) {if( request[j] == 1){request[j] = 0; 〃哪一层有请求destination1 = j; 〃则将目的楼层设为该楼break; 〃并将其对应的request置1,然后跳出)),)else if( status == 0) 〃若电梯向下走则从低楼层到高楼层扫描{ 〃以此达到判断优先级的目的for(j = 1; j <= 8; ++j){if( request[j] == 1){request[j] = 0;destination1 = j; break;))〃显示某一楼层void Display( uchar n, uchar a)( uchar i, b;" 一一if(a == 1)( b=0x73;)else if(a == 0)( b = 0x5E;)for(i = 0; i < 60; ++i)P1=0x20;P2 = b;Delay_ms( 10);P1 = 0x02;P2 = TAB[n];Delay_ms( 10);//闪烁显示到达的楼层void Flash( uchar a) (uchar i, j, b;uchar m;if(a == 1) //a=1 表示向上(b = 0x73; //七段码P)表示向下/ else if(a == 0) //a=0(b = 0x5E; //七段码 d) for(i = 0; i < 5; ++i) {m = Represent(); 〃闪烁时判断有无楼层请求到达 request[m] = 1; for(j = 0; j < 15; ++j) 〃闪烁显示楼层和P 或者d(P1=0x20; P2 = b; Delay_ms( 10); P1 = 0x02; P2 = TAB[lift];Delay_ms( 10);)一for(j = 0; j < 15; ++j) (P1 = 0x20; P2 = b; Delay_ms( 10); P1 = 0x02; P2 = 0x00;Delay_ms( 10);}一)}》#include ""〃延时void dl_ms()( 一uchar i;for(i = 0; i < 200; ++i);〃点阵键盘扫描uchar KBScan() (uchar sccode, recode; //sccode 低位,recode 高位uchar i, a; //i循环控制,a 读取P0 口P0 = 0x0f;if( (P0 & 0x0f) != 0x0f) //有无键按下(dl_ms();〃消抖延时 if( (P0 & 0x0f) != 0x0f)〃有键按下则继续recode = 0x7f; for(i = 1; i <= 4; ++i) (〃先显示P 或者d 以及楼层数〃再显示P 或者d 而不显示楼层数〃以此达到闪烁的目的P0 = recode; 〃从P0的最高位开始扫描,即点阵键盘第四行if( (P0 & 0x0f) != 0x0f)# {a = P0; 〃若该行有键按下,则返回其代码sccode = a & 0x0f;recode = recode & 0xf0;return (sccode + recode);)else{recode = (recode >> 1) | 0x80; //若没有则扫描其上面一行))))return 0; )//解析出按键所代表的楼层uchar Represent(){uchar key, n;key = KBScan();switch( key){case 0xee: n = 1; break; case 0xed: n = 2; break; case 0xeb: n = 3; break; case 0xe7: n = 4; break; case 0xde: n = 5; break; case0xdd: n = 6; break; case 0xdb: n = 7; break; case 0xd7: n = 8; break; case 0x77: n = 9; break; default: n = 0; break;)return n; )。

基于单片机的6层电梯模拟控制系统设计课程设计报告5524027

基于单片机的6层电梯模拟控制系统设计课程设计报告5524027
其次,电梯系统还有一个判断是否无人的情况。即电梯到达某楼层后,其他 楼层无按键动作,且电梯内也无楼层选择按键动作,电梯应自动返回到1层等待。
然后,两个楼层之间应考虑有一段运行时间,而且也要设置在一个楼层的停 留时间。本设计中两个楼层之间的运行时间设为is,每层停留时间设为5s。另外, 当电梯上升或者下降时,相应的状态指示灯应及时同步点亮。
3.6
LED是Light Emiting Diode(发光二极管)的缩写,发光二极管是可以将电 信号转换为光信号的电致发光器件。由条形发光二极管组成“8”字形的LED显 示器称数码管。通过数码管中发光二极管的亮暗组合,可以显示多种数字,字母以 及其他符号。这次设计采用七段数码管。外形如图3・5所示,即左边的7个引脚 跟单片机P0口相接,下边的引脚连接地。
3.3
LI L2 L3

如上图3・4所示,继电接触控制电路,通过接触器、继电器之间的相互联锁, 可以实现多台设备按生产工艺进行工作,是实现自动控制及保护的重要环节。当 接通电源后,闭合负荷开关QM,按下开关SB1,线圈C1得电,使电动机启动, 此时电动机正转。按下开关SB2,线圈C2得电,线圈C1断开,此时电机开始反 转。
2.3
我们选用Y100L24三相异步电动机,因为它还具有性能好、寿命长、可靠性 高、维护方便、启动转矩大等优点,其功能参数为额定电压380V,额定频率50HZ,额定功率3000W,额定转速1400转/分。
2.4 9C52
这次设计釆用的是AT89C52单片机,AT89C52是一个低电压,髙性能CMOS8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生 产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储 单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场 合。其外形及引脚排列如图2・2所示:

基于单片机原理的电梯自动控制系统

基于单片机原理的电梯自动控制系统

基于单片机原理的电梯自动控制系统摘要:本文介绍了基于单片机的电梯控制系统,硬件部分主要由单片机最小系统模块、电梯内外电路按键矩阵模拟检测模块、电梯外请求发光管显示模块、楼层显示数码管模块、电梯上下行及开关门模拟显示模块等5部分组成。

该系统采用单片机(AT89S51)作为控制核心,内外招使用按键按下和否而引起的电平的改变,作为用户请求信息发送到单片机,单片机控制电动机转动,单片机根据楼层检测结果控制电机停在目标楼层。

软件部分使用汇编语言,利用查询方式来检测用户请求的按键信息,根据电梯运行到相应楼层时,模拟按键引起电平变化,送到单片机计数来确定楼层数,并送到数码管进行显示。

硬件设计简单可靠,结合软件,基本实现了六层电梯运行的模拟。

关键词:AT89S51、电梯控制、单片机1 引言随着现代高科技的发展,住房和办公用楼都已经逐渐向高层发展。

电梯是高层宾馆、商店、住宅、多层仓库等高层建筑不可缺少的垂直方向的交通运输工具。

由于传统的电梯运行逻辑控制系统采用的是继电器逻辑控制线路。

采用这种控制线路,存在易出故障、维护不便、运行寿命较短、占用空间大等缺点。

从技术发展来看,这种系统将逐渐被淘汰。

而单片机价格相当便宜,由单片机设计的控制系统可以随着设备的更新而不断修改完善,更完美的实现设备的升级。

2 电梯控制系统原理电梯使用中大多采用交流变频电机拖动原理,其厢体由一条曳引钢缆连接,由安装在顶层的曳引轮和曳引电机拖动,电机的功率随着曳引重量的不同大小不等。

其主要的拖动及控制系统有:a)外呼内选系统,外部呼叫信号和指示以及厢体内选层和指示系统;b)平层换速系统,电梯快速到达指定楼层之前切换为慢速并到达平层位置停车;c)厢体状态指示系统,随时显示厢体所在位置;d)开关门控制系统,平层开门,关门行车;e)安全保护系统,含有上下限位、消防、满载、门电锁等功能;电梯运行基本过程是:由外部呼叫信号给出呼叫,控制系统判断厢体目前所处位置并和呼叫楼层进行对照,同方向还是反方向。

基于单片机的电梯控制系统设计

基于单片机的电梯控制系统设计
方案二:数码管显示
数码管也就是常说的LED数码管,是一种利用半导体的基本功能来实现发光的器件。[4]发光二极管是它的基本单元。数码管的种类有很多种,按段数分可分为两种,分别为:七段数管和八段数码管;其根本区别是后者比前者多一个发光二极管。按能显示“8”的个数可分几种:分别为1位、2位、4位等等不同型号的数码管;按连接方式可分为两种发光二极管:共阳极数码管和共阴极数码管。其二者的区别在于是否将所有的发光二极管的阳极/阴极接到一起形成公共阳极/阴极的数码管。再根据接在相应的公共极,是否出现相应字段的亮或不亮来判断高低电平。由于它的价格便宜使用简单在电器特别是家电领域应用极为广泛。
2 系统总体方案
2.1
(1)电梯无人控制,完全自动根据梯内或梯外的操作自动运行。
(2)电梯系统通电后,如果有呼叫信号,则电梯自动响应召唤,并且自动运行。
(3)按梯内外的召唤指令信号自动定向,有优先级的运行路径,减少电梯的运行时间。
(4)显示屏有显示电梯运行的方向以及到达的楼层。
2.2系统设计方案
2.2.1 显示模块的选择
方案一:1602液晶模块
1602液晶又称1602字符型液晶,它的功能是能够显示数字、字母以及符号等需要显示的内容,是一种专门的显示模块。它有很多个5*7或者5*11等点阵字符位组成,由于点阵的关系,它的每一个字符位都可以把一个字符显示出来。由于每一位点阵之前存在一个点距的间隔,同样,每一行之前也有间隔,所以他不能显示图形。它的优点是微功耗、体积小、显示内容丰富、超薄轻巧。[3]
目前的电梯控制系统大多采用继电器或者可编程控制器(PLC)的控制方式,存在着成本高,需要三相供电等缺点,本设计给出了一种基于单片机的电梯模型控制系统设计。以单片机为核心,通过使用适当的硬件电路和控制程序来检测和控制整个电梯的信号,具有成本低廉、通用性强、灵活性大、扩展容易及易于操作,实现较易控制等优点。[2]

基于单片机AT89C52的六层电梯控制模拟

基于单片机AT89C52的六层电梯控制模拟

1 绪论
1.1 引言
随着人们生活水平的不断提高和国名经济的迅速发展。各大城市建筑物在不 断向高层化发展。因此电梯在我们的生活中起着举足轻重的作用。电梯已不仅是 一种生产环节中的重要设备,更是一种人们频繁乘用的交通运输设备。因此电梯 控制技术也在不断的进步和完善,常用的控制技术主要的有两种技术:基于 PLC 控制和基于单片机控制两大技术。用 PLC 控制的电梯性能可靠、稳定,但是造价 太高。基于单片机控制的电梯可以大大的降低成本而且运行也较可靠,所以现在 电梯控制中大多数采用单片机控制。
目次
1 绪论.................................................................................................................................1 1.1 引言...........................................................................................................................1 1.2 总体设计方案........................................................................................................... 1 1.2.1 设计思路................................................................................................................. 1 1.2.2 设计方框图....................

基于单片机的智能电梯控制系统设计

基于单片机的智能电梯控制系统设计

基于单片机的智能电梯控制系统设计摘要本文介绍了一种采用单片机STC89C52芯片进行电梯控制系统的设计方法,主要阐述如何使用单片机进行编程来实现四层电梯的智能控制,利用单片机编程简洁而又多变的设计方法,缩短了研发周期,同时使电梯控制系统体积更小功能更强大。

本设计实现了电梯控制系统所需的一些基本功能,能通过电梯内按键或者电梯外上升、下降按键选择楼层,数码管显示实时楼层数,LED显示实时电梯运行状态。

原理图和PCB部分采用protel99se专业软件来设计,实现将设计产品化。

本次设计更注重了把一些新的思路加入到设计中。

主要包括采用了STC89C52芯片,使用C语言进行编程,使其具有了更强的移植性,更加利于产品升级。

关键词:STC89C52;电梯控制系统;protel99se;C语言AbstractThis 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第一章绪论随着人类社会已经逐步进入信息化的时代,信息社会的快速发展更是离不开电子产品的进步。

单片机课程设计电梯

单片机课程设计一、设计名称:电梯控制系统设计二、设计人员:周海峰、杨柳、吴晶晶、邹敏三、指导老师:王宪菊四、设计要求:楼层:共六层设计名称:电梯控制系统设计六个按键:用来输入要去的楼层点阵1:显示当前楼层点阵2:显示“↑”或“↓”箭头例如:当前电梯停在三楼,当按下键1时,点阵1间隔一秒依次显示“2”,“1”,点阵2显示箭头↓;当按下键6时,点阵1间隔一秒依次显示“4”,“5”,“6”,点阵2显示箭头↑。

器件:89c51芯片、两个8*8点阵、6个按键五、器件介绍:89c51芯片:89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压、高性能CMOS8位微处理器,俗称单片机。

单片机的可擦除只读存储器可以反复擦除100次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。

89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

结构特点:8位CPU;片内振荡器和时钟电路;32根I/O线;外部存贮器寻址范围ROM、RAM64K;2个16位的定时器/计数器;5个中断源,两个中断优先级;全双工串行口;布尔处理器;管脚说明:VCC:供电电压。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

建造6层电梯控制系统程序的设计方案

建造6层电梯控制系统程序设计方案1.1 PLC的基本结构1、中央处理单元(CPU) 中央处理单元 (CPU)是PLC的控制核心。

它按照PLC系统程序赋予的功能:a. 接收并存储从用户程序和数据;b.检查电源、存储器、I/O以及警戒定时器的状态,并能诊断用户程序中的语法错误。

2、存储器可编程序控制器的存储器分为系统程序存储器和用户程序存储器。

存放系统软件(包括监控程序、模块化应用功能子程序、命令解释程序、故障诊断程序及其各种管理程序)的存储器称为系统程序存储器;存放用户程序(用户程序存和数据)的存储器称为用户程序存储器,所以又分为用户存储器和数据存储器两部分。

3.输入接口电路输入输出信号有开关量、模拟量、数字量三种,在我们实际涉及到的信号当中,开关量最普遍。

4.输出接口电路:可编程序控制器的输出有:继电器输出(M)、晶体管输出(T)、晶闸管输出(SSR)三种输出形式。

5.电源 PLC的电源在整个系统中起着十分重要得作用。

如果没有一个良好的、可靠得电源系统是无法正常工作的,因此PLC的制造商对电源的设计和制造也十分重视。

一般交流电压波动在+10%(+15%)范围内,可以不采取其它措施而将PLC直接连接到交流电网上去。

如FX1S额定电压AC100V—240V,而电压允许范围在AC85V—264V 之间。

允许瞬时停电在10ms以下,能继续工作。

一般小型PLC的电源输出分为两部分:一部分供PLC内部电路工作;一部分向外提供给现场传感器等的工作电源。

1.2 PLC的工作原理PLC则是采用循环扫描的工作方式。

一个扫描周期主要可分为3个阶段。

1.2.1输入刷新阶段在输入刷新阶段,CPU扫描全部输入端口,读取其状态并写入输入状态寄存器。

完成输入端刷新工作后,将关闭输入端口,转入程序执行阶段。

在程序执行期间即使输入端状态发生变化,输入状态寄存器的内容也不会改变,而这些变化必须等到下一工作周期的输入刷新阶段才能被读入。

C语言电梯程序全部

motor_ffw(); //启动电机反转
while(!flag);
flag=0;
}
if(floorin>floorstay & upin_flag==1) //判断内部楼层升降
{
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xed:num=5;
downin_flag=1;
if(floorin<floorstay & downin_flag==1 )//判断内部楼层下降
uchar num,num1,floorin,floorout,floorstay,temp;
uint downin_flag,upout_flag,downout_flag,upin_flag,flag;
uchar code table[]={
0x06,0x5b,0x4f,
0x66,0x6d,0x7d};
upout_flag=1;
downout_flag=1;
floorout=2;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
void timer0() interrupt 1
{ TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num1++;
P0=table[floorstay-1];
if(num1==20)

电梯控制系统C语言程序

for(a=2;a<befnum+1-num;a++)
{
TR1=1;
step_down();
TR1=0;
}
}
}
void main()
uint circle;
uchar table_up[]={0x06,0x0c,0x09,0x03}; //步进电机上楼
uchar table_down[]={0x03,0x09,0x0c,0x06}; //步进电机下楼
uchar const lightopen[]={0x00,0x18,0x3c,0x7e,0xff};//流水灯指示电梯门打开
befnum=num;
}
}
befnum=num;
delay(10);
kaimen();
}
///////////////////////////////////下 楼///////////////////////////////////////////
uchar select[]={0xbf,0x7f}; //选择数码管数组,依次选择1,2,..,8
uchar i,j,num,aa,befnum,lightnum,dnum,abcd,uplay,a,key,define,loop,lable;
{ P0=shuma[dnum/10];
P2=select[0];
delay(1);
P0=shuma[dnum%10];
P2=select[1];
delay(1);
}
void delay2(uint cnt) //延时
h=P3&0x0f;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

}
}
}
/******************选择下一个楼层的函数*******************/
void SELECTNEXT()
{
char n;
if(CURFLOOR==MAXFLOOR) //如果当前楼层等于最大楼层,方向转为向下方向,0 表 示向下运行,
{
DIRECTION=0;
}
else if(CURFLOOR==1) //否则,如果当前处于 1 楼,方向为向上,1 代表向上方向
//关闭向上 LED 灯
LEDDOWN=1;
//关闭向下 LED 灯
STOP=1;
//停止位置 0
return;
}
}
}
}
/***********************外中断 0 中断服务函数**********************/
void int0() interrupt 0
{
if(FLOOR6DOWN==0)
{
timer1=0;
//定时值 1 赋值为 0
if(DIRECTION) //如果电梯为向上方向运行
{
CURFLOOR++;
//当前楼层自加
CALLFLOORUP[CURFLOOR]=0; //楼层向上请求赋值为 0
}
else
//否则,楼层为向下方向运行
{
CURFLOOR--;
//楼层数自减
CALLFLOORDOWN[CURFLOOR]=0; //楼层向下请求赋值为 0
sbit FLOOR2DOWN=P2^0; //2 楼下对应的 P2^0,IO 口
sbit FLOOR1UP=P2^1; //1 楼上对应的 P2^1,IO 口
/******************电梯内对应各层楼的按键***********************/
sbit FLOOR1=P2^2;
if(CALLFLOORUP[n]) {
DESTFLOOR=n; return; } for(n=MAXFLOOR;n>CURFLOOR;n--) if(CALLFLOORDOWN[n]) { DESTFLOOR=n; return; }
//上到最高层的时候,有向下的请求
DIRECTION=0;
//有低于当前楼层的向下请求
//如果 6 楼没有向下运行
CALLFLOORDOWN[6]=1; //6 楼向下请求信号置 1
else if(FLOOR5DOWN==0)
//如果 5 楼没有向下运行
CALLFLOOR[5]=1;
//5 楼向下请求信号置 1
else if(FLOOR4DOWN==0)
//如果 4 楼没有向下运行
CALLFLOORDOWN[4]=1; //4 楼向下请求信号置 1
//1 楼对应的 P2^2IO 口
sbit FLOOR2=P2^3;
//2 楼对应的 P2^3IO 口
sbit FLOOR3=P2^4;
//3 楼对应的 P2^4IO 口
sbit FLOOR4=P2^5;
//4 楼对应的 P2^5IO 口
sbit FLOOR5=P2^6;
//5 楼对应的 P2^6IO 口
unsigned char CALLFLOORDOWN[7]={0,0,0,0,0,0,0}; //呼叫楼层下对应的数组,存储每层楼的信
息,1 为有人呼叫或者有人前往
unsigned char CALLFLOOR[7]={0,0,0,0,0,0,0}; //呼叫楼层对应的数组,存储每层楼的信息,
1 为有人呼叫或者有人前往
sbit FLOOR6=P2^7;
//6 楼对应的 P2^7IO 口
/*********************电梯上下运行指示灯************************/
sbit LEDUP=P3^6; //LED 上对应的 P3^6IO 口
sbit LEDDOWN=P3^7;
//LED 下对应的 P3^7IO 口
{
LEDUP=0;
//向上的 LED 灯亮
LEDDOWN=1;
//向下的 LED 灯灭
}
else
//否则为向下方向
{
LEDUP=1;
//向上的 LED 灯灭
LEDDOWN=0;
//向下的 LED 灯亮
}
timer1=0;
TR0=1;
//开定时器 0
}
}
/*************************延时函数****************************/
bit DIRECTION=1,STOP=0; //电梯运行方向位,电机运行停止与否标志位
unsigned char CURFLOOR=1; //当前楼层处于 1 楼
unsigned char DESTFLOOR=1; //目地楼层处于 1 楼
unsigned char RUN=0;
//运行状态标志位,RUN=1 表示正在运行
#include<reg51.h>
#define MAXFLOOR 6
//定义一个最大层数为 6 层的电梯
unsigned char code LEDCODES[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d}; //LED 数码管发光数组
/******************电梯外对应的上下按键*************************/
unsigned int timer1=0,timer2=0;
//timer1 为 楼 层 间 运 行 时 间 计 数 值 ,
timer2 为等待计数值
unsigned char CALLFLOORUP[7]={0,0,0,0,0,0,0}; //呼叫楼层上对应的数组,存储每层楼的信息,
1 为有人呼叫或者有人前往
void step(bit DIRECTION)
{
if(DESTFLOOR==CURFLOOR) //如果当前楼层等于目地楼层,则返回
return;
else if(!RUN)
//否则,如果运行了
{
RUN=1;
//运行位置 1
DELAY(50);
//延时 50
if(DIRECTION==1)
//如果反方向为向上
{
timer2=0; TR0=1;
//定时值 2 标志位置 0 //开启定时器 0
while(timer2<100&&STOP); //如果定时值 2 小于 100 并且 stop 位为 1
TR0=0;
//关闭定时器 0
timer2=0; STOP=0;
//定时值 2 标志位置 0 //停止位置 0
void timer0_int() interrupt 1
{
TH0=0x3C;
//赋予定时器初值
TL0=0xB0;
timer1++;
//定时值 1 标志位自加
timer2++;
//定时值 2 标志位自加
if(RUN)
//如果处于运行状态
{
if(timer1==20)
//如果定时值 1 自加到 20,表示到达一个楼层延时 1s
void main(void)
{
P0=LEDCODES[1]; //点亮第一层对应的 LED
TH0=0x3C;
//定时器 1 的初值
TL0=0xB0; TMOD=0x01; ET0=1; EA=1; EX0=1;
//开启定时器 0 工作方式 1 //开启定时器 0
//开放总中断 //开放外中断 0
void DELAY(unsigned int Z)
{
unsigned int X,Y;
for(X=Z;X>0;X--)
for(Y=125;Y>0;Y--);
}
/*********************定时器 0 中断服务函数**********************
*********************定时 0 中断,可利用此发送电机 PWM 脉冲信号***/
{
DIRECTION=1;
}
if(DIRECTION==0)
//如果方向是 0,表明当前楼层处于最高层,为向下方向
{
if(CALLFLOORDOWN[CURFLOOR]) {
//如果在下的过程中,有下面楼层的呼叫请求 //要去的为当前层,即需延时 5s
CALLFLOORDOWN[CURFLOOR]=0; //把当前楼层置 0
sbit FLOOR4DOWN=P1^4; //4 楼下对应的 P1^4,IO 口
sbit FLOOR3UP=P1^5; //3 楼上对应的 P1^5,IO 口
sbit FLOOR3DOWN=P1^6; //3 楼下对应的 P1^6,IO 口
sbit FLOOR2UP=P1^7; //2 楼上对应的 P1^7,IO 口
/*************自定义函数的声明*******************/
void SELECTNEXT();
void step(bit DIRECTION);
void DELAY(unsigned int Z);
void JUDGESIT();
/********************主函数**********************/
for(n=CURFLOOR+1;n<=MAXFLOOR;n++) //如果在上的过程中有高于当前楼层的楼层
发出向上请求
相关文档
最新文档