机械必威体育网址
标题:
单片机C语言程序问题,请教
[打印本页]
作者:
三月的暴风雪
时间:
2011-5-2 18:13
标题:
单片机C语言程序问题,请教
我在调试单片机程序的时候,发现switch语句中break不起作用,比如说本应该从case11中结束循环的,但是发现没有结束循环,却执行了case12中的语句命令,请问各位大侠,这是何故
作者:
无能
时间:
2011-5-2 18:23
建议将源程序贴上来。
作者:
三月的暴风雪
时间:
2011-5-2 18:35
这是部分程序,前面的程序没有任何问题,当执行
+ |+ }1 U3 @. F8 @9 \% H7 p. I% }
case 1:
; m+ I! b! `4 v; N+ Y$ G
PWM0_0=1;
( ^- U E2 w# e
TH0=-PWM_Value1[0]/256;
# B- S" |( I. }7 P
TL0=-PWM_Value1[0]%256;
, e. J4 Q% D. Q- i! R' X
break;
1 W6 N) P; g" ^% l8 ~2 I
时,break没有起作用,反而直接到了case 12中的这一步
# T; d" Q4 u. V# [1 A" q) h; s. v
TL0=-(3300-PWM_Value1[5])%256;
" [' ^1 G4 Q' C: Y* i
order1=0;
: w% H2 }: n& w& c5 N' q
TR1=0;
) }% ~: r4 | D% C, T4 o
break;
, n$ Q6 }; V8 J$ E4 D7 _8 L
}
* r3 M, z: ~1 f1 f- v
order1++;
4 Q6 c8 F q" f" p" L* ]
在case12中结束循环的
6 B2 u4 a9 D$ I. K
/*===================================================================================
- h2 D* A$ [8 @
定时器T0的中断服务程序
5 X- D' Y5 f3 q4 N! B& [( I: r
一个循环20MS ≈ 6*3.33ms
+ Q/ {" v2 t7 y' T/ O
=====================================================================================*/
& u* M. J# {3 r0 ?/ A1 S0 ?3 O
void timer0(void) interrupt 1 using 1
* a3 T; m. q& k+ }: Z7 _- s
{
, B4 f# C4 `, H. v
switch(order1)
( V$ ~% }. j4 }
{
: P1 w }# w D0 h
case 1:
* y8 n+ W# c' Y
PWM0_0=1;
. `4 r* _3 l# c* A3 u: `: w
TH0=-PWM_Value1[0]/256;
* m* A2 o/ v' g+ t& t! X
TL0=-PWM_Value1[0]%256;
( C* J l/ v+ W/ M; I$ c ~1 g
break;
8 M: N" a& x+ z( J+ I. q9 r
case 2:
' g' u- U6 k' b" w. ?
PWM0_0=0;
Q& e0 g8 p( F1 u3 @; E
TH0=-(3300-PWM_Value1[0])/256;
! F$ `; d( x( H, _/ t! |* o# s
TL0=-(3300-PWM_Value1[0])%256;
6 h: X& H7 ]5 g' ?! i
break;
# j, B; [6 B1 D7 z) R6 H
case 3:
% @$ c$ [# ~5 ^9 ^/ H
PWM0_1=1;
0 A) [9 |$ b5 s( ?: T; K' S5 A
TH0=-PWM_Value1[1]/256;
. j: G9 y5 `# ?8 y5 i9 X1 X7 G5 V
TL0=-PWM_Value1[1]%256;
! I8 |1 { N2 v `; ?3 h
break;
8 V- ^7 d+ B' X: Z/ O# `6 J$ }) i. F
case 4:
9 d9 }* q% Y8 o; `% h! {$ {* t
PWM0_1=0;
0 P0 a# u1 r( K
TH0=-(3300-PWM_Value1[1])/256;
F E- V7 R% l6 p
TL0=-(3300-PWM_Value1[1])%256;
, U( W$ y+ h7 ?- `
break;
9 Z* u2 B/ x6 ^4 M8 I/ ]+ Z
case 5:
' x% u: c3 ]4 M8 f2 z' C+ i/ T
PWM0_2=1;
+ o* `8 N) `. V' k: M) p
TH0=-PWM_Value1[2]/256;
8 i. R8 e/ g9 @
TL0=-PWM_Value1[2]%256;
* Z5 `5 r3 A' |$ O6 ?4 L5 ^
break;
# ~. f$ g' v' S* }
case 6:
0 G7 c) h. J. J; z% p' b
PWM0_2=0 ;
4 ^# y* u1 T8 e8 _
TH0=-(3300-PWM_Value1[2])/256;
+ u1 ~) U' ?+ [3 T$ J. L0 C
TL0=-(3300-PWM_Value1[2])%256;
* J1 n- W9 c' M. d2 S2 u. W
break;
: e& |5 F/ @* C2 q
case 7:
, S/ a7 y- `: d; ^# T
PWM0_3=1;
. G( n$ D# M9 }: L
TH0=-PWM_Value1[3]/256;
' j* f9 Z7 O t: x5 p) A. X0 l
TL0=-PWM_Value1[3]%256;
; ~1 U5 a1 b$ u9 {6 @4 q2 Z
break;
8 @; H' r0 n' _
case 8:
5 ^# |& s6 {7 l5 G+ \7 w1 i
PWM0_3=0;
# a) `* ^9 U8 c7 J
TH0=-(3300-PWM_Value1[3])/256;
0 H2 s& V9 @, k3 R1 ~6 w
TL0=-(3300-PWM_Value1[3])%256;
?! c( W4 c; n
break;
. J, ]4 b( F& A% v, a7 s
case 9:
4 x2 W E9 C/ G0 f6 V7 x
PWM0_4=1;
! X; a3 b3 J6 p+ M
TH0=-PWM_Value1[4]/256;
2 T6 @! T, ^# j2 F# x
TL0=-PWM_Value1[4]%256;
# u& q8 s8 c) V$ E) f4 q, O
break;
/ G4 L6 l# w/ n! U
case 10:
/ y8 U5 d+ q- R, J3 E0 i
PWM0_4=0;
( x8 o+ k, j, l: H2 L4 m
TH0=-(3300-PWM_Value1[4])/256;
- Y- k% h# \, e i* Z( s
TL0=-(3300-PWM_Value1[4])%256;
; i' d0 v. j) p0 C3 c7 W% E
break;
3 ^" V! g- B* }$ k6 A
case 11:
$ F3 U0 J8 P5 t; F
PWM0_5=1;
& O1 x/ ]3 G9 V* f# ^
TH0=-PWM_Value1[5]/256;
5 [2 h* v0 B! h+ P2 i6 [
TL0=-PWM_Value1[5]%256;
' ?6 g5 i: G5 h9 }- B. x8 [
break;
- I$ N/ a; J% r& r4 [
case 12:
$ i* Y2 ^2 c% ~+ j
PWM0_5=0 ;
' }& Q9 V5 W- U. t5 m+ x8 n
TH0=-(3300-PWM_Value1[5])/256;
+ ?- X2 \8 W6 Z4 X, l6 `3 L c8 m
TL0=-(3300-PWM_Value1[5])%256;
" t! L' \' G' U( }# c
order1=0;
' _/ |. I! @6 h3 G5 O) {( @, D
TR1=0;
3 r8 H% [; w+ m# [" W
break;
4 p; y/ R( q0 Y' G0 W2 a- S
}
6 _- j0 v, Q1 n$ t! h
order1++;
' ` J( Z' ]: |, h
}
作者:
Michael.MG
时间:
2011-5-2 18:35
仔细的慢慢检查吧,有时候错误的地方不是你想的地方,呵呵。
作者:
三月的暴风雪
时间:
2011-5-2 18:37
回复
Michael.MG
的帖子
8 J/ K! t1 k% D& e
& n% m1 b" I. L" I8 } q
这个实在是不明白了,才上来求教的
作者:
三月的暴风雪
时间:
2011-5-2 18:51
回复
无能
的帖子
6 t8 B' o' z. d8 h& K$ e K
8 x" U4 g: Q3 B# Z% s1 ~3 u3 [
前辈,能帮忙解决一下吗?谢谢,程序贴出来了。
作者:
晓昀
时间:
2011-5-2 20:19
本帖最后由 晓昀 于 2011-5-2 20:20 编辑
" ] W, _, b1 b3 e- N
5 q" j# x* f; X6 c5 }# \( t) N
单步执行,看看执行到break之后去执行哪一步?
' `1 M, T: x% s& f) L V) S# [
8 ?' i( L; v7 O
很久不玩这个,忘得差不多了。
4 J- Q) L7 C+ M, g; y5 B
作者:
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
回复
晓昀
的帖子
O# M( n5 b8 ~; o8 [) E! a6 _
0 m, V2 I' l7 M! I% k
就是单步执行的,才知道跳到case12中去了
作者:
三月的暴风雪
时间:
2011-5-2 20:41
回复
metalstorm
的帖子
* i+ C1 b! O- R8 C0 N
( M1 U7 w9 o6 |2 c' e. A. d
额,不好意思,没说清楚,在主函数中已经给order1赋值1了
作者:
三月的暴风雪
时间:
2011-5-2 20:43
回复
robi
的帖子
! w% t3 x3 K# x; r
: H0 k5 f4 g4 q% V: S! U/ x
额,那个是switch函数,和pwm没关系
作者:
metalstorm
时间:
2011-5-2 20:52
回复
三月的暴风雪
的帖子
! H& [" P( Z# N9 K- N
# t9 e2 y6 z% L/ [8 E
OOP编程思想一般都建议子函数使用参数传递机制。当单步执行到case12时,能否通过编程软件的调试功能查看timer()函数中的order1变量的实际值是多少?最好在order++语句前增加一个输出语句,将order1打印出来,这个值才是千真万确的判断条件。如果order1不等于1,能排除不少可能因素。
. T6 l! t- J9 d
作者:
robi
时间:
2011-5-2 21:01
回复
三月的暴风雪
的帖子
% Y, X2 ~) F! a! |! V- M
( E+ `$ @+ f$ G# z
嗯~看懂了~
作者:
三月的暴风雪
时间:
2011-5-2 21:41
回复
metalstorm
的帖子
; I$ F- K5 K; O4 c' d* F0 _3 M
- f2 y% a: c3 V
嗯,按您的方法调试了,在执行order1++之前一直等于1,直到执行完order1++之后,那个就是跳到TL0=-(3300-PWM_Value1[5])%256; order1=0;
: B0 p6 H2 V# _: B
$ f' _, h) }, g* F0 R6 E, E
TR1=0;
+ e4 E D) _+ Q g( m# m8 S
7 n& l* w5 a+ q
break;
1 T2 E8 g' b' Q. R# j
/ |& M8 \5 U3 ?& C( Z
相当郁闷
" X$ `5 X" [" e8 B$ k# c
作者:
quanxi1215
时间:
2011-5-2 22:11
不太明白,学习了,
作者:
metalstorm
时间:
2011-5-2 23:19
建议将timer()函数改写为参数传递机制:
( R7 _8 e% L" J& O
int timer0(int par)
% U1 z/ H0 f& U# [. ^
{
% \7 ^0 L) n( n9 @
switch(par)
4 \! {2 n- Y8 ?6 i' Q
{
- s. D: O9 [$ c+ V2 @/ o0 z" o
case 1:
9 t$ K! N- \4 y* n
...
( B& e3 J2 r& B- x* q8 l
...
- ]" A4 d/ F z1 C, {
case 12:
+ H1 n" s% h B
PWM0_5=0 ;
( e% Y4 {* Z$ S0 A
TH0=-(3300-PWM_Value1[5])/256;
-
% q! e/ b0 P, R0 q8 G
TL0=-(3300-PWM_Value1[5])%256;
. s7 l- j% [8 B) W1 A
order1=0; //为什么要在这里清零?建议删除该行,改为在主函数中调用timer0()后,判断如果order1==13,则=1。
( V6 J9 A% S5 m* Q/ l& b
TR1=0; //为什么要在这里清零?建议删除该行,改为在主函数中调用timer0()后,判断如果order1==13,则清零。
: s y9 F* ]* u; e* g/ G
break;
;
) U0 R% p( k9 w; h) N
}
- S. ^* R& w( A6 z+ W2 c0 v
return(par++);
4 l# Z7 @+ ?+ T& ^8 T* m
}
, b; q* F$ B: I& ^+ _9 g% `
" v' v, G! e' d7 q& x
在主函数中调用timer0()的语句:
, H0 M# [) Y- q7 b
order1=timer0(order1);
2 X; N: J. z' L' a) U
if(order1==13) {order1=1; TR1=0;}
, C9 [. U( J7 k; ~8 s
作者:
无能
时间:
2011-5-3 20:07
看了一下你的程序,没看明白要实现什么功能,感觉有点乱,switch没这么用的。
, ?, f! j& J1 w! p9 w: |4 o
按说跳转没问题,如果出现异常,建议写个测试函数test(),本函数逐个显示所有变量的当前值,test()加在每个break;之前。
欢迎光临 机械必威体育网址 (//www.szfco.com/)
Powered by Discuz! X3.4