機(jī)械社區(qū)

標(biāo)題: 單片機(jī)C語言程序問題,請教 [打印本頁]

作者: 三月的暴風(fēng)雪    時間: 2011-5-2 18:13
標(biāo)題: 單片機(jī)C語言程序問題,請教
  我在調(diào)試單片機(jī)程序的時候,發(fā)現(xiàn)switch語句中break不起作用,比如說本應(yīng)該從case11中結(jié)束循環(huán)的,但是發(fā)現(xiàn)沒有結(jié)束循環(huán),卻執(zhí)行了case12中的語句命令,請問各位大俠,這是何故
作者: 無能    時間: 2011-5-2 18:23
建議將源程序貼上來。
作者: 三月的暴風(fēng)雪    時間: 2011-5-2 18:35
這是部分程序,前面的程序沒有任何問題,當(dāng)執(zhí)行/ u5 `* G, A& @: L  u4 W4 h
case 1:  ' r! W* b, T; l
        PWM0_0=1;
$ A* D2 e7 @6 g$ k4 x8 T        TH0=-PWM_Value1[0]/256;6 ^9 r; R5 |) X
        TL0=-PWM_Value1[0]%256;
! l+ k. z6 F) M2 k* f! ]- V        break;
. N, f' H$ e  i; ]時,break沒有起作用,反而直接到了case 12中的這一步
- |# _, h) n8 q: D% ]  n# tTL0=-(3300-PWM_Value1[5])%256;
2 K4 t7 _- {# T4 Q# L! T    order1=0;: |0 T% Q# H, G1 A
        TR1=0;) n# |7 r1 ~! E( E7 ~& p- E
        break;
5 p8 p* b5 S" F    }  U; G- s5 U  @2 v5 W/ H
order1++;+ J- u1 }2 m: t) N% M* T. D
在case12中結(jié)束循環(huán)的
1 J, e3 S# z; C: S" ~; n& k& f7 G6 G* j/*===================================================================================
5 d) ]4 Z* K" i: m0 ^    定時器T0的中斷服務(wù)程序* R% h3 R4 Q3 j; I" L0 ~/ O
    一個循環(huán)20MS  ≈ 6*3.33ms6 O. W# u/ M* p8 V* Z+ D5 \
=====================================================================================*/" W2 S6 [* a* ?4 U/ n# |$ z
void timer0(void) interrupt 1 using 11 h4 b9 D( e% E6 Z' x: j+ O
{
- l5 R- i; V# `8 [( W        switch(order1)
0 f( B1 a# R) G{
3 W" n; H4 F6 ?! R  N' ?& gcase 1:  
1 ]) n3 y9 ^, |# x" `        PWM0_0=1;' |/ _, R9 m3 s/ a: j# g
        TH0=-PWM_Value1[0]/256;4 R6 }3 u# G# a' i9 [! l1 {1 @
        TL0=-PWM_Value1[0]%256;1 J7 c/ C2 X( c% G' S
        break;1 X/ u: d& l( s$ T6 [* o' h
case 2:  % I! k0 _" I' i, V7 ~! k2 r6 f
        PWM0_0=0;      
0 D) ?% E0 M6 E0 [4 _& j! i        TH0=-(3300-PWM_Value1[0])/256;
# d6 K8 }' Y/ m1 ^  _        TL0=-(3300-PWM_Value1[0])%256;3 H7 @" K! [* Y8 }5 Z/ K- _
        break;
$ r$ Z; h6 l0 E8 l$ W9 @  Kcase 3:   
, ], W  V% n3 ^! v        PWM0_1=1;) b* r: x* f& _- F, k* F7 ^: j9 d
        TH0=-PWM_Value1[1]/256;! W+ h! a3 r4 |8 r7 T9 t6 U
        TL0=-PWM_Value1[1]%256;$ t' s! l- r0 |* g
        break;
! b6 }# K9 ^9 i; [case 4:   " Q2 }) k8 c! ?  C) b* ^* B1 B
        PWM0_1=0;5 T1 ], D) \  l6 Z+ J# H
        TH0=-(3300-PWM_Value1[1])/256;: H3 {" i, Z  N5 O2 Y7 q
        TL0=-(3300-PWM_Value1[1])%256;0 C: ?/ H8 b* x' r4 Z
        break;
8 t# @% e$ [. B0 J  ]$ L/ A; ecase 5:   
% z1 v3 I" l2 x* |- `        PWM0_2=1;
5 ~, l; X+ X0 N6 y2 J        TH0=-PWM_Value1[2]/256;
: X" L% N8 l; Z1 o4 F        TL0=-PWM_Value1[2]%256;
) o9 v/ h. u# |0 r        break;- L, v. e; Y' i. C
case 6:   
# H$ o9 k1 c. n  \- B. n        PWM0_2=0 ;3 n/ F# w" k, w' ~, a  K, J6 d
        TH0=-(3300-PWM_Value1[2])/256;
1 o) [: H9 B4 H1 @3 r        TL0=-(3300-PWM_Value1[2])%256;
/ j) W# i! t, U- f& W        break;
( m2 Q3 W4 H* s! X; ncase 7:  
- ~0 L8 @+ C& V: @. g0 W0 p* ], L        PWM0_3=1;
0 Y# @3 v9 ?8 g/ K7 q: v' I        TH0=-PWM_Value1[3]/256;: ^$ C) I! y  j8 P. x5 i
        TL0=-PWM_Value1[3]%256;
4 }4 ]9 }: l( F% S& s: j        break;
% W3 {0 M0 j' ?* Hcase 8:  
$ f3 F0 d4 E  ^5 b" |( a# k" o        PWM0_3=0;       7 z: i& n( t) [% g$ p+ {0 z) N
        TH0=-(3300-PWM_Value1[3])/256;. h. w& U0 Y  \; {5 b* v% F" z$ r
        TL0=-(3300-PWM_Value1[3])%256;
: t( l1 q( z* ^' r! m" \        break;
; B) N5 a7 A, f* h+ ]/ l  scase 9:   
: S; J& H( y3 R: L* L        PWM0_4=1;
1 e9 ]& U4 D/ \$ ], k        TH0=-PWM_Value1[4]/256;
9 G: J" E+ Z5 w, e5 }0 V4 z; N- M        TL0=-PWM_Value1[4]%256;2 g) I( E$ ^; r/ R' G
        break;+ Q7 B6 D0 D; I( ~: V2 n& L9 ^
case 10:   
- T" J- g. w2 v7 Z5 |        PWM0_4=0;+ Z$ `& ?0 I; ^
        TH0=-(3300-PWM_Value1[4])/256;
% y" \: E! s. h0 `5 X0 k        TL0=-(3300-PWM_Value1[4])%256;1 k! ~! C9 c6 `* D! t
        break;
. Z, b! V2 `$ _  i: n- Kcase 11:   8 x, C4 G( s6 A6 B  `8 ]; K
        PWM0_5=1;* l' |7 N, ~& f  x; `: a6 X
        TH0=-PWM_Value1[5]/256;
$ y$ m; s% }8 h+ Y, J        TL0=-PWM_Value1[5]%256;
6 g5 W9 n9 M! `3 H        break;
! K8 d' i4 R4 {) C: ]case 12:   : }' s$ X3 [) K4 p/ f" Q6 X
        PWM0_5=0 ;0 ~" b0 p' q8 {2 N1 J
        TH0=-(3300-PWM_Value1[5])/256;  l8 x$ N  L& A& O
        TL0=-(3300-PWM_Value1[5])%256;
) W, ?3 G0 m( l8 @" e2 N' |7 H    order1=0;
; P, O+ q1 u* v  Y: c# N0 F        TR1=0;: H, g  c+ W1 z9 z) D
        break;
( t& F' a5 U+ d5 n9 {1 g6 c# B    }+ p+ K  n) A5 u9 b: b$ U. m$ Z4 `$ n
order1++;- r7 H5 `& |: l2 j' c( l, z) U6 \  z9 D
}
作者: Michael.MG    時間: 2011-5-2 18:35
仔細(xì)的慢慢檢查吧,有時候錯誤的地方不是你想的地方,呵呵。
作者: 三月的暴風(fēng)雪    時間: 2011-5-2 18:37
回復(fù) Michael.MG 的帖子' h# U. G: C& V1 ]' ]
( N7 h1 C- V* A) [" v/ Q
這個實在是不明白了,才上來求教的
作者: 三月的暴風(fēng)雪    時間: 2011-5-2 18:51
回復(fù) 無能 的帖子
/ p$ g( P% G; v, x# i. ~4 J* k/ F# \1 N& K- H& m  K
前輩,能幫忙解決一下嗎?謝謝,程序貼出來了。
作者: 曉昀    時間: 2011-5-2 20:19
本帖最后由 曉昀 于 2011-5-2 20:20 編輯
  S  u* }+ p7 s' s* T! ?2 ?+ o: U5 n! f- A: [! }+ H( M
單步執(zhí)行,看看執(zhí)行到break之后去執(zhí)行哪一步?
6 @  g$ k( C; B) ]9 n; J
6 _9 q2 |+ `( M) O/ s很久不玩這個,忘得差不多了。
6 Z8 ?# b: T7 N  l+ n; R: X
作者: metalstorm    時間: 2011-5-2 20:20
問題原因可能在于switch(order1)的order1參數(shù)是局部變量,在timer()函數(shù)里沒有被賦值,因此數(shù)值是多少是不確定的。建議函數(shù)void timer0(void)應(yīng)該使用參數(shù)傳遞機(jī)制,每次調(diào)用timer()函數(shù)時應(yīng)該將order1作為參數(shù)傳遞給該函數(shù),函數(shù)結(jié)束的時候返回order1++的大小。
作者: robi    時間: 2011-5-2 20:24
PWM是什么意思?有個問題不明白哈,如果PWM0_0,PWM0_1,PWM0_2,PWM0_3,PWM0_4,PWM0_5同時為0,執(zhí)行那個case?
作者: 三月的暴風(fēng)雪    時間: 2011-5-2 20:32
回復(fù) 曉昀 的帖子; p# p* @" d. T1 Z. `

# Z+ `: u9 {; L# r, j. t$ I就是單步執(zhí)行的,才知道跳到case12中去了
作者: 三月的暴風(fēng)雪    時間: 2011-5-2 20:41
回復(fù) metalstorm 的帖子8 a. G( e, }" ^5 {# R2 h

5 L. m/ y9 M& ~( C6 h額,不好意思,沒說清楚,在主函數(shù)中已經(jīng)給order1賦值1了
作者: 三月的暴風(fēng)雪    時間: 2011-5-2 20:43
回復(fù) robi 的帖子
% e. Q% W# @4 |; ^5 v- U, B$ Z, q# E0 O' E' J% G
額,那個是switch函數(shù),和pwm沒關(guān)系
作者: metalstorm    時間: 2011-5-2 20:52
回復(fù) 三月的暴風(fēng)雪 的帖子! f6 A+ \$ c# g! p# T4 Z6 H" Y, ?* ?
5 e  o$ V% t; P- V$ t
OOP編程思想一般都建議子函數(shù)使用參數(shù)傳遞機(jī)制。當(dāng)單步執(zhí)行到case12時,能否通過編程軟件的調(diào)試功能查看timer()函數(shù)中的order1變量的實際值是多少?最好在order++語句前增加一個輸出語句,將order1打印出來,這個值才是千真萬確的判斷條件。如果order1不等于1,能排除不少可能因素。
: X( h7 f: U/ W: J  F' U0 H
作者: robi    時間: 2011-5-2 21:01
回復(fù) 三月的暴風(fēng)雪 的帖子
, ~6 b: X5 ]) i/ _" |; [+ q9 o$ |& L& Z/ ]" G2 v# ]* p
               嗯~看懂了~
作者: 三月的暴風(fēng)雪    時間: 2011-5-2 21:41
回復(fù) metalstorm 的帖子2 q% t0 V: \6 z6 W) i% M

9 ^: c, }/ o0 Z; y5 x' E: z嗯,按您的方法調(diào)試了,在執(zhí)行order1++之前一直等于1,直到執(zhí)行完order1++之后,那個就是跳到TL0=-(3300-PWM_Value1[5])%256;    order1=0;5 g9 {- a) Q, t. k; y( Q
8 ?$ ]5 O) K  Q" E
TR1=0;
% M# O) M+ _0 M, W4 |( [! y. H4 z
- \) o& F( F: ]! L. o6 J' T1 Sbreak;# n. G6 ]+ ]: e+ q4 P( s" h, I9 j& l

6 N1 b/ g$ ?% P" J4 M0 p+ s+ f相當(dāng)郁悶- F' m6 n! |. a: r+ J9 P/ {" e

作者: quanxi1215    時間: 2011-5-2 22:11
不太明白,學(xué)習(xí)了,
作者: metalstorm    時間: 2011-5-2 23:19
建議將timer()函數(shù)改寫為參數(shù)傳遞機(jī)制:9 l( P  `  B) i1 v; X% X
int timer0(int par)7 O! S0 y+ e& F8 B4 z& l
{- Z/ A+ B6 l$ j) e2 t: h
        switch(par)/ a% u  t) c7 c( a' Z# {
{
5 R1 n9 S$ l$ a3 Bcase 1:
+ F; S$ g. r, p" R% h8 j...2 _5 q( ~, S$ h' C- X
...
9 }, J7 B' ~! B% J& `( Pcase 12:  5 M+ O: a5 v) ]* n0 o
        PWM0_5=0 ;3 c" o" Y$ ]" l# o0 ~
        TH0=-(3300-PWM_Value1[5])/256;-
4 u( X$ f4 x" s        TL0=-(3300-PWM_Value1[5])%256;5 G$ b) a9 \% y6 m4 O# o
        order1=0;  //為什么要在這里清零?建議刪除該行,改為在主函數(shù)中調(diào)用timer0()后,判斷如果order1==13,則=1。7 t/ K% Y0 j/ P. Z$ ^/ i- J2 E
        TR1=0;  //為什么要在這里清零?建議刪除該行,改為在主函數(shù)中調(diào)用timer0()后,判斷如果order1==13,則清零。" E* k6 g' H* E; U8 T9 n& @7 C
        break;;
/ k% A: r7 P* f! A}$ q; N# P* \" h3 t
return(par++); 1 W' e8 Z5 `3 m$ j
}
# f# [  L0 I+ X, @& H! p* g# ^3 }4 r9 Z
在主函數(shù)中調(diào)用timer0()的語句:
! C: p, W5 o1 D4 b* j8 t/ Oorder1=timer0(order1);
8 @$ B; \* O, C! y) I' o1 Sif(order1==13) {order1=1; TR1=0;}7 E: Z' H& c0 G5 ^% Y0 T

作者: 無能    時間: 2011-5-3 20:07
看了一下你的程序,沒看明白要實現(xiàn)什么功能,感覺有點亂,switch沒這么用的。% Q4 E! L7 m8 ~& y
按說跳轉(zhuǎn)沒問題,如果出現(xiàn)異常,建議寫個測試函數(shù)test(),本函數(shù)逐個顯示所有變量的當(dāng)前值,test()加在每個break;之前。




歡迎光臨 機(jī)械社區(qū) (http://e-learninguniversity.com/) Powered by Discuz! X3.4