一.中断分类
中断分为内部中断、外部中断、串口中断
二.内部中断
内部中断主要是CPU内部通过定时器T0/T1进行计数溢出时对TF0/TF1置1后产生的中断,当中段发生后硬件会对TF0/TF1进行复位,同时也会对计数寄存器进行复位;
T0的优先级是高于T1的优先级的;对于运行T0或T1的工作模式选择是通过CPU内部的特殊寄存器TMOD来设置的;T0/T1打开还是关闭以及溢出标志位是在寄存器TCON中
1.T0定时/计数器以及中断
T0定时/计数器功能只能进行定时和计数两种
寄存器TCON第4位TR0控制T0寄存器的启/禁用,当TR0=1时T0开始计数;TCON第5位TF0为T0溢出标志位,当定时或计数达到时TF0会被硬件置1,然后跳至中断函数进行执行,当中断函数进行执行时硬件对TF0复位;在配置T0的初始化函数中保证TR0=1,TF0=0。寄存器TMOD第0和1位为T0作为定时器时的工作方式选择位,寄存器TMOD第2位为T0选择位,当TMOD.2(C/T)=0则T0进行定时器功能、当TMOD.2(C/T)=1则T0进行计数器功能,计数信号来之P3.4引脚;在配置T0的初始化函数中将T0作为定时器时应保证TMOD.2=0,运用13位计数方式时应保证M0=0、M1=0及TMOD=0x10。TL0和TH0分别为T0定时器的定时时间的低八位和高八位,定时时一个机器周期记一次数,总共可以记65535次数,TL0和TH0为256进制;T1的定时时间为TL1和TH1。
如果采用定时器0作为中断源则需要配置ET0 = 1(打开T0中断,允许T0进行中断)、EA = 1(打开系统总中断开关,允许系统进行中断),;T0的中断等级为1,因此中断函数后缀中断等级为1。T0演示代码如下,功能是实现LED灯1秒闪烁一次
#include <STC89C5xRC.H>
void Timer0Ini() //100微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD = 0x01; //设置定时器模式为T0定时器的16位计数方式
TL0 = 64535%256; //设置定时初值
TH0 = 64535/256; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //打开定时器0的中断
EA = 1; //打开系统总中断
IP=0x00; //设置中断等级
IPH=0x00; //设置中断等级
}
void main()
{
Timer0Ini();
while(1)
{
}
}
void interrupt_use() interrupt 1
{
TL0 = 64535%256; //设置定时初值
TH0 = 64535/256; //设置定时初值
if(a==1000)
{
P2_0 = ~P2_0;
a=0;
}
a++;
// P2_0 =0 ;
}
对于中断函数的中断序列号:如果main函数中只有一个中断源,但是程序中有多个中断函数时,会优先执行中断函数序列较高且低于中断源对应的优先级的函数;例如:main函数中采用T0为中断源,正常T0中断优先级为1,但是外部中断函数的序列号为大于等于1时均可使中断请求发生时去执行该中断函数
1.中断执行顺序
在使用Stc89芯片进行中断编程时遵循先执行高优先级的中断源请求的中断,当正在执行一个较低优先级中断的同时发生了一个较高优先级的中断,此时会等较低优先级中断函数执行完成后再执行较高优先级中断函数
2.