GPIOGPIOGeneral Purpose Input/Output通用输入输出是微控制器MCU最基本的硬件接口用来连接和控制外部设备LED、按键、传感器等。引脚输入输出1. 输出模式给定单片机引脚电平控制引脚输出高/低电平 LED控制 、数码管控制、 蜂鸣器 控制2. 输入模式检测引脚电平变化用于检测外部电平信号按键检测、 检测ADC信号起始信号500ms高电平 40us低电平GPIO输出接收传感器数据检测DATA信号新 电平 GPIO输入独立按键 1. 按键一端接到GND另外一端接到GPIO引脚2. 如果按键被按下 GND会 和引脚短路到一起 此时引脚呈现低电平 代表按键被按下按键按下 → 引脚被拉低 → 电平从 1 变 0void 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总是先处理优先级高的中断 处理完优先级高的中断后再处理优先级低中断INT00TIMER01INT12TIMER1:3UART: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最高系统复位/启动外部中断000x00031最高INT0 引脚触发定时器0溢出10x000B2TF0 标志外部中断120x00133INT1 引脚触发定时器1溢出30x001B4TF1 标志串口中断40x00235RI 或 TI 标志定时器2溢出50x002B652 系列特有中断向量表的作用定时器定时器/计数器是51单片机内部最重要的外设之一用于精确计时和外部脉冲计数。特性8位计数器16位计数器范围0-2550-65535分辨率1μs (12MHz)1μs (12MHz)最大定时256μs65536μs (65.5ms)寄存器1个 (TLx)2个 (THxTLx)精度粗细16位定时器// 模式116位定时器最常用 // THx (高8位) TLx (低8位) 16位 // 最大计数2^16 65536 TMOD (TMOD 0xF0) | 0x01; // 模式1 // 示例1ms中断12MHz TH0 0xFC; // 高8位 TL0 0x18; // 低8位8位自动重装定时器、// 模式28位自动重装 // TLx 是计数器THx 存储重装值 // 溢出后自动重装无需软件干预 TMOD (TMOD 0xF0) | 0x02; // 模式2 // 示例定时器0250μ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); }PWMPWMPulse Width Modulation脉宽调制是一种通过数字信号控制模拟量的技术广泛应用于 LED 调光、电机调速、音频输出等领域。脉冲宽度调制能够让引脚产生一个方波 能够让引脚周期性产生电平变化蜂鸣器有源蜂鸣器 内部 存在 震荡源 通电 后可以 发 出持续 固定 频率的 声 音无源蜂鸣器 不存在 震 荡源 需要 给 定对应引 脚 一个高 低电 平产生 震荡 可 以输 出指定 频率 音调