不了解ATmega32定时器延迟程序

时间:2014-07-06 18:44:39

标签: c microcontroller avr atmega

我有以下程序......

“编写一个程序,以一定的延迟连续切换PORTB的所有位。使用Timer0,正常模式,没有预分频器选项。”

#include….
    void T0Delay()
    int main ()
    DDRB= 0xFF;
    while (1) {
        PORTB=0x55;
        T0Delay();
        PORTB=0xAA;
        T0Delay();
    }

void T0Delay ()
    {
        TCNT0=0x20;
        TCCR0=0x01;
        while ((TIFR&01)==0);
        TCCR0=0;
        TIFR=0x01;
    }

在“TODelay()”函数中,“while((TIFR& 01)== 0)”的功能是什么?为什么这个循环设置TCCR0 = 0和TIFR = 0x01? 有人可以解释这段代码吗?

4 个答案:

答案 0 :(得分:6)

语句while ((TIFR&01)==0);是整个循环。后面的两个语句不是此循环的一部分,并在循环结束后执行。

此循环的目的是等到TIFR的最低有效位置位。据推测,这被声明为一个易失整数,并映射到控制输入端口的地址(否则此循环将永远不会终止)。

答案 1 :(得分:2)

while ((TIFR&01)==0);是一个忙碌的等待循环。它会继续循环,直到指示计时器已过期的标志更改为1.只有这样,流才会退出循环。

TIFR=0x01;是一种特殊的指示。它实际上清除了旗帜;也就是说,它会将标记设置为0而不是1,如您所料。

因此延迟功能设置定时器计数,启动定时器,然后忙等待循环,直到定时器到达结束。之后它清除定时器标志以允许再次使用定时器。

答案 2 :(得分:0)

用循环检查整行,不要用分号结尾?这意味着循环体是一个空语句,并且它是循环。

分配不是循环的一部分。

答案 3 :(得分:0)

while循环继续检查并等待定时器溢出,一旦定时器溢出,它再次设置定时器,并返回