控制/MCU
单片机中,中断算是一个比较重要的部分,在51单片机中有八种中断方式 ,其中常用的的有五种,分别是外部中断0,计时器中断0,外部中断1,计时器中断1,和串口中断。今天主要介绍的是计时器中断。
51单片机给我们提供了2个计时器中断,分别是计时器0和计时器1,他们对应的优先级分别是1和3,开启计时器并允许其中断后,计时器会从给定的初始值开始,每个指令周期加1,直到加到65535,再加一时计时器溢出,计时器此时会进入中断,并执行中断服务函数。
在编程过程中发现有许多人搞不清中断服务函数与一般函数的区别,他们总是问出诸如中断服务函数在程序中哪一句之前或哪一句之后执行的问题。其实中断服务函数虽然也是个函数,但是它与一般函数还是有一定的区别的。一般函数想使用时,必须要在主函数或其他函数中调用。而中断服务函数,只要在主函数中初始化计时器后,当计时器进入中断时会中止单片机进行的所有操作,开始执行中断服务函数,在执行完中断服务函数后再回到执行中断服务函数前执行的地方继续执行。其实中断服务函数也是被调用了,但它不是被程序中的某一句话调用了,而是被单片机调用了。
单片机单片机存储程序并不是从0地址开始保存,而是在中端向量表后保存,中断向量表中保存的是中断的优先级和中断服务函数的地址。程序执行后一旦计时器进入中断状态,单片机会回到中断向量表查询中断的优先级和中断服务函数的地址,然后跳转到中断服务函数所在地址开始执行,执行完成后回到中断向量表,然后回到中断前的地方执行。
单片机的初始化有5步:
1.打开总中断。
2.选择工作方式。
3.计时器初始化。
4.打开计时器中断允许。
5.开始计时。
下面以定时器0为例就按照上面五个步骤写一个1ms执行一次中断函数的初始化函数。
void tiemr0_init()
{
EA = 1; //打开总中断
TMOD |= 0x01; //选择工作方式1 *注1
TH0 = (65536 - 1000) / 256; //定时器高八位初始化
TL0 = (65536 - 1000) %256; // 定时器低八位初始化
ET0 = 1; //打开定时器0中断允许
TR0 = 1; //定时器0开始计时
}
注1:TMOD寄存器有八位,其中高八位用于选择定时器1的工作方式,低八位用于选择定时器0 的工作方式,定时器1有三种工作方式,定时器1有四种工作方式。
一般定时器中断时使用方式一,也就是用定时器0(T0)时 TMOD |= 0x01,用定时器1(T1)时 TMOD |= 0x10,方式2一般用于串口中断,其余两种涉及不多。
中断服务函数只需要在函数名后加interrupt X ,X就是中断对应的优先级,如定时器0中断对应的优先级是1,那他的中断服务函数名后面就加interrupt 1,下面就以定时器0为例编写一个使count一毫秒加一的中断服务函数(晶振为12M)
unsigned char count = 0;
void timer0_isr() interrupt 1
{
TH0 = (65536 - 1000) / 256;
TL0 = (65536 - 1000) % 256;
count++;
全部0条评论
快来发表一下你的评论吧 !