在51单片机上完成一个八层楼的电梯模拟项目的简单的示例代码 其要求如下 1、使用键盘阵列模拟电梯按键 S1按键代表5层 S2按键代表6层 S3按键代表7层 S4按键代表8层 S5按键代表1层 S6按键代表2层 S7按键代表3层 S8按键代表4层 S13按键代表确认 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 14:05:24 浏览: 24
以下是示例代码: ```c #include <reg52.h> sbit beep = P2^3; // 定义蜂鸣器端口 sbit key_confirm = P3^2; // 定义确认键端口 sbit led_top = P1^0; // 定义最高层LED灯端口 sbit led_bottom = P1^7; // 定义最低层LED灯端口 unsigned char key; // 保存按键值 unsigned char target_floor; // 目标楼层 unsigned char current_floor = 1; // 当前楼层 unsigned char led_value = 0x01; // LED灯值 unsigned char dot_matrix[8] = {0x7f, 0x41, 0x5d, 0x5b, 0x79, 0x6b, 0x6f, 0x49}; // 数码管0-7的编码 // 数码管扫描函数 void display(unsigned char floor) { unsigned char i; for (i = 0; i < 8; i++) { P2 = i; // 先选择行 P0 = dot_matrix[floor-1]; // 再输出列 delay_ms(2); // 延时一段时间 P0 = 0xff; // 关闭所有列 } } // LED灯扫描函数 void led_scan(unsigned char floor) { switch (floor) { case 1: led_value = 0x01; break; case 2: led_value = 0x03; break; case 3: led_value = 0x07; break; case 4: led_value = 0x0f; break; case 5: led_value = 0x1f; break; case 6: led_value = 0x3f; break; case 7: led_value = 0x7f; break; case 8: led_value = 0xff; break; default: break; } P1 = led_value; } // 延时函数 void delay_ms(unsigned int i) { unsigned int j, k; for (j = 0; j < i; j++) for (k = 0; k < 125; k++); } // 按键扫描函数 unsigned char key_scan() { unsigned char key_value = 0xff; unsigned char i, j; for (i = 0; i < 4; i++) { P3 = ~(0x01 << i); // 依次扫描4行 j = P3 & 0x0f; // 读取4列的值 if (j != 0x0f) // 判断是否有按键按下 { delay_ms(5); // 延时一段时间 j = P3 & 0x0f; // 再次读取4列的值 if (j != 0x0f) // 再次判断是否有按键按下 { switch (j) { case 0x0e: key_value = i*4+1; break; // 按键S5 case 0x0d: key_value = i*4+2; break; // 按键S6 case 0x0b: key_value = i*4+3; break; // 按键S7 case 0x07: key_value = i*4+4; break; // 按键S8 case 0x0e: key_value = 13; break; // 按键S13 default: break; } } } } return key_value; } // 检查是否有目标楼层 unsigned char has_target_floor() { unsigned char i; for (i = 1; i <= 8; i++) { if ((target_floor & 0x01 << (i-1)) != 0) return 1; } return 0; } // 电梯运行函数 void elevator_run() { if (current_floor < target_floor) // 电梯向上运行 { while (current_floor < target_floor) { current_floor++; led_scan(current_floor); display(current_floor); beep = 0; // 蜂鸣器响 delay_ms(100); beep = 1; // 蜂鸣器停止响 delay_ms(400); } } else if (current_floor > target_floor) // 电梯向下运行 { while (current_floor > target_floor) { current_floor--; led_scan(current_floor); display(current_floor); beep = 0; // 蜂鸣器响 delay_ms(100); beep = 1; // 蜂鸣器停止响 delay_ms(400); } } else // 电梯已到达目标楼层 { beep = 0; // 蜂鸣器响 delay_ms(100); beep = 1; // 蜂鸣器停止响 delay_ms(400); } target_floor &= ~(0x01 << (current_floor-1)); // 清除当前楼层的目标楼层 } void main() { while (1) { key = key_scan(); // 扫描按键 if (key != 0xff && key != 13 && (target_floor & 0x01 << (key-1)) == 0) // 如果按键有效且目标楼层中没有该楼层 { target_floor |= 0x01 << (key-1); // 将该楼层添加到目标楼层中 led_scan(key); // 更新LED灯状态 } if (key_confirm == 0 && has_target_floor()) // 如果确认键按下且有目标楼层 { while (has_target_floor()) // 重复运行直到所有目标楼层到达 { if ((target_floor & 0xff) == 0) // 如果目标楼层中只有高层楼层 { target_floor >>= 8; // 将目标楼层向右移8位,即向下运行 current_floor = 8; // 当前楼层设为最高层 } else // 否则先向上运行到最高目标楼层再向下运行到最低目标楼层 { target_floor >>= 1; // 将目标楼层向右移1位 while ((target_floor & 0x01) == 0) // 找到最高目标楼层 { target_floor >>= 1; current_floor++; } elevator_run(); // 运行到最高目标楼层 while ((target_floor & 0xff) != 0) // 找到最低目标楼层 { target_floor >>= 1; current_floor--; } } elevator_run(); // 运行到最低目标楼层 } } display(current_floor); // 更新数码管显示 } } ```

相关推荐

在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、电梯运行过程中按键不起作用。

最新推荐

recommend-type

基于51单片机的电梯控制器设计方案.doc

基于51单片机的电梯控制器设计方案,本方案基本功能已具备,电梯内有各楼层按钮和紧急呼叫按钮和开关门提示音以及警报声,各楼层有上下行按钮,希望各位能够采纳,个人所作,学校课程要求。
recommend-type

51单片机单中断多按键的应用.doc

在单片机的按键编程中,有时会遇到一个问题,用多个按键来控制多个死循环,而程序一旦进入循环就跳不出来,此时会想到用中断,而普通单片机一般只有2个外部中断,stc系列的查了一下最多也只有5个外部中断,那要是...
recommend-type

51单片机整数二一十进制转换的快速算法

无论是与传统汇编语言子程序,还是与使用sprintf()函数的程序相比,快速算法都有很大的速度优势;是一种针对8位机的创新算法,具有很强的工程实用性,值得推广应用。
recommend-type

单片机与DSP中的利用单片机实现的模拟信号和数字信号单线混合传输

信号传输在现代工程中是很重要的一个技术环节,通常使用多芯电缆将模拟信号和数字信号独立多线传输。但在信号传输中,数字信号将对模拟信号产生干扰,不得不采用互相屏蔽的多芯缆来降低干扰。这样不仅使电缆的线径和...
recommend-type

基于STC15W204S单片机模拟单总线EEPROM芯片DS2431

基于STC15W204S单片机研究模拟了单总线EEPROM芯片DS2431。SOP8封装的STC15W204S...主要介绍了1Wire通信协议、单片机模拟芯片硬件电路、单片机模拟DS2431的程序设计流程、单片机模拟DS2431的64位光刻以及EEPROM。
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章

![:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章](https://img-blog.csdnimg.cn/img_convert/69b98e1a619b1bb3c59cf98f4e397cd2.png) # 1. 目标检测算法概述 目标检测算法是一种计算机视觉技术,用于识别和定位图像或视频中的对象。它在各种应用中至关重要,例如自动驾驶、视频监控和医疗诊断。 目标检测算法通常分为两类:两阶段算法和单阶段算法。两阶段算法,如 R-CNN 和 Fast R-CNN,首先生成候选区域,然后对每个区域进行分类和边界框回归。单阶段算法,如 YOLO 和 SSD,一次性执行检
recommend-type

ActionContext.getContext().get()代码含义

ActionContext.getContext().get() 是从当前请求的上下文对象中获取指定的属性值的代码。在ActionContext.getContext()方法的返回值上,调用get()方法可以获取当前请求中指定属性的值。 具体来说,ActionContext是Struts2框架中的一个类,它封装了当前请求的上下文信息。在这个上下文对象中,可以存储一些请求相关的属性值,比如请求参数、会话信息、请求头、应用程序上下文等等。调用ActionContext.getContext()方法可以获取当前请求的上下文对象,而调用get()方法可以获取指定属性的值。 例如,可以使用 Acti
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。