历史上的今天
今天是:2024年09月24日(星期二)
2020年09月24日 | 单片机电梯仿真控制源程序
2020-09-24 来源:51hei
1.图中绿灯为电梯上行指示灯、黄灯为下行指示灯、红灯为报警指示灯。2.电梯初始状态位于一楼,在一楼的用户可直接按下电梯内部按钮,按启动电梯开始运行。3.在任一层楼的用户,可以通过电梯外部的按钮请求电梯,电梯到达后通过内部按钮确定目标层。注意:启动按钮相当于关门,电梯内部的请求都要按启动后电梯才会运行。

单片机源程序如下
#include #include unsigned char ucMotorDrvPuls; //电机运转时初始值 unsigned char FORREV=1; //1表示上行,0表示下行 unsigned char STOPCUR=0;//1电梯停留在当前层,0不停留 unsigned char CURFLR=1; //当前所在楼层 unsigned char count=0; //累计到COUNT即表示运行过一层 #define UCTIMES 8 //设置电机转速 #define OUTPUT P2 //电机驱动信号口 #define COUNT 8 //电机每循环8次表示电梯经过一层楼 sbit UP1=P3^4; sbit DOWN2=P3^3; sbit UP2=P3^2; sbit DOWN3=P3^1; sbit UP3=P3^0; sbit DOWN4=P1^7; sbit FLOOR1=P1^0; sbit FLOOR2=P1^1; sbit FLOOR3=P1^2; sbit FLOOR4=P1^3; sbit START=P1^4; sbit STOP=P1^5; sbit ALARM=P1^6; //报警位 sbit alarmBit=P0^4; sbit upLight=P0^5; sbit downLight=P0^6; void time(unsigned int ucMs);//延时单位:ms void outPress();//按下电梯外按钮 unsigned char inPress();//按下电梯内楼层按钮 unsigned char elevator();//到达某一层返回1,否则返回0 void storeUP(unsigned char);//存储当前所有上行请求 void storeDOWN(unsigned char);//存储当前所有下行请求 //延时函数 void time(unsigned int ucMs); //初始化所有灯 void initLights(void); //设置当前楼层 void setFloor(int floor); //设置电梯向上运行灯 void setUpLight(); //设置电梯向下运行灯 void setDownLight(); //设置电梯停止运行灯 void setStopLight(); //设置电梯向上运行灯 void setAlarmLight(); //设置电梯报警灯和喇叭 void setAlarmLight(); //关闭电梯报警灯和喇叭 void offAlarmLight(); //报警开关 int alarmSwitch=1; unsigned char UP_req[5]={0,0,0,0,0}; //上行请求 unsigned char DOWN_req[5]={0,0,0,0,0}; //下行请求 //电机定位 void position(void) { OUTPUT=0x01|(P2&0xf0);time(200); OUTPUT=0x02|(P2&0xf0);time(200); OUTPUT=0x04|(P2&0xf0);time(200); OUTPUT=0x08|(P2&0xf0);time(200); ucMotorDrvPuls=0x11; OUTPUT=0x01|(P2&0xf0); } /****************************************/ /* 主函数 */ /****************************************/ void main(void) { time(100); initLights(); position();//电机定位 ucMotorDrvPuls=0x11; OUTPUT=0x00|(P2&0xf0);//电机停止 setFloor(CURFLR); setUpLight(); time(100); while(1)//主循环 { outPress();//按下电梯外按钮 while(STOPCUR==1)//电梯在当前层,电梯不动,可以继续接受请求 { outPress(); inPress(); } if(inPress())//按下电梯内楼层按钮 { while(START)//等待启动按键按下,电梯不动,可以继续接受请求 { outPress(); inPress(); } } while(1)//电机运转循环 { if(UP_req[1]==0&&UP_req[2]==0&&UP_req[3]==0&& DOWN_req[2]==0&&DOWN_req[3]==0&&DOWN_req[4]==0) { break;//没有请求,跳出电机运转循环,电梯不动 } if(FORREV)//上行 { setUpLight();//上行灯亮 if(STOPCUR==1){break;}// if(elevator())//往上到达某一层 { if(CURFLR==4) {setDownLight();break;}//到达四楼 } OUTPUT=(ucMotorDrvPuls&0x0f)|(P2&0xf0); ucMotorDrvPuls=_crol_(ucMotorDrvPuls,1); } if(!FORREV)//下行 { setDownLight();//下行灯亮 ; if(STOPCUR==1){break;} if(elevator())//往下到达某一层 { if(CURFLR==1) {setUpLight();break;}//到达一楼 } OUTPUT=(ucMotorDrvPuls&0x0f)|(P2&0xf0); ucMotorDrvPuls=_cror_(ucMotorDrvPuls,1); } outPress();//按下电梯外按钮 //if(inPress())//按下电梯内楼层按钮 //{ // while(START)//等待启动按键按下 //{ // outPress(); inPress();//电梯运行时,内部按钮按下,无需按启动按钮 // } //} time(380-UCTIMES*16); }//end while-电机运转循环 OUTPUT=0x00|(P2&0xf0);//电机停止,有请求时按下启动按钮启动 }//end while-主循环 } /****************************************/ /* 按钮事件 */ /****************************************/ //按下电梯外按钮 void outPress() { //FORREV=1; if(!UP1)//1楼上 { storeUP(1); if(CURFLR>1&&STOPCUR==1)//电梯不在一楼,且当前没其他请求,电梯马上自动启动 { FORREV=0;//向下运行 STOPCUR=0; } if(CURFLR==1) { STOPCUR=1;//电梯停留在当前层 } } if(!UP2)//2楼上 { storeUP(2); if(CURFLR>2&&STOPCUR==1)//电梯在二楼以上 { FORREV=0; STOPCUR=0; } if(CURFLR<2&&STOPCUR==1) { FORREV=1; STOPCUR=0; } if(CURFLR==2) { STOPCUR=1; } } if(!UP3)//3楼上 { storeUP(3); if(CURFLR>3&&STOPCUR==1)//电梯在三楼以上 { FORREV=0; STOPCUR=0; } if(CURFLR<3&&STOPCUR==1) { FORREV=1; STOPCUR=0; } if(CURFLR==3) { STOPCUR=1; } } if(!DOWN2)//2楼下 { storeDOWN(2); if(CURFLR>2&&STOPCUR==1)//电梯在二楼以上 { FORREV=0; STOPCUR=0; } if(CURFLR<2&&STOPCUR==1) { FORREV=1; STOPCUR=0; } if(CURFLR==2) { STOPCUR=1; } } if(!DOWN3)//3楼下 { storeDOWN(3); if(CURFLR>3&&STOPCUR==1)//电梯在三楼以上 { FORREV=0; STOPCUR=0; } if(CURFLR<3&&STOPCUR==1) { FORREV=1; STOPCUR=0; } if(CURFLR==3) { STOPCUR=1; } } if(!DOWN4)//4楼下 { storeDOWN(4); if(CURFLR<4&&STOPCUR==1) { FORREV=1;
史海拾趣
|
利用DS1302时钟芯片实现时间、日期的显示,并且具有调节时间、日期的功能。“星期”通过P0口显示,“时间”或“日期”采用MAX7219控制共阴极LED显示,通过“时间/日期”切换键,实现时间和日期的切换。按下“调整”键,再分别按相应的“星期”、“ ...… 查看全部问答> |
|
很多人发贴,来信询问关于约束、时序分析的问题,比如:如何设置setup,hold时间?如何使用全局时钟和第二全局时钟(长线资源)?如何进行分组约束?如何约束某部分组合逻辑?如何通过约束保证异步时钟域之间的数据交换可靠?如何使用I/O逻辑单元内 ...… 查看全部问答> |
|
我想写一段通用的代码刷进bios里面 达到下面目的: 开机的时候,通过我自带主板集成网卡访问网络某ip,思路已经有了。但是遇到难点不知道如何获得网卡的地址。 所以想问下高手 或者有类似经验的高手。 1 所有网卡的端口是统一固定 ...… 查看全部问答> |
|
1)我的ARM9芯片连了一块MAX3243,MAX3243是RS232驱动器/接收器,请问这个芯片的作用? 2)ARM9内部已经有UART,为什么要外接一个呢,如果外接,那编驱动时,是要对外接的UART还是ARM内部的UART进行设置呢? 3)WINCE的串口驱动,硬件部分代 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 技术挑战: 电子设备接地的重要性 各种错误的接地方法导致的问题分析 一、电子设备为什么要接地 很多人都知道,贵重仪器设备使用的时候,外壳都要接地,如采用三心电源插头等 ...… 查看全部问答> |
|
这是一本很经典的有关磁性元件的书在学校一般磁方面讲得比较少很多人也没有理解什么是磁场上次看到一个人怎么都不理解(很多人仅仅凭感觉来理解问题而非用逻辑,用定量的计算)为什么开气隙的磁环中磁能大多储存在气息中(准确的说是储存在磁导率低 ...… 查看全部问答> |




