微控制器:ATmega328P在Arduino Uno
中时钟频率 : 16兆赫
void timeDelay_CTC(float sec, unsigned char times)
{
unsigned char cycles = (unsigned char)(sec / 0.000064f);
OCR1A = cycles - 1;
TCCR1A = 0b00000000;
TCCR1B = 0b00001101;
for( unsigned char i = 1; i <= times; i++ )
{
while( (TIFR1 & (1<<OCF1A)) == 0 );
TIFR1 |= (1<<OCF1A);
}
TCCR1A = 0;
TCCR1B = 0;
}
该函数用于计算延时周期数,然后实现它。
int main(void)
{
//Initialization
LED1_DDR |= (1<<LED1_BIT);
LED1_PORT |= (1<<LED1_BIT);
//Start
while(1)
{
LED1_PORT ^= (1<<LED1_BIT);
timeDelay_CTC(1, 1);
}
}
但是,在运行上述代码时,LED 灯不会切换。如果我只输入 OCR1A = 15624;
(1 秒的周期数),效果很好。因此,问题应该来自unsigned char cycles = (unsigned char)(sec / 0.000064f);
的计算,我认为数据类型转换可能是错误的。你能教我如何让它工作吗?或者给我一些提示。
请检查
无符号字符的范围,它是[0 255],它对于您的应用程序来说不够大。尝试使用无符号的 int。