历史上的今天
返回首页

历史上的今天

今天是:2025年01月28日(星期二)

2020年01月28日 | 单片机电梯控制器代码

2020-01-28 来源:51hei

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

单片机源程序如下:

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

           STOPCUR=0;

推荐阅读

史海拾趣

Eaton公司的发展小趣事

自1993年进入中国市场以来,伊顿公司凭借其先进的技术和丰富的经验,迅速在电网、石油化工、轨道交通、数据中心、商业楼宇等多个行业建立了市场地位。伊顿在中国的发展过程中,不仅带来了全球领先的产品和解决方案,还积极参与了本地市场的建设和创新。通过一系列的战略合作和收购活动,伊顿在中国市场的业务不断扩展,为中国经济和电气工业的发展做出了重要贡献。

Compact公司的发展小趣事

在电子行业的初期,Compact公司凭借其卓越的技术研发团队,成功开发出了一款具有颠覆性的新型半导体芯片。这款芯片不仅性能卓越,而且成本远低于市场上的同类产品。凭借这一技术创新,Compact公司迅速获得了市场份额,并在行业内建立了良好的声誉。随着技术的不断进步,Compact公司不断推出新产品,巩固了其市场地位。

CBM_America_Corporation公司的发展小趣事

随着科技的快速发展,CBM_America_Corporation意识到传统电子产品市场的饱和趋势。为了保持竞争力,公司决定进行创新转型,将业务重心转向智能家居和物联网领域。通过研发智能家居设备和物联网解决方案,CBM成功打开了新的市场空间。同时,公司还积极拓展多元化业务,涉及到了电子支付、数据安全等领域,进一步提升了公司的综合实力。

CINCH公司的发展小趣事

CINCH公司作为一家在电子行业颇具影响力的企业,始终致力于技术研发和产品创新。某年,公司研发团队成功开发出一种新型的连接器技术,该技术不仅提高了数据传输速度,还增强了设备的稳定性和耐用性。这一技术突破迅速引起了市场的关注,CINCH公司趁热打铁,推出了一系列基于新技术的产品,迅速占领了市场份额,实现了业务的快速增长。

BEKA Associates Ltd公司的发展小趣事

在快速发展的过程中,BCD Semi(Diodes)积极寻求风险投资和资本运作的支持。公司通过吸引国内外知名的投资机构参与投资,获得了大量的资金支持,为公司的研发、生产和市场拓展提供了有力的保障。同时,BCD Semi还通过并购、合作等方式,与行业内的其他企业实现资源共享和优势互补,进一步提升了公司的综合实力。

Diplohmatic A/S公司的发展小趣事

Diplohmatic A/S公司非常重视企业文化的建设。公司倡导“创新、协作、诚信、共赢”的核心价值观,通过举办各类员工活动、开展团队建设和员工培训等方式,不断增强员工的归属感和凝聚力。这种积极向上的企业文化氛围激发了员工的创新精神和工作热情,为公司的持续发展提供了强大的动力。

问答坊 | AI 解惑

单片机C语言编程基础

单片机的外部结构: 1、 DIP40双列直插; 2、 P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平) 3、 电源VCC(PIN40)和地线GND(PIN20); 4、 高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位) ...…

查看全部问答>

A System Evaluation of CAN Transceivers

A System Evaluation of CAN Transceivers…

查看全部问答>

在WinCE上,EVC或其它开发工具,如何写多种语言(中英等多国语言)版程序

请问, 在WinCE上,EVC或其它开发工具,如何写多种语言(中英等多国语言)版程序? 请给一些思路. 谢谢.…

查看全部问答>

LINUX 的嵌入式开发。

在arm板上写个sd卡的驱动。操作系统:linux .(C语言) 问题:      1:c语言中是如何操作寄存器,比如,知道一个寄存器的物理地址,知道它的每一位的作用。C语言下如何进行对它的操作。      2:arm ...…

查看全部问答>

32k时钟问题

我用的是msp430f122,外接32k晶振,可是不知怎么回事,上电后,用示波器观察,没有起振,我已经查了两天了,还是没有头绪,希望高人指点。…

查看全部问答>

CCSv4的TI的培训视频链接

现在很多芯片只能在CCSv4上支持,但是CCSv4已经和CCSv3.3是完全不同的架构,是基于eclipse架构的。所以调试界面与CCSv3.3是完全不同的。 TI有CCSv4的培训视频链接http://e2e.ti.com/cn/media/p/2090.aspx。 主要还是需要亲自调试,多使用。个人觉 ...…

查看全部问答>

ZigBee协调器网络的建立

ZigBee协调器网络的建立 一、协调器网络的建立      1、 网络的格式化           A:初始化的能量阀值为16。通过设置ZDApp_event_loop任务中的事件ID为ZDO_NETWORK_INIT以便执行B。   ...…

查看全部问答>

高采样率下对窄带信号做FFT,如何减少运算量?

采样率1M以上,而信号的频率范围仅37k——43k,FFT会算出大量的零,请问有办法进计算指定范围的频谱吗? 目前硬件是STM32F103ZET6,可以加硬件的。 谢谢!…

查看全部问答>

1302的备用电源的问题

请问使用DS1302时钟芯片的备用电源给芯片供电,需要补需要软件上进行什么设置? …

查看全部问答>