在BST-V51 Ver3.3全新升级版的51单片机开发板上完成一个八层楼的电梯模拟项目的简单的示例代码 其硬件配置要求如下 1、使用键盘阵列模拟电梯按键,按键的排列如下 S1按键代表去5层 S2按键代表去6层 S3按键代表去7层 S4按键代表去8层 S5按键代表去1层 S6按键代表去2层 S7按键代表去3层 S8按键代表去4层 S13按键代表确认前往 2、开发板8个LED灯自下向上排列,分别对应8个楼层 如下; D1代表8层 D2代表7层 D3代表6层 D4代表5层 D5代表4层 D6代表3层 D7代表2层 D8代表1层 3、蜂鸣器发出“哔”声,提示电梯到达。 电梯运行流程如下: 1、初始电梯停在1楼,对应的LED灯点亮; 2、按下按键上的数字键,表示电梯运行的目标楼层,对应LED灯点亮,如:按下3,对应3层的LED灯点亮;允许多次按键,如楼层已经按过,再按不起作用; 3、按下确定键,电梯开始以0.5秒一层的速度自下向上运行,同时对应的LED灯随同改变,如:运行到2层,1层LED熄灭,2层LED亮起; 4、电梯一直运行到目标楼层,蜂鸣器响起,提示到达目标;如有多个目标楼层,每一个目标楼层停顿三秒后电梯继续运行直到最后一个目标,此时仅有该楼层LED点亮,电梯一次运行结束; 5、不论电梯停在何层,重复步骤2-4,电梯继续运行,注意:当目标楼层中出现小于当前楼层的,电梯都以“先上后下”原则处理,即先运行到最高目标楼层后再往下运行到最低的目标楼层方停止,完成一次运行;如仅有低于当前楼层的目标楼层,则电梯直接向下运行; 6、电梯运行过程中按键不起作用。
时间: 2024-01-02 07:04:20 浏览: 103
以下是示例代码:
```c
#include <REGX51.H>
#define KEY P1
#define LED P2
#define BUZZ P3
unsigned char current_floor = 1; // 当前楼层
unsigned char target_floors[8] = {0}; // 目标楼层,最多支持八个目标楼层
unsigned char target_count = 0; // 目标楼层数量
unsigned char is_running = 0; // 是否在运行中
unsigned char is_up = 1; // 是否向上运行
unsigned char is_arrived = 0; // 是否到达目标楼层
unsigned char led_pattern[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // LED灯模式
void delay(unsigned int time) // 延时函数,单位为10毫秒
{
unsigned int i, j;
for(i = time; i > 0; i--)
{
for(j = 114; j > 0; j--);
}
}
void refresh_led() // 刷新LED灯
{
unsigned char i;
for(i = 0; i < 8; i++)
{
if(current_floor == i + 1)
{
LED = led_pattern[i];
break;
}
}
}
void buzzer() // 蜂鸣器发声
{
BUZZ = 1;
delay(10);
BUZZ = 0;
}
void add_target(unsigned char floor) // 添加目标楼层
{
unsigned char i;
for(i = 0; i < target_count; i++) // 判断是否已经存在该目标楼层
{
if(target_floors[i] == floor)
{
return;
}
}
target_floors[target_count++] = floor;
}
void sort_targets() // 对目标楼层进行排序
{
unsigned char i, j, temp;
for(i = 0; i < target_count; i++)
{
for(j = i + 1; j < target_count; j++)
{
if(target_floors[i] > target_floors[j])
{
temp = target_floors[i];
target_floors[i] = target_floors[j];
target_floors[j] = temp;
}
}
}
}
void elevator_up() // 电梯向上运行
{
current_floor++;
refresh_led();
buzzer();
delay(30);
}
void elevator_down() // 电梯向下运行
{
current_floor--;
refresh_led();
buzzer();
delay(30);
}
void elevator_run() // 电梯运行
{
unsigned char i;
is_running = 1;
is_up = 1;
is_arrived = 0;
while(target_count > 0) // 直到所有目标楼层都到达
{
if(is_up) // 向上运行
{
for(i = current_floor - 1; i < 8; i++) // 检查是否有目标楼层
{
if(target_floors[i])
{
is_arrived = 1;
while(current_floor < target_floors[i]) // 运行到目标楼层
{
elevator_up();
}
break;
}
}
if(!is_arrived) // 没有目标楼层,直接到达顶层
{
is_up = 0;
while(current_floor < 8)
{
elevator_up();
}
}
}
else // 向下运行
{
for(i = current_floor - 2; i >= 0; i--) // 检查是否有目标楼层
{
if(target_floors[i])
{
is_arrived = 1;
while(current_floor > target_floors[i]) // 运行到目标楼层
{
elevator_down();
}
break;
}
}
if(!is_arrived) // 没有目标楼层,直接到达底层
{
is_up = 1;
while(current_floor > 1)
{
elevator_down();
}
}
}
for(i = 0; i < target_count; i++) // 判断当前楼层是否是目标楼层
{
if(target_floors[i] == current_floor)
{
target_floors[i] = 0; // 到达目标楼层,将其从目标楼层列表中删除
target_count--;
break;
}
}
buzzer(); // 到达目标楼层,发出提示音
delay(30);
}
is_running = 0;
}
void main()
{
unsigned char key_code, floor;
while(1)
{
if(!is_running) // 电梯未运行
{
key_code = KEY & 0x0F; // 获取按键编号
if(key_code > 0 && key_code < 9) // 楼层按键被按下
{
floor = key_code;
if(floor != current_floor) // 目标楼层不是当前楼层
{
add_target(floor);
sort_targets();
refresh_led();
}
}
else if(key_code == 13 && target_count > 0) // 确认键被按下,且存在目标楼层
{
elevator_run();
}
}
}
}
```
阅读全文