基于51单片机的模拟电梯控制系统

利用51单片机模拟5层电梯控制系统,还原真实生活场景。当某层被按下呼梯按键(电梯厢外)时,电梯将运行到该楼层,同时步进电机模拟电梯运转,液晶显示屏实时显示楼层数及电梯运行方向,到达该楼层时电机停止,电梯开门,乘客进入电梯后按下目的楼层按键,电梯运行至目的楼层。同时设有消防呼叫功能,且在所有呼叫中,消防优先级最高,当消防呼叫按键被按下时,电梯就近平层停车,不再响应任何外呼叫信号。

一、系统功能

  • 矩阵键盘模拟电梯内外按键。其中8个按键为电梯厢外按键,作为电梯呼叫信号,分别为“1楼上、2楼上、3楼上、4楼上、2楼下、3楼下、4楼下、5楼下”。其中5个按键为电梯厢内目的楼层按键。1个按键为报警功能。
  • LCD1602液晶显示屏实时显示当前楼层以及电梯运行方向“up/down”。
  • 28BYJ48步进电机模拟电梯运转,电梯上行为正转,电梯下行为反转。
  • 外部中断系统(外部中断1)触发消防呼叫,且在所有呼叫中,消防优先级最高,当消防呼叫按键被按下时,电梯就近平层停车,电梯开门,乘客出来,并不再响应任何外呼叫信号。(显示out)
  • 红外遥控功能 :可以利用遥控器模拟矩阵键盘所有按键。(仅拓展供娱乐QWQ)
  • 报警功能,电梯紧急停止,其他所有按键失效。

二、硬件电路原理图

结构框图如下:

电路图如下:

三、C语言实现

  • 流程图

    主要逻辑:
void main()
{  Speed = 20;LCD1602_Init();  LCD1602_DisplayOneCharOnAddr(0,0,floor[lc-1]);  //显示初始楼层init();  //构造函数,初始化while(1){keyscan();zhishideng();if(flag==0)  //电梯静止时{LCD1602_MoveToPosition(1,0);   //显示位置移动到指定位置(第二行)LCD1602_DisplayString(jz);  //显示静止shang[lc]=0;xia[lc]=0;nei[lc]=0;      //按键初始化n=lc ;for(i=n+1;i<=5;i++)// 上行{keyscan();zhishideng();if(shang[i]==1||xia[i]==1||nei[i]==1){flag=1;break;  }  }for(i=n-1;i>=1;i--)// 下行{keyscan();zhishideng();if(shang[i]==1||xia[i]==1||nei[i]==1){flag=2;  break;}}}if(flag==1){  keyscan();zhishideng();LCD1602_MoveToPosition(1,0);    //显示位置移动到指定位置(第二行)LCD1602_DisplayString(up);  //显示上升UPUP();//步进电机正转delay(200);lc++;LCD1602_DisplayOneCharOnAddr(0,0,floor[lc-1]);  //显示楼层if(shang[lc]==1||nei[lc]==1){    //上升一层后再次判断shang[lc]=0;nei[lc]=0;zhishideng();LCD1602_MoveToPosition(1,0);  //显示位置移动到指定位置(第二行)LCD1602_DisplayString(jz);  //显示静止delay(200);                    }if(xf == 1){LCD1602_MoveToPosition(1,0);    //显示位置移动到指定位置(第二行)LCD1602_DisplayString(xiaofang);    //显示outwhile(1);}flag=0;n=lc ;for(i=n+1;i<=5;i++){keyscan();zhishideng();if(shang[i]==1||xia[i]==1||nei[i]==1){flag=1;break;}}if(flag==0||lc>=5){n=lc ;if(shang[n]==0&&nei[n]==0){LCD1602_MoveToPosition(1,0);  //显示位置移动到指定位置(第二行)LCD1602_DisplayString(jz);  //显示静止}xia[n]=0;for(i=n-1;i>=1;i--){keyscan();zhishideng();if(shang[i]==1||xia[i]==1||nei[i]==1){flag=2;  break;}}}  }if(flag==2){keyscan();zhishideng();LCD1602_MoveToPosition(1,0);    //显示位置移动到指定位置(第二行)LCD1602_DisplayString(down);    //显示下降DOWNDOWN();//步进电机反转delay(200);lc--;LCD1602_DisplayOneCharOnAddr(0,0,floor[lc-1]);  //显示楼层if(xia[lc]==1||nei[lc]==1){xia[lc]=0;nei[lc]=0;zhishideng();LCD1602_MoveToPosition(1,0);   //显示位置移动到指定位置(第二行)LCD1602_DisplayString(jz);  //显示静止delay(200);}if(xf == 1){LCD1602_MoveToPosition(1,0);    //显示位置移动到指定位置(第二行)LCD1602_DisplayString(xiaofang);    //显示静止while(1);}flag=0;n=lc;for(i=n-1;i>=1;i--){keyscan();zhishideng();if(shang[i]==1||xia[i]==1||nei[i]==1){flag=2;break;}}                if(flag==0||lc<=1){n=lc ;if(xia[n]==0&&nei[n]==0){LCD1602_MoveToPosition(1,0); //显示位置移动到指定位置(第二行)LCD1602_DisplayString(jz);  //显示静止}shang[n]=0;for(i=n+1;i<=5;i++){keyscan();zhishideng();if(shang[i]==1||xia[i]==1||nei[i]==1){flag=1;  break;}}}    }   }
}

键盘扫描函数:

void keyscan()
{num=0;P1=0xfe; //11111110temp=P1;temp=temp&0xf0; //11110000while(temp!=0xf0)  //有键被按下{delay(5);temp=P1;temp=temp&0xf0;  //11110000while(temp!=0xf0){temp=P1;switch(temp){case 0xee:num=1;    //11101110    第一行第一个按键break;case 0xde:num=2;    //11011110   第一行第二个按键break;case 0xbe:num=3;    //10111110   第一行第三个按键break;case 0x7e:num=4;   //01111110    第一行第四个按键break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xfd;  //11111101temp=P1;temp=temp&0xf0;while(temp!=0xf0)      //11110000{delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xed:num=5; //11101101  二行第一个break;case 0xdd:num=6;  //11011101  二行第二个break;case 0xbd:num=7;  //10111101    二行第三个break;case 0x7d:num=8;  //01111101  二行第四个break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xeb:num=9;      //三行一break;                case 0xdb:num=10;       // 三行二break;case 0xbb:num=11;      // 三行三break;case 0x7b:num=12;      //三行四break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xe7:num=13;   // 四行一break;case 0xd7:num=14;   //四行二break;case 0xb7:num=15;   //四行三break;case 0x77:num=16;   //四行四break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}//红外遥控功能if(irok)                        //如果接收好了进行红外处理{   Ircordpro();irok=0;}if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{Ir_work();}switch(num){case 1:shang[1]=1;break;case 2:shang[2]=1;break;case 3:shang[3]=1;break;case 4:shang[4]=1;break;case 5:xia[2]=1;break;case 6:xia[3]=1;break;case 7:xia[4]=1;break;case 8:xia[5]=1;break;case 9:nei[1]=1;break;case 10:nei[2]=1;break;case 11:nei[3]=1;break;case 12:nei[4]=1;break;case 13:nei[5]=1;break;case 14:break;case 15:break;case 16:alarm1=0;alarm2=1;while(1);break;}
}

变量声明:

unsigned char code floor[]="12345";  //楼层字符用于液晶屏显示
unsigned char code up[]="up  ";        //显示上升"up"
unsigned char code down[]="down";    //显示下降"down"
unsigned char code jz[]="    ";    //到达目的楼层后清除up/down
unsigned char code xiaofang[]="out ";    //消防呼叫显示
unsigned char Speed;//步进电机速度变量uint xf=0;
uint shang[6]={0,0,0,0,0,0};
uint xia[6]={0,0,0,0,0,0};
uint nei[6]={0,0,0,0,0,0};
uint num,temp,flag=0,lc=1,i,n;    //i,n是层数

电梯上升函数:

void UPUP(void)
{unsigned int i = 128;while(i--){Coil_A1       delay(Speed);Coil_AB1                 //遇到Coil_AB1  用{A1=1;B1=1;C1=0;D1=0;}代替delay(Speed);            //改变这个参数可以调整电机转速        Coil_B1                  //数字越小,转速越大,力矩越小delay(Speed);Coil_BC1delay(Speed);Coil_C1       delay(Speed);Coil_CD1delay(Speed);Coil_D1       delay(Speed);Coil_DA1delay(Speed);Coil_OFF}
}

电梯下降函数类似……

四、结果

下降中:

按下消防按键:

欢迎大佬提出优化方案!
如有错漏之处,敬请指正,不吝赐教。

51单片机课设——模拟电梯控制系统相关推荐

  1. imut 51单片机课设 模拟室内温度检测器 *秋昊

    写在前面的话: 本文主要讲述了一下IMUT的单片机课设报告. 下面的百度云链接中包括了:ICL7109手册,ICL7109自检_标度转换(excel),课设报告(word版),演示视频,程序源码. 链 ...

  2. 51单片机课设代做_微波炉控制系统设计

    微波炉控制系统设计 一.设计要求 选用温度传感器.按键.LED灯和蜂鸣器等,采用MCS-51系列单片机实现温度的设置.显示和报警. (1)可通过按键设置三种最高温度值,如低温(20°),中温(30°) ...

  3. 【51单片机练习3——智能电梯控制系统1】

    任务需求 2019年安徽省机器人大赛单片机与嵌入式系统应用技能竞赛试题 设计并制作智能电梯控制系统,开机后屏幕第一行显示"ZNDTKZQ",第二行显示四位数字,并自下而上滚动,3秒 ...

  4. 【51单片机练习3——智能电梯控制系统2】

    书接上回,我们完成了步进电机和按键扫描的组合,接下来就是要实现智能电梯控制系统的各相任务需求了. 为了方便阅读,硬件介绍和软硬件原理图我再Ctrl C V一下(并没有水字数). 任务需求 2019年安 ...

  5. 51单片机课设项目大全

    1-基于51单片机的音乐彩灯 2-基于51单片机的蓝牙智能台灯设计 3-基于51单片机的篮球计分器 4-基于51单片机的无线病床呼叫系统设计 5-基于51单片机的语音实时采集系统 6-基于51单片机的 ...

  6. 电梯程序c语言51单片机,基于51单片机的六层电梯控制系统c语言程序.pdf

    #include #define MAXFLOOR 6 //定义一个最大层数为6 层的电梯 unsigned char code LEDCODES[]={0x3f,0x06,0x5b,0x4f,0x6 ...

  7. 单片机课设基于51单片机的波形发生器(公开资源)(四种波形)(同时输出两种波形)

    单片机课设-波形发生器 前言 一.课设任务是什么? 二.如何解决这几个任务? 三.仿真原理图 四.代码 4.1 LCD1602代码 4.2 波形输出以及8*8点阵显示代码 4.3 波形选择 五.仿真源 ...

  8. 基于51单片机的全自动智能洗衣机控制系统Proteus仿真(仿真+源码+全套资料)

     资料编号:108 设计功能: 1.对水温实时显示 2.显示滚筒转速 3.显示运行倒计时 4.能通过按钮分别设置洗涤时间和脱水时间 5.运行过程为:加热--洗涤--脱水 具体功能请看下方演示视频 10 ...

  9. T155基于51单片机手机按键模拟拨号Proteus设计、keil程序、c语言、源码

    资料下载请点击:51mcu.top 使用51单片机设计一个模拟手机拨号的Proteus设计: 1.使用3*4矩阵按键模拟手机按键作为输入: 2.通过LCD1602显示输入的按键数值;

最新文章

  1. Linux系统调用FAQ
  2. Lambda省略格式Lambda使用前提
  3. 小谈@override
  4. 【计算机网络复习】1.2.2 OSI参考模型
  5. 从用户的角度看 c语言中函数有两种,【南开大学】20秋学期(1709、1803、1809、1903、1909、2003、2009 )《C语言程序设计》在线作业答卷...
  6. 一图流“系列——Ruby vSphere Console命令脑图
  7. 深观察|区块链不是洪水猛兽,但要警惕以区块链之名圈钱
  8. 大数据元数据管理系统功能有哪些
  9. 融合阿里云,牛客助您找到心仪好工作
  10. axure网页预览_解决Axure发布分享预览的3个方法
  11. MATLAB软件安装教程
  12. 微软雅黑字体,百度云下载
  13. 趋势追踪交易课堂:复盘的意义和方法
  14. 【独行秀才】macOS Monterey 12.1正式版(21C52)原版镜像
  15. elasticsearch的基础使用(二)
  16. 访问者模式(JAVA)
  17. brew安装时fatal: not in a git directory Error: Command failed with exit 128: git
  18. 电大计算机西方经济学考试题库,2011电大西方经济学网上作业1.2.3全部答案
  19. zynq自定义PL IP核linux驱动开发流程
  20. python编译py文件为pyc文件

热门文章

  1. RSA非对称加密(以Android和java为例)
  2. C语言读取磁盘分区信息(MBR、DPT、EBR)
  3. 《塔木德智慧全书》摘要(之二)
  4. Swift常用基础知识(二)
  5. ubuntu 8.04 配置okl4编译环境
  6. 小春日记 - 基金初识
  7. (Java毕业设计)大学生租房系统(基于java+springboot)
  8. 职业生涯设计与面试培训
  9. ITK入门教程(15)向量作为像素类型
  10. 2O19 江大计算机有调剂,江南大学2019考研调剂公告