前言
学习资料参考
课程资料:
【【小蜜蜂笔记】蓝桥杯大赛-单片机设计与开发基础技能与进阶强化教程】https://www.bilibili.com/video/BV1Bt41187hw?p=8&vd_source=e2191f89c557f5ac44bb6c7aa3967c7c
LED基本控制可以参考以下笔记:
https://blog.csdn.net/zicheng_G/article/details/142025188?fromshare=blogdetail&sharetype=blogdetail&sharerId=142025188&sharerefer=PC&sharesource=zicheng_G&sharefrom=from_link
本节训练重点
- 外部中断的基本操作
中断系统与外部中断
中断相关的基础概念
内核与外设之间的主要交互方式有两种:轮询和中断。相较于轮询,中断应对突发事件的能力更好。
在程序执行的过程中由于外界的原因而被中间打断的情况,称为中断。
中断服务函数:内核响应中断后执行的相对应处理程序。
中断向量:中断服务程序的入口地址。
每个中断源都对应一个固定的入口地址。
中断号
中断号 | 中断源 |
---|---|
0 | INT0 |
1 | TF0 |
2 | INT1 |
3 | TF1 |
4 | RI/TI |
中断相关的寄存器
两个寄存器都可以按位寻址。
中断请求标志
中断请求标志有TCON寄存器和SCON寄存器。
编程思路
外部中断的基本操作
定义一个Working()函数,使L1指示灯不断闪烁。将P32引脚定义成外部中断函数,按下S5按键就会产生外部中断触发信号,在中断响应函数中,点亮L8指示灯,演唱一段时间后熄灭。
/*头文件声明区域*/
#include <REGX52.H>
/*变量声明区域*/
sbit L1=P0^0;//定义L1指示灯
sbit L8=P0^7;//定义L8指示灯
/*延时函数*/
void Delay(unsigned int t)
{
while(t--);
}
/*HC573选择函数,选中LED对应的HC573*/
void HC573()
{
P2 = (P2 & 0x1f)|0x80;
}
/*Working函数实现L1指示灯闪烁*/
void Working()
{
L1=0;
Delay(500000);
L1=1;
Delay(500000);
}
//======中断函数======
/*中断初始化函数*/
void INT0_Init()
{
IT0=1;//下降沿触发
EX0=1;//打开中断使能
EA=1;//打开总开关
}
/*中断服务函数*/
void ServiceINT0() interrupt 0
{
L8=0;
Delay(500000);
Delay(500000);
Delay(500000);
Delay(500000);
L8=1;
}
//====================
/*主函数*/
void main()
{
HC573();
INT0_Init();
while(1)
{
Working();
}
}
没有写按键相关的代码,为什么按下S5可以实现中断?
答:原理图上INT0的位置与S5复位,即S5会对INT0产生作用。由于在中断初始化函数中写的是下降沿触发,所以当S5按下时,产生下降沿,触发中断。