51单片机实训4:独立按键控制LED 📅 2026/7/8 12:37:23 一、实训项目与目标实训项目独立按键控制LED实训目标熟悉PROTEUS软件和KEIL C软件界面。熟悉在PROTEUS软件中连接单片机电路图。熟悉在KEIL C软件中编写单片机控制程序。学会在PROTEUS软件和KEIL C软件联调单片机控制程序。掌握独立键盘的设计控制过程。二、设备与耗材设备工具计算机一台实训耗材暂无耗材三、实训内容及过程1. 熟悉PROTEUS与KEIL C软件首先分别打开PROTEUS和KEIL C软件熟悉其基本界面、菜单栏、工具栏和项目管理方式。2. 在PROTEUS中绘制电路图在PROTEUS软件中连接独立按键控制LED的单片机电路图。典型电路包括AT89C51单片机最小系统晶振、复位电路8个独立按键一端接地另一端分别接P0口的8个引脚8个LED阳极通过限流电阻接VCC阴极分别接P1口的8个引脚确保电路连接正确为后续程序仿真做好准备。电路图示例为增强文章直观性可在此处插入一张PROTEUS仿真电路图的截图。图片应清晰展示以下核心元件及其连接关系AT89C51单片机位于电路图中心连接晶振和复位电路构成最小系统。独立按键8个按键一端接地另一端分别连接到P0口的P0.0-P0.7引脚。LED8个发光二极管阳极通过220Ω限流电阻接VCC5V阴极分别连接到P1口的P1.0-P1.7引脚。电阻LED的限流电阻通常220Ω以及可能的上拉/下拉电阻。通过截图可以直观展示按键与P0口、LED与P1口的对应连接关系帮助读者快速理解硬件电路设计。3. 在KEIL C中编写控制程序在KEIL C软件中新建工程选择AT89C51单片机编写独立按键控制LED的程序。核心代码如下#include reg51.h void delay10ms() { unsigned int i, j; for(i 0; i 100; i) for(j 0; j 120; j); } void main() { //主函数 unsigned char x; P0 0xff; //P0口作为输入口置全1内部上拉 P1 0xff; //P1口作为输出口初始全灭高电平 x 0; while(1) { while(x 0) { //循环判断是否有键按下 x P0; //读键盘状态 x ~x; //键盘状态取反按下为1 } delay10ms(); //延时10ms去抖动 x P0; //再次读键盘状态 x ~x; //键盘状态取反 if(x 0) continue; //如果无键按下则认为是按键抖动重新扫描键盘 switch(x) { //根据键值点亮对应的发光二极管 case 0x01: P1 0xfe; break; //点亮第一个发光二极管P1.0低电平 case 0x02: P1 0xfd; break; //点亮第二个发光二极管P1.1低电平 case 0x04: P1 0xfb; break; //点亮第三个发光二极管P1.2低电平 case 0x08: P1 0xf7; break; //点亮第四个发光二极管P1.3低电平 case 0x10: P1 0xef; break; //点亮第五个发光二极管P1.4低电平 case 0x20: P1 0xdf; break; //点亮第六个发光二极管P1.5低电平 case 0x40: P1 0xbf; break; //点亮第七个发光二极管P1.6低电平 case 0x80: P1 0x7f; break; //点亮第八个发光二极管P1.7低电平 default: break; } } }程序说明P0口设置为输入内部上拉按键按下时对应引脚被拉低。通过~x取反将按键按下低电平转换为逻辑1便于判断。使用delay10ms()函数进行按键消抖。根据读取的键值x控制P1口相应引脚输出低电平点亮对应的LED。4. 联调与观察效果在PROTEUS软件中加载编译生成的HEX文件启动仿真。依次按下各个独立按键观察对应的LED是否被点亮。如未达到预期效果需检查电路连接是否正确按键、LED极性、限流电阻程序逻辑是否有误端口定义、消抖处理、键值判断KEIL C工程配置单片机型号、晶振频率反复调试直至实现独立按键对LED的准确控制。四、思考题问题如果要同时按下第一、二两个按钮来点亮D1第一个LED如何实现思路提示修改键值判断逻辑将case语句中的条件改为检测两个按键同时按下的组合键值例如case 0x03:并执行点亮D1的操作P1 0xfe;。参考答案要实现同时按下第一、二两个按钮P0.0和P0.1点亮D1P1.0可以在switch语句中增加一个组合键值的判断。具体实现方法如下// 在switch语句中增加组合键值判断 switch(x) { //根据键值点亮对应的发光二极管 case 0x01: P1 0xfe; break; //按下第一个按键点亮D1 case 0x02: P1 0xfd; break; //按下第二个按键点亮D2 case 0x03: P1 0xfe; break; //同时按下第一、二个按键点亮D1 case 0x04: P1 0xfb; break; //点亮第三个发光二极管P1.2低电平 case 0x08: P1 0xf7; break; //点亮第四个发光二极管P1.3低电平 case 0x10: P1 0xef; break; //点亮第五个发光二极管P1.4低电平 case 0x20: P1 0xdf; break; //点亮第六个发光二极管P1.5低电平 case 0x40: P1 0xbf; break; //点亮第七个发光二极管P1.6低电平 case 0x80: P1 0x7f; break; //点亮第八个发光二极管P1.7低电平 default: break; }代码说明当同时按下P0.0和P0.1时P0口读取的值为0xFC二进制11111100。经过~x取反后键值x变为0x03二进制00000011。在switch语句中增加case 0x03:分支执行P1 0xfe;操作使P1.0输出低电平点亮D1。也可以使用if语句实现if(x 0x03) { P1 0xfe; }。五、实训总结请在此处填写本次实训的收获、遇到的问题及解决方法、对独立按键控制LED原理的理解等。