历史上的今天
返回首页

历史上的今天

今天是: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;

推荐阅读

史海拾趣

Bussmann (Eaton)公司的发展小趣事

2011年,Bussmann的母公司Cooper集团被EATON集团收购,Bussmann随之成为EATON旗下的一个产品系列。EATON集团作为一家多元化的动力管理企业,在电气和航空航天领域有着深厚的积累。通过整合EATON集团的资源和技术优势,Bussmann得以在更广泛的领域开展业务,并进一步提升其在电路保护领域的竞争力。

DETCO公司的发展小趣事

ElectronicsCorp最初是一个在亚洲某城市的小型电子产品制造商。它以其高质量和合理的价格迅速获得了市场份额。公司创始人李先生坚持将研发作为核心驱动力,不断投入资金研发新技术。随着时间的推移,ElectronicsCorp的产品线不断扩大,包括智能手机、平板电脑和智能家居设备。凭借持续的创新和卓越的质量,ElectronicsCorp逐渐成长为全球电子行业的领导者。

西安航天民芯公司的发展小趣事

随着公司业务的不断拓展和市场规模的逐步扩大,西安航天民芯吸引了众多投资者的关注。多家知名投资机构纷纷入股公司,为公司的发展提供了强大的资本支持。这些资金的注入不仅加速了公司的技术研发和市场拓展步伐,也为公司的持续发展注入了新的活力。

这五个故事展示了西安航天民芯公司在电子行业中的发展历程和取得的成就。通过不断地技术创新和市场拓展,西安航天民芯已经逐渐成为了电子行业中的领军企业之一,为行业的发展做出了积极的贡献。

Fukushima Futaba Electric Co Ltd公司的发展小趣事

随着技术的不断成熟和产品质量的提升,Futaba Electric开始将目光投向国际市场。20世纪70年代末至80年代初,公司成功进入欧美市场,与多家国际知名企业建立了合作关系。通过参加国际展会、设立海外分支机构等方式,Futaba Electric的产品逐渐在全球范围内得到推广和应用。这一时期,公司的国际化战略取得了显著成效,为公司的长远发展奠定了更加坚实的基础。

Chip Supply Micro Devices公司的发展小趣事

随着市场竞争的加剧,Chip Supply Micro Devices意识到成本控制的重要性。公司开始着手优化供应链管理,通过引入先进的生产管理系统和自动化设备,提高了生产效率,降低了生产成本。同时,公司还与供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和优质品质。这些措施使得Chip Supply Micro Devices在价格上具备了竞争优势,进一步提升了市场份额。

全志(Allwinner)公司的发展小趣事

随着平板市场的逐渐饱和,全志科技开始寻求新的增长点。公司在保持原有产品线优势的同时,积极拓展多品类产品线,实施了营销端BU化,并提出了未来大方向的MANS战略。这一转型不仅增强了公司的市场竞争力,也为公司的长期发展打开了新的局面。

问答坊 | AI 解惑

PLC入门学习基础教程

PLC入门学习基础教程.zip…

查看全部问答>

SPI总线的DS1302实时钟控制

利用DS1302时钟芯片实现时间、日期的显示,并且具有调节时间、日期的功能。“星期”通过P0口显示,“时间”或“日期”采用MAX7219控制共阴极LED显示,通过“时间/日期”切换键,实现时间和日期的切换。按下“调整”键,再分别按相应的“星期”、“ ...…

查看全部问答>

约束与时序分析问题汇总

很多人发贴,来信询问关于约束、时序分析的问题,比如:如何设置setup,hold时间?如何使用全局时钟和第二全局时钟(长线资源)?如何进行分组约束?如何约束某部分组合逻辑?如何通过约束保证异步时钟域之间的数据交换可靠?如何使用I/O逻辑单元内 ...…

查看全部问答>

触摸屏的工作原理

本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 触摸屏简单的工作原理实际上就是用手指或其他物体触摸安装在显示器前端的触摸屏时,所触摸的位置(以坐标形式)由触摸屏控制器检测,并通过接口(如RS-232串行口)送到CPU,从而确定输入的 ...…

查看全部问答>

p28f512

p28f512是个什么样集成块?怎么写入数据???…

查看全部问答>

bios获得网卡地址

我想写一段通用的代码刷进bios里面 达到下面目的:     开机的时候,通过我自带主板集成网卡访问网络某ip,思路已经有了。但是遇到难点不知道如何获得网卡的地址。 所以想问下高手 或者有类似经验的高手。 1 所有网卡的端口是统一固定 ...…

查看全部问答>

ARM外接UART控制器??串口驱动问题

1)我的ARM9芯片连了一块MAX3243,MAX3243是RS232驱动器/接收器,请问这个芯片的作用?    2)ARM9内部已经有UART,为什么要外接一个呢,如果外接,那编驱动时,是要对外接的UART还是ARM内部的UART进行设置呢? 3)WINCE的串口驱动,硬件部分代 ...…

查看全部问答>

因接地不良,每年中国有数百万台电子设备被损坏

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 技术挑战: 电子设备接地的重要性 各种错误的接地方法导致的问题分析   一、电子设备为什么要接地 很多人都知道,贵重仪器设备使用的时候,外壳都要接地,如采用三心电源插头等 ...…

查看全部问答>

给当年磁学没学好的朋友《磁性元器件分册》-赵修科

这是一本很经典的有关磁性元件的书在学校一般磁方面讲得比较少很多人也没有理解什么是磁场上次看到一个人怎么都不理解(很多人仅仅凭感觉来理解问题而非用逻辑,用定量的计算)为什么开气隙的磁环中磁能大多储存在气息中(准确的说是储存在磁导率低 ...…

查看全部问答>

求助

看到一个关于5438ADC的程序,要求If A0 > 0.5*AVcc, P1.0 set, else reset. 程序是这样写的 if (ADC12MEM0 >= 0x7ff)                 // ADC12MEM0 = A0 ...…

查看全部问答>