×
单片机 > 单片机程序设计 > 详情

单片机电梯仿真控制源程序

发布时间:2024-05-19 发布时间:
|

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)

[1] [2] [3]
单片机电梯仿真控制初始值

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会