中断系统:
中断的含义:
中断系统是为使 CPU 具有对外界紧急事件的实时处理能力而设置的。
当中央处理机 CPU 正在处理某件事的时候外界发生了紧急事件请求,要求 CPU 暂停当前的工作,转而去处理紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。
实现这种功能的部件称为中断系统,请示 CPU 中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向 CPU 请求中断,要求为它服务的时候,这就存在 CPU 优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU 总是先响应优先级别最高的中断请求。
注意:中断要求 “快进快出”
如何声明中断函数:
注意:每个函数都有自己的中断优先级,CPU优先处理优先级高的中断函数。
什么函数适合放在中断中?
因为放在中断中的函数要符合快进快出的原则,LED,蜂鸣器,数码管显示可以放在定时器中断里,在while()循环里放变量赋值
定时器初始化函数:
注意,再写中断函数的时候,还需要先生成定时器初始化函数,这个函数还是不用我们自己写,使用stc-isp软件他会自动帮我们生成。生成的函数放在main函数中执行一次即可。
- 系统频率一般选择12MHz
- 定时器时钟1T模式最多计时(65536/12)us,12T模式最多计时65535us
- 定时器选择按需求选择即可,一般定时选择定时器2
- 定时长度也是按需选择
最后点击生成代码即可,记得要把代码放在void vTimer2Init()函数内部,然后再在mian函数中调用一次函数才能生效。
程序示例:
//中断服务程序
void vTimer2_ISR() interrupt 12 //中断入口
{
cnt_led++; //每过1mscnt_led加1
if(cnt_led<=200)
{
P0=~0x01; //0-200时P1亮
P2=0x80; //打开锁存器
P2=0; //关闭锁存器
}
else if(cnt_led<=400)
{
P0=0xff; //200-400msP1灭
P2=0x80;
P2=0;
}
else
cnt_led=0; //大于400mscnt_led清零,重新计时
}
//这样就能实现P1间隔2ms亮灭了