機(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# t
TL0=-(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.33ms
6 O. W# u/ M* p8 V* Z+ D5 \
=====================================================================================*/
" W2 S6 [* a* ?4 U/ n# |$ z
void timer0(void) interrupt 1 using 1
1 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' ?& g
case 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 @ K
case 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; e
case 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; n
case 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' ?* H
case 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 s
case 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- K
case 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: U
5 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 S
break;
# 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 B
case 1:
+ F; S$ g. r, p" R% h8 j
...
2 _5 q( ~, S$ h' C- X
...
9 }, J7 B' ~! B% J& `( P
case 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/ O
order1=timer0(order1);
8 @$ B; \* O, C! y) I' o1 S
if(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