中断系统是为了使CPU具有对外界紧急事件的实时处理能力而设置的。
由于C51 是单线程,如果在执行过程中需要去处理某些事情,则需要中断。
如果使用C语言编程,中断查询次序号就是中断号,例如:
void Int0_Routine(void) interrupt 0;
void Timer0_Rountine(void) interrupt 1;
void Int1_Routine(void) interrupt 2;
void Timer1_Rountine(void) interrupt 3;
void UART_Routine(void) interrupt 4;
void Timer2_Rountine(void) interrupt 5;
void Int2_Routine(void) interrupt 6;
void Int3_Routine(void) interrupt 7;
定时器中断方式控制

结合上图可以知道CPU能响应定时器 0 中断的条件:需要配置IE寄存器的bit1: ET0, bit7: EA
ET0中断允许要置1 ET0 = 1
EA总中断要置 1 EA = 1

中断控制LED
#include "reg52.h"
sbit led = P3^6;
sbit led1 = P3^7;
int cnt = 0;
void Time0Init()
{
// 1. 配置定时器0工作模式为16位计时
TMOD = 0x01;
// 2. 给初值,定一个10ms出来
TL0 = 0x00;
TH0 = 0xDC;
//3. 开始计时
TR0 = 1;
TF0 = 0;
// 4. 打开定时器0中断
ET0 = 1;
// 5. 打开总中断EA
EA = 1;
}
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
//_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
led = 1;
Time0Init();
//4. 爆表了,操作led吗,累计到1s再操作led
while(1){
led1 = 0;
Delay300ms();
led1 = 1;
Delay300ms();
}
}
void TimeOHandler() interrupt 1
{
cnt++;
// 重新赋初值
TL0 = 0x00;
TH0 = 0xDC;
if(cnt == 100){
cnt = 0;
led = !led;
}
}