硬件基础2
GPIO
GPIO(General Purpose Input/Output,通用输入输出)是微控制器(MCU)最基本的硬件接口,用来连接和控制外部设备(LED、按键、传感器等)。
引脚输入输出:
1. 输出模式:给定单片机引脚电平,控制引脚输出高/低电平( LED控制 、数码管控制、 蜂鸣器 控制)
2. 输入模式:检测引脚电平变化(用于检测外部电平信号按键检测、 检测ADC信号)
起始信号:500ms高电平 40us低电平(GPIO输出)
接收传感器数据(检测DATA信号新 电平 GPIO输入)
独立按键 :
1. 按键一端接到GND,另外一端接到GPIO引脚
2. 如果按键被按下, GND会 和引脚短路到一起, 此时引脚呈现低电平, 代表按键被按下
按键按下 → 引脚被拉低 → 电平从 1 变 0
void key_init(void) { P1 |= (0x0F << 4); P3 |= (1 << 5); } // 按键检测 int key_press(void) { int ret = 0; if ((P1 & (1 << 4)) == 0) { ret = 1; } else if ((P1 & (1 << 5)) == 0) { ret = 2; } else if ((P1 & (1 << 6)) == 0) { ret = 3; } else if ((P1 & (1 << 7)) == 0) { ret = 4; } else if ((P3 & (1 << 5)) == 0) { ret = 5; } return ret; }中断
CPU在处 理某个任务时,被外界更 为紧急的 事件打断,要求CPU优先去处 理
这个更为紧 急 的事件 ;处 理完 紧急 事件 后,再 回到 之前被 打 断的地 方继 续向下 执行
本质上是来自cpu外部的异步事件,如I/O设备请求、时钟信号
中断源:打断CPU执行 当前的任务源头/事件
中断源分类: 外部中断0、 外部中断 1、 定时器0、 定时器1、 串口
外部中断:引脚电平变化所引发的中断
┌───────────────────────────────────────────────────────────
│ 51 单片机外部中断引脚
│ ┌─────────────────────────────────────────────────────┐
│ │ INT0 (P3.2) → 外部中断0
│ │ INT1 (P3.3) → 外部中断1
│ └─────────────────────────────────────────────────────┘
│
│ 对应中断号:
│ INT0 → interrupt 0
│ INT1 → interrupt 2
└───────────────────────────────────────────────────────────
中断优先级 :CPU总是先处理优先级高的中断, 处理完优先级高的中断后再处理优先级低中断
INT0:0
TIMER0:1
INT1:2
TIMER1:3
UART:4
中断嵌套:CPU处理一个中断时再去嵌套另外一个中断任务(最多两层嵌套)
中断处理流程:
1. 中断源发出中断请求
2. 检查CPU是否允许中断( 总开关能够响应外部中断)及该中断源是否被屏蔽 (子开关能够产生对应的中断)
3. 比 较中断优先级
4. 保护现场
5. 执行中断服务函数 (回调函数 )
6. 恢复现场
IE (0xA8) 中断允许控制寄存器 (控制:是否允许某个中断)
TCON (0x88) 中断状态/控制寄存器 ( 控制:触发方式 + 查询中断标)
unsigned int g_i = 0; // 外部中断0服务函数 void int0_handler(void) interrupt 0 { g_i++; } // 外部中断0初始化 void int0_init(void) { // 1. 将外部中断0引脚拉高 P3 |= (1 << 2); // 2. 配置外部中断0引脚中断触发方式:下降沿触发 TCON |= (1 << 0); // 3. 允许外部中断0产生中断 IE |= (1 << 0); // 4. 允许CPU响应所有中断 IE |= (1 << 7); }中断向量表
中断向量表是单片机中一张非常重要的“地址表”,它告诉 CPU 当中断发生时,应该跳转到哪个地址去执行对应的中断服务程序。本质是一个数组,数组中存放的是中断服务函数的入口地址。
中断向量:中断向量表中的标号, 通过标号可访问到对应中断服务函数
| 中断源 | 中断号 | 入口地址 | 优先级 | 描述 |
|---|---|---|---|---|
| 复位 | - | 0x0000 | 最高 | 系统复位/启动 |
| 外部中断0 | 0 | 0x0003 | 1(最高) | INT0 引脚触发 |
| 定时器0溢出 | 1 | 0x000B | 2 | TF0 标志 |
| 外部中断1 | 2 | 0x0013 | 3 | INT1 引脚触发 |
| 定时器1溢出 | 3 | 0x001B | 4 | TF1 标志 |
| 串口中断 | 4 | 0x0023 | 5 | RI 或 TI 标志 |
| 定时器2溢出 | 5 | 0x002B | 6 | 52 系列特有 |
中断向量表的作用
定时器
定时器/计数器是51单片机内部最重要的外设之一,用于精确计时和外部脉冲计数。
| 特性 | 8位计数器 | 16位计数器 |
|---|---|---|
| 范围 | 0-255 | 0-65535 |
| 分辨率 | 1μs (12MHz) | 1μs (12MHz) |
| 最大定时 | 256μs | 65536μs (65.5ms) |
| 寄存器 | 1个 (TLx) | 2个 (THx+TLx) |
| 精度 | 粗 | 细 |
16位定时器
// 模式1:16位定时器(最常用) // THx (高8位) + TLx (低8位) = 16位 // 最大计数:2^16 = 65536 TMOD = (TMOD & 0xF0) | 0x01; // 模式1 // 示例:1ms中断(12MHz) TH0 = 0xFC; // 高8位 TL0 = 0x18; // 低8位8位自动重装定时器、
// 模式2:8位自动重装 // TLx 是计数器,THx 存储重装值 // 溢出后自动重装,无需软件干预 TMOD = (TMOD & 0xF0) | 0x02; // 模式2 // 示例:定时器0,250μs中断 TH0 = 0x06; // 重装值 (256 - 250 = 6) TL0 = 0x06; // 初始值TMOD:计数器工作模式寄存器
定时器配置流程
unsigned int g_t = 0; // 定时器0中断服务函数 void timer0_handler(void) interrupt 1 { TH0 = g_t >> 8; TL0 = g_t; P2 ^= (1 << 1); } // 定时器0初始化 void timer0_init(void) { // 1. 配置定时器0工作模式:16位定时器 TMOD &= ~(0x0F << 0); TMOD |= (1 << 0); // 2. 设置定时器0初值 TH0 = g_t >> 8; TL0 = g_t; // 3. 打开定时器0,开始计数 TCON |= (1 << 4); // 4. 开启定时器0中断 IE |= (1 << 1); // 5. 开启CPU总中断 IE |= (1 << 7); }PWM
PWM(Pulse Width Modulation,脉宽调制)是一种通过数字信号控制模拟量的技术,广泛应用于 LED 调光、电机调速、音频输出等领域。
脉冲宽度调制,能够让引脚产生一个方波, 能够让引脚周期性产生电平变化
蜂鸣器:
有源蜂鸣器 :内部 存在 震荡源 , 通电 后可以 发 出持续 固定 频率的 声 音
无源蜂鸣器: 不存在 震 荡源, 需要 给 定对应引 脚 一个高 低电 平产生 震荡 (可 以输 出指定 频率 音调)