找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14423|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机电梯控制系统设计论文

[复制链接]
跳转到指定楼层
#
ID:324007 发表于 2018-5-7 10:42 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
单片机课程设计
摘 要
电梯是标志现代物质文明的垂直运输工具、是机电一体化的复杂运输设备。它涉及电子技术、机械工程、电力电子技术、微电脑技术、电力拖动系统和土建工程等多个科学领域。本文旨在使用单片机上的数码管模拟电梯的运行过程对提高学生的综合应用程序设计能力也将是非常有益和非常有效的,并且需要使用动态扫描的方法来实现这一模拟过程,独立进行单片机应用技术开发工作,掌握单片机程序设计、调试,应用电路设计、分析及调试检测。本文的核心在于:熟练使用单片机,并且要基于keil平台编写程序;最后要使用单片机来实现电梯控制功能。
Abstract
Elevator is the vertical transportation vehicle that marks the modern material civilization, and the complex transportation equipment of electromechanical integration. It involves many fields of science, such as electronic technology, mechanical engineering, power electronic technology, micro-computer technology, electric drive system and civil engineering. The purpose of this paper is to simulate the operation process of the elevator with the digital tube on the single chip computer. It is also very useful and very effective to improve the students' comprehensive application design ability, and it is necessary to use the dynamic scanning method to realize this simulation process. The application technology development work of the single chip computer is independently carried out and the single chip computer program is mastered. Design, debug, application circuit design, analysis and debug test. The core of this article is: using SCM skillfully, and programming based on keil platform. Finally, we need to use SCM to achieve elevator control function.


目录

第一章 概述
第二章 电梯控制的原理
2.1基于MSC-51单片机的简单电梯控制
2.2方案一的讨论
2.2.1方案一的优点
2.2.2方案一的缺点
2.3方案二的讨论
2.3.1方案的优点
2.3.2方案二的缺点
2.4两种方法的比较以及选择
第三章 硬件电路设备及软件流程代码
3.1控制芯片AT89S52简介
3.2主程序代码设计
3.3功能测试
总结
参考文献
附录1 主要源代码
附录2  原理图


第一章 概述
随着人口的增长,高层建筑已经逐渐成为了人们居住,上班的主流建筑。随着高层建筑的兴起,电梯的地位也变得越来越重要。十几层甚至几十层的宾馆、酒店、办公楼、住宅鳞次栉比。伴随着社会的高速发展,电梯作为大楼里的一种交通工具,人们的生活越来越离不开它。
电梯是垂直运行的电梯(通常也简称为电梯)、倾斜方向运行的自动扶梯、倾斜或水平方向运行的自动人行道的总称。有了电梯,摩天大楼才得以崛起,现代城市才得以长高。据估计,截至2002年,全球在用电梯约635万台,其中垂直电梯约610万台,自动扶梯和自动人行道约25万台。电梯已成为人类现代生活中广泛使用的人员运输工具。人们对电梯安全性、高效性、舒适性的不断追求推动了电梯技术的进步。在现代社会和经济活动中,计算机技术、自动控制技术和电力电子技术得到了迅速的发展,不断满足社会经济快速发展和人民生活水平不断提高的需要,电梯作为一种重要的交通运输工具,已经成为城市物质文明的一种标志。电梯在公办大楼、公司、高层住宅、宾馆等场所得到了广泛应用。特别是在高层建筑中,电梯是不可缺少的垂直运输设备。
现代电梯主要由曳引机(绞车)、导轨、对重装置、安全装置(如限速器、安全钳和缓冲器等)、信号操纵系统、轿厢与厅门等组成。这些部分分别安装在建筑物的井道和机房中。通常采用钢丝绳摩擦传动,钢丝绳绕过曳引轮,两端分别连接轿厢和平衡重,电动机驱动曳引轮使轿厢升降。电梯要求安全可靠、输送效率高、平层准确和乘坐舒适等。电梯的基本参数主要有额定载重量、可乘人数、额定速度、轿厢外廓尺寸和井道型式等。简单使用方法(紧急情况下面有解决方法)
载人电梯都是微机控制的智能化、自动化设备,不需要专门的人员来操作   电梯电梯结构图 电梯内部结构图驾驶,普通乘客只要按下列程序乘坐和操作电梯即可。在乘梯楼层电梯入口处,根据自己上行或下行的需要,按上方向或下方向箭头按钮,只要按钮上的灯亮,就说明你的呼叫已被记录,只要等待电梯到来即可。
电梯到达开门后,先让轿厢内人员走出电梯,然后呼梯者再进入电梯轿厢。进入轿厢后,根据你需要到达的楼层,按下轿厢内操纵盘上相应的数字按钮。同样,只要该按钮灯亮,则说明你的选层已被记录;此时不用进行其他任何操作,只要等电梯到达你的目的层停靠即可。电梯行驶到你的目的层后会自动开门,此时按顺序走出电梯即结束了一个乘梯过程。
              近年来,随着城镇化的推进及居民生活水平的提高,电梯已成为百姓生产、生活中不可或缺的垂直交通工具。前瞻产业研究院发布的《2015-2020年中国电梯行业市场需求预测与投资机会分析报告前瞻》显示,2013年我国电梯的总产量达到了57.97万台,同比增长9.58%,中国已经成为全球电梯产量最高的国家,比重超过全球总量的60%。从2009年到2013年,我国电梯产量年均增长率达到了21.96%。
目前中国已成为世界上电梯保有量最大的国家,截至2013年底,我国电梯保有量达到292.24万台,同比增长19.97%。我国电梯拥有数为21.48台/1万人,与全球平均23.88台/1万人相比,已经接近全球平均水平。而与韩国等地的市场比较来看,我国未来电梯的保有量会达到800万台左右,年新装/更新量会维持在50万台的水平。

第二章 电梯控制的原理
2.1基于MSC-51单片机的简单电梯控制
方案一:为了更有效的进行电梯控制,现在使用最左边的数码管表示电梯上升和下降状态,使用“∧”表示上升状态,是同“∨“表示下降状态,使用另外一个一个数码管表示电梯此时所在的楼层,使用按键K1和K2来控制电梯上升或者下降的状态。
在每层楼之后需要进行判断上升或者下降。如果是在上升过程中,应先判断是否继续上升,然后在判断是否下降。如果是在下降过程中,应先判断是否继续下降,在判断是否上升。在上升改变为下降状态时,或者下降改变为上升状态时。
数码管的状态应该相应改变。
方案二:依然使用最左边的数码管表示电梯上升和下降状态,使用“∧”表示上升状态,是同“∨“表示下降状态,使用另外一个一个数码管表示电梯此时所在的楼层,不过此时又八个按键来代表电梯的层数,使用k11代表1楼,k12代表2楼,k13代表3楼,k14代表4楼,k21代表5楼,k22代表6楼,k23代表7楼,k24代表8楼。
如果默认电梯在一楼,比如按下k22按键,数码管则由1变化到6,此时是上升状态。然后数码管就显示6,直至再次按键。如果按的是k13,则数码管从6变化到3,此时是下降状态。数码管显示3,直到再次按键才改变当前状态。
2.2方案一的讨论
2.2.1方案一的优点
1.方案一的思路十分清晰明了。仅有由1至8的上升状态或者8至1的下降状态,程序书写比较简单。
2.方案一对于初学者来说比较友好,会基础C语言语句以及51单片机定时器的使用方法就可以比较轻松的做出程序。
    3.因为上升过程中,仅计数8次,定时器的参数就可以使用一个宏定义的常数代替,定时器的程序也可以大大化简。
2.2.2方案一的缺点
方案一最大的缺点是对于电梯的运行过程过于简化,仅仅考虑了上升或者下降的两个过程。而实际的电梯运行时,仅有在有人使用的时候才会运行,不然是会一直停靠在某层楼的。为了简化过程编写程序的便利而牺牲了电梯本来可以实现的功能,是这个方案最大的缺陷。
2.3方案二的讨论
2.3.1方案的优点
1.方案二是方案一的强化改良版本,基本可以实现真实电梯的功能
2.方案二可以按照所需要去的楼层数的不同而数码管的变化不同,这是方案一所无法达到的。
3.方案二的思路也比较清晰,默认电梯在一楼,去了6楼之后便停在6楼,然后从6楼在去其他楼层,在停靠在某个楼层。
2.3.2方案二的缺点
方案二最大的缺点是虽然思路清晰,但是编写程序的过程还是比较复杂的。首先默认电梯在某楼,将此楼作为参数进入子函数1中,然后对8个按键哪个按键按下进行判断,然后进入子程序2中,先判断要去的楼层和现在所在的楼层的大小关系,有三种情况,对应三个条件语句。然后执行完子函数2之后,在将去的层数作为参数再次进入子函数1中。而且因为所去楼层不同,定时器的参数也会相应改变,编写程序比较繁杂。

2.4两种方法的比较以及选择
根据实际编写程序者的水平以及对于操作者水平的可行性来说,方案一对于新手来说相对友好了很多,不需要考虑过于复杂的情况只需要想一个相对来说很理想,电梯只从1楼上升到8楼,在每层楼只停相同的时间。而方案二则对于编写者的水平要求就要高了很多,对于新手来说在两天到三天过程几乎是个不可能完成的任务,所以还是决定选择方案一。


第三章 硬件电路设备及软件流程代码
3.1控制芯片简介
本设计中,AT89S52 是Atmel公司生产的一种低功耗、高性能CMOS 8位微控制器,具有8 位在系统可编程Flash存储器。AT89S52 使用Atme  公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash 允许程序存储器在系统可编程,也适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52 为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。  AT89S52 具有PDIP、PLCC、TQFP3 种封装形式以适用于不同的使用场合。
AT89S52是美国ATMEL公司生产的低电压,高性能CMOS 8位单片机,内含2k字节的可反复擦写的Flash只读程序存储器和128字节的随机存取数据存储器(RAM),其擦写周期约1000次。器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,内置通用8位中央处理器和Flash存储单元,功能强大。AT89S52单片机的工作电压范围较宽,可在2.7V~6V电压范围内工作。它的工作频率为0Hz~24MHz,支持降至0Hz的静态逻辑操作,并支持两种可选的节电工作模式(低功耗空闲和掉电模式),空闲方式下停止CPU的工作,但允许RAM、定时/计数器、串行通信口及中断系统继续工作。掉电方式下保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。AT89S52还具有两级加密程序存储器,使用者可以根据需要对程序进行加密,实现版权保护的目的。考虑到在单片机的很多应用中,需要使用发光二极管(LED)进行指示,AT89S52的输出端口被设计成可直接驱动LED,可以省去外加的驱动电路,节省资源[6]。
AT89S52内部资源主要有:2k字节Flash闪速存储器,128字节内部RAM,15个I/O口线(其中P1是一个完整的8位双向I/O口),两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口(可编程串行UART通道),精密模拟比较器,片内振荡器以及时钟电路。


AT89S52引脚如图3.1所示。
图3.1 AT89S52引脚图


VCC:电源。
GND:地。
P0 口:P0 口是一个8 位漏极开路的双向I/O 口。作为输出口,每位能驱动8 个TTL逻辑电平。对P0 端口写“1”时,引脚用做高阻抗输入。当访问外部程序和数据存储器时,P0 口也被作为低8 位地址/数据复用。在这种模式下,P0 具有内部上拉电阻。在Flash编程时,P0 口也用来接收指令字节;在程序校验时,输出指令字节。在程序校验时,需要外部上拉电阻。
P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,P1 输出缓冲器能驱动4 个TT  逻辑电平。当对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。当作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此 外,P1.0 和P1.2 分别作为定时器/计数器2 的外部计数输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体如表1-1 所示。在Flash编程和校验时,P1口接收低8 位地址字节。

表3-1  P1口引脚第二功能
引脚号
第二功能
P1.0
T2(定时器/计数器T2外部计数输入),时钟输出
P1.1
T2EX(定时器/计数器T2捕捉/重载触发信号和方向控制)
P1.5
MOSI(系统编程用)
P1.6
MISO(系统编程用)
P1.7
SCK(系统编程用)


P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TT  逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。当作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16 位地址读取外部数据存储器(如执行MOVX @DPTR)时,P2 口送出高8 位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用8 位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在Flash编程和校验时,P2 口也接收高8位地址字节和一些控制信号。
P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TT逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。当作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3 口也作为AT89S52 特殊功能(第二功能)使用,如表1-2所示。在Flash编程和校验时,P3口也接收一些控制信号。

表3-2  P3口引脚第二功能
引脚号
第二功能
引脚号
第二功能
P3.0
RXD(串行输入)
P3.4
T0(定时器0外部输入)
P3.1
TXD(串行输出)
P3.5
T1(定时器1外部输入)
P3.2
INT0(外部中断0)
P3.6
WR(外部数据写选通)
P3.3
INT1(外部中断1)
P3.7
RD(外部数据读选通)

RST: 复位输入。在晶振工作时,RST脚持续两个机器周期高电平将使单片机复位。看门狗计时完成后,RST 脚输出96 个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO 位可以使此功能无效。在DISRTO 默认状态下,复位高电平有效。
ALE/PROG:地址锁存控制信号(ALE)在访问外部程序存储器时,锁存低8 位地址的输出脉冲。在Flash编程时,此引脚(PROG)也用做编程输入脉冲。在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE 脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0 位置“1”,ALE 操作将无效。这一位置“1”,ALE 仅在执行MOVX 或MOVC指令时有效。否则,ALE 将被微弱拉高。这个ALE 使能标志位(地址为8EH的SFR的第0 位)的设置对微控制器处于外部执行模式下无效。
PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当AT89S52从外部程序存储器执行外部代码时,PSEN 在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。
EA/VPP:访问外部程序存储器控制信号。为使能从0000H 到FFFFH 的外部程序存储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接VCC。在Flash编程期间,EA也接收12伏VPP电压。
XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:振荡器反相放大器的输出端。

主程序流程图如下图所示:

图3.2 主程序流程图

3.2主程序代码设计
根据流程图,设计主程序代码如下:
首先是主函数,主函数比较简单,仅需判断按键k1或者k2是否按下,来判断对应的上升还是下降的状态。
void main()
{
                 init();
                 while(1)  
                {
                   if(k1==0)      //按下K1键,启动定时器,进入子函数up中
                  {
                      TR0=1;   
                       h=1;
                   }
                   if(h==1)
                   {
up();
}

                    if(k2==0)     //按下K2键,启动定时器,进入子函数down中
                   {
                       TR0=1;
                       h=0;
                    }
                     if(h==0)
                    {
down();
}
                 }
}
然后根据按键的结果进入对应的两个子函数up或者down中。
下面就是这两个子函数的程序:
  1. void up()  
  2. {               
  3.               W1=0;
  4.               P0= DIG4_CODE[i];    //给右边的数码管附上相应的数字
  5.               delay(1);
  6.               W1=1;
  7.               W2=0;
  8.               P0= DIG1_CODE [0];   //给左边的数码管附上相应上升的标记。
  9.               delay(1);
  10.               W2=1;
  11.               if(i==7)               //上升到第八层的时候,停止定时器
  12.               {TR0=0;}
  13.               j=i+1;
  14. }


  15. void down()
  16. {
  17.               W1=0;
  18.               P0= DIG4_CODE [j-1];    //给右边的数码管附上相应的数字
  19.               delay(1);
  20.               W1=1;
  21.               W2=0;
  22.               P0= DIG1_CODE [1];     //给左边的数码管附上相应下降的标记
  23.               delay(1);
  24.               W2=1;
  25.               if(j==1)                 //下降到第一层的时候,停止定时器
  26.               {TR0=0;}
  27.               i=j-1;
  28. }
复制代码
第三部分就是定时器所相对应的函数。
程序如下:
  1. void time0()interrupt 1        
  2. {
  3.               TH0=(65535-50000)/256;
  4.               TL0=(65535-50000)%256;
  5.               num++;         
  6.               if(num==40)              //计算一次5ms,40次恰好2S
  7.               {
  8.      num=0;
  9.               j--;
  10.               if(j==0)
  11.               {
  12. j=8;
  13. }
  14.                               
  15.      i++;
  16.      if(i==8)               
  17.               {
  18.                 i=0;
  19.                 }
  20.               }            
  21. }
复制代码

3.3功能测试
经过测试发现完成了方案一所要完成的功能。
    可以在由一楼上升到八楼过程中,按下下降按键则可以改变上升状态变为下降状态。然后在八楼到一楼的下降过程中,按下上升按键则可以改变下降状态为上升状态。在任意楼层按下上升或者下降按键,都可以产生相应的上升或者下降的状态。
这说明此次的实验比较成功,因为程序比较简单,使用的功能也比较简单让我比较容易的完成了该实验。
图3.3 测试实物图


图3.4 测试实物图

总结
经过调试之后,使用单片机来模拟电梯的运行过程的是可行的,但是由于我选用的是方案一,模型比较简单,功能也较为单一。仅能上下升降而不可以选择任意的楼层停止。
改进的话就应该如同方案二一样,设计多个按键就可以对不同楼层进行操作。但是由于自身水平有限,对于该段操作流程理解的逻辑流程还是有点些乱,编写的程序也无法使用,所以在接下来的学习中,应该根据自身的对于单片机掌握的情况对单片机进行一些有针对性的学习。因为51单片机确实比较基础,仅有8位IO口,比较容易掌握。难的是自己的逻辑思维能力和C语言应用能力,能讲模型转化为程序编辑出来。在参考资料的过程中,有很多想法也设计了很多程序但是这些程序都有着很多的缺陷仅能完成自己想做的部分功能。
还有需要改进的地方就是编写的时候很多可以用宏定义定义的常数都没有用宏定义去定义参数。
总的来说,这段时间对于程序的编写和对于方案的设计有一定程度的提升自身的水平。
附录2  原理图

单片机源码:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit W1=P1^0;       //对两个数码管进行位选
  5. sbit W2=P1^7;
  6. sbit k1=P3^2;       //对两个按键进行位选
  7. sbit k2=P3^3;
  8. uchar i,j,a,b,n,k,ge,temp1;
  9. uchar code DIG4_CODE[]={0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80}; //定义楼层数
  10. uchar code DIG1_CODE[]={0x89, 0xc7};                     //定义上升或下降的符号
  11. void delay(uchar z);
  12. void up();
  13. void down();
  14. void init()        //给定时器赋初值
  15. {
  16. i=0;
  17.               j=8;
  18.               b=0;
  19.               TMOD=0x01;
  20.               TH0=(65535-50000)/256;
  21.               TL0=(65535-50000)%256;
  22.               ET0=1;
  23.               EA=1;
  24.               TR0=0;
  25. }

  26. void main()
  27. {
  28.               init();
  29.               while(1)
  30.               {
  31.                  if(k1==0)  //按下K1键,启动定时器,进入子函数up中
  32.                 {
  33.                      TR0=1;
  34.                       h=1;
  35.                 }
  36.                  if(h==1)
  37.                      up();
  38.                   if(k2==0)    //按下K2键,启动定时器,进入子函数down中
  39.                  {
  40.                      TR0=1;
  41.                      h=0;
  42.                  }
  43.                    if(h==0)
  44.                       down();
  45.                  }
  46. }
  47. void up()          //两个数码管不同时点亮,才可以让数码管显示的数不同   
  48. {               
  49.               W1=0;
  50.               P0= DIG4_CODE[i];
  51.               delay(1);
  52.               W1=1;
  53.               W2=0;
  54.               P0= DIG1_CODE[0];
  55.               delay(1);
  56.               W2=1;
  57.               if(i==7)
  58.               {TR0=0;}
  59.               j=i+1;
  60. }

  61. void down()
  62. {
  63.               W1=0;
  64.               P0=DIG4_CODE [j-1];
  65.               delay(1);
  66.               W1=1;
  67.               W2=0;
  68.               P0=DIG1_CODE [1];
  69.               delay(1);
  70.               W2=1;
  71.               if(j==1)
  72.               {TR0=0;}
  73.               i=j-1;
  74. }
  75. void delay(uint z)
  76. {
  77.               uint x,y;
  78.               for(x=z;x>0;x--)
  79.               for(y=125;y>0;y--);
  80. }
  81. void time0()interrupt 1
  82. {
  83.               TH0=(65535-50000)/256;
  84.               TL0=(65535-50000)%256;  //计算一次5ms,40次恰好2S
  85.               n++;
  86.               if(n==40)
  87.         {
  88.        n=0;
  89.                  j--;
  90.                   if(j==0)
  91.                    j=8;
  92.                             i++;
  93.        if(i==8)               //数码管运行8次,i自动清零
  94.                     i=0;
  95.                  }            
  96. }
复制代码

完整的Word格式文档51黑下载地址:
正文.doc (838.5 KB, 下载次数: 99)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

楼主
ID:716685 发表于 2020-5-8 16:52 | 只看该作者
非常有用谢谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表