在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 20:04:20 浏览: 22
以下是一个可能的示例代码(仅供参考):
```c
#include <reg52.h>
sbit S13 = P3^3; //确认键
sbit Buzzer = P1^7; //蜂鸣器
sbit D1 = P2^0; //8层
sbit D2 = P2^1; //7层
sbit D3 = P2^2; //6层
sbit D4 = P2^3; //5层
sbit D5 = P2^4; //4层
sbit D6 = P2^5; //3层
sbit D7 = P2^6; //2层
sbit D8 = P2^7; //1层
sbit S1 = P3^0; //5层
sbit S2 = P3^1; //6层
sbit S3 = P3^2; //7层
sbit S4 = P3^3; //8层
sbit S5 = P3^4; //1层
sbit S6 = P3^5; //2层
sbit S7 = P3^6; //3层
sbit S8 = P3^7; //4层
bool targets[8] = {false}; //目标楼层数组
int currentFloor = 1; //当前楼层
bool running = false; //电梯是否在运行
int highestTarget = 0; //目标楼层中最高的楼层
int lowestTarget = 8; //目标楼层中最低的楼层
void delay(int ms) { //延时函数
int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 1000; j++);
}
}
void updateLEDs() { //更新LED灯
D1 = (currentFloor == 8);
D2 = (currentFloor == 7);
D3 = (currentFloor == 6);
D4 = (currentFloor == 5);
D5 = (currentFloor == 4);
D6 = (currentFloor == 3);
D7 = (currentFloor == 2);
D8 = (currentFloor == 1);
}
void buzzer() { //蜂鸣器发出“哔”声
Buzzer = 1;
delay(100);
Buzzer = 0;
}
void stopAtFloor(int floor) { //电梯停在指定楼层
currentFloor = floor;
updateLEDs();
buzzer();
targets[floor-1] = false;
delay(3000);
}
void startRunning() { //电梯开始运行
int i;
running = true;
if (highestTarget < currentFloor) { //先下行
for (i = currentFloor; i >= highestTarget; i--) {
currentFloor = i;
updateLEDs();
delay(500);
if (targets[i-1]) { //到达目标楼层
stopAtFloor(i);
}
}
}
if (lowestTarget > currentFloor) { //再上行
for (i = currentFloor; i <= lowestTarget; i++) {
currentFloor = i;
updateLEDs();
delay(500);
if (targets[i-1]) { //到达目标楼层
stopAtFloor(i);
}
}
}
running = false;
}
void main() {
while (1) {
if (!running) { //电梯不在运行时才响应按键
if (S1) { //5层
targets[4] = true;
D5 = 1;
while (S1);
}
if (S2) { //6层
targets[5] = true;
D6 = 1;
while (S2);
}
if (S3) { //7层
targets[6] = true;
D7 = 1;
while (S3);
}
if (S4) { //8层
targets[7] = true;
D1 = 1;
while (S4);
}
if (S5) { //1层
targets[0] = true;
D8 = 1;
while (S5);
}
if (S6) { //2层
targets[1] = true;
D7 = 1;
while (S6);
}
if (S7) { //3层
targets[2] = true;
D6 = 1;
while (S7);
}
if (S8) { //4层
targets[3] = true;
D5 = 1;
while (S8);
}
if (S13) { //确认键
int i;
for (i = 0; i < 8; i++) {
if (targets[i]) { //找出目标楼层中最高和最低的楼层
if (i+1 > highestTarget) {
highestTarget = i+1;
}
if (i+1 < lowestTarget) {
lowestTarget = i+1;
}
}
}
startRunning(); //电梯开始运行
while (S13);
}
}
}
}
```
注意,以上代码仅供参考,可能存在错误或不足,需要根据具体情况进行调整和优化。