久久久国产一区二区_国产精品av电影_日韩精品中文字幕一区二区三区_精品一区二区三区免费毛片爱

機械社區

標題: 單片機C語言程序問題,請教 [打印本頁]

作者: 三月的暴風雪    時間: 2011-5-2 18:13
標題: 單片機C語言程序問題,請教
  我在調試單片機程序的時候,發現switch語句中break不起作用,比如說本應該從case11中結束循環的,但是發現沒有結束循環,卻執行了case12中的語句命令,請問各位大俠,這是何故
作者: 無能    時間: 2011-5-2 18:23
建議將源程序貼上來。
作者: 三月的暴風雪    時間: 2011-5-2 18:35
這是部分程序,前面的程序沒有任何問題,當執行
9 c3 ?3 I! G$ d5 ^! W+ [$ Icase 1:  7 [0 g# y0 @, M# H3 `% }
        PWM0_0=1;- H$ }0 R# k7 w& i9 ]: t: @
        TH0=-PWM_Value1[0]/256;& C0 T: i9 v% T) Q
        TL0=-PWM_Value1[0]%256;7 q( J: J' m& P5 D1 D# E
        break;% R7 o, C4 T2 d
時,break沒有起作用,反而直接到了case 12中的這一步
/ q# M) E  F' K. PTL0=-(3300-PWM_Value1[5])%256;
& ]# |4 M% f1 |( J    order1=0;
# S2 V; @- l( p# k1 S        TR1=0;
+ Z9 O8 |  `: V# g* L5 N9 G        break;5 s) t2 {- g, E, s0 x
    }
# w9 g# Z* i& {order1++;4 C5 v3 q- V7 p1 p3 V% y# M* [
在case12中結束循環的0 {. l( O! W( B9 d& j
/*===================================================================================. _; a" ^$ }0 i: @* c2 f
    定時器T0的中斷服務程序9 g6 {! y8 K, o. L; f& [6 K
    一個循環20MS  ≈ 6*3.33ms
3 W, y: X! O3 A5 ^: }+ r=====================================================================================*/
3 L/ ?" Z: ]# t/ lvoid timer0(void) interrupt 1 using 1  A+ j$ c# O2 z4 h) h
{
) r$ K8 \1 G* _! s        switch(order1); U6 W2 ]0 _4 P  j
{5 ?3 v4 I$ \) Z8 x2 g9 G
case 1:  
/ B. q4 [  M7 {# @        PWM0_0=1;
  ~0 j% a/ A0 z& S        TH0=-PWM_Value1[0]/256;
$ B; `1 v- u+ x+ b; v        TL0=-PWM_Value1[0]%256;6 U" z4 P8 r  Q
        break;1 x) U6 J9 D3 q9 r# d3 m+ o  k3 {
case 2:  . w: L+ T6 ?" I0 M  s) S- n3 `' @9 d
        PWM0_0=0;       8 G$ I- c& ~, N3 e1 i
        TH0=-(3300-PWM_Value1[0])/256;! }* V- n2 `/ \6 q
        TL0=-(3300-PWM_Value1[0])%256;
) t- ^' O6 k) K% Y, v        break;2 H( R5 \6 I0 T$ D1 z* ^& B1 N2 O
case 3:   ; ^' X$ D4 V; k* ]' ?0 [8 N
        PWM0_1=1;
8 U& F" i; h9 b, w3 x( C0 ?+ o- W+ x        TH0=-PWM_Value1[1]/256;
; l6 N+ N, c( T- `        TL0=-PWM_Value1[1]%256;; {0 E: _$ ^) f/ I8 Z) ]% a: F
        break;% J9 n( D, t2 @' C! b) Z
case 4:   
4 H4 e! \# C; p( M+ N# e        PWM0_1=0;
! L, p, g/ T/ v3 _        TH0=-(3300-PWM_Value1[1])/256;  w3 d9 s5 e& Y
        TL0=-(3300-PWM_Value1[1])%256;. Q8 n/ @3 ]& h2 H/ W+ E
        break;7 |0 v& ?$ k# Y* X, n8 I  k' L
case 5:   ; J3 i3 a1 L( ~: N3 Q% W" s
        PWM0_2=1;
! l+ U: B# h$ p8 u; W3 x        TH0=-PWM_Value1[2]/256;
8 _: y+ I5 C& f; |: `9 _. |5 V        TL0=-PWM_Value1[2]%256;
" p9 x1 X' J' ^        break;
) c( J' N! p) D  N7 Z! q; _! pcase 6:   ! `0 G4 F0 n; s7 \; F8 q, R
        PWM0_2=0 ;
+ n/ \  G* b4 W4 X( \9 p; v/ S" B        TH0=-(3300-PWM_Value1[2])/256;2 H6 L' v6 y4 Z5 J
        TL0=-(3300-PWM_Value1[2])%256;4 T( Z6 m3 r' @' R2 |+ `" n, i9 P
        break;
3 w5 [! n1 B& Z! \case 7:    N! j. a8 q* l/ P2 ~( U
        PWM0_3=1;
1 x1 h, g8 g4 o5 l) h3 T5 {) |        TH0=-PWM_Value1[3]/256;+ q& R& r9 c; n0 x  g2 S" O' n4 T
        TL0=-PWM_Value1[3]%256;
+ ?5 u& ]1 A5 K; R" O, r* \/ Y6 g        break;2 d8 ^& K& v+ d  H  E  \% U9 {
case 8:  * e( W6 F7 F# \8 |
        PWM0_3=0;       7 u+ \6 }, v' T+ _
        TH0=-(3300-PWM_Value1[3])/256;$ B( U& s0 ~0 \  s6 q, U7 j
        TL0=-(3300-PWM_Value1[3])%256;
! j; D& H* q% t" T        break;% R& s' G  {. f) V
case 9:   ' A. I: B5 V5 b% u# f3 L
        PWM0_4=1;7 A( W0 M2 S2 E
        TH0=-PWM_Value1[4]/256;
3 v- O; C( P) A' }4 P+ z        TL0=-PWM_Value1[4]%256;
" l( |* ~6 O% |( v4 {# @5 |) }        break;
: S4 l& b+ f5 W  ncase 10:   
! x! X: u! `: [4 `4 ]9 f0 v5 ]        PWM0_4=0;
$ L$ p: r- i& I' T. Q1 [' G' G- J        TH0=-(3300-PWM_Value1[4])/256;
2 d5 ]0 W+ `7 B* Z4 K        TL0=-(3300-PWM_Value1[4])%256;
2 t8 l/ F$ G7 V1 l        break;
: _1 L7 t* g  k. Z$ O$ rcase 11:   
5 `& O  q7 K, x2 G; U) ^5 _8 e" W/ g        PWM0_5=1;
* j* U1 q% n3 G3 j) q5 ~# I1 h( e4 V, r        TH0=-PWM_Value1[5]/256;2 M3 |, Z% l9 c' J& Y4 ]
        TL0=-PWM_Value1[5]%256;
, |( {8 p4 ~* ^, r- a2 Z' _        break;
- \) A" b$ T, K- {case 12:   - X# }+ B3 U5 }% Q$ r; A& V9 m
        PWM0_5=0 ;
: p, P  r6 e5 a        TH0=-(3300-PWM_Value1[5])/256;
. t7 J4 [% y4 _& d! d" t3 B        TL0=-(3300-PWM_Value1[5])%256;
: h6 B! e  N8 j7 a    order1=0;
: O, p* k) l2 b0 [1 ?        TR1=0;
5 V! X6 ^: o* G! \        break;" F* q- a1 D+ G
    }
) F0 }" j; _7 H' eorder1++;, G6 o* ]+ J3 |
}
作者: Michael.MG    時間: 2011-5-2 18:35
仔細的慢慢檢查吧,有時候錯誤的地方不是你想的地方,呵呵。
作者: 三月的暴風雪    時間: 2011-5-2 18:37
回復 Michael.MG 的帖子, N4 Z; C7 j6 C& |+ j+ ^

/ t& a/ I0 u) s4 D4 e7 u* {這個實在是不明白了,才上來求教的
作者: 三月的暴風雪    時間: 2011-5-2 18:51
回復 無能 的帖子
/ E8 \6 z7 N1 j$ b7 g; R
. i4 f4 L3 f. N+ [& X% b前輩,能幫忙解決一下嗎?謝謝,程序貼出來了。
作者: 曉昀    時間: 2011-5-2 20:19
本帖最后由 曉昀 于 2011-5-2 20:20 編輯   b- x* x  S: c4 j: b# p! ^- V

) J. t0 H. t; ?+ N單步執行,看看執行到break之后去執行哪一步?
! H+ S" L" W& V- q! ?2 C& \* z; v: m
2 Q! A" D$ D* D# D! [  p& m很久不玩這個,忘得差不多了。7 N' m2 |  c- z* U

作者: 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
回復 曉昀 的帖子
; V" k* g+ k1 F, ~; j5 l1 k8 L* F
就是單步執行的,才知道跳到case12中去了
作者: 三月的暴風雪    時間: 2011-5-2 20:41
回復 metalstorm 的帖子- \* h" V  `4 M; r: T0 k5 I& E& z
8 z& D5 ~. t$ G; j' r6 i1 M
額,不好意思,沒說清楚,在主函數中已經給order1賦值1了
作者: 三月的暴風雪    時間: 2011-5-2 20:43
回復 robi 的帖子! I6 E+ E$ y/ X6 W7 d0 ^$ A8 f

) W; G: I( A! |" y& P額,那個是switch函數,和pwm沒關系
作者: metalstorm    時間: 2011-5-2 20:52
回復 三月的暴風雪 的帖子. f8 A6 q) m: L. Y

- D9 D# N- d+ y! AOOP編程思想一般都建議子函數使用參數傳遞機制。當單步執行到case12時,能否通過編程軟件的調試功能查看timer()函數中的order1變量的實際值是多少?最好在order++語句前增加一個輸出語句,將order1打印出來,這個值才是千真萬確的判斷條件。如果order1不等于1,能排除不少可能因素。8 a% v# ~* a3 E4 M3 M, j" q

作者: robi    時間: 2011-5-2 21:01
回復 三月的暴風雪 的帖子
5 H" [8 F& E8 p
+ [3 w; j; D( k. j. K               嗯~看懂了~
作者: 三月的暴風雪    時間: 2011-5-2 21:41
回復 metalstorm 的帖子% f7 P. t/ |' W2 b- P
5 r! T9 r/ R4 Y! d" Y% _) @
嗯,按您的方法調試了,在執行order1++之前一直等于1,直到執行完order1++之后,那個就是跳到TL0=-(3300-PWM_Value1[5])%256;    order1=0;
2 I& l3 a; o; ?6 w3 ~( u
3 b/ E) X8 x! u7 @3 L: X' c/ QTR1=0;
+ B6 @0 Z# u% \9 Y( H; x$ ?# o
/ F; b& _1 `( }, Sbreak;
0 L6 \5 Q" F- F6 o3 [3 H" Z8 t) |" `4 f' \1 E9 j+ N' W+ X  l+ c9 V
相當郁悶
+ g  w( J- M/ X' w: v) x# p
作者: quanxi1215    時間: 2011-5-2 22:11
不太明白,學習了,
作者: metalstorm    時間: 2011-5-2 23:19
建議將timer()函數改寫為參數傳遞機制:: A3 W1 y& O& y7 p$ U+ X
int timer0(int par)
! `" w* ^0 Q% y) c6 {$ j{; y, H( V' ?5 \. y9 Z8 ?, K/ D
        switch(par)! N) F* J0 y! K$ u" P
{& |8 s6 n% }0 x% I" b
case 1:2 I" M$ A' S2 I( F8 G$ t) m- r
...
" n+ X  w7 L, Q- Y* t% w/ J$ ?...7 t5 V: r: x2 i& w( z2 v" I9 j
case 12:  - l7 o: N  G8 }' ^: ]3 q
        PWM0_5=0 ;
3 V9 C! T7 `" P- x5 r0 k& W! [        TH0=-(3300-PWM_Value1[5])/256;-  I: n' T* s% f3 N$ h
        TL0=-(3300-PWM_Value1[5])%256;* o$ `; `( ]6 Q
        order1=0;  //為什么要在這里清零?建議刪除該行,改為在主函數中調用timer0()后,判斷如果order1==13,則=1。6 ?+ \( |& V' c2 N3 G+ @* t# _* R
        TR1=0;  //為什么要在這里清零?建議刪除該行,改為在主函數中調用timer0()后,判斷如果order1==13,則清零。# p/ B) _& U1 w; j
        break;;9 [. n& l5 [) u, a5 H. l" v
}
8 [* i: f& W& R5 dreturn(par++);
7 v) F4 \& [7 R' k. K* E}
- G# P' r. w$ J8 S1 K9 h. U& z
" Q: ]7 C" H) i6 }* @0 q在主函數中調用timer0()的語句:: q/ l; P4 l# ~, G' h5 u7 @
order1=timer0(order1);) u- z3 \( T7 t3 ]/ c# N
if(order1==13) {order1=1; TR1=0;}# G" I) c- r" d9 L6 r, h: }% c! O

作者: 無能    時間: 2011-5-3 20:07
看了一下你的程序,沒看明白要實現什么功能,感覺有點亂,switch沒這么用的。  l& p* {' X+ T' Q: U
按說跳轉沒問題,如果出現異常,建議寫個測試函數test(),本函數逐個顯示所有變量的當前值,test()加在每個break;之前。




歡迎光臨 機械社區 (http://www.ytsybjq.com/) Powered by Discuz! X3.5