找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 5396|回复: 17

单片机C语言程序问题,请教

[复制链接]
发表于 2011-5-2 18:13:29 | 显示全部楼层 |阅读模式
  我在调试单片机程序的时候,发现switch语句中break不起作用,比如说本应该从case11中结束循环的,但是发现没有结束循环,却执行了case12中的语句命令,请问各位大侠,这是何故
回复

使用道具 举报

发表于 2011-5-2 18:23:18 | 显示全部楼层
建议将源程序贴上来。
 楼主| 发表于 2011-5-2 18:35:14 | 显示全部楼层
这是部分程序,前面的程序没有任何问题,当执行
- r: z' I3 S# L  g: e( S- dcase 1:  
5 d0 [- j7 h4 t* H2 }$ S6 G' u        PWM0_0=1;$ X' J2 V2 I# S) J# c5 \6 e; K* c
        TH0=-PWM_Value1[0]/256;
3 a# i) H9 c. W$ F+ n% N% b5 x        TL0=-PWM_Value1[0]%256;$ o. e  h% R% e$ M  S0 \
        break;
9 E; O# r# y3 B2 k+ A时,break没有起作用,反而直接到了case 12中的这一步
, O8 q3 |' `( H& d3 {* ATL0=-(3300-PWM_Value1[5])%256;
( o) [4 `! p  ~6 d  l5 e    order1=0;
' F( ]& ]8 V, e% F- G$ b% Y        TR1=0;/ g% v; ]; q( j- J+ I
        break;: q; j, w" V- y0 M! P4 U- D
    }9 P& ^! K* |$ X2 t
order1++;& Y9 \( C, i! {
在case12中结束循环的% j, ?6 H% N" K1 {
/*===================================================================================; ]# Z3 i3 k6 A; M/ U7 B- @2 f
    定时器T0的中断服务程序
% [# F  u7 r$ L8 g2 }7 @$ w    一个循环20MS  ≈ 6*3.33ms
, r, t2 R  h/ h) O# I; r3 V. N=====================================================================================*/5 _% L5 M/ I3 a% Z3 V2 V) B
void timer0(void) interrupt 1 using 1) X4 B! y  y! M* |
{
, \8 c0 L' F- I1 @        switch(order1)
& X0 O! g8 c' \2 v/ C/ O$ G{3 e! t/ F# |, a& A1 T) w" }
case 1:  
4 ]7 m' o8 u! C* T: d% @" p" E: d        PWM0_0=1;
: r& M. n" X4 t. V9 g* k( C8 k        TH0=-PWM_Value1[0]/256;, h: |) l# Z  z: r" G
        TL0=-PWM_Value1[0]%256;5 R  T3 {, p4 ?8 C/ g
        break;
7 x5 ^% @8 {! g! x+ H& t9 ecase 2:  
: S; V8 f& S5 W1 G6 ^        PWM0_0=0;      
' `( h0 `/ k1 W        TH0=-(3300-PWM_Value1[0])/256;* i% S# E" A+ B* k
        TL0=-(3300-PWM_Value1[0])%256;7 L( t" r) b) m- k) g
        break;
/ l7 {4 `+ R2 Z, C/ icase 3:   - j; R# E0 ]. W7 F# T- q  U
        PWM0_1=1;+ t1 Z$ i9 A% q$ Y3 y
        TH0=-PWM_Value1[1]/256;3 U" E; J' B8 @7 V' Z+ f, e
        TL0=-PWM_Value1[1]%256;
+ m8 N/ T0 s. T        break;
5 U+ @, o0 s* R  O5 O: ncase 4:   
  e" o+ x0 O: o5 J6 W        PWM0_1=0;+ K& [5 A( A7 `6 }" H% [
        TH0=-(3300-PWM_Value1[1])/256;
' }: V, a1 i; p: [( U. k        TL0=-(3300-PWM_Value1[1])%256;' J* }  ~/ ^( `1 O- b2 l2 e* W/ `" C
        break;
% m& |, l' z- \' `4 Kcase 5:   
8 u( v7 Y' y! v2 u9 o0 S& J        PWM0_2=1;. ?& X8 A  H8 O9 s: k& G- Y
        TH0=-PWM_Value1[2]/256;) b9 C8 Y' T3 w6 T3 k2 G  _4 I2 t
        TL0=-PWM_Value1[2]%256;
6 C: ?3 A) J- |. S' w7 [; O+ K        break;. N, H2 Y8 g8 X. [7 u$ |. ?. C
case 6:   
- f7 E8 z' q" t, F. z* r        PWM0_2=0 ;
. S2 m- C) i  t5 P, [) s6 z        TH0=-(3300-PWM_Value1[2])/256;
! e( J: H& T8 c% c/ N4 f1 i        TL0=-(3300-PWM_Value1[2])%256;
" {+ t* O) }/ v1 s1 R        break;7 H! K& n0 r7 D2 x& a+ ?1 N
case 7:  ( s# u. H; e) _4 b  T
        PWM0_3=1;+ H" {1 n! n2 \  N( z+ U! F
        TH0=-PWM_Value1[3]/256;
  `; z  z- y" K1 x& n' p0 L        TL0=-PWM_Value1[3]%256;
  i0 K0 t* F' w. x        break;7 y& F! i7 Z8 t2 S/ K9 k) H! S
case 8:  $ e3 l3 v% O  u8 B  j5 S' x2 [
        PWM0_3=0;       * Z9 p( L+ a4 X! A
        TH0=-(3300-PWM_Value1[3])/256;
9 o' C8 Z, |7 }- n        TL0=-(3300-PWM_Value1[3])%256;; p! e2 x/ d! v% y
        break;/ L' l1 ^3 l4 \5 {
case 9:   & o+ K9 |: }0 |
        PWM0_4=1;, e  p4 O4 G/ S5 [& Y& P
        TH0=-PWM_Value1[4]/256;% \1 F) @  c7 b# a# a6 @+ o$ d# ^
        TL0=-PWM_Value1[4]%256;
7 a. Q# O' F4 z6 m* h        break;
/ r3 E* `; |3 \8 _( X: M# r' hcase 10:   
9 X0 |: _5 L! Z. G# |! p        PWM0_4=0;: g" Y9 w$ c$ M* D0 b$ p
        TH0=-(3300-PWM_Value1[4])/256;
6 \# }* p2 ]( f9 i% x* s* V% y        TL0=-(3300-PWM_Value1[4])%256;
+ D0 c1 _* J. ?. P0 e! e, }        break;- [3 u  Q" s7 ~8 `/ }
case 11:   
9 f7 H! S% A5 u* K4 t, {        PWM0_5=1;
: @: |# R7 D  N6 H) A* A        TH0=-PWM_Value1[5]/256;
7 ?: b1 ?* w4 V% B6 k        TL0=-PWM_Value1[5]%256;
# R- t9 r2 O; n! [% U( k7 s2 p; N        break;) b) X% E# f" S4 M9 |
case 12:     e5 |8 A/ P! ^, U- I5 K
        PWM0_5=0 ;8 B# }, U4 B% j6 Q
        TH0=-(3300-PWM_Value1[5])/256;! K4 O0 e- t1 K
        TL0=-(3300-PWM_Value1[5])%256;
& [1 }. E* _6 \/ P* {% o    order1=0;
% C9 V' ?3 F0 R- z. p( i! a        TR1=0;. V: V* b5 }0 @' z, q
        break;9 }6 C0 L" T6 m+ z/ N
    }" ?0 m7 \! S# j( |8 Z
order1++;
$ e' _; s# R& S' K}
发表于 2011-5-2 18:35:43 | 显示全部楼层
仔细的慢慢检查吧,有时候错误的地方不是你想的地方,呵呵。
 楼主| 发表于 2011-5-2 18:37:06 | 显示全部楼层
回复 Michael.MG 的帖子
$ x7 Z% S& W8 H6 B& Y
" R; U# V2 c5 t0 u/ f' V$ A这个实在是不明白了,才上来求教的
 楼主| 发表于 2011-5-2 18:51:36 | 显示全部楼层
回复 无能 的帖子
- Z5 _9 @6 ]6 I9 H% L( r, P& V5 r0 Y" H" t0 P% X
前辈,能帮忙解决一下吗?谢谢,程序贴出来了。
发表于 2011-5-2 20:19:19 | 显示全部楼层
本帖最后由 晓昀 于 2011-5-2 20:20 编辑 : M8 D& P7 `" `. J6 J
( P- i* z1 u* v3 A3 v
单步执行,看看执行到break之后去执行哪一步?
6 \% F; C" x. s0 n4 A8 `, h' p/ d6 P9 e; |8 x" v  D' D
很久不玩这个,忘得差不多了。7 {+ g% b, V: J8 E! e3 i
发表于 2011-5-2 20:20:46 | 显示全部楼层
问题原因可能在于switch(order1)的order1参数是局部变量,在timer()函数里没有被赋值,因此数值是多少是不确定的。建议函数void timer0(void)应该使用参数传递机制,每次调用timer()函数时应该将order1作为参数传递给该函数,函数结束的时候返回order1++的大小。

点评

谢谢  发表于 2011-5-2 22:43
发表于 2011-5-2 20:24:57 | 显示全部楼层
PWM是什么意思?有个问题不明白哈,如果PWM0_0,PWM0_1,PWM0_2,PWM0_3,PWM0_4,PWM0_5同时为0,执行那个case?
 楼主| 发表于 2011-5-2 20:32:17 | 显示全部楼层
回复 晓昀 的帖子
! G! u/ k' U7 T, M7 n# s5 I
2 K* L0 y$ E9 O/ O/ V% \就是单步执行的,才知道跳到case12中去了
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Archiver|手机版|小黑屋|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2025-6-22 13:53 , Processed in 0.062367 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表