三月的暴风雪 发表于 2011-5-2 20:41:27

回复 metalstorm 的帖子

额,不好意思,没说清楚,在主函数中已经给order1赋值1了

三月的暴风雪 发表于 2011-5-2 20:43:34

回复 robi 的帖子

额,那个是switch函数,和pwm没关系

metalstorm 发表于 2011-5-2 20:52:18

回复 三月的暴风雪 的帖子

OOP编程思想一般都建议子函数使用参数传递机制。当单步执行到case12时,能否通过编程软件的调试功能查看timer()函数中的order1变量的实际值是多少?最好在order++语句前增加一个输出语句,将order1打印出来,这个值才是千真万确的判断条件。如果order1不等于1,能排除不少可能因素。

robi 发表于 2011-5-2 21:01:06

回复 三月的暴风雪 的帖子

               嗯~看懂了~

三月的暴风雪 发表于 2011-5-2 21:41:59

回复 metalstorm 的帖子

嗯,按您的方法调试了,在执行order1++之前一直等于1,直到执行完order1++之后,那个就是跳到TL0=-(3300-PWM_Value1)%256;    order1=0;

TR1=0;

break;

相当郁闷

quanxi1215 发表于 2011-5-2 22:11:59

:)不太明白,学习了,

metalstorm 发表于 2011-5-2 23:19:30

建议将timer()函数改写为参数传递机制:
int timer0(int par)
{
      switch(par)
{
case 1:
...
...
case 12:
      PWM0_5=0 ;
      TH0=-(3300-PWM_Value1)/256;-
      TL0=-(3300-PWM_Value1)%256;
      order1=0;//为什么要在这里清零?建议删除该行,改为在主函数中调用timer0()后,判断如果order1==13,则=1。
      TR1=0;//为什么要在这里清零?建议删除该行,改为在主函数中调用timer0()后,判断如果order1==13,则清零。
      break;;
}
return(par++);
}

在主函数中调用timer0()的语句:
order1=timer0(order1);
if(order1==13) {order1=1; TR1=0;}

无能 发表于 2011-5-3 20:07:29

看了一下你的程序,没看明白要实现什么功能,感觉有点乱,switch没这么用的。
按说跳转没问题,如果出现异常,建议写个测试函数test(),本函数逐个显示所有变量的当前值,test()加在每个break;之前。
页: 1 [2]
查看完整版本: 单片机C语言程序问题,请教