基于51单片机的四层电梯控制系统模拟器proteus仿真程序原理图设计

硬件设计

链接:https://pan.baidu.com/s/1G2n2Ml95mtLKSdndIb3QFw
提取码:f3yy

仿真图: 模拟四层电梯系统
在这里插入图片描述

程序设计

#include <REG52.H>
#include <INTRINS.H>

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;
	 }
   }

.
文件仅供参考:

.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值