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

转载自:http://blog.sina.com.cn/s/blog_6fe8b3c7010106b1.html

51学习之定时器中断

呵呵,从网上抄了个程序,自己改了下。能用了。不过有些地方还是不太了解,呵呵,明天来细写。
2012.2.25
定时器中断可用两种方式处理:查询和进入中断处理。
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一直变大,程序只能执行一次。
  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值