机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 5164|回复: 17
打印 上一主题 下一主题

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

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

使用道具 举报

2#
发表于 2011-5-2 18:23:18 | 只看该作者
建议将源程序贴上来。
回复 支持 反对

使用道具 举报

3#
 楼主| 发表于 2011-5-2 18:35:14 | 只看该作者
这是部分程序,前面的程序没有任何问题,当执行
7 T% ]) |0 j0 u4 bcase 1:  
; r) I& B' G8 R/ [        PWM0_0=1;  Q; ?( t4 {1 \, D; @3 J! F1 w
        TH0=-PWM_Value1[0]/256;
3 j# M* Y: ?4 l$ v  L4 Q- i, Q        TL0=-PWM_Value1[0]%256;
& o8 a6 a3 S' J& O# Q  n+ B        break;1 _! O$ N( o3 m& ?0 |/ ?" F
时,break没有起作用,反而直接到了case 12中的这一步9 P5 y0 q$ K# r" ?4 p
TL0=-(3300-PWM_Value1[5])%256;6 N3 A- |9 v) b# n- _( v( J
    order1=0;; q9 ]% t3 V  u) J
        TR1=0;& `  H8 T; k, k. e8 D
        break;" y7 r' a7 n/ ]$ L4 L
    }0 F- Z# b. u# F8 ^- z+ {% U' j; \' c
order1++;' e) n5 p) W& ^" }
在case12中结束循环的4 I7 b8 i, P4 m5 c: P
/*===================================================================================
& ~8 M; f* Y2 B& E! K% [    定时器T0的中断服务程序
7 T6 `, W2 R- D8 [    一个循环20MS  ≈ 6*3.33ms7 i) `. M- Q2 W( S. o
=====================================================================================*/+ `0 X! [% R; C( O# i7 n" X# j; W
void timer0(void) interrupt 1 using 1
/ c8 d+ H  t& I) _* q' g{9 N# D$ ]+ |5 ^0 {" g. g
        switch(order1)
0 V! G' d1 l& f{. d  |0 Y7 _4 s7 n0 I
case 1:  + O9 i7 m' y- e; o1 T* l1 F
        PWM0_0=1;
2 S) s8 q7 k# @" V, L/ p9 J2 }6 F4 X        TH0=-PWM_Value1[0]/256;7 D) ^1 }  U$ i! E) J! c" N
        TL0=-PWM_Value1[0]%256;# e# ?9 L# K6 _! ]6 X
        break;; ]$ N7 Z# h' V; l
case 2:  
* `" R+ J' V" @2 a        PWM0_0=0;      
3 u! U2 f. K; I/ `5 J% {        TH0=-(3300-PWM_Value1[0])/256;+ b* N1 t% x# w4 O; O
        TL0=-(3300-PWM_Value1[0])%256;
6 u6 |4 Y) `0 ?& I8 i        break;
5 Q% x5 T2 c5 E% h- I" ?: i) i8 Xcase 3:   
+ R( Z2 g; O- ~% @6 e& S        PWM0_1=1;
+ @. v6 i( H; ^7 m8 p, `; x  j' r% X        TH0=-PWM_Value1[1]/256;
1 n- c  M9 d! |2 e. r7 X+ |: q0 }5 v        TL0=-PWM_Value1[1]%256;# _$ d* C" v* {8 ]$ S
        break;. h1 Z- Z/ L- |# }% ?: s9 r: r
case 4:   7 j) }3 Q& Z5 A# K, g; J
        PWM0_1=0;5 T; ~$ z7 D7 a* A5 \  m8 a+ X
        TH0=-(3300-PWM_Value1[1])/256;
% Y7 ]. x" q" s1 x4 {8 s0 X: i        TL0=-(3300-PWM_Value1[1])%256;
& I* E$ R9 Q8 ~3 N" t* U0 j        break;
+ i) |: K% s) G. b8 ~/ ]0 Dcase 5:   
. M  `: a# Y3 G        PWM0_2=1;! ]; Y' s+ L- j
        TH0=-PWM_Value1[2]/256;
  M! s8 ]5 h) p. r! T3 ]  n( a        TL0=-PWM_Value1[2]%256;3 m! z3 l+ b5 }  x  L8 Y% Z+ [
        break;
: R/ W6 B8 {! {% e( X. ycase 6:   3 _# A" t' m+ M! R  G
        PWM0_2=0 ;
! g7 a/ e  d  v% P8 d        TH0=-(3300-PWM_Value1[2])/256;+ x. r  B; r3 d8 O
        TL0=-(3300-PWM_Value1[2])%256;
! v7 _6 k& O' y+ V0 C) G" z5 y        break;7 I$ W: w5 M3 b) Z  V4 T2 A( p6 N+ A
case 7:  : B) e2 u' J8 h% l
        PWM0_3=1;  k5 [  M. U$ E
        TH0=-PWM_Value1[3]/256;! w) Z% j7 U) j3 J, K* @
        TL0=-PWM_Value1[3]%256;
" L9 e2 U4 @* [# t* a4 U$ p& }        break;
0 u3 q6 V$ L* |( L/ xcase 8:  
$ s1 b4 x4 f1 M3 V        PWM0_3=0;       ; T  j& Q2 ~4 I6 k/ K
        TH0=-(3300-PWM_Value1[3])/256;+ q! B% P) c+ k) T
        TL0=-(3300-PWM_Value1[3])%256;6 h& R" E. Y! }: {" c
        break;+ G9 F. u' {; m
case 9:   - q  k. v3 [0 M: g( y
        PWM0_4=1;
' `- ]! E; y/ k        TH0=-PWM_Value1[4]/256;9 L5 {8 |; S; V8 \! d
        TL0=-PWM_Value1[4]%256;1 N( G5 B( B# g! E7 L$ |( q
        break;
, N. p) O" m7 O# ?0 y, zcase 10:   
0 ^: n" c6 E+ |% q        PWM0_4=0;
& b0 |) Z/ b8 n7 M' F( F  t        TH0=-(3300-PWM_Value1[4])/256;
2 x3 N7 [4 _) R- g        TL0=-(3300-PWM_Value1[4])%256;' w' {8 y& I9 G& B& ^
        break;
4 F2 d! ?5 l. ^! E  M( Gcase 11:   
. [6 r$ _* H. g3 Z, m4 x        PWM0_5=1;
, |% c% y" `8 {. J( e4 L        TH0=-PWM_Value1[5]/256;
7 ?: \9 v2 e& S) o0 l        TL0=-PWM_Value1[5]%256;4 ~3 j/ R/ o& Y7 Q, c
        break;. C* x) G- z9 {' I! a
case 12:   ! I' H4 u" J! Z- `
        PWM0_5=0 ;, f7 w' C6 }! F) q/ ]1 X( H3 O( H: y
        TH0=-(3300-PWM_Value1[5])/256;
# B+ P. y! q& E* U        TL0=-(3300-PWM_Value1[5])%256;4 R3 a- M. A) {2 r: ^: T$ }
    order1=0;
$ \; u! M( z! g6 l7 ]: Y0 |        TR1=0;0 B8 c8 j  Y' w, D. G
        break;
: a' d% |4 K  K4 O2 G    }& s8 _8 ]3 K! v0 _
order1++;
* v* V9 {) Z, I. `2 u7 j/ J}
回复 支持 反对

使用道具 举报

4#
发表于 2011-5-2 18:35:43 | 只看该作者
仔细的慢慢检查吧,有时候错误的地方不是你想的地方,呵呵。
回复 支持 反对

使用道具 举报

5#
 楼主| 发表于 2011-5-2 18:37:06 | 只看该作者
回复 Michael.MG 的帖子
+ ~1 ?( a# w" i; G) m; O+ I# t4 u/ c5 x
这个实在是不明白了,才上来求教的
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2011-5-2 18:51:36 | 只看该作者
回复 无能 的帖子
9 ]" i8 P& |5 l; x' c; H3 H7 e8 D5 t) p$ f
前辈,能帮忙解决一下吗?谢谢,程序贴出来了。
回复 支持 反对

使用道具 举报

7#
发表于 2011-5-2 20:19:19 | 只看该作者
本帖最后由 晓昀 于 2011-5-2 20:20 编辑 * C1 w& G6 v  R9 H' a6 p; T

: r3 U8 s! t; R  d! ^单步执行,看看执行到break之后去执行哪一步?
' Q# v/ u% j" e3 M9 Z$ d, W7 ]& g( n. h# l. J& J4 G  U2 v
很久不玩这个,忘得差不多了。. x0 t3 b. f3 o
回复 支持 反对

使用道具 举报

8#
发表于 2011-5-2 20:20:46 | 只看该作者
问题原因可能在于switch(order1)的order1参数是局部变量,在timer()函数里没有被赋值,因此数值是多少是不确定的。建议函数void timer0(void)应该使用参数传递机制,每次调用timer()函数时应该将order1作为参数传递给该函数,函数结束的时候返回order1++的大小。

点评

谢谢  发表于 2011-5-2 22:43
回复 支持 反对

使用道具 举报

9#
发表于 2011-5-2 20:24:57 | 只看该作者
PWM是什么意思?有个问题不明白哈,如果PWM0_0,PWM0_1,PWM0_2,PWM0_3,PWM0_4,PWM0_5同时为0,执行那个case?
回复 支持 反对

使用道具 举报

10#
 楼主| 发表于 2011-5-2 20:32:17 | 只看该作者
回复 晓昀 的帖子+ F% _! h4 i3 o2 [/ ]

0 P6 Y9 ~2 `' t, x2 j就是单步执行的,才知道跳到case12中去了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

小黑屋|手机版|Archiver|机械必威体育网址 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2025-2-19 07:15 , Processed in 0.059698 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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