中断系统
什么是中断?
你正在追电视剧《神雕侠侣》,正看得入迷的时候,电话响了,你暂停电视剧,去接电话,在接电话的过程中,门铃又响了,你暂时放下电话,去把门打开。如果追电视剧是在执行主程序,那么电话就是中断源,电话铃响了就是中断请求,暂停电视就是现场保护,接电话就是中断响应,门铃响了是更高一级的中断请求,去把门打开,那就是中断嵌套。开完门回来接着聊电话,那是中断返回,接完电话把电视剧暂停打开就是现场恢复。 内核与外设之间的主要交互方式有两种:轮询和中断。轮询的方式貌似公平,但实际工作效率很低,且不能及时响应紧急事件;中断系统使得内核具备了应对突发事件的能力。 中断有个特点,就是你不知道中断什么时候发生。因此,每个中断都需要有一个中断入口地址,也成为中断向量。这样,不管中断在什么时候发生,它都有一个确定的程序执行起始点。中断响应之后,执行的那段程序,我们称作中断服务函数,也就是这个函数专门是为该中断服务的。
中断源:指引起CPU中断的事件,即中断请求信号的来源。
51单片机有5个中断源:按照自然优先级从高到低依次为:
外部中断0:INT0
定时/计数器0:TF0
外部中断1:INT1
定时/计数器1:TF1
串口中断:RI/TI
下图为51单片机的中断系统结构:
每个中断源都对应着一个固定的入口地址,也就是中断向量,它们依次是: 0 0x0003: INT0 1 0x000B: TF0 2 0x0013: INT1 3 0x001B: TF1 4 0x0023: RI/TI
中断相关的寄存器
另外2个为中断请求标志:TCON寄存器与SCON寄存器:
关于中断服务函数程序的编写
void 函数名 () interrupt 中断号
{
------ 函数体 ------
}
void Init_INTO()
{
IT0 = 1;
EX0 = 1;
EA = 1;
} //开外部中断0
我们要利用定时器0来进行间隔定时,中断程序架构我们C语言可以这样写: