3. 特殊功能寄存器(SFR)的位操作

特殊功能寄存器(SFR)的位操作 学习卡片

任务说明

本案例以8051单片机为对象,通过直接地址和位寻址两种方式操作特殊功能寄存器(SFR),实现LED闪烁控制。你需要理解SFR在内部RAM高128字节区域的映射关系,并掌握用C语言关键字sfr和sbit声明SFR及其可位寻址位的方法。最终通过控制P1口(直接地址0x90)和P1.0位(位地址0x90)实现LED的定时亮灭。

SFR映射与位寻址原理

8051的SFR区位于内部RAM地址0x80~0xFF,其中地址能被8整除的SFR支持位寻址。P1口地址为0x90,其最低位P1.0的位地址为0x90(字节地址与位地址恰好相同)。操作SFR有两种方式:直接地址方式通过字节读写控制整个端口;位寻址方式通过sbit声明后单独操作某一位,不影响其他引脚状态。本案例中LED接在P1.0引脚,通过交替置位和清零该位实现闪烁。

硬件连接

8051 P1.0 (位地址0x90) P1口 (字节地址0x90) SFR区: 0x80~0xFF P1.0 330Ω LED GND P1.0输出高电平→LED灭 P1.0输出低电平→LED亮 P1.0位地址: 0x90 P1字节地址: 0x90

LED正极经限流电阻接P1.0,负极接地。P1.0输出低电平时LED点亮,输出高电平时熄灭。

代码实现

以下代码同时演示直接地址和位寻址两种方式。主循环中先使用P1 = 0xFF直接地址方式将整个P1口置高(LED灭),延时后使用位寻址P1_0 = 0将P1.0清零(LED亮),再延时。两种方式交替操作同一引脚,实现闪烁。


#include <reg51.h>

// 位寻址声明:P1.0对应位地址0x90
sbit P1_0 = P1^0;

// 直接地址方式声明(reg51.h已定义,此处仅为演示)
// sfr P1 = 0x90;

// 简单延时函数(12MHz晶振下约延时100ms)
void delay(void) {
    unsigned int i, j;
    for (i = 0; i < 100; i++)
        for (j = 0; j < 500; j++);
}

void main(void) {
    while (1) {
        // 方式1:直接地址操作,P1口全部输出高电平,LED灭
        P1 = 0xFF;
        delay();

        // 方式2:位寻址操作,P1.0输出低电平,LED亮
        P1_0 = 0;
        delay();
    }
}

编译与烧录

使用Keil C51或SDCC编译上述代码,生成HEX文件。以Keil为例:新建工程选择Atmel AT89C51或兼容芯片,添加源文件,在Options for Target中勾选"Create HEX File",编译后生成.hex文件。使用STC-ISP或USB转串口烧录器将HEX文件写入单片机。

验证方法

将程序烧录至单片机并上电运行,观察LED是否以约100ms间隔闪烁。若LED持续点亮或持续熄灭,检查P1.0与LED连接是否正确,以及延时函数参数是否合适。判定标准:LED以肉眼可辨的稳定频率交替亮灭,说明直接地址和位寻址操作均生效。可通过修改delay()循环次数改变闪烁频率,验证程序对时序的控制能力。