用 C学习51单片机——记录 4、中断系统
用 C 学习51单片机过程与自我拓展——记录(STC89C52芯片)
前言——其实51并不太难,多看 多写代码,多调试,就一定会有所感悟。
所以我在此留下一些代码以供自己重复记忆,也希望能够帮到你!
废话少说,来!🙂☞
四、中断系统
中断系统算是属于51的中级难度部分了,同时这也十分重要,所以大家一定学好一点!💪
简单认识:
1、中断系统包含三大类:外部中断、定时器中断和串口中断。
串口中断没有再分类,
外部中断和定时器中断又分为两小类(看下图):
定时器中断 | 外部中断 |
---|---|
定时器0 | 外部中断0(操作P3^2) |
定时器1 | 外部中断1(操作P3^3) |
2、中断系统具有优先级(看下图)
这次我们先来看看最简单的外部中断
(1)外部中断
外部中断0和外部中断1,它们除了中断优先性上有先后差别外,其使用上两者没有太多的差别。
下面我们先来看看外部中断0的使用:
程序说明:
1、我在里面列了3种不同的方式来触发外部中断0,请大家看清楚说明
2、注意中断函数里 interrupt 后面的数字,与上面列举的优先级后的数字相对应
#include <reg52.h>
sbit s2 = P3^0;
sbit flag = P3^2;
sbit beep = P2^3;
void delay (int z)//延时函数
{
int i,j;
for(i=z;i>0;i--)
for(j=114;j>0;j--);
}
void int0Init ()//中断0的初始化
{
EA = 1; //打开中断总开关
EX0 = 1; //打开外部中断0开关
IT0 = 0; //ITO为0,触发中断方式为P3^2为0
//ITO为1,触发中断方式为下降沿触发
}
void main ()
{
int0Init(); //外部中断0初始化
beep = 0; //按下S2前蜂鸣器一直鸣叫
while(1)
{
if (s2 == 0)
{
delay(20); //消抖
if(s2 == 0)
{
/*方式一 、直接控制P3^2,触发中断*/
flag = 0;
flag = 1;
/*方式二、直接P3控制^2产生下降沿触发中断*/
// flag = 1; //先置高P3^2
// flag = 0; //置低P3^2产生下降沿
// flag = 1; //拉高P3^2 结束中断(不能省略,否则只能中断一次)
//注意:使用方式三前先把程序中的flag=P3^2改为 flag = P3^6
/*方式三、外部杜邦线P3^6连接P3^2使其为0触发中断*/
// flag = 0; //利用相连接,拉低P3^6来拉低P3^2
// flag = 0; //CPU运行速度快,要检测两次P3^2为0才行
// flag = 1; //拉高P3^2 结束中断
beep = 1;//关闭蜂鸣器,并不再响起
while(!s2); //松手检测
}
}
}
}
void int0 () interrupt 0 //外部中断0函数
{
P1 = ~P1; //通过打开流水灯显示中断的成功
}
至于外部中断1的使用我就不多说了,
把上面的操作的IO口改为P3^3,把ET0改为ET1,IT0改为IT1,
程序最后一个中断程序的interrupt 0改为interrupt 1 就行了