在 8051 入门实验里,“开关控制 LED”几乎是最常见的一步,但真正上手时,很多人卡在 8255 应该怎么配、控制字为什么写成 0x90,以及程序里每一行到底在完成什么。本文把这个仿真实验按“目标功能—端口配置—主循环逻辑”重新整理,保留原始代码和关键地址,帮助你判断这套方案是如何把开关输入直接映射到 LED 输出的。
实验要实现什么
这个实验的目标并不复杂:使用 8051 系列单片机,通过拨动开关的状态变化,去直接控制一组 LED 的亮灭。
为了完成这个过程,核心器件不是单片机本身,而是 8255 可编程并行接口芯片。8255 具备多种工作模式,这里只用到最基础的输入输出模式。原因很直接:本实验只需要把开关状态读进来,再把同样的数据送到 LED 对应的输出口,不涉及更复杂的握手或中断控制。
按这个思路,仿真的重点可以归纳为两件事:
- 把连接拨动开关的端口设成输入口;
- 把连接 LED 的端口设成输出口,并让输出实时跟随输入变化。
8255 如何与 8051 连接并完成端口配置
程序首先要解决的是 8051 如何访问 8255。原代码通过 XBYTE 方式,把 8255 的控制寄存器、A 口和 B 口映射到外部数据存储器地址空间中:

#include <reg51.h>
#include <stdio.h>
#include <absacc.h>
#define C8255 XBYTE[0x9006]
#define PA8255 XBYTE[0x9000]
#define PB8255 XBYTE[0X9002]
这里有三个地址需要先看明白:
C8255对应0x9006,用于写入 8255 的控制字;PA8255对应0x9000,表示 8255 的 A 口;PB8255对应0X9002,表示 8255 的 B 口。
这一步的意义,是先把“芯片上的寄存器”变成“程序里可直接读写的变量”。后面无论是设置工作模式,还是读取开关、输出到 LED,都是围绕这几个宏定义展开的。
控制字 0x90 表示什么
实验中的关键配置语句是:
C8255=0x90;
这条语句向 8255 的控制寄存器写入 0x90,用于设置各端口的输入输出方向。按照原实验说明,这个控制字会让:
- A 口处于输入模式;
- B 口处于输出模式;
- C 口上半部分为输入;
- C 口下半部分为输出。
对当前实验来说,最重要的是前两项:A 口接拨动开关,所以必须能读;B 口接 LED,所以必须能写。只要这个方向配置正确,后面的“输入状态直接复制到输出口”才有意义。
为什么程序里还要加入延时
原代码没有直接在读取后立刻无限高速刷新,而是加入了一个简单的延时函数:
void delay(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
这段延时通过空循环实现,结构很简单,但在这种低速控制实验里已经够用。它主要起两个作用:
- 让拨动开关的状态读取更稳定,减少机械抖动带来的误判;
- 避免 LED 因为采样过快而出现不稳定闪烁,方便在仿真中观察结果。
这里的 delay(100); 并不是精确定时方案,也不适合更复杂的实时控制场景,但放在这个“输入跟随输出”的基础实验中,足够完成演示目的。
主循环怎样实现“开关状态同步到 LED”
真正完成控制的是主函数里的初始化和循环逻辑:

void main(void)
{
unsigned char data1;
C8255=0x90;
while(1)
{
data1=PA8255;
PB8255=data1;
delay(100);
}
}
这一段可以按执行顺序拆开理解:
1. 先初始化 8255 工作方式
程序启动后,首先执行 C8255=0x90;,把 8255 设置成当前实验需要的端口方向。没有这一步,A 口和 B 口的读写关系就不能按预期工作。
2. 从 A 口读取拨动开关状态
data1=PA8255; 的作用,就是把 A 口当前电平状态读入变量 data1。由于 A 口连接的是拨动开关,所以这个变量保存的就是开关当前的组合状态。
3. 把读到的数据原样送到 B 口
PB8255=data1; 把刚刚读到的内容直接写给 B 口。因为 B 口连接的是 LED,LED 的亮灭状态就会跟随 data1 一起变化。
换句话说,这里没有额外判断、没有位运算转换,也没有复杂控制逻辑,而是最直接的一种“输入映射输出”:开关是什么状态,LED 就显示什么状态。
4. 通过死循环实现实时刷新
while(1) 让程序持续重复“读取 A 口—写入 B 口—短暂延时”这三个动作。因此,只要拨动开关状态发生变化,LED 也会在下一轮循环中同步改变,实现实时控制效果。
这个实验能帮助你理解什么
从结果上看,这只是一个简单的灯控实验;但从学习路径上看,它把 8051 外扩 I/O 的几个基础点串了起来:如何通过地址映射访问 8255、如何设置控制字、以及如何把输入口数据直接送到输出口。
如果你在仿真里已经能稳定实现“拨动开关变,LED 跟着变”,说明你已经掌握了 8255 在最基础输入输出模式下的使用方法。后续再做按键检测、流水灯、数码管驱动,或者更复杂的端口联动,都会更容易上手。









