久久久国产一区二区_国产精品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+ [$ I
case 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. P
TL0=-(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/ l
void 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; _! p
case 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 n
case 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$ r
case 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' e
order1++;
, 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! A
OOP編程思想一般都建議子函數使用參數傳遞機制。當單步執行到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/ Q
TR1=0;
+ B6 @0 Z# u% \9 Y( H; x$ ?# o
/ F; b& _1 `( }, S
break;
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 d
return(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