×
单片机 > 单片机程序设计 > 详情

51学习之定时器中断的两种方式——查询和中断

发布时间:2020-05-28 发布时间:
|

定时器中断可用两种方式处理:查询和进入中断处理。

1.查询

void Init_T0 (void) 定时器初始化

{

TMOD = 0x01;

TH0 = (65536-65000) /256;

TL0 = (65536-65000) %6;

EA = 1;

ET0 = 1;

TR0 = 1;

}

void Main() 主函数

{ Init_T0 ();

Speak1 =1;

if(TF0==1) 查询中断标志

{

Speak1=~Speak1;

//TH0 = (65536-65000) /256;

//TL0 = (65536-65000) %6;

TF0=0;

}

}

2.进入中断处理

void Init_T0 (void) 定时器初始化

{

TMOD = 0x01;

TH0 = (65536-65000) /256;

TL0 = (65536-65000) %6;

EA = 1;

ET0 = 1;

TR0 = 1;

}

void Time0_Int() interrupt 1 中断处理函数

{

Speak1=~Speak1;

//TH0 = (65536-65000) /256;

//TL0 = (65536-65000) %6;

}

void Main() 主函数

{

Init_T0 ();

Speak1 =1;

while(1); 等待中断

}


对于查询方式,一定要手动清楚中断标志。

上面2段程序,我屏蔽了,中断时重新装计数初值的语句,程序都可正常运行,所以我认为无论对于那种处理方式,重装初值都不必要。

初始化时,可定义输出口的初始状态。而在处理中断时,一定要用取反语句。手动置0或1,程序不能正常运行。


对于方式2,开始main中没写最后的while(1),程序不正常运行。


上述定时最大为65535,约65ms.如果计时大于此,可在中断中处理。

程序如下:

int a;

void Time0_Int() interrupt 1

{

if(a++==20)

{ a=0;

Speak1=~Speak1;

}

}

呵呵,在写上面这一小段时,开始没写a=0,灯一直亮,后来参考下,发现不清0.a一直变大,程序只能执行一次。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向