下面的程序使用了一个5ms的定时器,对变量sys_tick进行了+1的操作.
程序的功能是使LED灯亮一秒,熄一秒.
目前程序运行后,通过逻辑分析仪分析 P2_3的电平输出,高低电平持续的时候大部分是准时的,但是有时会少于1000ms,会出现800多ms,500多ms的情况.
如果每次延迟的时候去掉下面红字部分的注释则能正常.请问程序出现的问题在哪?
#include <stdint.h>
void Timer0Init(void) //5毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x28; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
}
typedef uint32_t size_tick;
volatile size_tick sys_tick = 0;
void Timer0Int() __interrupt TF0_VECTOR
{
++sys_tick;
}
void Delay(uint16_t ms)
{
size_tick tick_num = ms / 5;
// sys_tick = 0; // 如果这行注释去掉的话定时是正确的
size_tick cur_tick = sys_tick;
while (sys_tick - cur_tick < tick_num)
{;}
}
void main()
{
EA = 1; //开总中断
Timer0Init();
while (1)
{
P2_3 = 0;
Delay(1000);
P2_3 = 1;
Delay(1000);
}
}
另外,我在每次延迟后通过串口输出 sys_tick的值. 理论上 sys_tick每次输出的值应该是相隔200左右 ( 1000ms/5ms = 200 ).
但是总是在固定时候输出是啊小于200的.
200
400
600
800
1000
1201
1402
1536
1737
1938
2048
2249
2450
2560
2761
2962
3072
3273
3474
|