jianhong_wu 发表于 2014-10-20 11:23:37

51单片机累计定时中断计时时间不准的诡异现象?已解答。

ajian_佛山:
我有个问题,以下是原理图和源代码。第5节 LED灯为什么会是这样,程序应该是亮一秒灭一秒。从波形上看时间不准确。为什么会是这样啊?


void led_flicker() //第三区 LED闪烁应用程序
{

switch(ucLedStep)
{
   case 0:

         if(uiTimeLedCnt>=const_time_05s) //时间到
         {
             uiTimeLedCnt=0; //时间计数器清零
             led_dr=1;    //让LED亮
             ucLedStep=1; //切换到下一个步骤
         }
         break;
   case 1:
         if(uiTimeLedCnt>=const_time_05s) //时间到
         {
            uiTimeLedCnt=0; //时间计数器清零
            led_dr=0;    //让LED灭
            ucLedStep=0; //返回到上一个步骤
         }
         break;
}

}

鸿哥--深圳:
跟开发的设置环境有关。要调整keil设置环境的Meory Model和Code Rom Size。你截图让我看看你的设置模式。

ajian_佛山:
好的。


鸿哥--深圳:
把code rom size 改成compact模式,再告诉我们效果如何。我等你。

ajian_佛山:
我设置了之后还是这样,没解决问题。

鸿哥--深圳:
再改一下。

ajian_佛山:
改哪里?

鸿哥--深圳:
还是改那里。


ajian_佛山:
还是不行。

鸿哥--深圳:
你是用实物开发板还是仿真软件?

ajian_佛山:
仿真软件。

鸿哥--深圳:
这样吧,我现在用实物开发板,和示波器观察一下,一会告诉你结果。

鸿哥--深圳:

请看我上面在实物硬件学习板上用示波器观察的波形,学习板上用示波器观察时间是正确的,但是你在仿真软件看到的是不正确,说明仿真软件protues跟硬件实物是有差距的。当然,也可能不完全是protues的问题,今天我之所以专门用示波器去观察这段代码,是因为我以前也遇到过一些诡异现象,就是让一个LED灯闪烁,结果时间明显不准确,后来我通过调整keil设置环境的Meory Model和Code Rom Size后就正常了。


页: [1]
查看完整版本: 51单片机累计定时中断计时时间不准的诡异现象?已解答。