一、频率与时间基础单位
频率描述信号每秒震荡多少次,时间与频率互为倒数:T=1fT=\frac1fT=f1。
| 单位 | 换算关系 |
|---|---|
| HZ(赫兹) | 基础单位,1HZ = 1次/秒 |
| KHZ(千赫兹) | 1KHZ=103HZ1\mathrm{KHZ}=10^3\mathrm{HZ}1KHZ=103HZ |
| MHZ(兆赫兹) | 1MHZ=103KHZ=106HZ1\mathrm{MHZ}=10^3\mathrm{KHZ}=10^6\mathrm{HZ}1MHZ=103KHZ=106HZ |
| GHZ(吉赫兹) | 1GHZ=103MHZ=109HZ1\mathrm{GHZ}=10^3\mathrm{MHZ}=10^9\mathrm{HZ}1GHZ=103MHZ=109HZ |
示例:2.1GHZ,代表每秒震荡 2.1×1092.1\times10^92.1×109 次;
周期 T=12.1×109≈0.5nsT=\frac{1}{2.1\times10^9} \approx0.5\mathrm{ns}T=2.1×1091≈0.5ns。
💡51单片机常用晶振:11.0592MHZ,专门适配串口波特率;还有12MHZ,方便做精确延时计算。
二、C51位运算(单片机最核心操作)
单片机IO口操作几乎全部依靠位运算,5种基础运算符:
| 运算符 | 名称 | 运算规则 | 典型业务场景 |
|---|---|---|---|
| ` | ` | 按位或 | 对应位有1则为1,全0才是0 |
& |
按位与 | 对应位全1才为1,有0则为0 | 指定位清0,其余位保持不变 |
~ |
按位取反 | 每一位0变1,1变0 | 配合按位与,生成清零掩码 |
^ |
按位异或 | 对应位相同为0,相异为1 | 指定位翻转(取反) |
<< |
左移 | 二进制整体向左移动,低位补0 | 生成掩码,1<<n快速得到第n位为1的数 |
>> |
右移 | 二进制整体向右移动;有无符号分为逻辑右移、算术右移 | 拆分多位数高低字节 |
✨代码实操示例
#include <reg51.h>
void bit_op_demo(void)
{
unsigned char t = 0xF4; // 1111 0100
unsigned char n = 0x32; // 0011 0010
unsigned char res_or = t | n; // 1111 0110 = 0xF6
unsigned char res_and = t & n; // 0011 0000 = 0x30
unsigned char res_xor = t ^ n; // 1100 0110 = 0xC6
unsigned char res_not = ~(t&n); // 1100 1111 = 0xCF
// ========= IO口经典用法 =========
unsigned char P2 = 0x00;
P2 |= (1 << 0); // bit0置1,其余不变
P2 |= (1 << 7); // bit7置1,其余不变
P2 |= (1<<2) | (1<<3); // bit2、bit3同时置1
P2 = 0xFF;
P2 &= ~(1 << 0); // bit0清0,其余不变
P2 &= ~(1 << 6); // bit6清0,其余不变
}
重点记忆两个模板,写项目天天用:
- 某一位置1:
寄存器 |= (1 << n);- 某一位清0:
寄存器 &= ~(1 << n);
三、三极管开关原理(数码管位选驱动)
三极管在数字电路充当电子开关 ;模拟电路用于电流放大。
分为两大类型:NPN、PNP;通过箭头区分:
- NPN:箭头朝外;基极高电平 → 导通(饱和区);基极低电平 → 关断(截止区)
- PNP:箭头朝内;基极低电平 → 导通(饱和区);基极高电平 → 关断(截止区)
📌本课程硬件:4位共阴极数码管位选由NPN三极管驱动。
P1低4位输出高电平,三极管导通,对应数码管被选通。
四、各类处理器概念区分
| 器件 | 核心说明 |
|---|---|
| CPU | 中央处理器,负责指令运算、处理 |
| MCU | 微控制器,单片机;CPU+RAM+ROM+外设全部集成一块芯片;成本低,做简单控制,51单片机就属于MCU |
| MPU | 微处理器;只有独立CPU芯片,需要外接内存、外设;适合复杂操作系统,如手机主处理器 |
| GPU | 图形处理器,专门做图像渲染、图形计算 |
| NPU | 神经网络处理器;AI推理、卷积运算,AI拍照 |
| FPU | 浮点运算单元,专门处理小数浮点数运算,一般集成在CPU内部 |
| SOC | 片上系统;把CPU、GPU、NPU、内存控制器等多个芯片集成一块芯片;体积小功耗低,手机、开发板大量使用 |
五、存储器概念:内存 vs 外存;RAM与ROM
内存与外存
- 内存 :程序运行时存放临时变量;掉电数据丢失;读写速度快,价格贵;电脑内存条。
- 外存 :存放代码、文件;掉电数据保留;读写速度慢,价格便宜;电脑硬盘。
51单片机内部 RAM / ROM
- RAM(随机存取存储器):相当于单片机的内存,存放运行变量,断电丢失。标准8051内部RAM大小:128字节。
- ROM(只读存储器/程序存储器):存放编译好的程序代码,掉电不会丢失;标准8051 ROM大小:4KB。
CPU工作流程:
1.CPU完成运算;
2.通过地址总线 找到RAM变量地址;
3.通过数据总线 ,读写RAM里面的数据;
4.控制总线完成外设读写控制。
三大总线:地址总线、数据总线、控制总线。
外设寄存器:单片机片上外设(IO、定时器、串口)对应的特殊寄存器地址;操作寄存器,就可以控制硬件外设,例如P0、P1、P2、P3。
📚作业问题回顾:操作LED、数码管用到哪些寄存器?LED一般操作P2;4位数码管:P1做位选,P0做段选。
六、4位共阴极数码管原理与动态显示
硬件基础
- 共阴极 :公共脚COM接GND;段引脚输出高电平点亮段。
- 段选:P0口输出段码,控制每一段LED亮灭;
- 位选:P1低4位输出电平,通过NPN三极管,选择哪一个数码管工作。
⚡动态显示核心思想:人眼视觉暂留效应 。
同一时刻只点亮1位数码管,快速轮流刷新每一位,人眼看不出闪烁,以为4个同时亮。
静态显示:一个数码管独占一套硬件资源,多位硬件成本高;动态扫描节省硬件,项目更常用。
共阴极段码(dp g f e d c b a)
//共阴极0‑9段码表
unsigned char code seg_table[10]={
0x3F, //0
0x06, //1
0x5B, //2
0x4F, //3
0x66, //4
0x6D, //5
0x7D, //6
0x07, //7
0x7F, //8
0x6F //9
};
digister.c完整驱动代码
#include <reg51.h>
#include "digister.h"
//共阴极段码表 0~9
unsigned char seg_table[10] = {
0x3F, //0
0x06, //1
0x5B, //2
0x4F, //3
0x66, //4
0x6D, //5
0x7D, //6
0x07, //7
0x7F, //8
0x6F //9
};
//位选:P1低4位,NPN三极管高电平选通,n范围0~3
void Select_Bit(unsigned char n)
{
P1 &= ~0x0F; //清空P1低四位
P1 |= (1 << n); //选中第n位数码管
}
//段选输出到P0口
void Select_Seg(unsigned char num)
{
P0 = seg_table[num];
}
//毫秒延时,防止编译器优化空循环
void delay_ms(unsigned int t)
{
unsigned int i,j;
for(i = t; i > 0; i--)
for(j = 110; j > 0; j--);
}
//动态扫描一轮:不要写while(1)死循环!交给main主循环调用
void Digiter_show(unsigned int n)
{
unsigned char ge,shi,bai,qian;
ge = n % 10;
shi = n / 10 % 10;
bai = n / 100 % 10;
qian= n / 1000;
if(n >= 0 && n <= 9999)
{
//显示个位
Select_Bit(0);
Select_Seg(ge);
delay_ms(1);
Select_Bit(0); //消隐,关闭位选,消除鬼影重影
//显示十位
Select_Bit(1);
Select_Seg(shi);
delay_ms(1);
Select_Bit(0);
//显示百位
Select_Bit(2);
Select_Seg(bai);
delay_ms(1);
Select_Bit(0);
//显示千位
Select_Bit(3);
Select_Seg(qian);
delay_ms(1);
Select_Bit(0);
}
}
digister.h头文件
#ifndef __DIGISTER_H
#define __DIGISTER_H
extern unsigned char seg_table[10];
void Select_Bit(unsigned char n);
void Select_Seg(unsigned char num);
void delay_ms(unsigned int t);
void Digiter_show(unsigned int n);
#endif
main.c测试调用
#include <reg51.h>
#include "digister.h"
void main(void)
{
while(1)
{
Digiter_show(1234); //数码管显示数字1234
}
}
- C141语法错误:一般是上一行大括号、数组闭合、分号缺失,报错行不一定是错误行,向上查找 ;注释不能把
}大括号吃掉;- L104多重定义:函数实现写在
.h头文件,多个文件include后重复定义;头文件只写声明,.c写函数实现;- L16警告:定义了函数但是没有调用,属于警告不影响运行,可以删除未使用函数消除;
- 数码管鬼影:增加消隐,切换数字前关闭位选三极管。
📎名词缩写全称对照表
| 缩写 | 英文全称 | 中文释义 |
|---|---|---|
| HZ | Hertz | 赫兹,频率单位 |
| KHZ | Kilo Hertz | 千赫兹 |
| MHZ | Mega Hertz | 兆赫兹 |
| GHZ | Giga Hertz | 吉赫兹 |
| CPU | Central Processing Unit | 中央处理器 |
| MCU | Micro Controller Unit | 微控制器(单片机) |
| MPU | Micro Processor Unit | 微处理器 |
| GPU | Graphics Processing Unit | 图形处理器 |
| NPU | Neural‑network Processing Unit | 神经网络处理器 |
| FPU | Floating‑Point Unit | 浮点运算单元 |
| SOC | System On Chip | 片上系统 |
| RAM | Random Access Memory | 随机存取存储器(内存) |
| ROM | Read‑Only Memory | 只读存储器(程序存储器) |
课后复习思考题(来源于学习文档)
- 什么是CPU、MCU、MPU、GPU、NPU、FPU、SOC?
- RAM和ROM区别?51单片机芯片内部的RAM和ROM大小?
- 什么是外设寄存器?
- 操作LED和数码管用到了哪些寄存器?
- NPN型三极管和PNP型三极管的区别?
- 数码管显示数值的操作流程?
- C语言如何实现指定位清0和指定位置1?
本篇全部代码可以直接复制到Keil C51工程编译,适合普中51开发板运行。