三月的暴风雪 发表于 2011-5-2 18:13:29

单片机C语言程序问题,请教

我在调试单片机程序的时候,发现switch语句中break不起作用,比如说本应该从case11中结束循环的,但是发现没有结束循环,却执行了case12中的语句命令,请问各位大侠,这是何故

无能 发表于 2011-5-2 18:23:18

建议将源程序贴上来。

三月的暴风雪 发表于 2011-5-2 18:35:14

这是部分程序,前面的程序没有任何问题,当执行
case 1:
        PWM0_0=1;
        TH0=-PWM_Value1/256;
        TL0=-PWM_Value1%256;
        break;
时,break没有起作用,反而直接到了case 12中的这一步
TL0=-(3300-PWM_Value1)%256;
    order1=0;
        TR1=0;
        break;
    }
order1++;
在case12中结束循环的
/*===================================================================================
    定时器T0的中断服务程序
    一个循环20MS≈ 6*3.33ms
=====================================================================================*/
void timer0(void) interrupt 1 using 1
{
        switch(order1)
{
case 1:
        PWM0_0=1;
        TH0=-PWM_Value1/256;
        TL0=-PWM_Value1%256;
        break;
case 2:
        PWM0_0=0;      
        TH0=-(3300-PWM_Value1)/256;
        TL0=-(3300-PWM_Value1)%256;
        break;
case 3:   
        PWM0_1=1;
        TH0=-PWM_Value1/256;
        TL0=-PWM_Value1%256;
        break;
case 4:   
        PWM0_1=0;
        TH0=-(3300-PWM_Value1)/256;
        TL0=-(3300-PWM_Value1)%256;
        break;
case 5:   
        PWM0_2=1;
        TH0=-PWM_Value1/256;
        TL0=-PWM_Value1%256;
        break;
case 6:   
        PWM0_2=0 ;
        TH0=-(3300-PWM_Value1)/256;
        TL0=-(3300-PWM_Value1)%256;
        break;
case 7:
        PWM0_3=1;
        TH0=-PWM_Value1/256;
        TL0=-PWM_Value1%256;
        break;
case 8:
        PWM0_3=0;      
        TH0=-(3300-PWM_Value1)/256;
        TL0=-(3300-PWM_Value1)%256;
        break;
case 9:   
        PWM0_4=1;
        TH0=-PWM_Value1/256;
        TL0=-PWM_Value1%256;
        break;
case 10:   
        PWM0_4=0;
        TH0=-(3300-PWM_Value1)/256;
        TL0=-(3300-PWM_Value1)%256;
        break;
case 11:   
        PWM0_5=1;
        TH0=-PWM_Value1/256;
        TL0=-PWM_Value1%256;
        break;
case 12:   
        PWM0_5=0 ;
        TH0=-(3300-PWM_Value1)/256;
        TL0=-(3300-PWM_Value1)%256;
    order1=0;
        TR1=0;
        break;
    }
order1++;
}

Michael.MG 发表于 2011-5-2 18:35:43

仔细的慢慢检查吧,有时候错误的地方不是你想的地方,呵呵。

三月的暴风雪 发表于 2011-5-2 18:37:06

回复 Michael.MG 的帖子

这个实在是不明白了,才上来求教的

三月的暴风雪 发表于 2011-5-2 18:51:36

回复 无能 的帖子

前辈,能帮忙解决一下吗?谢谢,程序贴出来了。

晓昀 发表于 2011-5-2 20:19:19

本帖最后由 晓昀 于 2011-5-2 20:20 编辑

单步执行,看看执行到break之后去执行哪一步?

很久不玩这个,忘得差不多了。

metalstorm 发表于 2011-5-2 20:20:46

问题原因可能在于switch(order1)的order1参数是局部变量,在timer()函数里没有被赋值,因此数值是多少是不确定的。建议函数void timer0(void)应该使用参数传递机制,每次调用timer()函数时应该将order1作为参数传递给该函数,函数结束的时候返回order1++的大小。

robi 发表于 2011-5-2 20:24:57

PWM是什么意思?有个问题不明白哈,如果PWM0_0,PWM0_1,PWM0_2,PWM0_3,PWM0_4,PWM0_5同时为0,执行那个case?

三月的暴风雪 发表于 2011-5-2 20:32:17

回复 晓昀 的帖子

就是单步执行的,才知道跳到case12中去了
页: [1] 2
查看完整版本: 单片机C语言程序问题,请教