历史上的今天
返回首页

历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2019年10月15日 | 单片机16层可剪裁电梯源码+Proteus仿真设计

2019-10-15 来源:eefocus

楼层数可选,硬件可删除。16层内任意设置最大楼层数,用不到的楼层硬件可以删除,不影响程序。提供串口通讯,波特率可在main初使化里设置。更新了详细注释版本,需要学习的朋友请关注银穗之家回复:16层电梯源码。即可下获取详细注释版。

电梯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
 
 
 

/*Uart串口发送函数示例:
1.USART_SendByte(u8 dat) //发送单字节数据
  例:USART_SendByte(0x04);

2.USART_Send(u8* arr,u16 len) //发送多字节数据
  例:
  Usart.TX_BUFF[0]=0xA1;
  Usart.TX_BUFF[1]=0x08;
  Usart.TX_BUFF[2]=0x04;
  Usart.TX_BUFF[3]=0xF9;
  USART_SendByte(Usart.TX_BUFF,4);
  或
  u8 Arr[16]={0xA1,0x08,0x04,0xF9};
  USART_SendByte(Arr,4);

3.USART_SendStr(u8* str) //发送字符串数据
  USART_SendStr("大吉在利,晚上吃鸡!rn");

4.有关电梯通信代码参考:
<1>发送电梯当前楼层给其他设备:     USART_SendByte(ElevState.CurrentFloor);
<2>发送电梯当前运行方向给其他设备: USART_SendByte(ElevState.Direction);
<3>发送电梯当前所有数据给其他设备: USART_Send((u8*)(&ElevState),sizeof(ElevState));

*/

单片机源程序如下:

/*************************电梯主程序*****************************/


#include "reg51.h"

#include "intrins.h"


/*********************程序选择****************************/

#define USE_MODE 0   //0-定时模拟  1-传感器

/****************************************************************/

/*********************平台移植部分代码****************************/

//定时器模拟版接口:

#if (USE_MODE==0)

sbit DOOR=P3^5;        //电梯门开关控制信号

sbit ElevMotor_P=P3^6; //电梯电机正极控制信号

sbit ElevMotor_N=P3^7; //电梯电机负极控制信号

sbit SHCP=P0^5;        //74HC595  LED、数码管显示驱动

sbit DS=P0^6;          //74HC595  LED、数码管显示驱动

sbit STCP=P0^7;        //74HC595  LED、数码管显示驱动

#define KeyPort_X  P1  //矩阵按键接口

#define KeyPort_Y  P2  //矩阵按键接口

#endif

//除以上定义的IO外,还需用到P33作为矩阵键盘的中断触发引脚

//8路与门可用芯片:CD4068或74LS30(芯片是与非门)+出端接一个三极管反向电平。



//传感器版接口:

#if (USE_MODE==1)

sbit DOOR_CLOSE_SENSOR=P3^4;//电梯门关闭检测传感器输入

sbit DOOR=P3^5;        //电梯门开关控制信号

sbit ElevMotor_P=P3^6; //电梯电机正极控制信号

sbit ElevMotor_N=P3^7; //电梯电机负极控制信号

sbit SHCP=P0^5;        //74HC595  LED、数码管显示驱动

sbit DS=P0^6;          //74HC595  LED、数码管显示驱动

sbit STCP=P0^7;        //74HC595  LED、数码管显示驱动

#define KeyPort_X  P1  //矩阵按键接口

#define KeyPort_Y  P2  //矩阵按键接口

#endif

//除以上定义的IO外,还需用到P33作为矩阵键盘的中断触发引脚

//需用到P32作为楼层限位开关触发中断引脚

//每个楼层一个限位开关,接在N路输入的与门芯片上

//如果大于8层,可用两个8路输入的与门芯片+一个2路的与门芯片组合

//8路与门:用8路与非门CD4068或74LS30+输出端接一个三极管反向电平。

/****************************************************************/

/***********************楼梯参数设置*****************************/

#define MaxFloor      16  //电梯总楼层(最大16)


#define FloorStayTime 40 //单位:50ms, 楼层停留时间:40*50ms=2S

#define DoorStayTime  2  //单位:S   , 电梯门停留时间

#define SEG_Num       2  //数码管数量(为1时请删除第一个数码管的595)

/****************************************************************/

#define u8  unsigned char

#define u16 unsigned int

        

#define TRUE  1

#define FALSE 0


#define Null  0  

#define STOP  1

#define UP    2

#define DOWN  3


#define UP_IN     0x01

#define UP_OUT    0x02

#define DOWN_IN   0x04

#define DOWN_OUT  0x08


#define Elev_UP    ElevMotor_P=0;ElevMotor_N=1  //低电平有效

#define Elev_DOWN  ElevMotor_P=1;ElevMotor_N=0  //低电平有效

#define Elev_STOP  ElevMotor_P=1;ElevMotor_N=1  //低电平有效


#define OPEN  1  

#define CLOSE 0

#define DOOR_Open  DOOR=OPEN

#define DOOR_Close DOOR=CLOSE


#define SHCP_H SHCP=1

#define SHCP_L SHCP=0

#define DS_H   DS=1

#define DS_L   DS=0

#define STCP_H STCP=1

#define STCP_L STCP=0


#if MaxFloor>8  

#define MHC595_NUM 8

#else

#define MHC595_NUM 5

#endif 


#define SEGPort 0x01

#define LED_IN_Port 0x02

#define LED_OUT_UP_Port 0x03

#define LED_OUT_DOWN_Port 0x04


typedef struct

{

        u8 ElevRunning;      //电梯运行状态标志

  u8 CurrentFloor;     //当前电梯所处楼层

        u8 Direction;        //电梯运行方向

        u8 FloorCallTable[MaxFloor+1];//数组[0]不用,从[1]开始使用 ,呼叫列表(所有楼层呼叫的信息均保存于此)

        u8 FloorTimerCount;         //计时

        u8 ArriveFlag;       //到达楼层信号(用于停止或在前一楼层提前加减速)(定时器模拟的用不到)

        u8 FreeFlag;               //电梯空闲状态标志

}TYPEDEF_ELEVSTATE;

TYPEDEF_ELEVSTATE ElevState; //电梯状态结构体


//u8 code SEG_NUM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7D,0x07,0x7f,0x6f};   //共阴SEG数码管段码  0~9 

u8 code SEG_NUM[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳SEG数码管段码  0~F 

u16 code LED_NUM[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};   //SEG数码管段码  0~9


u8 HC595_BUFF[MHC595_NUM]={0};

u8 Timer_Second;

u16 TimerCount;


u8 RIOver_Flag=0;

u8 ExternKey[2]={0}; //外部按键按下信息

u8 FloorCallTableBUFF[MaxFloor+10]={0};

u8 KeyPressFlag=0;


#define USART_RX_LEN 20  //接收缓存长度(请勿超过芯片rom剩余大小)

typedef struct

{

  u8 RX_BUFF[USART_RX_LEN]; //接收缓存

        u8 TX_BUFF[USART_RX_LEN]; //发送缓存

        u16 RX_COUNT;

}USART;

USART Usart;


void delay_ms(u16 xms);

void delay_s(u8 xs);

void EXTI0_Init(void);

void Timer0_Init(void);

void USART_Configure(u16 BaudRate);

void HC595_Send(u8 *p);

u8 KeyScan(void);

void KeyDatHandle(u8 key);

void WaitDoorOpen(u8 ts);

void WaitDoorClose(u8 ts);

void SEG_Display(u8 segnum);

void LED_ON(u8 addr,u8 lednum);

void LED_OFF(u8 addr,u8 lednum);

void DlevWorkState(u8 state);

void Elevator(void);

u8 FloorCall_UP(u8 floorside);

u8 FloorCall_DOWN(u8 floorside);

u8 DelNullCheck(void);

void FloorCallCheck(void);

void USART_SendByte(u8 dat);

void USART_Send(u8* arr,u16 len);

void USART_SendStr(u8* str);

void SYSYEM_INIT(void);


void delay_ms(u16 xms)

{

        u8 i;

        u16 t;

  for(t=xms;t>0;t--)

          for(i=112;i>0;i--);

}


void delay_s(u8 xs)

{

   TimerCount=0;

         Timer_Second=0;

   while(Timer_Second}


void EXTI0_Init(void)

{

  EA = 1;  

        IT0= 1; //下降沿触发

        EX0= 1;

}


void EXTI1_Init(void)

{

  EA = 1;  

        IT1= 1; //下降沿触发

        EX1= 1;

}


……………………


…………限于本文篇幅 余下代码请从51黑下载附件…………

        else

        if(((key>0)&&(key<=8))||((key>32)&&(key<=40))) //楼梯内的楼层选择按键(使用第1行和第5行作为电梯内部16个按键,每行8个键)

        {

                if(key>32) tempkey=key-32+8;

                else       tempkey=key;

                if(tempkey<=MaxFloor) 

                {

                        LED_ON(LED_IN_Port,tempkey);

                        if(((tempkey>ElevState.CurrentFloor)&&(tempkey                        else

                        if((tempkey                }

        }

        else 

        if(((key>9)&&(key<=16))||((key>40)&&(key<=48)))  //每个楼层门口外的向下按键(底楼按向下无效),第2行和第6行

        {

                 if(key>40) tempkey=key-40+8;

                 else       tempkey=key-8;

                 if((tempkey>1)&&(tempkey<=MaxFloor))

                 {

                         LED_ON(LED_OUT_DOWN_Port,tempkey);

                   ElevState.FloorCallTable[tempkey]|=DOWN_OUT;

                 }

        }

        else 

        if(((key>16)&&(key<=24))||((key>48)&&(key<56))) //每个楼层门口外的向上按键(顶楼按向上无效),第2行和第7行

        {

                 if(key>48) tempkey=key-48+8;

                 else       tempkey=key-16;

                 if(tempkey                 {

                         LED_ON(LED_OUT_UP_Port,tempkey);

                         ElevState.FloorCallTable[tempkey]|=UP_OUT;

                 }

        }

        else

        if(key==25)  //开门

        {

                if(ElevState.ElevRunning==FALSE)

                {

                  if(DOOR==CLOSE) DOOR_Open;

                }

        }

推荐阅读

史海拾趣

Advanced Fibreoptic Engineering Ltd公司的发展小趣事

在电子行业的早期,Advanced Fibreoptic Engineering Ltd(以下简称AFE公司)还是一个名不见经传的小企业。然而,随着技术的不断进步,AFE公司凭借其在光纤技术领域的深厚积累,成功研发出了一种具有划时代意义的新型光纤材料。这种材料不仅传输速度快,而且损耗极低,极大地提高了数据传输的效率和质量。这一技术突破迅速为AFE公司赢得了市场认可,公司的订单量激增,业绩逐年攀升。

随着技术的推广和应用,AFE公司的光纤产品逐渐在通信、医疗、工业等多个领域得到广泛应用。公司不仅在国内市场占据了一席之地,还积极拓展海外市场,与国际知名企业建立了稳定的合作关系。凭借卓越的产品性能和良好的市场口碑,AFE公司逐渐在电子行业中崭露头角,成为了光纤技术领域的佼佼者。

以上是第一个故事的示例,若您想要探索更多关于AFE公司的发展故事,请输入继续。

(注:由于我无法实时获取具体公司的实际发展故事,以上故事为虚构内容,仅用于展示故事编写风格和结构。如果您需要真实、具体的故事,请提供更多关于AFE公司的信息,以便我能为您编写更贴近实际的内容。)

AZ Displays公司的发展小趣事

AZ Displays深知品质是企业生存的根本。因此,公司始终将质量控制放在首位,从原材料采购到生产工艺的每一个环节都进行严格把控。通过严格的质量管理体系和高效的供应链管理,AZ Displays的产品质量得到了客户的高度认可,逐渐在行业内建立了卓越的声誉。

创基(CBI)公司的发展小趣事

在电子行业快速发展的今天,创新是企业持续发展的关键。CBI公司始终坚持创新驱动的发展战略,不断投入研发资源,推出具有创新性的电子产品。这些产品不仅满足了消费者的多样化需求,也为公司带来了丰厚的利润回报。同时,公司还注重知识产权保护,通过申请专利、商标等方式,保护自己的创新成果不受侵犯。

请注意,以上故事均为虚构,旨在为您提供一个关于电子行业里公司发展起来的故事框架。在实际情况中,不同公司的发展历程和故事可能会有所不同。

Fillfactory Nv公司的发展小趣事

FIDELIX公司成立于1990年,是一家专注于存储芯片研发与销售的韩国企业。在公司成立初期,FIDELIX凭借对技术的深入研究和对市场的敏锐洞察,成功推出了多款性能优越的NAND FLASH(闪存)和SDR/DDR(单/双数率同步动态存储器)等存储芯片产品。这些产品不仅在韩国市场上获得了良好的口碑,同时也开始逐步进入国际市场。

随着技术的不断进步和市场的不断扩大,FIDELIX逐渐在韩国存储芯片领域崭露头角。公司不断投入研发资金,加强技术创新,努力提升产品的性能和品质。同时,FIDELIX也积极拓展销售渠道,与多家国内外知名厂商建立了合作关系,为公司的持续发展奠定了坚实的基础。

Eagle-Picher公司的发展小趣事

1958年,Eagle-Picher公司的电池技术得到了重大的突破。在美国宇航局的探索者1号卫星上,Eagle-Picher的电池成功发射到太空,为卫星的运行提供了稳定的电源。这一里程碑式的事件标志着Eagle-Picher的电池技术在太空探索领域的应用达到了新的高度,也为公司赢得了更多的科研和商业机会。

Cedrat Technologies公司的发展小趣事

随着技术的不断进步和产品质量的提升,Cedrat Technologies开始积极拓展国际市场。公司凭借其卓越的技术实力和优质的产品服务,成功打入欧美等发达国家市场,赢得了众多客户的青睐。同时,公司也积极参与国际电子行业的交流与合作,提升了品牌知名度和国际影响力。

这些故事只是Cedrat Technologies在电子行业发展中的一小部分缩影,它们展示了公司在技术创新、产品应用和市场拓展等方面的努力和成果。未来,随着电子行业的不断发展和变革,相信Cedrat Technologies将继续保持其领先地位,为行业的发展贡献更多的力量。

问答坊 | AI 解惑

车用传感器发展驱动力及趋势

一直以来,传感器技术就被广泛地应用在日常信息、通讯、汽车、医疗等外围精密设备上,其中又以汽车工业作为车用传感器产品最为突出,一般使用在车上的传感器是以行车计算机系统作为输入装置,它将汽车运行中各种工作状况信息,包括:车速、车况及各 ...…

查看全部问答>

ARM学习经验-开始贴

现在ARM处理器优点突出,正在日益成为嵌入式领域的标杆,大家上招聘网站看下就知道了,电子工程师岗位基本上都要求熟悉ARM或DSP,熟悉linux下程序开发。这对我们都是个挑战啊,为了赶上这班车,自己也开始了ARM学习之旅。以后,我会把自己的过程和 ...…

查看全部问答>

STM32固件手册STM32固件手册

STM32固件手册STM32固件手册…

查看全部问答>

兼职:诚意找人编写PADS /AD电路设计的图书

我们现有关于PADS /Altium Designer 电路设计的图书选题,诚找有写书意向的作者合作。要求作者有一些实战经验和写作资源,有一定的业余时间、能够保证写作进度。有意者请直接发信 联系方式:haohong99@163.com、478057587(QQ)。欢迎有实践开发 ...…

查看全部问答>

附件格式要求

可不可以加一种doc的啊?word是咱们常用的处理工具啊!…

查看全部问答>

【大讲台】安森美半导体LED照明电源设计

【大讲台】安森美半导体LED照明电源设计 LED照明有着广阔的应用前景,其中LED照明电源的设计至关重要,但LED照明设计给包括中国工程师在内的工程社群带来了挑战,因为LED照明的应用范围非常广泛,应用的功率等级、可以采用的驱动电源种类及电源拓 ...…

查看全部问答>

界面开发的烦恼

做了1,2个EVC开发的项目。基本是工控的,就是触摸屏然后控制硬件完成一些动作。 用户总是对界面有点不满意,想弄得鲜艳一些,各种状态明了一些, 比如不同状态下换个颜色,贴个图片,按钮变成圆的等等。 但是大家都知道EVC控件种类实在是少,而 ...…

查看全部问答>

WINCE5.0 /6.0 EBOOT启动有何异同?

最近项目发生些意外,具体是因为2443的核心板原来使用的RAM是MobileDDR128MB,但是因为特殊情况改了普通DDR128MB的RAM后一直无法正常通过USB下载Stpldr/Eboot.bin/NK.bin WINCE6.0的项目在这种变更情况下出现问题了,可是WINCE5.0还是很正常,而且什么 ...…

查看全部问答>

CeGetLastError()的返回值为ERROR_ACCESS_DENIED

是这样的,写了一个DLL,放到手机上。(不需要考虑CPU问题,因为我是在POCKET PC 2003的平台下写的) 然后在PC端用CeRapiInvoke连接。 但是总是失败 使用CeGetLastError()得到的返回值为ERROR_ACCESS_DENIED,也就是错误码为5,拒绝访问。 有人 ...…

查看全部问答>

值得期待:全套家电概念呼之欲出

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 从2011年中国家电博览会启动仪式现场获悉,已成功举办了7届的家博会将首次变脸,除了传统的白色家电产品外,还将融合彩电、数码、音响等消费类电子产品。本届展会主办方也由中国家用电器协会一 ...…

查看全部问答>