中断流程
二、中断寄存器
中断系统组成
我们结合此图对中断系统进行介绍。根据图片可以看出,与中断有关的寄存器有TCON、IE、IP(RX和TX这里不加赘述)
TCON:
在这里插入图片描述
TF1(TF0):定时计数器溢出标志位,当定时计数器记满时会自动置1,可通过if(TF1==1)或while语句来判断是否溢出,并执行下一步 *** 作。
TR1(TR0):定时计数器的启动控制位,启动时软件编程置1
IE1(IE0):外部中断请求标志位
IT1(IT0):外部中断触发选择位,若为1,则为下降沿触发,若为0,则为低电平触发
IE:
在这里插入图片描述
EA:总中断开关,使用任何中断前要先使EA置1
ET2:52系列T2中断允许位
ES:置1时开放串行口中断
ET1(ET0):定时计数器T1(T0)溢出中断允许位,使用定时计数器时需要使其置1
EX1(EX0):外部中断INT1(INT0)允许位,使用外部中断前要使其置1
中断优先级寄存器IP:
在这里插入图片描述
51单片机有五个中断源,但只有两个优先级,必然会有几个中断请求源处于同样的优先级。当CPU同时接收到几个同优先级中断请求时,其内部会有一个硬件查询逻辑,将根据中断查询逻辑的自然优先顺序来查询。
51单片机自然优先级为:
外部中断0>定时器0>外部中断1>定时器1>串口中断>定时器2
三、中断响应过程
51单片机的CPU在每一个周期都顺序查询每一个中断源,在机器周期的S5P2状态采样并按照优先级处理所有被激活的中断请求。但是在出现以下情况时,将不会处理中断请求:
①CPU正在处理更高级或同级中断
②现在的机器周期不是所执行指令的最后一个机器周期
③正在执行的指令是RETI或正在访问IE或IP
CPU响应中断时,首先会置位相应的优先级状态触发器,以阻断同级或低级触发请求。之后会自动清除响应的中断标志,并自动保护断电程序,将pc内容压入堆栈,并把中断源对应的矢量单元地址装入pc
既然是按键触发中断,在中断程序中还要判断?if(P33==1),这是判断按键释放了吗?
问题:中断程序,不能有延时子程序,不能用return退出中断程序,中断程序执行结束就自然退出,因汇编的返回指令是不同的。
以下的程序看不见了,不知道还有什么问题了。
看程序,这中断也没有什么大作用,就是一个标志位来回的折腾,又写了一堆延时子程序,实在不知道你的中断是做什么的。要中断,真要做点实事呀。什么也不做,没意思。
#include<reg52.h>unsigned char i
main()
{
P2=0xff
TMOD=0X01 //一般用方式1
EA=1
ET0=1
//IE=0xff //多余
TH0=0
TL0=0
TR0=1
while(1)
}
void time0() interrupt 1 //定时器0
{
TH0=0
TL0=0//重新装初值
P2--
}
以上程序中断会每隔65536us(如果你眼睛够快的话,但是以这个速度人眼应该感觉不到,你可以每隔20次中断再让P2自减一次,这样效果更好)发生一次,但是由于P2--自减8次之后就会变成0x00,所以之后就看不到任何现象,如果在P2之后添上如下语句就会一直看到所对应的现象(比如流水灯):
i++
if(i==8)
{
i=0
P2=0xff
}
玩单片机一定要多练,希望对你有帮助,再不懂就给我留言,祝你成功
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)