历史上的今天
今天是: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 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; } }
史海拾趣
|
一直以来,传感器技术就被广泛地应用在日常信息、通讯、汽车、医疗等外围精密设备上,其中又以汽车工业作为车用传感器产品最为突出,一般使用在车上的传感器是以行车计算机系统作为输入装置,它将汽车运行中各种工作状况信息,包括:车速、车况及各 ...… 查看全部问答> |
|
现在ARM处理器优点突出,正在日益成为嵌入式领域的标杆,大家上招聘网站看下就知道了,电子工程师岗位基本上都要求熟悉ARM或DSP,熟悉linux下程序开发。这对我们都是个挑战啊,为了赶上这班车,自己也开始了ARM学习之旅。以后,我会把自己的过程和 ...… 查看全部问答> |
|
我们现有关于PADS /Altium Designer 电路设计的图书选题,诚找有写书意向的作者合作。要求作者有一些实战经验和写作资源,有一定的业余时间、能够保证写作进度。有意者请直接发信 联系方式:haohong99@163.com、478057587(QQ)。欢迎有实践开发 ...… 查看全部问答> |
|
【大讲台】安森美半导体LED照明电源设计 LED照明有着广阔的应用前景,其中LED照明电源的设计至关重要,但LED照明设计给包括中国工程师在内的工程社群带来了挑战,因为LED照明的应用范围非常广泛,应用的功率等级、可以采用的驱动电源种类及电源拓 ...… 查看全部问答> |
|
最近项目发生些意外,具体是因为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届的家博会将首次变脸,除了传统的白色家电产品外,还将融合彩电、数码、音响等消费类电子产品。本届展会主办方也由中国家用电器协会一 ...… 查看全部问答> |




