前一段时间的文章已经跟各位一起刷了一部分的客观题了
接下来将会跟大家一起从官方提供的原理图和芯片手册出发
练习每个模块的程序编写
因为我学习采用的是模块化编程的思路,函数的定义分散在不同的文件中,所以一般不会放完整代码,只会放对应模块相关的程序并说明其使用方法
学习此部分内容需要有一定的单片机基础,类似软件配置这种不会讲述,不懂的建议先上B站刷一下视频
本人使用的开发板 国信长天CT107D单片机竞赛板(这是今年新版,可能与旧版略有不同,但是程序是通用的)
参考资料:
官网能下载的 赛点资源数据包 里面的资料(比赛时会提供)
以及
《“蓝桥杯”全国软件和信息技术专业人才大赛(电子类)实训指导书》(点这里下载)(比赛时不会提供)
中断程序设计
理论部分
先讲一下为什么需要先学中断
中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的。
中断是指CPU正在处理主函数某一事件时,又发生了另一事件,CPU暂时停止当前的工作,转而去处理中断中的事件,待CPU处理完成中断事件后,再回到原来主程序事件被中断的地方继续处理事件。
中断的好处就是可以去处理一些随机事件(比如按下按键、串口接收等),而配合定时器使用时则可以以固定的频率做某些事情,后面会经常用到,因此放在前面讲。
查看手册可以看到我们使用的芯片的中断有哪些
这一次会从外部中断0入手,其他的中断也是类似的方式使用
查看中断结构图,我们可以看到配置外部中断0需要的相关寄存器以及中断优先级
其中
TCON.0
即IT0
用于选择外部中断是 上升沿和下降沿 都触发还是只有 下降沿 触发
- 上升沿与下降沿
- 上升沿:电平由0 --> 1 (一般对应按键按下)
- 下降沿:电平由1 --> 0 (一般对应按键松开)
IE0
用于使能中断的寄存器
EX0
外部中断0的使能位EA
总中断的使能位
PX0
用于控制中断优先级
- 优先级
- 即系统进入中断的顺序,在中断同时触发时,系统会先处理具有较高优先级的中断
- 中断分为低优先级和高优先级两个组,可以通过对应的寄存器选择中断的优先级组,每个组中的优先级是固定的(如图所示的优先级)
- 置0则进入低优先级组,置1则进入高优先级组
以上内容都可以在数据手册中查到,建议各位自己也多看看,这里就不截图一一标出来了
除此之外,中断还需要有一个中断回调函数来告诉系统中断时应该去做什么事
查看手册可知,需要在一个类似这样的函数中编写希望单片机在中断中做的任务
其中最重要的就是interrupt 0
这个中断号,写什么中断就用什么中断对应的中断号,写错了会导致中断触发不正常
函数名反而不重要,但是建议按照手册写,方便阅读代码时识别中断类型
最后还差一个,就是外部中断由谁触发
查询手册可以看到外部中断0由P32
这个IO口触发,再查看开发板原理图
可以看到P32
上接了一排按键,为了方便验证,我们需要将J5
的2 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灯会熄灭
总结
中断虽然简单,但是使用得非常多,建议大家还是多看看手册,把中断的内容吃透
最最最重要的事,多看芯片手册和原理图
欢迎大家提出问题并指正
觉得有帮助的话,那就点赞、收藏、关注一下吧~~
随缘更新~~