本帖最后由 651927693 于 2014-5-2 10:53 编辑
写了一个程序,里面设计数码管的动态显示,抛弃了之前延时的做法,一律采用时标。但是却发现时间“跑”了,时间到底去哪儿了呢?
我的定时周期是50us,定时中断函数如下:
void timer0(void) interrupt 1 using 0
{
flag_50us = 1;
}
我用逻辑分析仪测试过,定时准确。
还有一个时标函数,是检查是否到0.5s,如下:
void half_second_check(void)
{
if(flag_50us == 1)
{
flag_50us = 0;
num_50us++;
if(10000 == num_50us)
{
num_50us = 0;
flag_half_second = 1;
P30 = ~P30;
}
}
}
我的主程序如下:void main(void)
{
int num = 0;
timer_init();
P0 = 0x00;
while(1)
{
half_second_check();
if(1 == flag_half_second)
{
flag_half_second = 0;
num ++;
if(999 == num)
num = 0;
}
led_display(num/100, (num%100)/10, num%10, 2);
}
}
注意到我注释了最后一个函数led_display这个函数,这种情况下,测试时间,0.5s,十分准确。
但是当我取消注释时,时间就变成了4.44s
于是很理所当然地认为应该是led_display这个函数的执行时间太长。但是这个程序本身并不长呀,应该不会超过50us:
void led_display(uint num0, uint num1, uint num2, uint dot)
{
static unsigned int segs = 0;
if(num_50us%10000 == 0)
{
if(segs == 0)
{
P32 = 1;
if(0 == dot)
P1 = led_code[num0]-32;
else
P1 = led_code[num0];
P34 = 0;
P33 = 1;
P32 = 1;
}
else if(segs == 1)
{
P34 = 1;
if(1 == dot)
P1 = led_code[num1]-32;
else
P1 = led_code[num1];
P33 = 0;
P34 = 1;
P32 = 1;
}
else
{
P33 = 1;
if(2 == dot)
P1 = led_code[num2] - 32;
else
P1 = led_code[num2];
P32 = 0;
P33 = 1;
P34 = 1;
segs = -1;
}
segs++;
}
}
这个程序就是数码管动态显示的程序,这一句if(num_50us%10000 == 0)用来指定扫描的间隔,现在是每0.5s扫描一次(显示效果自然不好,我这里只是为了调试)。如果到了0.5s,则执行函数,否则直接退出。按理说对时间影响不大呀?
大家帮忙分析分析。
|