找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 5624|回复: 17

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

 火.. [复制链接]
发表于 2011-5-2 18:13:29 | 显示全部楼层 |阅读模式
  我在调试单片机程序的时候,发现switch语句中break不起作用,比如说本应该从case11中结束循环的,但是发现没有结束循环,却执行了case12中的语句命令,请问各位大侠,这是何故
回复

使用道具 举报

发表于 2011-5-2 18:23:18 | 显示全部楼层
建议将源程序贴上来。
 楼主| 发表于 2011-5-2 18:35:14 | 显示全部楼层
这是部分程序,前面的程序没有任何问题,当执行4 h4 h+ ~( E6 O' g
case 1:  
+ e; m; J5 l% \- T4 Y" R        PWM0_0=1;/ S8 L/ X/ S* B7 t8 m6 P  E& |* J2 _
        TH0=-PWM_Value1[0]/256;. [* T( K# k# F* A+ V, k
        TL0=-PWM_Value1[0]%256;% Y' N4 I. j. U' v9 z
        break;/ R+ B  ?  C& v/ w1 r; p4 F
时,break没有起作用,反而直接到了case 12中的这一步
7 q) m+ j3 A1 Z6 Q' V5 F- tTL0=-(3300-PWM_Value1[5])%256;
4 s: O2 U" `! Q& W2 r    order1=0;. [. d; S: l2 H! F, |' Y9 a
        TR1=0;
  P2 j3 a% s) `: E! N% s        break;
* S; m" o1 U! o+ r7 }( q( E    }
$ I! X; ~$ ^8 ~) f" [" q  Sorder1++;
7 i7 l0 Q& |. Z) I$ H" a0 `在case12中结束循环的1 u/ R3 @  L! c  _
/*===================================================================================
1 q& T2 Q2 W: ~5 `2 j& ]    定时器T0的中断服务程序& ]+ c9 Q0 f: T" O6 L, C, |
    一个循环20MS  ≈ 6*3.33ms8 M! w& e/ r# r( c* M2 w
=====================================================================================*/
/ y9 Z8 r: ?- o, \void timer0(void) interrupt 1 using 1+ y' F% Y. m& C
{
% n1 T5 [6 F9 B- n2 q3 z; O        switch(order1)% s8 i0 L5 W7 I/ Q
{
, [5 u+ q; U$ h' p8 K7 I* j4 Lcase 1:  ; F, j& `; V' X. V8 \3 b' I2 `
        PWM0_0=1;
  D. P  p$ m  r3 z( F        TH0=-PWM_Value1[0]/256;
. q$ {6 h- w6 X        TL0=-PWM_Value1[0]%256;( ]" `" N& I, M
        break;
+ y7 {; t. B2 y- x# ^case 2:  + D# d. I1 b; ~6 k) @1 Q
        PWM0_0=0;      
" D5 r7 Z; _& s4 R7 M4 u        TH0=-(3300-PWM_Value1[0])/256;) Y- e2 w- l  U4 b' \
        TL0=-(3300-PWM_Value1[0])%256;5 g, ^+ l, l' ]# r4 f
        break;
3 k9 B' g, o7 S/ ~* J" ~case 3:   . q+ I: w, e# l/ l6 p
        PWM0_1=1;9 I4 v& b6 u/ N, j% j2 a; y
        TH0=-PWM_Value1[1]/256;
) [! U! S: X+ L8 ?* S( v+ w- v        TL0=-PWM_Value1[1]%256;4 g8 M! R0 W8 y3 X9 V# r" V
        break;
; E5 Y/ X3 u7 b2 s; dcase 4:   7 T. K! ^$ ]% @. k: P! S
        PWM0_1=0;8 F" W8 E, m7 h1 ^6 h
        TH0=-(3300-PWM_Value1[1])/256;8 O/ P4 f+ V5 e" j6 _% U/ n6 A- \
        TL0=-(3300-PWM_Value1[1])%256;+ r$ ]- [  ]  b! j- z; F' @0 K
        break;, x! g/ v- ?! l1 Q- w# Q' B
case 5:   $ z/ R! t5 D, R: f5 [2 y0 E
        PWM0_2=1;
, |* Y1 k' J5 W8 `        TH0=-PWM_Value1[2]/256;  A3 m; t5 t$ q* C; E' z) H
        TL0=-PWM_Value1[2]%256;
) B; |3 ]/ u  i" @, F        break;/ l. M! B2 j+ C5 \
case 6:   
0 B- W, Z4 h, O8 t! S        PWM0_2=0 ;; A' X6 p% w: s: ~( j% P" z6 T) g: s
        TH0=-(3300-PWM_Value1[2])/256;+ A* ?7 {2 Q! ^' l
        TL0=-(3300-PWM_Value1[2])%256;
9 V* [9 S$ ^& N$ ^# J8 B        break;( V( [) \, w$ ?! T% P
case 7:  
* j% T* v4 @1 |6 I5 }/ t        PWM0_3=1;* ?3 u: N: [" T9 y3 R) n* G
        TH0=-PWM_Value1[3]/256;
( ?+ k4 x& R, z) b/ v& v. Z        TL0=-PWM_Value1[3]%256;* N) O& |, l( q& h" X
        break;4 o% b. o, V/ G" d0 J
case 8:  
# z- \2 h- ]: j- q8 m        PWM0_3=0;       1 [* x+ y8 A1 {0 }8 @" M- [
        TH0=-(3300-PWM_Value1[3])/256;
9 r( A: }' V7 ~5 G: G        TL0=-(3300-PWM_Value1[3])%256;( t2 L; b, P$ P
        break;# S, |" c5 o" H: F5 A3 o) c
case 9:   ! Y) D2 x; r4 }) l( K! ~
        PWM0_4=1;) v2 H8 y$ r; U4 V) o! O
        TH0=-PWM_Value1[4]/256;$ d$ ~$ E6 Y% B% n9 s2 k5 I* e
        TL0=-PWM_Value1[4]%256;$ W. f9 V! J, j( i# ~, E- o6 T
        break;. w, J! N- X* x5 g: d" A. m2 q
case 10:   
1 U; h2 F; `# k9 K) ?6 k) |3 U$ A7 B' o        PWM0_4=0;
% I: H6 r4 W- b+ j$ H& ~* V# p: \% E        TH0=-(3300-PWM_Value1[4])/256;
: t, Z- s: b; q- c        TL0=-(3300-PWM_Value1[4])%256;
+ f2 O% q8 N0 c1 b9 H4 Z) A        break;
  t0 R8 X. ?1 d( {$ w! rcase 11:   $ [1 l" X$ _% V# C. Q  _/ X
        PWM0_5=1;
2 r1 e! b; e0 C6 q1 m        TH0=-PWM_Value1[5]/256;
) f: n/ t6 i2 H+ L        TL0=-PWM_Value1[5]%256;. k/ o9 ^3 {0 ?3 ]: K
        break;7 u/ Z& l' t# _/ A! e, H
case 12:   
: A9 q, u2 M+ x8 m- l/ j        PWM0_5=0 ;
0 Y8 J: f& k) t$ o: r) B' K        TH0=-(3300-PWM_Value1[5])/256;  J) T9 E4 V- C( W: P. @
        TL0=-(3300-PWM_Value1[5])%256;$ b) ]* S( {* \& |
    order1=0;
$ M; m) x; k- d7 l5 x" y/ f. j        TR1=0;
) Z  d0 L5 ^0 D0 ^* ^" A: _1 @        break;) U1 a0 U6 @! ~+ `$ k. e
    }
4 m) Z, k3 s, Y/ L7 Q7 d( Xorder1++;
/ i8 U* o8 ^! R% `: v/ }' X}
发表于 2011-5-2 18:35:43 | 显示全部楼层
仔细的慢慢检查吧,有时候错误的地方不是你想的地方,呵呵。
 楼主| 发表于 2011-5-2 18:37:06 | 显示全部楼层
回复 Michael.MG 的帖子# Z" D" c$ U# R) h, ?

( g8 ^8 X( S# ]/ B这个实在是不明白了,才上来求教的
 楼主| 发表于 2011-5-2 18:51:36 | 显示全部楼层
回复 无能 的帖子/ r8 Q! L+ W3 j

7 V: E/ c7 ?7 l, c前辈,能帮忙解决一下吗?谢谢,程序贴出来了。
发表于 2011-5-2 20:19:19 | 显示全部楼层
本帖最后由 晓昀 于 2011-5-2 20:20 编辑
; D) {0 ~' i0 X$ B, x$ M2 i6 q5 t7 Y8 h6 X. S
单步执行,看看执行到break之后去执行哪一步?9 x( r5 Y+ g6 U5 @2 n0 }, r

" P3 u- c2 x# ?' {- p% ]" _/ t很久不玩这个,忘得差不多了。
, l- {, K, q1 M" e) s# V
发表于 2011-5-2 20:20:46 | 显示全部楼层
问题原因可能在于switch(order1)的order1参数是局部变量,在timer()函数里没有被赋值,因此数值是多少是不确定的。建议函数void timer0(void)应该使用参数传递机制,每次调用timer()函数时应该将order1作为参数传递给该函数,函数结束的时候返回order1++的大小。

点评

谢谢  发表于 2011-5-2 22:43
发表于 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 | 显示全部楼层
回复 晓昀 的帖子+ x0 E) v; |( v. g
; c9 l4 m$ H; w' s) V+ x
就是单步执行的,才知道跳到case12中去了
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Archiver|手机版|小黑屋|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2025-10-17 06:20 , Processed in 0.086893 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表