中断
- 1、定时器T0中断
- 2、案例:通过定时器T0中断来实现灯间隔1s亮灭
1、当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。
2、通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。
3、C51单片机有8个中断请求源:
1、定时器T0中断
如图:中断也需要配置寄存器,一共有2种寄存器,第一种位中断控制寄存器(IE和XICON),第二种为优先级控制寄存器。这里我们只学习定时器T0的一个中断。
要使用定时器T0中断:
ET0 = 1;ET0为定时器T0的中断开关,为1时打开中断
EA = 1; EA为中断源的总开关。
定的时间到了后,去执行中断函数里面的程序,那么怎样才知道哪个函数是中断函数喃?— 查询中断号(不同中断源产生的中断号不同)
2、案例:通过定时器T0中断来实现灯间隔1s亮灭
#include <REGX52.H>
sbit LED1 = P3^7;
int cnt = 0;
void Timer0_Init_10ms(void) //10毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Timer0_interrupt_Init(void)//定时器T0中断初始化
{
ET0 = 1;
EA = 1;
}
void main(void)
{
LED1 = 1;//先让灯熄灭的状态
Timer0_Init_10ms();//打开定时器T0
Timer0_interrupt_Init();//打开定时器T0中断
while(1)
{
}
}
/*定义中断函数*/
void Timer0Hander() interrupt 1
{
TF0 = 0;//软件清零
TL0 = 0x00; //重新给初值
TH0 = 0xDC;
cnt++;
if(cnt == 100)//数100次,相当于1s
{
cnt = 0;
LED1 = !LED1;
}
}
- 当中断开启时,每隔10ms就跳出主函数,执行中断函数里面的程序。
- 定时的第一个10ms到了,执行中断函数,重新给定时器计时10ms,cnt = 1,灯还是灭
- 定时的第二个10ms到了,执行中断函数,重新给定时器计时10ms,cnt = 2,灯还是灭
- …
- 定时的第100个10ms到了,执行中断函数,重新给定时器计时10ms,cnt = 100,灯变亮
这样就实现了间隔1s的亮灭。