嵌入式学习 day44:51单片机入门

一、51单片机简介

51单片机是Intel 8051系列的统称,是一种经典的8位微控制器(MCU)。它内部集成了CPU、RAM、ROM、定时器、I/O接口等功能,适合用于嵌入式控制场景。虽然性能不如ARM,但胜在结构简单、资料丰富,是学习硬件开发的绝佳入门选择。

学习方法:通过C语言编写程序,控制单片机的I/O口输出高低电平,从而驱动LED灯、蜂鸣器、数码管等外设。

二、开发环境

  • 开发板:51单片机开发板(如STC89C52)

  • 编程语言:C51(标准C的扩展)

  • 寄存器头文件:reg52.h

三、位运算基础

在单片机编程中,位运算是最常用的操作方式。因为单片机的寄存器只有8位,每一位控制一个引脚,通过位运算可以精准地操作某一位而不影响其他位。

运算符 含义 在单片机中的典型用法
` ` 按位或
& ~ 按位与取反 将指定位清0(输出低电平)
^ 按位异或 翻转指定位(取反)
<< 左移 配合循环生成 (1<<n) 掩码
~ 取反 全部翻转,用于 P2 = ~P2

四、核心设计思路

4.1 P2端口与LED的对应关系

51单片机的P2端口有8个引脚(P2.0 ~ P2.7),每个引脚控制一个LED。写入 P2 = 0xFF(二进制 1111 1111)全部输出高电平,LED熄灭;写入 P2 = 0x00(二进制 0000 0000)全部输出低电平,LED点亮。开发板采用低电平点亮 设计,所以 0 代表亮,1 代表灭。

4.2 函数封装思路

将LED操作封装成独立模块,提高代码复用性:

  • led_init():P2全部置1,关闭所有LED

  • led_on(mask):P2 &= ~mask,将指定位清零点亮

  • led_off(mask):P2 |= mask,将指定位置1熄灭

  • led_nor(mask):P2 ^= mask,翻转指定位状态

  • led_on_all():P2=0x00,全部点亮

  • led_off_all():P2=0xFF,全部熄灭

  • led_nor_all():P2 = ~P2,全部翻转

4.3 流水灯实现思路

  1. 用 delay() 函数实现软件延时(通过循环消耗CPU时间)

  2. 循环执行 led_on(1 << i),逐个点亮LED

  3. 先正向(0→7)再反向(7→0),形成往返流动效果

  4. 每次点亮后调用 delay() 保持可见时间,然后用 led_init() 全部熄灭再点亮下一个

五、今日总结

今天学了51单片机LED控制,核心要点如下:

  1. 单片机编程本质:通过C语言操作寄存器控制硬件引脚的电平状态

  2. 位运算是硬件控制的基石 :\| 置1、& ~ 清0、^ 翻转、<< 移位

  3. P2端口控制:8个引脚对应8个LED,0x00全部点亮,0xFF全部熄灭(低电平点亮)

  4. 软件延时:通过循环计数实现可见的时间延迟

  5. 流水灯逻辑:循环移位 + 延时,逐个点亮LED形成流动效果

相关推荐
旖旎夜光24 分钟前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
叼烟扛炮6 小时前
[LangChain] 学习笔记(07):大模型长出手脚——工具(Tools)定义与调用闭环
笔记·学习·langchain
叼烟扛炮10 小时前
[LangChain] 学习笔记(06):突破大模型限制——结构化输出(Structured Output)
windows·笔记·学习·langchain
且从容.11 小时前
VUE3学习笔记(根据黑马教程总结)
笔记·学习
Industio_触觉智能12 小时前
RK3506 Buildroot系统目录地图-上|7个关键符号链接与构建产物全解析
嵌入式硬件·sdk·智能硬件·固件·瑞芯微·系统编译·rk3506
蒸蒸yyyyzwd13 小时前
关于 AI 开发相关的一些面经。
笔记·学习
lzj_pxxw15 小时前
STM32移植FreeRTOS(Cmake+CubeMX)
vscode·stm32·嵌入式硬件
물の韜16 小时前
ZYNQ/FMQL系列Linux之I2C开发实战
linux·arm开发·嵌入式硬件·设备树·iic·zynq
坤坤子吖19 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
无敌贵点大王19 小时前
从寄存器层面重学STM32(7)——定时器
stm32·单片机·嵌入式硬件