[蓝桥杯单片机]模块学习—中断系统

前一段时间的文章已经跟各位一起刷了一部分的客观题了

接下来将会跟大家一起从官方提供的原理图芯片手册出发

练习每个模块的程序编写

因为我学习采用的是模块化编程的思路,函数的定义分散在不同的文件中,所以一般不会放完整代码,只会放对应模块相关的程序并说明其使用方法

学习此部分内容需要有一定的单片机基础,类似软件配置这种不会讲述,不懂的建议先上B站刷一下视频


本人使用的开发板 国信长天CT107D单片机竞赛板(这是今年新版,可能与旧版略有不同,但是程序是通用的)

image-20221105142604208

参考资料:

官网能下载的 赛点资源数据包 里面的资料(比赛时会提供)

以及

《“蓝桥杯”全国软件和信息技术专业人才大赛(电子类)实训指导书》(点这里下载)(比赛时不会提供)


中断程序设计


理论部分

先讲一下为什么需要先学中断

中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的。

中断是指CPU正在处理主函数某一事件时,又发生了另一事件,CPU暂时停止当前的工作,转而去处理中断中的事件,待CPU处理完成中断事件后,再回到原来主程序事件被中断的地方继续处理事件。

中断的好处就是可以去处理一些随机事件(比如按下按键、串口接收等),而配合定时器使用时则可以以固定的频率做某些事情,后面会经常用到,因此放在前面讲。

查看手册可以看到我们使用的芯片的中断有哪些

这一次会从外部中断0入手,其他的中断也是类似的方式使用

image-20221107213528302

查看中断结构图,我们可以看到配置外部中断0需要的相关寄存器以及中断优先级

image-20221107213942574

其中

TCON.0IT0 用于选择外部中断是 上升沿和下降沿 都触发还是只有 下降沿 触发

  • 上升沿与下降沿
    • 上升沿:电平由0 --> 1 (一般对应按键按下)
    • 下降沿:电平由1 --> 0 (一般对应按键松开)

IE0 用于使能中断的寄存器

  • EX0 外部中断0的使能位
  • EA 总中断的使能位

PX0 用于控制中断优先级

  • 优先级
    • 即系统进入中断的顺序,在中断同时触发时,系统会先处理具有较高优先级的中断
    • 中断分为低优先级高优先级两个组,可以通过对应的寄存器选择中断的优先级组,每个组中的优先级是固定的(如图所示的优先级)
  • 置0则进入低优先级组,置1则进入高优先级组

以上内容都可以在数据手册中查到,建议各位自己也多看看,这里就不截图一一标出来了

除此之外,中断还需要有一个中断回调函数来告诉系统中断时应该去做什么事

image-20221107221126521

查看手册可知,需要在一个类似这样的函数中编写希望单片机在中断中做的任务

其中最重要的就是interrupt 0这个中断号,写什么中断就用什么中断对应的中断号,写错了会导致中断触发不正常

函数名反而不重要,但是建议按照手册写,方便阅读代码时识别中断类型

最后还差一个,就是外部中断由谁触发

image-20221107222136464

查询手册可以看到外部中断0由P32这个IO口触发,再查看开发板原理图

image-20221107222408993

可以看到P32上接了一排按键,为了方便验证,我们需要将J52 3使用跳线帽短接(即切换为独立键盘模式),这样当按下S5时就会触发外部中断


程序部分

先上关键代码

/********************************************************************************
* 函 数 名: Int0_Init
* 函数功能: 外部中断0初始化
* 输入参数:无
* 返 回 值:无
* 其    他:INT0对应P32,配置为下降沿触发
********************************************************************************/
void Int0_Init()
{
    IT0=1;  //配置成下降沿触发
    EX0=1;  //允许外部中断0
    
    EA=1;   //中断总控制,允许中断
}

/********************************************************************************
* 函 数 名: Int0_Routine
* 函数功能: 外部中断0回调函数(模板)
* 输入参数:无
* 返 回 值:无
* 其    他:无
********************************************************************************/
void Int0_Routine() interrupt 0
{
    P0 = ~P0; //P0取反
    P2 = P2 & 0x1F | 0x80; // P27~P25 清零,再定位 Y4C
    P2 &= 0x1F; // P27~P25 清零
}

在主函数中的使用非常简单

void main()
{
    Int0_Init();
    while (1);
}

只需要调用Int0_Init();初始化中断后,即便程序卡在while(1)中,当按键按下时,系统还是会先去处理中断回调函数Int0_Routine()中的任务(这里的是让LED状态翻转)

这个程序最终实现的效果就是:当按下S5按键后,原本灭的LED灯会点亮,原本亮的LED灯会熄灭


总结

中断虽然简单,但是使用得非常多,建议大家还是多看看手册,把中断的内容吃透

最最最重要的事,多看芯片手册和原理图


欢迎大家提出问题并指正

觉得有帮助的话,那就点赞、收藏、关注一下吧~~

随缘更新~~

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NikkoLKR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值