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

单片机电梯控制器代码

发布时间:2020-12-25 发布时间:
|

单片机电梯控制器电路原理图如下:
 

单片机源程序如下:

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

}


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

热门文章 更多
C8051F020的UART