51单片机定时器设置问题之个人看法

本人最近学习51单片机,以下是教程网址,在7-37课中,讲到定时器时第一遍不是太明白,看到下面的评论中也有不少人一头雾水,本人现将自己的理解概述如下:

教程网址:http://www.51zxw.net/show.aspx?id=37655&cid=473

先贴代码:

#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit led = P1^0;
u8 timer;
void main (void)
{    
    TMOD = 0x01;
    TH0 = (65535-50000)/256;
    TL0 = (65535-50000)%256;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
    while (1)
    {
        ;
    }  
 
}
void timer0_service(void) interrupt 1
{
    TH0 = (65535-50000)/256;
    TL0 = (65535-50000)%256;
    timer ++;
    if(timer==20)
    {
        timer=0;
        led=~led;
    }
}

橙黄色的while循环语句很多人不明白为什么加上去之后就能实现定时呢?下面是个人理解:

首先要确认的是:main函数是扫描执行的,如果不加while语句,那么在TR0=1这条语句执行完后,程序会有两个分支同时进行,第一个分支是:重新执行main函数,给定时器赋初值;第二个分支是:定时器开始计时,记到50ms就会跳到中断函数 timer0_service,但是第一个分支的时间要比第二个分支的时间短,也就是说,第二个分支中,定时器还没能计时50ms,程序就已经跳到主函数的赋值语句中了,这就导致定时器还没计时50ms就被重新赋予初值,从而无法跳到中断函数 timer0_service,而加上while语句后,程序就会在此一直等待,而不执行第一个分支,使得定时器计时50ms后再跳到中断函数。

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值