机械必威体育网址

标题: 单片机C语言程序问题,请教 [打印本页]

作者: 三月的暴风雪    时间: 2011-5-2 18:13
标题: 单片机C语言程序问题,请教
  我在调试单片机程序的时候,发现switch语句中break不起作用,比如说本应该从case11中结束循环的,但是发现没有结束循环,却执行了case12中的语句命令,请问各位大侠,这是何故
作者: 无能    时间: 2011-5-2 18:23
建议将源程序贴上来。
作者: 三月的暴风雪    时间: 2011-5-2 18:35
这是部分程序,前面的程序没有任何问题,当执行
+ |+ }1 U3 @. F8 @9 \% H7 p. I% }case 1:  ; m+ I! b! `4 v; N+ Y$ G
        PWM0_0=1;
( ^- U  E2 w# e        TH0=-PWM_Value1[0]/256;
# B- S" |( I. }7 P        TL0=-PWM_Value1[0]%256;, e. J4 Q% D. Q- i! R' X
        break;
1 W6 N) P; g" ^% l8 ~2 I时,break没有起作用,反而直接到了case 12中的这一步
# T; d" Q4 u. V# [1 A" q) h; s. vTL0=-(3300-PWM_Value1[5])%256;" [' ^1 G4 Q' C: Y* i
    order1=0;: w% H2 }: n& w& c5 N' q
        TR1=0;
) }% ~: r4 |  D% C, T4 o        break;, n$ Q6 }; V8 J$ E4 D7 _8 L
    }* r3 M, z: ~1 f1 f- v
order1++;
4 Q6 c8 F  q" f" p" L* ]在case12中结束循环的6 B2 u4 a9 D$ I. K
/*===================================================================================- h2 D* A$ [8 @
    定时器T0的中断服务程序5 X- D' Y5 f3 q4 N! B& [( I: r
    一个循环20MS  ≈ 6*3.33ms
+ Q/ {" v2 t7 y' T/ O=====================================================================================*/& u* M. J# {3 r0 ?/ A1 S0 ?3 O
void timer0(void) interrupt 1 using 1
* a3 T; m. q& k+ }: Z7 _- s{, B4 f# C4 `, H. v
        switch(order1)( V$ ~% }. j4 }
{
: P1 w  }# w  D0 hcase 1:  * y8 n+ W# c' Y
        PWM0_0=1;
. `4 r* _3 l# c* A3 u: `: w        TH0=-PWM_Value1[0]/256;* m* A2 o/ v' g+ t& t! X
        TL0=-PWM_Value1[0]%256;
( C* J  l/ v+ W/ M; I$ c  ~1 g        break;8 M: N" a& x+ z( J+ I. q9 r
case 2:  ' g' u- U6 k' b" w. ?
        PWM0_0=0;      
  Q& e0 g8 p( F1 u3 @; E        TH0=-(3300-PWM_Value1[0])/256;! F$ `; d( x( H, _/ t! |* o# s
        TL0=-(3300-PWM_Value1[0])%256;
6 h: X& H7 ]5 g' ?! i        break;# j, B; [6 B1 D7 z) R6 H
case 3:   % @$ c$ [# ~5 ^9 ^/ H
        PWM0_1=1;
0 A) [9 |$ b5 s( ?: T; K' S5 A        TH0=-PWM_Value1[1]/256;
. j: G9 y5 `# ?8 y5 i9 X1 X7 G5 V        TL0=-PWM_Value1[1]%256;
! I8 |1 {  N2 v  `; ?3 h        break;
8 V- ^7 d+ B' X: Z/ O# `6 J$ }) i. Fcase 4:   9 d9 }* q% Y8 o; `% h! {$ {* t
        PWM0_1=0;0 P0 a# u1 r( K
        TH0=-(3300-PWM_Value1[1])/256;
  F  E- V7 R% l6 p        TL0=-(3300-PWM_Value1[1])%256;, U( W$ y+ h7 ?- `
        break;
9 Z* u2 B/ x6 ^4 M8 I/ ]+ Zcase 5:   ' x% u: c3 ]4 M8 f2 z' C+ i/ T
        PWM0_2=1;
+ o* `8 N) `. V' k: M) p        TH0=-PWM_Value1[2]/256;8 i. R8 e/ g9 @
        TL0=-PWM_Value1[2]%256;
* Z5 `5 r3 A' |$ O6 ?4 L5 ^        break;
# ~. f$ g' v' S* }case 6:   
0 G7 c) h. J. J; z% p' b        PWM0_2=0 ;
4 ^# y* u1 T8 e8 _        TH0=-(3300-PWM_Value1[2])/256;
+ u1 ~) U' ?+ [3 T$ J. L0 C        TL0=-(3300-PWM_Value1[2])%256;
* J1 n- W9 c' M. d2 S2 u. W        break;: e& |5 F/ @* C2 q
case 7:  , S/ a7 y- `: d; ^# T
        PWM0_3=1;
. G( n$ D# M9 }: L        TH0=-PWM_Value1[3]/256;' j* f9 Z7 O  t: x5 p) A. X0 l
        TL0=-PWM_Value1[3]%256;; ~1 U5 a1 b$ u9 {6 @4 q2 Z
        break;
8 @; H' r0 n' _case 8:  
5 ^# |& s6 {7 l5 G+ \7 w1 i        PWM0_3=0;      
# a) `* ^9 U8 c7 J        TH0=-(3300-PWM_Value1[3])/256;
0 H2 s& V9 @, k3 R1 ~6 w        TL0=-(3300-PWM_Value1[3])%256;
  ?! c( W4 c; n        break;
. J, ]4 b( F& A% v, a7 scase 9:   4 x2 W  E9 C/ G0 f6 V7 x
        PWM0_4=1;! X; a3 b3 J6 p+ M
        TH0=-PWM_Value1[4]/256;2 T6 @! T, ^# j2 F# x
        TL0=-PWM_Value1[4]%256;
# u& q8 s8 c) V$ E) f4 q, O        break;/ G4 L6 l# w/ n! U
case 10:   / y8 U5 d+ q- R, J3 E0 i
        PWM0_4=0;( x8 o+ k, j, l: H2 L4 m
        TH0=-(3300-PWM_Value1[4])/256;
- Y- k% h# \, e  i* Z( s        TL0=-(3300-PWM_Value1[4])%256;; i' d0 v. j) p0 C3 c7 W% E
        break;
3 ^" V! g- B* }$ k6 Acase 11:   $ F3 U0 J8 P5 t; F
        PWM0_5=1;& O1 x/ ]3 G9 V* f# ^
        TH0=-PWM_Value1[5]/256;5 [2 h* v0 B! h+ P2 i6 [
        TL0=-PWM_Value1[5]%256;
' ?6 g5 i: G5 h9 }- B. x8 [        break;- I$ N/ a; J% r& r4 [
case 12:   $ i* Y2 ^2 c% ~+ j
        PWM0_5=0 ;
' }& Q9 V5 W- U. t5 m+ x8 n        TH0=-(3300-PWM_Value1[5])/256;+ ?- X2 \8 W6 Z4 X, l6 `3 L  c8 m
        TL0=-(3300-PWM_Value1[5])%256;
" t! L' \' G' U( }# c    order1=0;
' _/ |. I! @6 h3 G5 O) {( @, D        TR1=0;3 r8 H% [; w+ m# [" W
        break;4 p; y/ R( q0 Y' G0 W2 a- S
    }
6 _- j0 v, Q1 n$ t! horder1++;
' `  J( Z' ]: |, h}
作者: Michael.MG    时间: 2011-5-2 18:35
仔细的慢慢检查吧,有时候错误的地方不是你想的地方,呵呵。
作者: 三月的暴风雪    时间: 2011-5-2 18:37
回复 Michael.MG 的帖子
8 J/ K! t1 k% D& e
& n% m1 b" I. L" I8 }  q这个实在是不明白了,才上来求教的
作者: 三月的暴风雪    时间: 2011-5-2 18:51
回复 无能 的帖子6 t8 B' o' z. d8 h& K$ e  K
8 x" U4 g: Q3 B# Z% s1 ~3 u3 [
前辈,能帮忙解决一下吗?谢谢,程序贴出来了。
作者: 晓昀    时间: 2011-5-2 20:19
本帖最后由 晓昀 于 2011-5-2 20:20 编辑
" ]  W, _, b1 b3 e- N5 q" j# x* f; X6 c5 }# \( t) N
单步执行,看看执行到break之后去执行哪一步?' `1 M, T: x% s& f) L  V) S# [

8 ?' i( L; v7 O很久不玩这个,忘得差不多了。4 J- Q) L7 C+ M, g; y5 B

作者: metalstorm    时间: 2011-5-2 20:20
问题原因可能在于switch(order1)的order1参数是局部变量,在timer()函数里没有被赋值,因此数值是多少是不确定的。建议函数void timer0(void)应该使用参数传递机制,每次调用timer()函数时应该将order1作为参数传递给该函数,函数结束的时候返回order1++的大小。
作者: robi    时间: 2011-5-2 20:24
PWM是什么意思?有个问题不明白哈,如果PWM0_0,PWM0_1,PWM0_2,PWM0_3,PWM0_4,PWM0_5同时为0,执行那个case?
作者: 三月的暴风雪    时间: 2011-5-2 20:32
回复 晓昀 的帖子  O# M( n5 b8 ~; o8 [) E! a6 _

0 m, V2 I' l7 M! I% k就是单步执行的,才知道跳到case12中去了
作者: 三月的暴风雪    时间: 2011-5-2 20:41
回复 metalstorm 的帖子
* i+ C1 b! O- R8 C0 N
( M1 U7 w9 o6 |2 c' e. A. d额,不好意思,没说清楚,在主函数中已经给order1赋值1了
作者: 三月的暴风雪    时间: 2011-5-2 20:43
回复 robi 的帖子
! w% t3 x3 K# x; r: H0 k5 f4 g4 q% V: S! U/ x
额,那个是switch函数,和pwm没关系
作者: metalstorm    时间: 2011-5-2 20:52
回复 三月的暴风雪 的帖子! H& [" P( Z# N9 K- N

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

作者: robi    时间: 2011-5-2 21:01
回复 三月的暴风雪 的帖子
% Y, X2 ~) F! a! |! V- M( E+ `$ @+ f$ G# z
               嗯~看懂了~
作者: 三月的暴风雪    时间: 2011-5-2 21:41
回复 metalstorm 的帖子; I$ F- K5 K; O4 c' d* F0 _3 M

- f2 y% a: c3 V嗯,按您的方法调试了,在执行order1++之前一直等于1,直到执行完order1++之后,那个就是跳到TL0=-(3300-PWM_Value1[5])%256;    order1=0;: B0 p6 H2 V# _: B

$ f' _, h) }, g* F0 R6 E, ETR1=0;+ e4 E  D) _+ Q  g( m# m8 S

7 n& l* w5 a+ qbreak;1 T2 E8 g' b' Q. R# j
/ |& M8 \5 U3 ?& C( Z
相当郁闷" X$ `5 X" [" e8 B$ k# c

作者: quanxi1215    时间: 2011-5-2 22:11
不太明白,学习了,
作者: metalstorm    时间: 2011-5-2 23:19
建议将timer()函数改写为参数传递机制:
( R7 _8 e% L" J& Oint timer0(int par)
% U1 z/ H0 f& U# [. ^{% \7 ^0 L) n( n9 @
        switch(par)
4 \! {2 n- Y8 ?6 i' Q{- s. D: O9 [$ c+ V2 @/ o0 z" o
case 1:
9 t$ K! N- \4 y* n...
( B& e3 J2 r& B- x* q8 l...
- ]" A4 d/ F  z1 C, {case 12:  + H1 n" s% h  B
        PWM0_5=0 ;
( e% Y4 {* Z$ S0 A        TH0=-(3300-PWM_Value1[5])/256;-% q! e/ b0 P, R0 q8 G
        TL0=-(3300-PWM_Value1[5])%256;. s7 l- j% [8 B) W1 A
        order1=0;  //为什么要在这里清零?建议删除该行,改为在主函数中调用timer0()后,判断如果order1==13,则=1。
( V6 J9 A% S5 m* Q/ l& b        TR1=0;  //为什么要在这里清零?建议删除该行,改为在主函数中调用timer0()后,判断如果order1==13,则清零。
: s  y9 F* ]* u; e* g/ G        break;;) U0 R% p( k9 w; h) N
}
- S. ^* R& w( A6 z+ W2 c0 vreturn(par++);
4 l# Z7 @+ ?+ T& ^8 T* m}
, b; q* F$ B: I& ^+ _9 g% `" v' v, G! e' d7 q& x
在主函数中调用timer0()的语句:, H0 M# [) Y- q7 b
order1=timer0(order1);2 X; N: J. z' L' a) U
if(order1==13) {order1=1; TR1=0;}
, C9 [. U( J7 k; ~8 s
作者: 无能    时间: 2011-5-3 20:07
看了一下你的程序,没看明白要实现什么功能,感觉有点乱,switch没这么用的。
, ?, f! j& J1 w! p9 w: |4 o按说跳转没问题,如果出现异常,建议写个测试函数test(),本函数逐个显示所有变量的当前值,test()加在每个break;之前。




欢迎光临 机械必威体育网址 (//www.szfco.com/) Powered by Discuz! X3.4