51学习之定时器中断
定时器中断可用两种方式处理:查询和进入中断处理。 TMOD = 0x01; TH0 = (65536-65000) /256; TL0 = (65536-65000) %6; EA = 1; ET0 = 1; TR0 = 1; Speak1 =1; if(TF0==1) 查询中断标志 { Speak1=~Speak1; //TH0 = (65536-65000) /256; //TL0 = (65536-65000) %6; TF0=0; } } TMOD = 0x01; TH0 = (65536-65000) /256; TL0 = (65536-65000) %6; EA = 1; ET0 = 1; TR0 = 1; Speak1=~Speak1; //TH0 = (65536-65000) /256; //TL0 = (65536-65000) %6; Init_T0 (); Speak1 =1; while(1); 等待中断} if(a++==20) Speak1=~Speak1;
1.查询
void Init_T0 (void) 定时器初始化
{
}
void Main() 主函数
{ Init_T0 ();
2.进入中断处理
void Init_T0 (void) 定时器初始化
{
}
void Time0_Int() interrupt 1 中断处理函数
{
}
void Main() 主函数
{
对于查询方式,一定要手动清楚中断标志。
上面2段程序,我屏蔽了,中断时重新装计数初值的语句,程序都可正常运行,所以我认为无论对于那种处理方式,重装初值都不必要。
初始化时,可定义输出口的初始状态。而在处理中断时,一定要用取反语句。手动置0或1,程序不能正常运行。
对于方式2,开始main中没写最后的while(1),程序不正常运行。
上述定时最大为65535,约65ms.如果计时大于此,可在中断中处理。
程序如下:
int a;
void Time0_Int() interrupt 1
{
{ a=0;
}
}
呵呵,在写上面这一小段时,开始没写a=0,灯一直亮,后来参考下,发现不清0.a一直变大,程序只能执行一次。
关键词: 51学习定时器中

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码