第二课,MCS51中断系统
中断系统基本组成:中断源、中断优先级、中断服务程序。
MCS-51有5个中断来源,两个是外部中断、两个定时器中断,一个串口发送/接收中断。
中断函数与普通调用函数的本质区别在于,中断函数的执行是随机的,为了响应外部或者外部事件而服务,而普通的子程序调用是程序事先安排好的,主要为主程序服务,与外部事件无关。
在中断系统控制整个过程中,涉及到四个寄存器,TCON SCON IE IP;
TCON是外部中断和定时器中断的中断请求寄存器。
其实从上面的结构很容易就可以看出,MCS51中断系统工作的模式,我大致描述一下就是:首先,CPU开总中断开关EA,接下来就是看我们在TCON里面设置的模式,例如,外部中断到底是低电平触发还是下降沿触发,这个可以通过TCON数组的IT0或者IT1位设置,逻辑0对应低电平触发,逻辑1代表下降沿触发。在这个数组里面IE0 IE1是外部中断请求标志位,代表有相应的中断过来了,CPU自动给他置1和清0;其他位在接下来的其他中断实验时在具体讲解。还有要注意的是,单片机复位后TCON全被初始化为O,以后的学习过程中,也要时刻关注单片机复位后寄存器或者IO的状态。接下来要考虑的是什么,大概就是分开关是否打开,这些是起到屏蔽某些中断功能的,我们将需要打开的开启,例如接下来我们要用的外部中断EX0=1。如果我们需要开启几个中断的话,就会存在谁先谁后,因为中断产生是随机的,所以一定要把他们的优先级弄好,在内片内部已经默认了一个自然优先级:外部中断0(对应的P3.2输入)>>定时器0>>外部中断1>>定时器1>>串口中断RI/TI。
如果您需要将低优先级的中断首先执行,那么你就把他的优先级提高一个,在IP里面设置,比如我可以把串口中断提高一个优先级那我就PS=1,这就人为把串口优先级提高了。当然这些优先级都是建立在同时的情况下,如果不是同时的话,只有高优先级中断才能抢断他。
#include
sbit u=P3^0;
unsigned char countor=0;
/*中断初始化*/
void init(void)
{
EA=1; //CPU开中断系统总开关
IT0=1; //设置TCON中的IT0为下降沿触发
EX0=1; //开外部中断0的分开关
}
/*中断服务程序,书写格式是有固定格式的,不得随意更改*/
void int0(void) interrupt0 using0 //中断0的工作寄存器组为0
{
countor++;
P1=countor;
}
/*延时函数,30ms;for循环里面每执行一次需要3个机器周期,
每个机器周期是1us,整个循环执行完是3*10000us=30ms*/
void delay30ms(void)
{
unsigned char m,n;
for(m=0;m<100;m++)
for(n=0;n<100;n++);
}
/*主函数*/
void main(void)
{
unsigned char i;
init();
for(i=0;i<100;i++)
{
u=1;
delay30ms();
u=0;
delay30ms();
}
while(1);
}
在这个地方我还想提到的是很多人并没有注意的知识点,就是外部中断响应时间的问题,当然我们CPU处理速度越来越快,很多时候不了解也不会出问题,但是还是看一下:
外部中断的最短的响应时间为3个机器周期:
(1)中断请求标志位查询占1个机器周期。
(2)子程序调用指令LCALL转到相应的中断服务程序入口,需2个机器周期。
外部中断响应的最长的响应时间为8个机器周期:
(1)发生在CPU进行中断标志查询时,刚好是开始执行RETI或是访问IE或IP的指令,则需把当前指令执行完再继续执行一条指令后,才能响应中断,最长需2个机器周期。
(2)接着再执行一条指令,按最长指令(乘法指令MUL和除法指令DIV)来算,也只有4个机器周期。
(3)加上硬件子程序调用指令LCALL的执行,需要2个机器周期。
所以,外部中断响应最长时间为8个机器周期。
如果已在处理同级或更高级中断,响应时间无法计算。
在一个单一中断的系统里,MCS-51单片机对外部中断请求的响应的时间总是在3~8个机器周期之间。
在这里我们做一个小小的总结,对于外部中断口来说,他首先是AFIO即是复用功能口,是作为输入的,我们像STM32那样要设置IO模式吗?从目前看来,好像不需要,那单片机如何知道是做输入且是复用功能呢?其实在使用某个引脚做输入前已经对其写1了,那么就可以作为输入来用;如何做AFIO来用的呢?当我们配置中断系统寄存器的时候,我想CPU肯定已经将该口通过MUX设置为复用功能的状态。
文章评论(0条评论)
登录后参与讨论