分享

51学习之定时器中断

 共同成长888 2016-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一直变大,程序只能执行一次。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多