当前位置:文档之家› 基于C51单片机的三层电梯控制

基于C51单片机的三层电梯控制

一.课程设计题目基于51单片机的三层电梯控制二.课程设计的目的1学习P口的使用方法2掌握如何利用单片机控制LED动态显示3掌握动态扫描显示的基本原理,动态显示的控制电路及控制程序4掌握微机控制系统的键盘组成及工作原理5认识微机控制系统的键盘设计,了解单片机键盘的特点和应用三.设计要求设计一个自动电梯模拟升降控制系统,通过乘客的自行按键达到电梯的升降功能。

结合硬件与软件对应。

端口P0.0-0.6用来控制LED灯的亮与灭,其中从低位到高位分别为一层灯,二层灯,三层灯(前述三个信号为电梯请求信号,乘客在电梯部方可置为有效),一层上灯,二层上灯,二层下灯,三层下灯(上述四个信号为电梯外部信号,乘客在电梯外部方可置为有效)P2口与键盘对应连接,数码管采用串行输入方式,键盘从低位到高位分别为一层按键,二层按键,三层按键,一层上升按键,二层上升按键,二层下降按键,三层下降按键.P1.0与数码管的时钟输入端相连,P1.1与数码管的串行口相连,用来显示电梯的上升下降和当前所在楼层,电梯门是否开启三种状态,p表示上升,d表示下降,1,2,3表示当前楼层,如果数码管闪烁,表示电梯门开启,反之则关断。

四.控制系统的总体设计方案微型计算机的出现使计算机在逻辑处理和工业控制等方面的非凡能力得到了更好的体现。

尤其是其非凡的嵌入能力对于满足嵌入式应用需求具有独特的优势。

随着城市建设的不断发展,楼群建筑不断增多,电梯在当今社会的生活中有着广泛的应用。

电梯作为楼群建筑中垂直运行的交通工具已与人们的日常生活密不可分。

实际上电梯是根据外部呼叫信号(呼梯信号)以及自身控制规律等运行的,而呼叫是随机的,电梯实际上是一个人机交互式的控制系统,单纯用顺序控制或逻辑控制是不能满足控制要求的,因此,大部分电梯控制系统都采用随机逻辑方式控制。

在目前广泛使用的电梯控制系统中,绝大多数为继电器控制型,所有的逻辑及控制关系完全由诸多继电器互相配合来完成,该控制系统的缺点是:(1)随着楼层的增高,使用继电器的数量越来越多,造价和体积也越来越大;(2)继电器这种触点式的电控元器件不宜长时间频繁工作,因而采用在电梯系统当中常发生触电表面烧结、控制失灵的故障。

因此我们设计一个3层自动电梯模拟升降控制系统,通过乘客的自行按键达到升降功能。

采用单片机作为控制核心进行仿真。

本次设计是应用AT89C51芯片进行设计制作的模拟电梯控制系统,通过乘客的按键达到对电梯升降的控制,并且模拟电梯的运行状态。

在设计方案中,通过对各个P口的合理安排和统一协调,通过按键、和LED 数码管来实现对设计设计方案的仿真演示。

另外在实验程序过对不同按键键码在功能上的分配,在按键按下之后使CPU做相应的工作,即LED数码管显示与之相应的楼层和使彩灯显示相应的电梯状态。

最后,结合PCB板的实际接线情况进行编程。

使实验顺利仿真。

五.控制系统的硬件系统设计5.1.AT89C51单片机介绍微型计算机系统的硬件部分通常由五部分组成:中央处理器CPU、数据存储器RAM、程序存储器ROM、定时/计数器、I/O接口。

MCS-51单片机部的总体硬件结构:1、中央处理单元CPU(8位)用于数据处理、位操作(位测试、置位、复位)。

2、只读存储器ROM(4KB或8KB)用于永久性存储应用程序,掩膜ROM、EPROM、EEPROM。

3、随机存取存取器RAM(128B 或256B)用于程序运行中存储工作变量和数据。

4、并行输入/输出口I / O(32线)4个8位并行I/O口P0、P1、P2、P3口用作系统总线、扩展外存、I / O接口芯片。

5、串行输入/输出口UART (二线)1个全双工的异步串行口;用于串行通信。

6、定时/计数器T(16位增量可编程)2 个或三个16位定时器/计数器;它与CPU之间各自独立工作,当它计数满时向CPU中断。

7、时钟电路fosc振荡频率fosc在1.2~12Mhz;分为部振荡器、外接振荡电路。

8、中断系统5源中断、2个中断优先级;,可编程进行控制。

5.2.硬件系统原理框图#include<reg51.h>void Zero();void Delay_ms(unsigned int Time);void Display(unsigned int n,unsigned char a);void Flash(unsigned int Time);void KBScan();void dl_ms();void Destination();void Up();void Down();unsigned char code TAB[3][8]={{0,0,0,0,0,1,1,0},{0,1,0,1,1,0,1,1},{0,1,0,0,1,1,1,1}};/*楼层数码管显示矩阵*///P2与查询式键盘硬件相连sbit P2_0=P2^0;sbit P2_1=P2^1;sbit P2_2=P2^2;sbit P2_3=P2^3;sbit P2_4=P2^4;sbit P2_5=P2^5;sbit P2_6=P2^6;sbit P2_7=P2^7;//P0与LED灯硬件相连sbit P0_0=P0^0;sbit P0_1=P0^1;sbit P0_2=P0^2;sbit P0_3=P0^3;sbit P0_4=P0^4;sbit P0_5=P0^5;sbit P0_6=P0^6;sbit P0_7=P0^7;sbit P1_0 = P1^0; /*用于产生时钟信号*/sbit P1_1 = P1^1; /*用于产生串行输入信号(显示or清零)*/unsigned int lift=1; /*电梯所在楼层*/unsigned int status=1; /*电梯上行为1,下行为0*/ unsigned char request[3]={0,0,0}; /*1~3楼有无请求,有请求为1*/ unsigned char dst=1; /*电梯的目的楼层*///清零程序void Zero(){unsigned char k;P1_1=0;P1_0=0;for(k=0;k<40;k++){dl_ms();P1_0=1;dl_ms();P1_0=0;}}//延时程序,以毫秒为单位,用软件计时,输入的参数void Delay_ms(unsigned int Time){unsigned int i=0,j=0;for(i=0;i<Time;++i){KBScan();for(j=0;j<125;++j);}}//显示某一楼层void Display(unsigned int n,unsigned char a){unsigned char k;unsigned char b[]={0,0,0,0,0,0,0,0};if(a==1){b[7]=1;b[6]=1;b[5]=0;b[4]=0;b[3]=1;b[2]=1;b[1]=1;b[0]=0; }else if(a==0){b[7]=0;b[6]=1;b[5]=1;b[4]=1;b[3]=1;b[2]=0;b[1]=1;b[0]=0; }Zero();P1_0=0;for(k=0;k<8;k++){KBScan();P1_1=b[k];dl_ms();P1_0=1;dl_ms();P1_0=0;}P1_0=0;for(k=0;k<8;k++){KBScan();P1_1=TAB[n-1][k];dl_ms();P1_0=1;dl_ms();P1_0=0;}}//闪烁显示到达楼层void Flash(unsigned int Time) {unsigned char i;for(i=0;i<Time;i++){Zero();Delay_ms(1000);KBScan();Display(lift,status);Delay_ms(1000);KBScan();}Zero();Delay_ms(1000);KBScan();}//查询式键盘扫描void KBScan(){if(P2!=0xff){dl_ms();if(P2!=0xff){switch(P2){case 0xfe: {P0_0=1;request[0]=1;break;} /*电梯请求1楼*/ case 0xfd: {P0_1=1;request[1]=1;break;} /*电梯请求2楼*/case 0xfb: {P0_2=1;request[2]=1;break;} /*电梯请求3楼*/case 0xf7: {P0_3=1;request[0]=1;break;} /*电梯外1楼请求向上*/ case 0xef: {P0_4=1;request[1]=1;break;} /*电梯外2楼请求向上*/ case 0xdf: {P0_5=1;request[1]=1;break;} /*电梯外2楼请求向下*/ case 0xbf: {P0_6=1;request[2]=1;break;} /*电梯3楼请求向下*/ default: {break;} /*错误请求*/}}}}//消抖延时void dl_ms(){unsigned char i;for(i=0;i<30;++i);}//获取目的楼层void Destination(){unsigned char j; //j循环控制变量KBScan(); //有键按下if(status==1) //若电梯向上走则从高楼层到低楼层扫描{ //以此达到判断优先级的目的for(j=3;j>=1;--j){if(request[j-1]==1){dst=j; //则将目的楼层设为该楼break; //并将其对应的request置1,然后跳出}}}else if(status==0) //若电梯向下走则从低楼层到高楼层扫描{ //以此达到判断优先级的目的for(j=1;j<=3;++j){if(request[j-1]==1){dst=j;break;}}}}//电梯向上走void Up(){status=1; //置1表示电梯向上走for(;lift<=dst;lift++) //电梯到达目的楼层之前往上走{Display(lift,1); //每到达一楼就显示该楼层数KBScan();Destination(); //读取点阵键盘if(request[lift-1]==1) //若请求到达的楼层在所在楼层和目的楼层之间则停下闪烁显示并将其对应的request清零{Delay_ms(3000);if(P0_5==1&&lift==2);else{request[lift-1]=0;}switch(lift){case 1:{P0_0=0;P0_3=0;break;}case 2:{P0_1=0;P0_4=0;break;}case 3:{P0_2=0;P0_6=0;break;}default:{break;}}Flash(3);Delay_ms(800);}else{Delay_ms(3000);}}lift--;}//电梯向下走void Down(){status=0; //置1表示电梯向上走for(;lift>=dst;lift--) //电梯到达目的楼层之前往上走{Display(lift,0); //每到达一楼就显示该楼层数KBScan();Destination(); //读取点阵键盘if(request[lift-1]==1) //若请求到达的楼层在所在楼层和目的楼层之间则停下闪烁显示并将其对应的request清零{Delay_ms(3000);if(P0_4==1&&lift==2);else{request[lift-1]=0;}switch(lift){case 1:{P0_0=0;P0_3=0;break;}case 2:{P0_1=0;P0_5=0;break;}case 3:{P0_2=0;P0_6=0;break;}default:{break;}}Flash(3);Delay_ms(800);}else{Delay_ms(3000);}}lift++;}void main(){P0=0;while(1) //电梯程序的循环{Display(lift,status);Destination(); //查询有无楼层请求到达if(dst>=lift) //请求的楼层比要到达的楼层高{Up(); //电梯向上走}else{Down(); //否则电梯向下走}}}七. 软硬件调试系统调试包括硬件调试和软件调试,而且两者是密不可分的。

相关主题