基于51单片机的多层电梯(1-16层)运行系统仿真设计_层数可改
仿真图proteus 8.9
程序编译器:keil 4/5
编程语言:C语言
设计编号:S0027
视频演示
主要功能:
结合实际情况,基于51单片机设计一个多层电梯单片机控制系统。该系统应满足的功能要求为:
1-16层电梯运行控制,轿内外呼叫,运行状态显示。独立键盘、LED显示楼层、指示灯。
1.通电后,系统默认电梯停在一层。
2.按下不同的按键电梯可以到达不同的楼层,如果电梯在上行,下面的楼层有呼叫电梯会继续上行,直到上行完了才会下行。同样如果电梯在下行,上面的楼层有呼叫 电梯会继续上行 ,直到下行完了才会上行。
3.如需上行,请按下所要到达楼层的上行呼叫按钮,电梯显示开始上行,所经楼层号用数码管进行显示,到达,楼层号持续显示。
4.当轿厢停留在中间楼层时,可实现上或下行呼叫,行进方向按呼叫顺序进行。
5.由LED箭头指示电梯是上行和下行的方向。
6.硬件软件可以兼容2-16层电梯,如果需要做8层10层电梯,可以用改设计快速修改。
主要硬件设备:51单片机、74HC595位移缓存器、数码管显示、按键、NSL-32SR3、电机。
资料下载链接(可点击):
【腾讯文档】S0027 网盘链接
以下为本设计资料展示图:
仿真
电梯停在一楼
按下电梯完按钮16楼,上行指示灯电路,电梯电机开始工作。此时显示栏会显示经过的楼层。
到达16层后,按下电梯完按钮1楼,下行指示灯电路,电梯电机开始工作。此时显示栏会显示经过的楼层。
程序:
//系统初使化
void SYSYEM_INIT(void)
{
u8 i;
ElevState.CurrentFloor=1;
ElevState.Direction=UP; //初使化方向为向上
ElevState.FloorTimerCount=0; //定时器版计时清0
ElevState.FreeFlag=TRUE; //初使化为空闲状态
ElevState.ElevRunning=FALSE; //运行标志置FALSE 表示暂停运行
Uart.RX_COUNT=0; //串口接收计数清0
for(i=0;i<=MaxFloor;i++)
{
ElevState.FloorCallTable[i]=Null; //初使化呼叫列表为Null
}
DOOR_Close; //关门
}
void EXTI0_IRQHandler(void) interrupt 0 //楼层传感器中断
{
#if (USE_MODE==1)
ElevState.ArriveFlag=TRUE;//触发中断后表示到达楼层,让到达楼层标志置TRUE
#endif
}
void EXTI1_IRQHandler(void) interrupt 2 //矩阵按键中断
{
KeyDatHandle(KeyScan()); //把KeyScan()按键扫描函数返回的按键值带入到KeyDatHandle()处理按键
}
void TIM0_IRQHandler(void) interrupt 1 //定时模拟电梯上升和下降
{
TH0=(65536-50000)/256;//定时50ms
TL0=(65536-50000)%256;//定时50ms
TimerCount++;
if(TimerCount==20) //1秒
{
TimerCount=0;
Timer_Second++;
}
if(DelNullCheck()==FALSE) ElevState.FloorTimerCount++; //非空闲状态计时累加
else ElevState.FloorTimerCount=0; //空闲状态计时清0
}
void Uart_IRQHandler(void) interrupt 4 //用于电梯之间的通信
{
if(RI==1) //判断是否为接收中断(串口中断分为发送中断和接收中断,均用同一个中断服务函数入口)
{
RI = 0; //清除RI接收中断标志
Uart.RX_BUFF[Uart.RX_COUNT++]=SBUF;
if(Uart.RX_COUNT==Uart_RX_LEN) Uart.RX_COUNT=0;
}
}
void main(void) //主函数
{
u8 SendTick1S=0;
SYSYEM_INIT();
EXTI0_Init();
EXTI1_Init();
TIMER0_Init();
UART_Config(9600);
Uart_SendStr("Welcome to use elevator program rn");
while(1)
{
KeyPort_Y=0x00; //不可删除
FloorCallCheck();
Elevator();
if(SendTick1S!=Timer_Second)
{
SendTick1S=Timer_Second;
Uart_SendBytes((u8*)(&ElevState),sizeof(ElevState));
}
}
}
资料清单(提供资料清单所有文件):
资料下载链接见文章开头