本帖最后由 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,则执行函数,否则直接退出。按理说对时间影响不大呀?
大家帮忙分析分析。
|