欢迎光临
我们一直在努力

51单片机 --- GPIO、中断、定时器、PWM

一、GPIO 基础

GPIO(General Purpose Input/Output,通用目的输入输出)是 51 单片机与外界交互的最基本方式。

1. 输入模式

检测引脚电平变化,用于检测外部电平信号,典型应用包括按键检测、ADC 信号检测。

2. 输出模式

给定单片机引脚电平,控制引脚输出高/低电平,典型应用包括传感器控制、LED 控制、数码管显示。

3. STM32 的 GPIO 模式

  • 输入模式:上拉输入、下拉输入、浮空输入、模拟输入(ADC)
  • 输出模式:推挽输出、开漏输出、复用推挽输出、复用开漏输出

4. 按键原理

  • 按键未被按下时:引脚为高电平
  • 按键被按下时:引脚会和 GND 短路到一起,此时引脚呈现低电平

void key_init(void)
{
P1 |= (0x0F << 4); //普中51-MS
P3 |= (1 << 5); //HC6800
}

5. 车载中控系统应用

  • 测水温
  • 测油温
  • 测转速
  • 调节安全座椅
  • 刹车制动

二、中断系统

1. 中断概念

当 CPU 执行某个任务时,被外部紧急事件所打断,要求 CPU 暂停当前任务,转而去执行更为紧急的事件,把紧急事件处理完后再回到之前被打断的地方继续向下执行。

2. 中断源

能够打断 CPU 执行当前任务的事件/源头。

3. 51 单片机中断源(共 5 个)

  • 外部中断 0(P3_2)
  • 外部中断 1(P3_3)
  • 定时器 0
  • 定时器 1
  • 串口

4. 外部中断

引脚电平变化所引发的中断(P32、P33)。

5. 中断优先级

CPU 去处理多个中断任务时,会去比较中断源的优先级,优先去处理优先级高的中断。

6. 中断嵌套

CPU 在处理一个中断时,再去嵌套另外的中断(最多允许嵌套两层)。

7. 中断处理流程

  • 中断源发起中断请求
  • 检查 CPU 是否允许中断及该中断源是否被屏蔽(CPU 中断总开关 + 中断源子开关)
  • 比较中断优先级
  • 保护现场
  • 执行中断服务函数(回调函数)
  • 恢复现场
  • 8. 外部中断 0 初始化

    • 将 P3_2 引脚拉为高电平
    • 将 CPU 中断总开关打开 + 外部中断 0 子开关打开(IE 寄存器:bit0 和 bit7 置 1)
    • 设置外部中断 0 引脚触发方式:下降沿触发(TCON 寄存器:bit0 置 1)

    9. 中断向量表与中断向量

    • 中断向量表:本质是一个数组,数组中存放中断服务函数的入口地址
    • 中断向量:本质是数组的下标/标号,CPU 通过中断向量寻找对应的中断服务函数

    三、定时器

    1. 定时器作用

    实现精准的定时/延时,不同设备对时序要求比较高。

    2. 时序概念

    以时间先后次序描述引脚电平变化。

    3. 16 位自增型定时器

    Timer0、Timer1 均为 16 位计数器。

    unsigned short cnt = 0;

  • 赋初值:cnt = 64535
  • 打开定时器,开始计数
  • 按照固定速率向上 ++,cnt++
  • 计数器加到 65535 + 1 溢出,定时器向 CPU 发起中断请求
  • 4. 定时计算原理

    从初值到溢出所经历的时间,取决于计数速率和初值大小。

    • 51 单片机实际工作频率:12MHz 或 11.0592MHz
    • 12MHz / 12 = 1MHz,时间:1 / 1MHz = 1us
    • 11.0592MHz / 12 = 0.9MHz,时间:1 / 0.9MHz = 1.1us

    5. 定时器实现 1ms 定时

    • 1ms = 1000us
    • 计数次数:1000us / 1us = 1000(12MHz);1000us / 1.1us = 909(11.0592MHz)
    • 初值:65535 – 1000 = 64535;65535 – 909 = 64626

    6. 初值拆分(TL0 与 TH0)

    • TL0(1 字节):64535 的低 8 位
    • TH0(1 字节):64535 >> 8
    • 8 位自动重装(用于串口波特率)

    7. 定时器 0 初始化

    void timer0_init(void)
    {
    //1
    TMOD &= ~(0x0F << 0);
    TMOD |= (1 << 0);

    //2
    TL0 = 64626;
    TH0 = 64626 >> 8;

    //3
    TCON |= (1 << 4);

    //4
    IE |= (1 << 1) | (1 << 7);
    }

    • 配置定时器 0 模式:16 位定时器(TMOD 寄存器低 4 位:低 4 位清零,bit0 置 1)
    • 设置定时器 0 初值(TL0 和 TH0 寄存器)
    • 开启定时器 0,开始计数(1us)(TCON 寄存器:bit4 置 1)
    • 开启定时器 0 中断子开关 + CPU 中断总开关(IE 寄存器:bit7 和 bit1 置 1)

    四、PWM 脉冲宽度调制

    1. PWM 概念

    脉冲宽度调制,能够让引脚产生一个方波,周期性地让引脚的电平发生翻转。

    2. PWM 周期

    一个方波所经历的周期(上升沿/下降沿到下一个上升沿/下降沿所经历的时间)。

    3. PWM 占空比

    在一个周期内高电平所占的比例。

    4. 典型应用

    背光调节、蜂鸣器控制。

    五、蜂鸣器

    1. 声音原理

    声音 → 声波 → 音调 → 频率。

    2. 有源蜂鸣器

    存在震荡源,通电后蜂鸣器会发出持续固定频率的声音。

    3. 无源蜂鸣器

    不存在震荡源,通电后蜂鸣器不会发出声音,需要给定蜂鸣器一个震荡信号。

    4. 定时器 + PWM 占空比 + 蜂鸣器(指定频率发声)

    频率 200Hz,占空比 50%:

    • 时间:1 / 200Hz = 0.005s / 2 = 0.0025s
    • 51 单片机工作频率:12MHz / 12 = 1MHz = 1000000Hz
    • 51 单片机 +1 所需时间:1 / 1000000Hz = 0.000001s
    • 计数次数:0.0025s / 0.000001s = 2500
    • 初值:65535 – 2500 = 63035

    频率 400Hz,占空比 50%:

    • 时间:1 / 400Hz = 0.0025s / 2 = 0.00125s
    • 51 单片机工作频率:12MHz / 12 = 1MHz = 1000000Hz
    • 51 单片机 +1 所需时间:1 / 1000000Hz = 0.000001s
    • 计数次数:0.00125s / 0.000001s = 1250
    • 初值:65535 – 1250 = 64285
    赞(0)
    未经允许不得转载:171主机测评 » 51单片机 --- GPIO、中断、定时器、PWM
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址