目录一、GPIO1.1 什么是GPIO1.2 GPIO输入类型1.3 GPIO输出类型1.4 示例检测P3_2是否为低电平二、中断系统2.1 中断的概念2.2 中断源2.3 中断优先级与嵌套2.4 中断向量表2.5 中断处理流程2.6 示例外部中断0初始化和使用1.查手册看外部中断默认是什么电平触发2.打开中断总开关3.选择外部中断0类型4.初始化代码示例5.外部中断0的使用三、定时器3.1 定时器的作用3.2 模式选择3.3 定时器0的初始化和使用1.首先将定时器TMOD寄存器的低四位置为0高四位是定时器12.开始设置定时器工作模式:16位定时器3.设置计算出的定时器0初值4.开启三个开关5.示例定时器0初始化和使用四、PWM与蜂鸣器4.1 PWM简介4.2 应用无源蜂鸣器发声4.3 示例输出200Hz方波占空比50%五、总结一、GPIO1.1 什么是GPIOGPIOGeneral Purpose Input Output即通用输入输出引脚是单片机与外部世界交互的桥梁。输入模式检测引脚电平变化高/低电平输出模式控制引脚输出高/低电平1.2 GPIO输入类型类型说明悬空输入电平不确定容易受干扰上拉输入内部接上拉电阻默认高电平下拉输入内部接下拉电阻默认低电平模拟输入用于ADC采集模拟信号1.3 GPIO输出类型类型说明推挽输出可输出强高电平和强低电平开漏输出只能输出低电平高电平需外接上拉电阻1.4 示例检测P3_2是否为低电平if ((P3 (1 2)) 0) { // P3_2 为低电平 }二、中断系统2.1 中断的概念中断是指CPU正在执行任务时收到更紧急的任务请求暂停当前任务转而去处理紧急任务处理完后再返回原任务继续执行。2.2 中断源51单片机共有5个中断源外部中断0INT0外部中断1INT1定时器0定时器1串口2.3 中断优先级与嵌套CPU会根据中断优先级决定先处理哪个中断51单片机支持最多两层中断嵌套arm不能嵌套2.4 中断向量表本质上是一个数组数组中存放的是中断服务函数的入口地址中断向量中断向量表中各中断服务函数的标号2.5 中断处理流程中断源发起请求检查中断是否开启、是否被屏蔽比较优先级保护现场保存当前寄存器执行中断服务函数恢复现场继续执行原任务2.6 示例外部中断0初始化和使用1.查手册看外部中断默认是什么电平触发可以得知外部中断0是低电平触发所以先把外部中断的引脚拉高查看开发板原理图找到INT0对应的引脚即P3.22.打开中断总开关寄存器IE的第八位和第1位置为13.选择外部中断0类型有低电平触发和下降沿触发选择下降沿触发只需要检测一下而不是一直检测低电平触发的话只要是低电平就会一直触发中断4.初始化代码示例//初始化 void int0_init(void) { //外部中断引脚拉高 P3 | (12); //打开CPU中断总开关 IE | (17); //打开外部中断开关 IE | (10); //选择外部中断0类型 TCON | (10); }5.外部中断0的使用外部中断对应按键K3初始化按键void key_init(void) { P3 | (0x0F 0);//按键初始化0000 1111 }按下按键即触发中断然后写一个中断函数注意 interrupt 0一定要写在函数旁边中断向量表这个会把我写的函数对应到系统指定的中断0函数中去void int0_handler(void) interrupt 0 //向量0 { g_n ; }三、定时器3.1 定时器的作用定时器能够产生一个精准的定时对时序要求严格高电平和低电平的时间必须是精准的常用于延时、PWM生成、计数等场景。这里简要介绍一下时序图3.2 模式选择8位自动重装定时器:实际参与计数的只有TL0当溢出后会将TH0的值再重新装回到TL0这里选择的定时器模式是16位自增型计数器从初值开始计数溢出时触发中断。计数范围0 ~ 65535计数频率 晶振频率 / 12STC8952RC的晶振频率过大所以用了12分频器计数一次时间 1 / 计数频率示例1ms定时器晶振频率11.0592MHzSTC8952RC工作频率11.0592MHz / 12 0.9216MHz计数一次时间1 / 0.9216MHz ≈ 1.085μs1ms所需计数次数1000μs / 1.085μs ≈ 922所以初值设置为65535 - 922 646133.3 定时器0的初始化和使用1.首先将定时器TMOD寄存器的低四位置为0高四位是定时器1// 1. 将TMOD寄存器低4位清零 TMOD ~(0x0F 0);2.开始设置定时器工作模式:16位定时器// 2. 设置定时器工作模式:16位定时器 TMOD | (1 0);3.设置计算出的定时器0初值// 3. 设置定时器初值 64613 TH0 g_i 8; TL0 g_i; //TH0是存低四位的数据TL0是存高四位的数据4.开启三个开关开启定时器计数CPU响应所有中断(总开关)允许定时器0产生中断(子开关)// 4. 开启定时器计数 TCON | (1 4); // 5. CPU响应所有中断(总开关) IE | (1 7); // 6. 允许定时器0产生中断(子开关) IE | (1 1);5.示例定时器0初始化和使用// 定时器0初始化函数 void timer0_init(void) { // 1. 将TMOD寄存器低4位清零 TMOD ~(0x0F 0); // 2. 设置定时器工作模式:16位定时器 TMOD | (1 0); // 3. 设置定时器初值 64613 TH0 g_i 8; TL0 g_i; // 4. 开启定时器计数 TCON | (1 4); // 5. CPU响应所有中断(总开关) IE | (1 7); // 6. 允许定时器0产生中断(子开关) IE | (1 1); }当计数到溢出后触发中断随后执行中断函数// 定时器0服务函数 void timer0_handler(void) interrupt 1 { TH0 g_i 8; //一定要复位初值不然定时器触发一次中断后初值会变成0计数就不对了 TL0 g_i; P2 ^ (15); }注意一定要复位初值不然定时器触发一次中断后初值会变成0计数就不对了四、PWM与蜂鸣器4.1 PWM简介PWM脉冲宽度调制脉冲宽度调制能够产生一个方波能够让引脚电平周期性发生变化周期一个方波所经历的时间从上升沿/下降沿到下一个上升沿/下降沿 占空比高电平在一个周期内所占的比例4.2 应用无源蜂鸣器发声无源蜂鸣器需要外部提供震荡信号才能发声。通过PWM可以控制其音调和音量。特性有源蜂鸣器无源蜂鸣器内部结构内置振荡源多谐振荡器没有振荡源只有线圈和磁铁驱动方式通电即响直流电压需要PWM方波驱动交流信号频率控制固定频率不可变可通过PWM频率改变音调声音特点单一频率声音单调可发出不同音调甚至音乐PDF中描述“通电后会持续发出固定频率声音”“通电后不会发出声音需要给定一个震荡”4.3 示例输出200Hz方波占空比50%周期 1 / 200Hz 0.005s半个周期 0.0025s到半个周期时定时器0中断触发后翻转电平计数次数 0.0025s / 1.085μs ≈ 23041.085us数值如何得出看上面定时器1ms实现初值 65535 - 2304 63231在定时器中断中函数中翻转蜂鸣器引脚电平即可输出200hz方波// 定时器0服务函数 void timer0_handler(void) interrupt 1 { TH0 g_i 8; //填蜂鸣器的频率所算出来的初值 TL0 g_i; P2 ^ (15); }五、总结通过本文我们系统梳理了51单片机的几个核心模块GPIO输入输出基础中断提升系统响应能力定时器精准控制时间PWM实现波形输出与控制这些知识点是嵌入式开发的入门必修课理解它们之后你将能更轻松地阅读芯片手册、编写底层驱动甚至开发完整的嵌入式系统。
ARM嵌入式学习(二) --- 入门51(中断)
目录一、GPIO1.1 什么是GPIO1.2 GPIO输入类型1.3 GPIO输出类型1.4 示例检测P3_2是否为低电平二、中断系统2.1 中断的概念2.2 中断源2.3 中断优先级与嵌套2.4 中断向量表2.5 中断处理流程2.6 示例外部中断0初始化和使用1.查手册看外部中断默认是什么电平触发2.打开中断总开关3.选择外部中断0类型4.初始化代码示例5.外部中断0的使用三、定时器3.1 定时器的作用3.2 模式选择3.3 定时器0的初始化和使用1.首先将定时器TMOD寄存器的低四位置为0高四位是定时器12.开始设置定时器工作模式:16位定时器3.设置计算出的定时器0初值4.开启三个开关5.示例定时器0初始化和使用四、PWM与蜂鸣器4.1 PWM简介4.2 应用无源蜂鸣器发声4.3 示例输出200Hz方波占空比50%五、总结一、GPIO1.1 什么是GPIOGPIOGeneral Purpose Input Output即通用输入输出引脚是单片机与外部世界交互的桥梁。输入模式检测引脚电平变化高/低电平输出模式控制引脚输出高/低电平1.2 GPIO输入类型类型说明悬空输入电平不确定容易受干扰上拉输入内部接上拉电阻默认高电平下拉输入内部接下拉电阻默认低电平模拟输入用于ADC采集模拟信号1.3 GPIO输出类型类型说明推挽输出可输出强高电平和强低电平开漏输出只能输出低电平高电平需外接上拉电阻1.4 示例检测P3_2是否为低电平if ((P3 (1 2)) 0) { // P3_2 为低电平 }二、中断系统2.1 中断的概念中断是指CPU正在执行任务时收到更紧急的任务请求暂停当前任务转而去处理紧急任务处理完后再返回原任务继续执行。2.2 中断源51单片机共有5个中断源外部中断0INT0外部中断1INT1定时器0定时器1串口2.3 中断优先级与嵌套CPU会根据中断优先级决定先处理哪个中断51单片机支持最多两层中断嵌套arm不能嵌套2.4 中断向量表本质上是一个数组数组中存放的是中断服务函数的入口地址中断向量中断向量表中各中断服务函数的标号2.5 中断处理流程中断源发起请求检查中断是否开启、是否被屏蔽比较优先级保护现场保存当前寄存器执行中断服务函数恢复现场继续执行原任务2.6 示例外部中断0初始化和使用1.查手册看外部中断默认是什么电平触发可以得知外部中断0是低电平触发所以先把外部中断的引脚拉高查看开发板原理图找到INT0对应的引脚即P3.22.打开中断总开关寄存器IE的第八位和第1位置为13.选择外部中断0类型有低电平触发和下降沿触发选择下降沿触发只需要检测一下而不是一直检测低电平触发的话只要是低电平就会一直触发中断4.初始化代码示例//初始化 void int0_init(void) { //外部中断引脚拉高 P3 | (12); //打开CPU中断总开关 IE | (17); //打开外部中断开关 IE | (10); //选择外部中断0类型 TCON | (10); }5.外部中断0的使用外部中断对应按键K3初始化按键void key_init(void) { P3 | (0x0F 0);//按键初始化0000 1111 }按下按键即触发中断然后写一个中断函数注意 interrupt 0一定要写在函数旁边中断向量表这个会把我写的函数对应到系统指定的中断0函数中去void int0_handler(void) interrupt 0 //向量0 { g_n ; }三、定时器3.1 定时器的作用定时器能够产生一个精准的定时对时序要求严格高电平和低电平的时间必须是精准的常用于延时、PWM生成、计数等场景。这里简要介绍一下时序图3.2 模式选择8位自动重装定时器:实际参与计数的只有TL0当溢出后会将TH0的值再重新装回到TL0这里选择的定时器模式是16位自增型计数器从初值开始计数溢出时触发中断。计数范围0 ~ 65535计数频率 晶振频率 / 12STC8952RC的晶振频率过大所以用了12分频器计数一次时间 1 / 计数频率示例1ms定时器晶振频率11.0592MHzSTC8952RC工作频率11.0592MHz / 12 0.9216MHz计数一次时间1 / 0.9216MHz ≈ 1.085μs1ms所需计数次数1000μs / 1.085μs ≈ 922所以初值设置为65535 - 922 646133.3 定时器0的初始化和使用1.首先将定时器TMOD寄存器的低四位置为0高四位是定时器1// 1. 将TMOD寄存器低4位清零 TMOD ~(0x0F 0);2.开始设置定时器工作模式:16位定时器// 2. 设置定时器工作模式:16位定时器 TMOD | (1 0);3.设置计算出的定时器0初值// 3. 设置定时器初值 64613 TH0 g_i 8; TL0 g_i; //TH0是存低四位的数据TL0是存高四位的数据4.开启三个开关开启定时器计数CPU响应所有中断(总开关)允许定时器0产生中断(子开关)// 4. 开启定时器计数 TCON | (1 4); // 5. CPU响应所有中断(总开关) IE | (1 7); // 6. 允许定时器0产生中断(子开关) IE | (1 1);5.示例定时器0初始化和使用// 定时器0初始化函数 void timer0_init(void) { // 1. 将TMOD寄存器低4位清零 TMOD ~(0x0F 0); // 2. 设置定时器工作模式:16位定时器 TMOD | (1 0); // 3. 设置定时器初值 64613 TH0 g_i 8; TL0 g_i; // 4. 开启定时器计数 TCON | (1 4); // 5. CPU响应所有中断(总开关) IE | (1 7); // 6. 允许定时器0产生中断(子开关) IE | (1 1); }当计数到溢出后触发中断随后执行中断函数// 定时器0服务函数 void timer0_handler(void) interrupt 1 { TH0 g_i 8; //一定要复位初值不然定时器触发一次中断后初值会变成0计数就不对了 TL0 g_i; P2 ^ (15); }注意一定要复位初值不然定时器触发一次中断后初值会变成0计数就不对了四、PWM与蜂鸣器4.1 PWM简介PWM脉冲宽度调制脉冲宽度调制能够产生一个方波能够让引脚电平周期性发生变化周期一个方波所经历的时间从上升沿/下降沿到下一个上升沿/下降沿 占空比高电平在一个周期内所占的比例4.2 应用无源蜂鸣器发声无源蜂鸣器需要外部提供震荡信号才能发声。通过PWM可以控制其音调和音量。特性有源蜂鸣器无源蜂鸣器内部结构内置振荡源多谐振荡器没有振荡源只有线圈和磁铁驱动方式通电即响直流电压需要PWM方波驱动交流信号频率控制固定频率不可变可通过PWM频率改变音调声音特点单一频率声音单调可发出不同音调甚至音乐PDF中描述“通电后会持续发出固定频率声音”“通电后不会发出声音需要给定一个震荡”4.3 示例输出200Hz方波占空比50%周期 1 / 200Hz 0.005s半个周期 0.0025s到半个周期时定时器0中断触发后翻转电平计数次数 0.0025s / 1.085μs ≈ 23041.085us数值如何得出看上面定时器1ms实现初值 65535 - 2304 63231在定时器中断中函数中翻转蜂鸣器引脚电平即可输出200hz方波// 定时器0服务函数 void timer0_handler(void) interrupt 1 { TH0 g_i 8; //填蜂鸣器的频率所算出来的初值 TL0 g_i; P2 ^ (15); }五、总结通过本文我们系统梳理了51单片机的几个核心模块GPIO输入输出基础中断提升系统响应能力定时器精准控制时间PWM实现波形输出与控制这些知识点是嵌入式开发的入门必修课理解它们之后你将能更轻松地阅读芯片手册、编写底层驱动甚至开发完整的嵌入式系统。