找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 5479|回复: 17

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

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

使用道具 举报

发表于 2011-5-2 18:23:18 | 显示全部楼层
建议将源程序贴上来。
 楼主| 发表于 2011-5-2 18:35:14 | 显示全部楼层
这是部分程序,前面的程序没有任何问题,当执行
1 T2 i/ {6 U5 p2 tcase 1:  , W, B4 n! R+ Z3 M  U* M
        PWM0_0=1;0 \1 W1 F% S4 K
        TH0=-PWM_Value1[0]/256;# P. x' w+ w5 t  k
        TL0=-PWM_Value1[0]%256;
& I9 L5 I1 h9 t; A. k        break;
; f, `/ \- m- ]) S时,break没有起作用,反而直接到了case 12中的这一步# X& Y0 f$ V+ a% r" |( b7 f
TL0=-(3300-PWM_Value1[5])%256;
4 b/ |/ T) E- ^+ R    order1=0;  N8 U# T4 h' v* O2 p7 z
        TR1=0;; v6 {4 S4 \) ^+ T6 C# U& Q& d
        break;
* I+ o8 p( i0 H& c! o- o    }6 r- S5 y/ g$ G% w
order1++;
. b  b3 Z! s7 v8 B% T3 t6 Z在case12中结束循环的+ w3 |6 E6 D0 g$ K% h$ n
/*===================================================================================1 m/ v9 u. d  g! x3 t' N0 f
    定时器T0的中断服务程序3 F, q2 x9 ?$ M
    一个循环20MS  ≈ 6*3.33ms
! q  `! M' B6 [9 v# @=====================================================================================*/: R3 H; d# }, U3 c
void timer0(void) interrupt 1 using 1; a) [2 u2 t: q. x6 _3 t
{
- _2 `2 L. l' d8 _        switch(order1)
2 r/ f: d/ Y5 T{& w: F7 n: j% `' U
case 1:  
+ q3 b( j* C/ Z3 @; C8 |% G1 _        PWM0_0=1;
! N3 `  s, j1 {$ g        TH0=-PWM_Value1[0]/256;# D' S% b9 F; d$ g# |
        TL0=-PWM_Value1[0]%256;3 ~& J9 l4 G3 L
        break;$ ^6 o; F% W9 z, |1 P( ^
case 2:  " _( {$ e+ G" M  e5 l# C) R& q" u
        PWM0_0=0;       % S/ ?+ ]" p( q' k" B
        TH0=-(3300-PWM_Value1[0])/256;+ A# w- k6 o: Z
        TL0=-(3300-PWM_Value1[0])%256;
* X! B7 ~9 s0 t! I3 V4 l        break;2 ~  [( Z/ U- Q0 w0 P# N& B
case 3:   6 l8 V+ C2 x8 S* H7 G
        PWM0_1=1;
/ ?5 h5 t" U5 L! w5 @        TH0=-PWM_Value1[1]/256;
$ d& p/ `( e1 W( M% x        TL0=-PWM_Value1[1]%256;
3 G$ r/ k, h9 p2 U+ e) u* o: \        break;
  V; H8 l# V) N' S2 b- [case 4:   % W  E# o* v3 g- M9 Q8 ?
        PWM0_1=0;4 C" L- L, r7 `5 i  G
        TH0=-(3300-PWM_Value1[1])/256;
9 c3 E! X$ p. ~* z        TL0=-(3300-PWM_Value1[1])%256;7 J  [/ B. M. m# B5 [
        break;! ^& \- Q) o9 J
case 5:   
% K! B. n* p7 i) B        PWM0_2=1;
: T4 O% E0 I' V# r6 @& R- Q        TH0=-PWM_Value1[2]/256;
5 F( ]; d$ @: m1 @$ C4 N        TL0=-PWM_Value1[2]%256;
* r9 g* D/ [, i( o) E0 C        break;* Q- x, h- A2 Z, v& {$ s, I) B
case 6:   5 ?; V1 Y' m. w+ G" ~9 [% m4 l
        PWM0_2=0 ;
! Y4 D0 J4 I8 Q# A! @( y6 f; j        TH0=-(3300-PWM_Value1[2])/256;' ^& y5 o3 t) p5 N2 E
        TL0=-(3300-PWM_Value1[2])%256;7 F9 \! f' r  V" m) n' Z/ \
        break;$ n. i  g$ q& t% W+ Z1 S, |
case 7:  
+ I2 G7 ]/ ^: B        PWM0_3=1;; \: V. r5 n' X$ J
        TH0=-PWM_Value1[3]/256;
7 m1 F6 B; i+ s+ i$ O  p$ Z        TL0=-PWM_Value1[3]%256;
# m$ J+ p; w2 k" l2 J- ]        break;4 v' v8 Y4 q* M: |6 N9 u. b
case 8:  / c1 d) }' a) m$ R! E2 F5 W
        PWM0_3=0;      
* e- s# `# `2 b! D        TH0=-(3300-PWM_Value1[3])/256;
( `% D0 }* M+ T5 W6 ~' b+ i* o        TL0=-(3300-PWM_Value1[3])%256;+ z% O1 H. U" \4 a# l
        break;
3 ]1 g1 ~  V2 h3 }! Ecase 9:   
& V* c+ O8 [9 s9 z* h" T. S        PWM0_4=1;! g" i* j! ], q
        TH0=-PWM_Value1[4]/256;, ]& S) [' b. h9 H" x) m3 o) z* E
        TL0=-PWM_Value1[4]%256;- w9 `- ?) S; X0 y
        break;
% R6 {! m( N9 r* {case 10:   
$ O* b3 m7 o- P        PWM0_4=0;
" [9 I1 w, H8 e8 p8 Z% \$ ?        TH0=-(3300-PWM_Value1[4])/256;6 ~/ J3 w/ W2 c; Q* \+ |
        TL0=-(3300-PWM_Value1[4])%256;
# [' O7 r- n1 ]. i7 k2 h        break;
6 e( k2 N5 y: V) _case 11:   
! d3 u$ x$ _' S9 g; [) w        PWM0_5=1;5 F& h" V& W; ?/ M
        TH0=-PWM_Value1[5]/256;
* ?4 Z+ g) o6 @2 U- b        TL0=-PWM_Value1[5]%256;
9 J3 x5 q  u3 G7 Y        break;
; i  b, g3 K' }6 g: ~$ |case 12:   
5 W* @6 P% x( ?7 p# O% ~        PWM0_5=0 ;
8 {9 j& u. l9 n6 @        TH0=-(3300-PWM_Value1[5])/256;- ~3 I$ r. I9 G) e
        TL0=-(3300-PWM_Value1[5])%256;" }. S# q5 n7 S! n  b2 @* i
    order1=0;7 \- S( |! a0 D- K+ p: m! S, x
        TR1=0;, Z6 f8 _' V; h5 U
        break;
0 b9 T$ c0 E' G+ [" e4 B    }2 h9 d# J. Q) _! _5 y1 i( h% b% }% M
order1++;% Z! J; Y# Z8 X& j# H3 p
}
发表于 2011-5-2 18:35:43 | 显示全部楼层
仔细的慢慢检查吧,有时候错误的地方不是你想的地方,呵呵。
 楼主| 发表于 2011-5-2 18:37:06 | 显示全部楼层
回复 Michael.MG 的帖子
# O  ]+ r# ^1 C% a( A' d5 c7 M$ U* k/ U/ _- W, Q% A
这个实在是不明白了,才上来求教的
 楼主| 发表于 2011-5-2 18:51:36 | 显示全部楼层
回复 无能 的帖子! b" ], Q, z7 J7 a4 ~) |0 m% e/ }
; Z& s7 n) L4 W  W, s
前辈,能帮忙解决一下吗?谢谢,程序贴出来了。
发表于 2011-5-2 20:19:19 | 显示全部楼层
本帖最后由 晓昀 于 2011-5-2 20:20 编辑 4 `* _) I1 k  [) S5 I% [2 A

( ^+ E2 F% a; z* C9 d单步执行,看看执行到break之后去执行哪一步?
3 V1 _' B9 p; A$ `# J
7 L  G9 q" s/ C  J5 L很久不玩这个,忘得差不多了。4 u; C* y" [+ ?+ ~( k  S
发表于 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 | 显示全部楼层
回复 晓昀 的帖子
  S2 s, [" L' C' k3 w6 M
8 D$ s: d  f2 V. \就是单步执行的,才知道跳到case12中去了
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-8-15 00:53 , Processed in 0.069841 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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