C51寄存器点灯入门学习


doit_179885156444160
原创
发布时间: 2025-12-31 12:06:50 | 阅读数 0收藏数 0评论数 0
封面
本文以 N76E003 单片机为例,面向初学者讲解 C51 寄存器点灯控制。文章从 端口模式配置原理出发,详细说明如何通过 P1M1、P1M2 寄存器将 P1.2 配置为推挽输出模式,并结合 sbit 位操作直接控制 LED 的亮灭。通过示例程序展示 LED 闪烁实现方法,并介绍软件延时的基本使用。内容通俗易懂,帮助读者快速掌握 端口寄存器操作、位操作及简单调试流程,适合作为单片机入门实践教程。
1

前期准备

首先我们肯定是需要一个兼容80c51的板子,本人选择的是N76E003这块板子。如图所示

2

下载调试器

程序写得再完美,如果无法成功下载到板子中运行,那也只是纸上谈兵。对于 N76E003 这块开发板,其官方配套的下载调试器Nu-Link


要想程序成功下载,我们需要提前安装 两个驱动程序

这两个驱动通常会在购买开发板时由商家一并提供,如 图 2 所示。

安装这些驱动的目的,是为了:

  1. 保证 Keil 能正确识别 Nu-Link 下载调试器
  2. 确保程序能够稳定、正确地下载到单片机中

安装完成后,在 Keil 中即可看到对应的下载调试器设备,如 图 3 所示。


下面用我自己比较薄弱、但直观的理解来解释一下 为什么一定要安装下载调试驱动

首先,我们编写的程序是运行在上位机(电脑)中的,而单片机程序最终需要被烧录到开发板里运行。

那么问题来了:电脑如何把程序“送”进单片机?

这时,就需要一个“中间人”——也就是 下载调试器(Nu-Link),它负责在上位机单片机之间进行数据传递。

但下载调试器并不是“插上就会用”的,它要能正确理解上位机发送的程序数据,就必须:

  1. 上位机 ↔ 下载调试器
  2. 下载调试器 ↔ 单片机

双方都遵守同一套通信协议

下载调试驱动程序的作用,正是:

  1. 操作系统与下载调试器之间建立统一、正确的通信协议
  2. 从而保证 Keil 发送的程序数据,能被 Nu-Link 正确识别和解析
  3. 最终确保程序能够稳定、准确地下载到单片机中

只有在驱动、调试器、开发环境三者都正常工作的情况下,程序下载和调试才能顺利完成。


3

开始点灯

一、基本流程说明

  1. 配置端口为推挽输出模式
  2. 通过端口置 1 或清零控制 LED 的亮灭


二、N76E003 端口模式配置说明

N76E003 中,端口的工作模式由 PxM1PxM2 两个寄存器共同决定,具体对应关系如下:


PxM1.n

PxM2.n

I/O 类型

0

0

准双向

0

1

推挽输出

1

0

输入(高阻)

1

1

开漏

三、LED 所在端口分析

根据板子的原理图可以看到,LED 连接在 P1.2 端口。

因此,要将 P1.2 配置为推挽输出模式,需要:

  1. P1M1.2 = 0
  2. P1M2.2 = 1

这样即可使 P1.2 工作在推挽输出模式。

同时,从原理图可以确定:

  1. P1.2 = 1 → LED 熄灭
  2. P1.2 = 0 → LED 点亮

四、程序编写前需要明确的两个知识点

启动文件的重要性

无论是 51 单片机 还是 32 位 MCU,程序要正常运行都必须有启动文件。

因此,在 Keil 工程中需要在 Source Group 中添加:

  1. STARTUP.A51

该文件用于完成上电后的初始化并跳转到 main 函数。

51 单片机对寄存器和位操作的限制

51 单片机 中,有以下几点需要注意:

  1. 不能像 32 位 MCU 一样通过指针直接操作寄存器地址
  2. 所有特殊功能寄存器(SFR)都需要使用 sfr 进行定义
  3. 如果需要进行位操作
  4. 该位必须位于 0x80–0xFF 范围内
  5. 且地址必须以 0H 或 8H 结尾
  6. 此时需要使用 sbit 来定义和操作单个位


4

代码

// 位掩码定义:用于操作 P1 端口的第 2 位(BIT2)
#define SET_BIT2 0x04

// ---------------- 寄存器定义 ----------------
// P1 端口寄存器(地址 0x90)
sfr P1 = 0x90;

// P1 端口模式寄存器 1(地址 0xB3)
sfr P1M1 = 0xB3;

// P1 端口模式寄存器 2(地址 0xB4)
// 具体含义可参考芯片参考手册
sfr P1M2 = 0xB4;

// ---------------- 位定义 ----------------
// 定义 P1.2 位,用于直接操作 P1 端口的第 2 位
// 这是 51 系列单片机的固定写法
sbit P12 = P1 ^ 2;

int main(void)
{
// 软件延时用的循环变量
long i = 0;

// ---------------- 端口模式配置 ----------------
// 将 P1M1 的第 2 位清零
// 与 P1M2 配合,将 P1.2 配置为推挽输出模式
P1M1 &= ~SET_BIT2;

// 将 P1M2 的第 2 位置 1
// 配置 P1.2 为推挽输出
P1M2 |= SET_BIT2;

// ---------------- 主循环 ----------------
// 无限循环,实现 LED 闪烁
for (;;)
{
// P1.2 输出低电平,点亮 LED
P12 = 0;

// 简单的软件延时
for (i = 0; i < 50000; i++) {;}

// P1.2 输出高电平,熄灭 LED
P12 = 1;

// 简单的软件延时
for (i = 0; i < 50000; i++) {;}
}
}

阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载
pdf下载 举报