什么时中断:
是指在执行程序的过程中,当出现每种情况,发出紧急的事件或其他情况时,有服务对象向CPU发出中断请求的信号,CPU暂时中断当前的程序的执行,而转去执行相应的处理程序,待处理程序完毕以后,再返回来执行原来被中断的程序。
关于中断以定时/计数器0中断为例;
void timer0_init()
{
EA = 1; //打开总中断;
TMOD |= 0x01; //选定定时/计数器0的工作的方式
TH0 = (65536 - 20000) / 256;
TL0 = (65536 - 20000) % 256; //初始化定时/计数器的值
ET0 = 1; //打开中断服务程序
TR0 = 1; //打开计数器
}
void timer0_isr() interrupt 1 // 中断的服务的程序
{
TH0 = (65536 - 20000) / 256;
TL0 = (65536 - 20000) % 256; //触发中断后再一次初始化值
change(); //调用一个程序,假设改变led的灯
}
void main()
{
timer0_init(); //中断的初始化;
while(1);
}
这个程序的运行的过程是,先是中断的初始化,然后一直while里面死循环,每当计数器溢出的时候,触发中断函数,进入中断的服务函数,执行中断函数timer0_isr()由于计数器没有关闭,所以计数器一直在计数,所以每隔20ms(晶振12mhz)触发一次中断。
注:
溢出:是指16位的计数器(可以选择计数器的工作的方式),每次累加到16位的最大的值溢出的时候,触发中断。
ET0 :如果把它置为0的话,那么就算计数器的溢出也不会调用中断服务程序
TR0 :如果将它置为0的话,那么计数器将不再累加
累加:什么时候累加,是根据晶振的hz来决定的
单片机的晶振频率 :12M震荡周期1/12us
单片机的机器的周期:12个机器周期,即加一次1us;
interrupt 1:
1.区分不同的函数
2.
1 定时器0
2 外部中断1
3 定时器1
4 串行中断
3.后面还有跟using 的,主要为了说明使用哪一组的寄存器,可以不写
中断程序就像C语言的里面的goto语句,打断程序的执行的顺序,但是又是不同的,因为,goto只有程序执行到那边的时候,进判断的时候程序将会跳转,而且跳转完不能够再次回到被中断的那个地方依旧在执行完的时候继续一次的执行,但是中断,是无论在程序的哪个地方只要中断一旦触发的时候的那么就执行中断子程序(中断服务程序)但是前提是打开中断程序,执行行完中断的依旧回到被中断的地方计数器一直开着那么只要计数器溢出,那么就触发中断。
其余的中断类似,只不过控制的寄存器不一样;
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』