目录
引言…………………………………………………………… - 3 -
单片机电梯智能控制系统课程设计
摘 要
现代电梯主要由曳引机(绞车)、导轨、对重装置、安全装置(如限速器、安全钳和缓冲器等)、信号操纵系统、轿厢与厅门等组成。这些部分分别安装在建筑物的井道和机房中。通常采用钢丝绳摩擦传动,钢丝绳绕过曳引轮,两端分别连接轿厢和平衡重,电动机驱动曳引轮使轿厢升降。电梯要求安全可靠、输送效率高、平层准确和乘坐舒适等。电梯的基本参数主要有额定载重量、可乘人数、额定速度、轿厢外廓尺寸和井道型式等。简单使用方法(紧急情况下面有解决方法)
载人电梯都是微机控制的智能化、自动化设备,不需要专门的人员来操作 电梯电梯结构图 电梯内部结构图驾驶,普通乘客只要按下列程序乘坐和操作电梯即可。在乘梯楼层电梯入口处,根据自己上行或下行的需要,按上方向或下方向箭头按钮,只要按钮上的灯亮,就说明你的呼叫已被记录,只要等待电梯到来即可。
引言
电梯是标志现代物质文明的垂直运输工具、是机电一体化的复杂运输设备。它涉及电子技术、机械工程、电力电子技术、微电脑技术、电力拖动系统和土建工程等多个科学领域。本文旨在使用单片机上的数码管模拟电梯的运行过程对提高学生的综合应用程序设计能力也将是非常有益和非常有效的,并且需要使用动态扫描的方法来实现这一模拟过程,独立进行单片机应用技术开发工作,掌握单片机程序设计、调试,应用电路设计、分析及调试检测。本文的核心在于:熟练使用单片机,并且要基于keil平台编写程序;最后要使用单片机来实现电梯控制功能。
MCS-51单片机是Intel公司在1980年继MCS-48系列8位单片机之后推出的高档8位单片机。MCS-51单片机在性能和片内功能方面大大优于MCS-48系列单片机。
MCS-51的典型产品有:8051、8031、8751、80C51、80C31、87C51等,8051内部有4kB ROM,8751内部有4kB EPROM,8031片内无ROM。除此之外,三者的内部结构及引脚完全相同。
89S51是一种低功耗、高性能CMOS8位微控制器,具有4K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,AT89S51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
单片机是应工业测控需要而产生的,最能反映其功能及形态的名称是在一个应用系统中,Single-chip Micro-controller。按照测控系统的特点和要求,单片机的应用可分为单机应用和多机应用两大类。我们这次要完成的单片机课程设计就是它的单机应用,下面在介绍一下单片机在单机应用领域内的主要内容。
(1)智能产品
单片机与传统机械产品相结合,使传统机械产品结构简化,控制智能化,购成新一代机电一体化产品。目前,利用单片机构成的智能产品已广泛应用于家用电器、办公设备、数控机床、纺织机械、工业设备等行业。
(2)智能仪表
目前,各种传感器、变送器、控制仪表已普遍采用单片机应用系统。它集测量、处理、控制功能于一体,具有各种智能化功能,如存储、数据处理、查找、判断、联网和语音等功能。
单片机构成的智能仪表,能使仪表具有数字化、智能化、多功能化、综合化、柔性化等优点,赋予测量仪表以崭新的面貌,使传统的仪器、仪表发生根本性的变革,它代表了仪器仪表的发展趋势。
(3)测控技术
用单片机构成的各种工业控制系统中的数据采集系统具有工作稳定可靠、抗干扰能力强的优点,如炉温恒温控制系统、电镀生产自动控制系统等。
(4)智能接口
在计算机系统,特别是较大型的工业测控系统中,除通用外部设备外,还由许多外部通信、采集、多路分配管理、驱动控制等接口。这些外部设备与接口如果完全由主机进行管理,势必会造成主机负担过重,运行速度降低,接口的管理水平也不可能提高。如果用单片机进行接口的控制与管理,单片机与主机可并行加工处理,可以大量降低接口的通信密度,极大的提高了接口控制管理水平。在一些通用计算机外部设备上,已实现了单片机的键盘管理、打印机控制、绘图仪控制、硬盘驱动控制等。
1)实现电梯的智能控制,到达楼层后亮灯,电梯门关闭时响起警报
2)没人时电梯实现休眠节省电力
为了更有效的进行电梯控制,现在使用最左边的数码管表示电梯上升和下降状态,使用另外一个一个数码管表示电梯此时所在的楼层,使用按键来控制电梯上升或者下降的状态。在每层楼之后需要进行判断上升或者下降。如果是在上升过程中,应先判断是否继续上升,然后在判断是否下降。如果是在下降过程中,应先判断是否继续下降,在判断是否上升。在上升改变为下降状态时,或者下降改变为上升状态时。数码管的状态应该相应改变
2.3按键系统设计
运用单片机的按键模拟电梯的楼层按键系统,可以在由一楼上升到八楼过程中,按下下降按键则可以改变上升状态变为下降状态。然后在八楼到一楼的下降过程中,按下上升按键则可以改变下降状态为上升状态。在任意楼层按下上升或者下降按键,都可以产生相应的上升或者下降的状态,如下图所示
2.4电梯所在楼层显示系统
运用8x8点阵数码管来模拟电梯的所在的楼层的显示和升降效果,8x8点阵数码管如下图所示
2.5电梯的显示灯和警报系统
运用延迟函数来实现到达层楼后接通P3.7接口来实现电梯的显示灯和警报,如下图所示
一个完整的电梯控制系统相当于一个简单的单片机系统,该系统是首判断有无按键按下,有按键按下后判断所在按键的楼层然后对按键的所在的楼层与电梯的所在的楼层作比较,然后判断电梯的升降问题,然后运用延时函数来延时电梯门开启的时间和电梯显示灯的时间,如果没有按键按下,电梯则不动处于原来的楼层,从而实现节省电力的效果。
3.3 电梯智能控制系统的设计程序说明
这部分中定义了一些全局变量的数组和变量以及位标志,只是些定义的东西不需要画流程图了。这部分程序如下:
判断按键有无按键按下:
unsigned int keyscan(void)//扫描功能:键盘扫描
{
if(P1 != 0xff)
{
switch(P1)
{
case 0x7f:{return(8);break;}
case 0xbf:{return(7);break;}
case 0xdf:{return(6);break;}
case 0xef:{return(5);break;}
case 0xf7:{return(4);break;}
case 0xfb:{return(3);break;}
case 0xfd:{return(2);break;}
case 0xfe:{return(1);break;}
default:return(0);
}
}
}
判断按键没按下的时候处于等待的状态:
void show(unsigned int i)//函数功能:电梯静止,并等待键盘
{
uint k;
while(P1 != 0xff);
while(P1 == 0xff)
{
for(k = 0;k < 8;k++)
{
P0 = scan[k];
P2 = zm[(i * 8 + k)];
delay(1);
}
}
}
用延时函数来延长电梯的开门的时间:
void delay(uint t)//延时函数
{
uchar a;
while(t--)
for(a = 0;a < 122;a++);
}
Proteus软件用于系统的仿真,编译软件采用keil UV3。程序的仿真用英国的labcenter公司的Protens V7.13。其果如下:加电后的结果如图此时电梯初始位置在0层
4.3 电梯下降到1楼的切换仿真
第五章 心得体会
经过调试之后,使用单片机来模拟电梯的运行过程的是可行的,但是由于我选用的是方案一,模型比较简单,功能也较为单一。仅能上下升降而不可以选择任意的楼层停止。
改进的话就应该如同方案二一样,设计多个按键就可以对不同楼层进行操作。但是由于自身水平有限,对于该段操作流程理解的逻辑流程还是有点些乱,编写的程序也无法使用,所以在接下来的学习中,应该根据自身的对于单片机掌握的情况对单片机进行一些有针对性的学习。因为51单片机确实比较基础,仅有8位IO口,比较容易掌握。难的是自己的逻辑思维能力和C语言应用能力,能讲模型转化为程序编辑出来。在参考资料的过程中,有很多想法也设计了很多程序但是这些程序都有着很多的缺陷仅能完成自己想做的部分功能。
还有需要改进的地方就是编写的时候很多可以用宏定义定义的常数都没有用宏定义去定义参数。
总的来说,这段时间对于程序的编写和对于方案的设计有一定程度的提升自身的水平。
[1]余发山.单片机原理及应用技术.中国矿业大学.2002
[2]李朝青.单片机原理及接口技术(修订版).北京:北京航空航天大学出版社,1998
[3]李广弟.单片机基础.北京:北京航空航天大学出版社,1992
附录1
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit p36 = P3^6;//p36接通P3.6接口
sbit p37 = P3^7; //p37接通P3.7接口
void delay(uint t);//定义全局变量
uint terminal;
uint outset = 0;
uint flag = 0;
uint flag1 = 0;
uint flag2 = 0;
uchar code scan[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//扫描代码
//以下为显示"0,1,2,3,4,5,6,7,8"的8x8点阵代码
uchar code zm[] = {
0x00,0x18,0x24,0x24,0x24,0x24,0x18,0x00,0x00,0x10,0x1c,0x10,0x10,0x10,0x3c,0x00,0x00,0x38,0x44,
0x40,0x20,0x10,0x7c,0x00,0x00,0x38,0x44,0x30,0x40,0x44,0x38,0x00,0x00,0x20,0x30,0x28,0x24,0x7e,
0x20,0x00,0x00,0x7c,0x04,0x3c,0x40,0x40,0x3c,0x00,0x00,0x38,0x44,0x3c,0x44,0x44,0x38,0x00,0x00,
0x7e,0x40,0x40,0x20,0x10,0x10,0x00,0x00,0x38,0x44,0x38,0x44,0x44,0x38,0x00};
//以下函数功能:提示楼层到,蜂鸣器发声及LED闪亮
void soundandled(uint j)
{
uint i,k;
P0 = 0xff;
P2 = 0xff;
for(i = 0;i < 20;i++)
{
p36 = 0;
delay(10);
p36 = 1;
for(k = 0;k < 8;k++)
{
P0 = scan[k];
P2 = zm[j * 8 + k];
p37 = 1;
delay(5);
p37 = 0;
}
}
}
unsigned int keyscan(void)//扫描功能:键盘扫描
{
if(P1 != 0xff)
{
switch(P1)
{
case 0x7f:{return(8);break;}
case 0xbf:{return(7);break;}
case 0xdf:{return(6);break;}
case 0xef:{return(5);break;}
case 0xf7:{return(4);break;}
case 0xfb:{return(3);break;}
case 0xfd:{return(2);break;}
case 0xfe:{return(1);break;}
default:return(0);
}
}
}
void downmove(uint m,uint n)//函数功能:电梯下行
{
uint k,j,i;
for(k = m * 8;k > n * 8;k--)
{
for(j = 0;j < 30;j++)
{
for(i = 7;(i >= 0) && (i < 8);i--)
{
if(P1!= 0xff)
{
outset = keyscan();
if((outset > n)&&(outset < m))
{
flag1 = outset;
outset = n;
n = flag1;
terminal = n;
}while(P1 != 0xff);
}//在最里面循环中加判别,可增加按键灵敏度,如果不加则只能运行完所有循环才能进入下一步
P0 = scan[i];
P2 = zm[(i + k) % 72];
delay(1);
}
}
}
}
//以下函数功能:电梯上行
void upmove(unsigned int m,unsigned int n)
{
uint i,j,k;
for(k = m * 8;k < n * 8;k++)
{
for(j = 0;j < 30;j++)
{
for(i = 0;i < 8;i++)
{
if(P1 != 0xff)
{
outset = keyscan();
if((outset > m)&&(outset < n))
{
flag1 = outset;
outset = n;
n = flag1;
terminal = n;
}
while(P1 != 0xff);
}
P0 = scan[i];
P2 = zm[(i + k)%72];
delay(1);
}
}
}
}
void show(unsigned int i)//函数功能:电梯静止,并等待键盘
{
uint k;
while(P1 != 0xff);
while(P1 == 0xff)
{
for(k = 0;k < 8;k++)
{
P0 = scan[k];
P2 = zm[(i * 8 + k)];
delay(1);
}
}
}
void main()//主程序
{
p37 = 0;
P2 = 0xff;
P0 = 0x00;
while(1)
{
show(flag);//显示电梯初始位置,等待按键动作
terminal = keyscan();//获取键值
if(terminal > flag)
{upmove(flag,terminal);soundandled(terminal);}
//如果键值大于初始位置,电梯上行
if(terminal < flag)
{downmove(flag,terminal);soundandled(terminal);}
//如果键值大于初始位置,电梯下行
flag = terminal;
if(outset != 0)
{
if(outset > terminal)
{upmove(terminal,outset);soundandled(outset);}
if(terminal > outset)
{downmove(terminal,outset);soundandled(outset);}
flag = outset;
outset = 0;
}
}
}
void delay(uint t)//延时函数
{
uchar a;
while(t--)
for(a = 0;a < 122;a++);
}
附录2