在51单片机上完成一个八层楼的电梯模拟项目的简单的示例代码 其要求如下 1、使用键盘阵列模拟电梯按键 2、开发板8个LED灯自下向上排列,分别对应8个楼层 3、使用8x8LED点阵屏显示1-8八个数字; 4、蜂鸣器发出“哔”声,提示电梯到达。 电梯运行流程如下: 1、初始电梯停在1楼,对应的LED灯点亮,点阵屏显示数字1; 2、按下按键上的数字键,表示电梯运行的目标楼层,对应LED灯点亮,如:按下 3,对应3层的LED灯点亮;允许多次按键,如楼层已经按过,再按不起作用; 3、按下确定键,电梯开始以0.5秒一层的速度自下向上运行,同时对应的LED灯和点阵屏随同改变,如:运行到2层,1层LED熄灭,2层LED亮起,点阵屏显示数字2; 4、电梯一直运行到目标楼层,蜂鸣器响起,提示到达目标;如有多个目标楼层,每一个目标楼层停顿三秒后电梯继续运行直到最后一个目标,此时仅有该楼层LED点亮,电梯一次运行结束; 5、不论电梯停在何层,重复步骤2-4,电梯继续运行,注意:当目标楼层中出现小于当前楼层的,电梯都以“先上后下”原则处理,即先运行到最高目标楼层后再往下运行到最低的目标楼层方停止,完成一次运行;如仅有低于当前楼层的目标楼层,则电梯直接向下运行; 6、电梯运行过程中按键不起作用。
时间: 2023-12-03 22:05:24 浏览: 84
好的,以下是一个简单的示例代码,实现了八层楼电梯的基本功能。需要注意的是,这只是一个示例代码,可能还有些不足之处,您可以根据实际需求进行修改和完善。
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep = P3^4; // 蜂鸣器
sbit led1 = P1^0; // LED灯
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
sbit led5 = P1^4;
sbit led6 = P1^5;
sbit led7 = P1^6;
sbit led8 = P1^7;
uchar code led_table[] = { // LED灯表格
0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f
};
uchar code num_table[] = { // 数字表格
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f
};
uchar key_value = 0; // 按键值
uchar current_floor = 1; // 当前楼层
uchar target_floor = 1; // 目标楼层
uchar flag = 0; // 标志位,用于判断是否到达目标楼层
uchar stop_flag = 0; // 停顿标志位,用于判断是否需要停顿
uchar delay_count = 0; // 延时计数器
uchar count = 0; // 计数器,用于控制电梯的运行速度
void delay(uint x) { // 延时函数
uint i, j;
for(i = x; i > 0; i--)
for(j = 110; j > 0; j--);
}
void display_num(uchar num) { // 数码管显示函数
P0 = num_table[num - 1];
delay(1);
}
void display_floor(uchar floor) { // 8x8LED点阵屏显示函数
uchar i;
for(i = 0; i < 8; i++) {
P0 = led_table[i];
P2 = ~(1 << floor - 1);
delay(1);
}
}
void beep_sound() { // 蜂鸣器响声函数
beep = 0;
delay(10);
beep = 1;
delay(10);
}
void run_elevator() { // 电梯运行函数
if(current_floor < target_floor) { // 上升
display_num(current_floor);
display_floor(current_floor);
led1 = 0;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
switch(current_floor) {
case 1: led1 = 1; break;
case 2: led2 = 1; break;
case 3: led3 = 1; break;
case 4: led4 = 1; break;
case 5: led5 = 1; break;
case 6: led6 = 1; break;
case 7: led7 = 1; break;
case 8: led8 = 1; break;
}
current_floor++;
count = 0;
}
else if(current_floor > target_floor) { // 下降
display_num(current_floor);
display_floor(current_floor);
led1 = 0;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
switch(current_floor) {
case 1: led1 = 1; break;
case 2: led2 = 1; break;
case 3: led3 = 1; break;
case 4: led4 = 1; break;
case 5: led5 = 1; break;
case 6: led6 = 1; break;
case 7: led7 = 1; break;
case 8: led8 = 1; break;
}
current_floor--;
count = 0;
}
else { // 到达目标楼层
display_num(current_floor);
display_floor(current_floor);
beep_sound();
flag = 1;
stop_flag = 1;
delay_count = 0;
}
}
void main() {
P0 = 0xff; // 数码管初始显示0
P2 = 0xff; // 8x8LED点阵屏初始显示空
beep = 1; // 蜂鸣器初始化为不响
while(1) {
key_value = P3; // 读取键盘阵列值
if(key_value != 0xff) { // 有键按下
delay(5); // 延时去抖
if(key_value != 0xff) { // 再次确认键是否按下
switch(key_value) {
case 0xfe: target_floor = 1; break;
case 0xfd: target_floor = 2; break;
case 0xfb: target_floor = 3; break;
case 0xf7: target_floor = 4; break;
case 0xef: target_floor = 5; break;
case 0xdf: target_floor = 6; break;
case 0xbf: target_floor = 7; break;
case 0x7f: target_floor = 8; break;
}
}
while(key_value != 0xff); // 等待键抬起
}
if(!flag && target_floor != current_floor && !stop_flag) { // 电梯未到达目标楼层,且没有停顿标志位
run_elevator(); // 运行电梯
}
if(flag && delay_count < 30) { // 电梯到达目标楼层,等待3秒
delay_count++;
if(delay_count == 30) {
flag = 0;
stop_flag = 0;
delay_count = 0;
}
}
if(flag && delay_count == 30) { // 电梯停顿3秒后,继续运行
if(target_floor > current_floor) { // 目标楼层在电梯上方
current_floor++;
count = 0;
}
else if(target_floor < current_floor) { // 目标楼层在电梯下方
current_floor--;
count = 0;
}
else { // 到达目标楼层
beep_sound();
flag = 1;
stop_flag = 1;
delay_count = 0;
}
}
if(count == 15) { // 控制电梯的运行速度
count = 0;
}
count++;
}
}
```
希望对您有所帮助。
阅读全文