news 2026/2/7 3:35:11

嵌入式基础学习(硬件)(51)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式基础学习(硬件)(51)

一、嵌入式系统基础

1. 嵌入式系统定义

  • 核心概念:以应用为中心,以计算机技术为基础,软硬件可裁剪的专用计算机系统

  • 特点:专用性、实时性、可靠性、低功耗、小型化

2. 51单片机发展历程

  • 1980年:Intel公司推出MCS-51系列(8051型号单片机)

  • 主要生产商

    • Atmel → AT89C51

    • Philips → P89V51(支持ISP在线编程)

    • STC(宏晶半导体)→ STC89C51/52/52RC系列


二、核心概念辨析

缩写全称功能与特点应用场景
MCU微控制器集成CPU、RAM、ROM、IO、定时器、中断系统等简单控制、成本敏感
CPU中央处理器数据运算、指令处理通用计算
MPU微处理器仅CPU,需外接存储与外设复杂系统、可运行Linux
GPU图像处理单元图形数据处理、图像渲染图形显示、游戏
NPU神经网络处理单元AI推理、神经网络加速人工智能、图像识别
FPU浮点数单元浮点数运算(IEEE754)科学计算
SOC片上系统集成多个功能芯片智能手机、物联网
ROM只读存储器存储程序,掉电不丢失固件存储
RAM随机存储器存储运行变量,掉电丢失(51单片机为256字节)临时数据存储

三、51单片机硬件架构

1. 内部资源

  • CPU(8位)

  • 片内RAM(256字节)

  • 片内ROM(4KB-64KB)

  • 4个8位I/O口(P0、P1、P2、P3)

  • 2个定时器/计数器

  • 1个全双工串口

  • 中断系统(5个中断源)

2. 引脚结构

  • DIP40封装:40个引脚双列直插

  • 引脚分组

    • P0口(P0.0-P0.7):双向I/O,开漏输出

    • P1口(P1.0-P1.7):准双向I/O

    • P2口(P2.0-P2.7):准双向I/O

    • P3口(P3.0-P3.7):多功能口(兼有第二功能)

3. 网络编号概念

  • 相同网络编号的引脚在电路板上实际连通

  • 简化原理图连线,提高可读性


四、外设控制原理

1. 发光二极管(LED)

  • 单向导通性:电流只能从阳极流向阴极

  • 共阳极接法

    • 所有LED阳极接VCC

    • 阴极接单片机引脚

    • 点亮条件:引脚输出低电平(0V)

  • 控制原理:通过控制I/O口电平控制LED亮灭

2. 数码管显示

  • 类型:4位共阴极数码管

  • 显示原理:先位选,再段选

    • 位选:选择显示哪一位数码管(P1.0-P1.3控制)

    • 段选:选择显示哪些段(P0口控制段码)

  • 动态显示

    • 利用视觉暂留效应(余晖效应)

    • 快速切换显示不同位数码管

    • 实现多位同时显示的视觉效果


五、位运算与C51专用函数

1. 基本位运算

运算符号特性应用场景
按位或|有1则为1指定位置1
按位与&全1则为1指定位置0
按位异或^相同为0,不同为1电平翻转
按位取反~逐位取反配合其他运算

2. 位操作示例

c

// 位操作示例代码 #include <reg52.h> void main() { unsigned char t = 0x00; // 初始化为0000 0000 // 将bit0置1,其余位不变 t |= (1 << 0); // 0000 0001 // 将bit7清0 t &= ~(1 << 7); // 0111 1111(假设t原本是1111 1111) // 同时操作多个位 t |= (1 << 0) | (1 << 3); // bit0和bit3置1 t &= ~((1 << 2) | (1 << 5)); // bit2和bit5清0 }

3. C51专用库函数:_crol_()详解

  • 函数原型unsigned char _crol_(unsigned char val, unsigned char n);

  • 头文件#include <intrins.h>(Keil C51编译器特有)

  • 功能:将变量val的二进制位向左循环移动n

  • 循环移位特点:移出的高位不会丢失,而是补回到低位

普通左移 vs 循环左移对比
操作类型示例结果(二进制)说明
普通左移0x81 << 10000 0010(0x02)高位丢弃,低位补0
循环左移_crol_(0x81, 1)0000 0011(0x03)高位补到低位
相关函数家族
函数功能适用数据类型
_cror_()循环右移unsigned char
_irol_()整数循环左移unsigned int
_iror_()整数循环右移unsigned int
_lrol_()长整数循环左移unsigned long
_lror_()长整数循环右移unsigned long
手动实现循环左移
// 自定义循环左移函数 unsigned char my_crol(unsigned char val, unsigned char n) { n %= 8; // 确保移位不超过8位 return (val << n) | (val >> (8 - n)); }

六、开发实战示例

1. 流水灯程序(使用_crol_()函数)

/** * 流水灯程序示例 * 使用P2口控制8个LED,实现循环左移效果 */ #include <reg52.h> #include <intrins.h> // 必须包含此头文件以使用_crol_()函数 // 简单延时函数 void delay(unsigned int t) { while(t--); // 空循环实现延时 } void main() { unsigned char led = 0xFE; // 1111 1110,初始状态:最低位LED亮 while(1) { P2 = led; // 输出到P2口控制8个LED delay(50000); // 延时一段时间 led = _crol_(led, 1); // 循环左移1位 // 移位过程说明: // 初始:1111 1110 → LED0亮 // 第1次:1111 1101 → LED1亮 // 第2次:1111 1011 → LED2亮 // ... // 第7次:0111 1111 → LED7亮 // 第8次:1111 1110 → 回到LED0,形成循环 } }

2. 数码管动态显示程序

/** * 数码管动态显示程序 * 在4位数码管上显示"1234" */ #include <reg52.h> // 共阴极数码管段码表(0-9) unsigned char code seg_table[] = { 0x3F, // 0 - 显示段码 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F // 9 }; // 位选控制(P1.0~P1.3) unsigned char code bit_table[] = { 0xFE, // 1111 1110 - 选中第1位数码管 0xFD, // 1111 1101 - 选中第2位数码管 0xFB, // 1111 1011 - 选中第3位数码管 0xF7 // 1111 0111 - 选中第4位数码管 }; // 显示缓冲区,存储要显示的数字 unsigned char display_buffer[] = {1, 2, 3, 4}; // 简单延时函数 void delay(unsigned int t) { while(t--); } void main() { unsigned char i; while(1) { for(i = 0; i < 4; i++) { P1 = bit_table[i]; // 选择第i位数码管 P0 = seg_table[display_buffer[i]]; // 输出段码 delay(200); // 短暂延时 P0 = 0x00; // 消隐,避免重影 } } }

3. 进阶练习:双向流水灯

/** * 双向流水灯程序 * 通过变量控制流水方向 */ #include <reg52.h> #include <intrins.h> bit direction = 0; // 0:左移,1:右移(位变量) void delay(unsigned int t) { while(t--); } void main() { unsigned char led = 0xFE; // 初始状态:1111 1110 while(1) { P2 = led; // 输出到P2口 delay(50000); // 延时 // 根据方向选择移位方式 if(direction == 0) { led = _crol_(led, 1); // 向左流水 } else { led = _cror_(led, 1); // 向右流水 } // 在实际应用中,可以通过按键改变direction值实现方向切换 // 例如:当检测到按键按下时,direction = !direction; } }

七、开发流程详解

1. 开发环境配置流程

步骤操作说明
1安装Keil4软件开发环境安装
2创建新工程点击Project → New Project
3选择单片机型号如Atmel → AT89C51
4添加源文件将.c文件添加到Source Group1
5配置生成选项勾选"Create HEX File"
6编写代码编写单片机程序
7编译程序点击Build按钮编译
8下载程序使用ISP软件下载到单片机

2. 程序下载步骤

  1. 硬件连接:使用串口线连接开发板和电脑

  2. 查看端口:在设备管理器中查看COM端口号

  3. 打开ISP软件:如STC-ISP

  4. 选择型号:如STC89C52RC

  5. 选择串口:选择对应的COM端口

  6. 打开HEX文件:加载编译生成的HEX文件

  7. 点击下载:点击"下载/编程"按钮

  8. 重启开发板:将开发板复位

  9. 观察现象:查看硬件运行效果

3. 调试工具使用

工具用途连接方式
逻辑分析仪观察引脚电平变化波形CH0-CH7接单片机引脚,GND共地
万用表测量电压、电流、通断根据测量需求连接
示波器观察模拟信号波形探头接地和信号点

八、常见问题与解决方案

1. LED相关问题

问题现象可能原因解决方案
LED不亮引脚电平设置错误检查共阳极/共阴极接法,调整电平
LED亮度异常限流电阻值不当调整电阻值(通常220Ω-1kΩ)
LED闪烁不稳定程序延时不当调整延时时间或使用定时器
多个LED同时亮引脚短路或程序错误检查硬件连接和程序逻辑

2. 数码管相关问题

问题现象可能原因解决方案
显示重影未消隐或消隐时间不足增加消隐代码和延时
亮度不均位选时间不一致确保每位显示时间相同
闪烁明显刷新频率过低提高刷新频率(>60Hz)
显示错误数字段码表错误检查段码表数据

3. 程序下载问题

问题现象可能原因解决方案
无法连接单片机串口驱动未安装安装CH340/CH341驱动
下载失败单片机型号选择错误选择正确的单片机型号
下载速度慢波特率设置过高降低下载波特率
下载后无反应晶振未工作检查晶振电路和单片机供电

九、重点知识点总结

1. 核心概念记忆点

概念类别关键点记忆技巧
MCU vs CPUMCU集成度高,CPU只负责运算"MCU=单片机,CPU=电脑心脏"
共阳极LED阳极接VCC,阴极接引脚,低电平点亮"共阳:高电平不亮,低电平亮"
动态显示利用视觉暂留,快速切换显示"轮流显示,骗过眼睛"
位运算与(&)清0,或()置1,异或(^)翻转"与0清0,或1置1"

2. 编程关键技巧

  • 使用位运算高效操作I/O口

  • 掌握_crol_()等C51专用函数

  • 理解延时函数的编写与优化

  • 学会数码管的动态显示原理

3. 硬件理解要点

  • 理解NPN三极管的导通条件

  • 掌握上拉/下拉电阻的作用

  • 熟悉电源与接地的正确连接方法

  • 了解信号完整性的基本概念

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/6 16:37:28

【嵌入式安全专家忠告】:C语言裸机程序必须规避的8类高危编程行为

第一章&#xff1a;C语言裸机程序安全加固概述在嵌入式系统开发中&#xff0c;C语言因其高效性和对硬件的直接控制能力被广泛用于裸机&#xff08;Bare-metal&#xff09;编程。然而&#xff0c;缺乏操作系统提供的安全机制使得这类程序更容易受到缓冲区溢出、空指针解引用和未…

作者头像 李华
网站建设 2026/2/6 13:14:38

使用Mock对象模拟依赖的实用技巧

在软件测试中&#xff0c;Mock对象是一种模拟外部依赖的工具&#xff0c;它允许测试人员隔离被测代码&#xff08;Unit Under Test&#xff09;&#xff0c;避免真实依赖&#xff08;如网络请求或数据库&#xff09;带来的不确定性。这不仅能加速测试执行&#xff0c;还能提高测…

作者头像 李华
网站建设 2026/2/6 17:36:11

【医疗设备C语言安全编码实战】:揭秘高风险漏洞根源及防护策略

第一章&#xff1a;医疗设备C语言安全编码概述在医疗设备软件开发中&#xff0c;C语言因其高效性和对硬件的直接控制能力被广泛采用。然而&#xff0c;其缺乏内置的安全机制也带来了潜在风险&#xff0c;尤其是在内存管理、数据类型处理和边界检查方面。由于医疗设备直接关系到…

作者头像 李华
网站建设 2026/2/4 16:57:34

【多解释器并发调度核心原理】:揭秘Python中GIL瓶颈下的高效并行方案

第一章&#xff1a;多解释器并发调度的核心概念在现代编程语言运行时环境中&#xff0c;多解释器并发调度是一种支持多个独立解释器实例并行执行的机制。它允许在同一进程中隔离不同解释器的状态&#xff0c;从而实现更细粒度的并发控制与资源管理&#xff0c;尤其适用于需要高…

作者头像 李华
网站建设 2026/2/5 4:31:52

零基础入门Qwen3-VL-2B-Instruct:手把手教你搭建AI视觉助手

零基础入门Qwen3-VL-2B-Instruct&#xff1a;手把手教你搭建AI视觉助手 1. 学习目标与背景介绍 1.1 为什么选择 Qwen3-VL-2B-Instruct&#xff1f; 在多模态大模型快速发展的今天&#xff0c;视觉语言模型&#xff08;Vision-Language Model, VLM&#xff09; 正在成为连接人…

作者头像 李华
网站建设 2026/2/7 5:33:20

开源大模型落地:GLM-4.6V-Flash-WEB企业级应用

开源大模型落地&#xff1a;GLM-4.6V-Flash-WEB企业级应用 智谱最新开源&#xff0c;视觉大模型。 1. 背景与技术定位 1.1 视觉大模型的演进趋势 近年来&#xff0c;多模态大模型在图文理解、视觉问答&#xff08;VQA&#xff09;、图像描述生成等任务中展现出强大能力。从早…

作者头像 李华