机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 4980|回复: 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 | 只看该作者
这是部分程序,前面的程序没有任何问题,当执行( X  t/ I/ v: G2 d" ]  g
case 1:  
& r0 S4 G: ~  a7 ]+ ~        PWM0_0=1;
5 m8 C8 C( m7 p1 F4 Z* N  _        TH0=-PWM_Value1[0]/256;# Q4 w4 O) ?: `
        TL0=-PWM_Value1[0]%256;( [( F1 P9 U, M& t
        break;/ B2 Z5 n5 ^/ k: M
时,break没有起作用,反而直接到了case 12中的这一步( K, _. p+ @; g) p3 _1 p
TL0=-(3300-PWM_Value1[5])%256;9 W5 n7 W; Y4 a& p7 \  ]% m- G3 {
    order1=0;9 c& m. T5 k) U4 a0 w
        TR1=0;) H2 L  A! ~0 i* E% e, a' D
        break;5 B4 ]6 m- b6 e% `, l: H* c
    }) Q+ G( C8 Z# C
order1++;6 D  M8 R! I! b6 c- Q
在case12中结束循环的
* D, S( C% I2 n, M/*===================================================================================( G' t% T% L2 J# v& {
    定时器T0的中断服务程序* H4 d. U- x* V* Q  w
    一个循环20MS  ≈ 6*3.33ms8 O% f. X; Y8 ^. |+ U
=====================================================================================*/' v+ b& c8 ]3 d) O9 }
void timer0(void) interrupt 1 using 1. i, o, }( n+ l: @% X* T
{
0 y/ D4 o9 O) O3 Q- R        switch(order1)
$ p. A& S* {2 ]5 b2 z" u1 c{
# y( V/ H* \" ?, S  T7 icase 1:  6 U  E* O! [. Y& p: ?
        PWM0_0=1;
+ o0 k  D, l% r# Z        TH0=-PWM_Value1[0]/256;
6 f) M9 u( G  M% `: |, A        TL0=-PWM_Value1[0]%256;" I7 R: o0 s0 A, b, P% q( J% ~
        break;
9 `' B; K6 ^+ F8 S8 hcase 2:  
( J- X% C5 a4 @! V5 J        PWM0_0=0;      
) y; a, J. T  d/ x5 r        TH0=-(3300-PWM_Value1[0])/256;6 e. U( H0 F% O' o* q4 Q, e% u- Q
        TL0=-(3300-PWM_Value1[0])%256;
% ?/ z7 x7 H( q' j( x: {        break;
: [+ T& ~$ V' ^  c$ n6 @/ A5 Qcase 3:   
7 p9 Y1 w3 O( L        PWM0_1=1;' Z7 \) }& f2 d! v% n
        TH0=-PWM_Value1[1]/256;
, U/ ~9 v6 [8 F! Z9 S. T        TL0=-PWM_Value1[1]%256;' C+ \, r" o5 Y  a1 Z3 v8 @
        break;
5 Y3 E8 n# s* b/ _' P  hcase 4:   
3 T1 q  q; |1 w1 |2 I* w' j        PWM0_1=0;
( z- I: V: w" l6 {' W( g        TH0=-(3300-PWM_Value1[1])/256;# f3 C4 s2 I" f2 h; [2 b0 F* n
        TL0=-(3300-PWM_Value1[1])%256;; W1 e" s& x" K! m
        break;  J1 i& a# _, U' U
case 5:   
) D0 Q/ {9 x: k' ^3 _5 @+ }        PWM0_2=1;
4 _: s, ?( s3 p7 ]7 g8 `        TH0=-PWM_Value1[2]/256;1 c3 y* D& u; Q- g, z  v
        TL0=-PWM_Value1[2]%256;
1 p1 E+ ?8 T6 D        break;
( J# e0 N$ C5 O, m0 M) |+ Zcase 6:   
' k+ O- X$ ^, [" s$ F2 R        PWM0_2=0 ;  r; U/ K( I# G8 T8 j0 s5 v
        TH0=-(3300-PWM_Value1[2])/256;
3 j- P1 F. D5 j) c# ^) R        TL0=-(3300-PWM_Value1[2])%256;1 \0 C* n; h9 L  g& n9 \
        break;
6 K: d6 @. T# w( r" `9 [case 7:  
* q- o5 p4 v* y4 O8 Z! P: `2 U        PWM0_3=1;$ z4 }$ d2 s! V5 a2 N/ W5 C- {! X
        TH0=-PWM_Value1[3]/256;
1 u9 k6 W' C6 B/ {; N+ m6 `7 M        TL0=-PWM_Value1[3]%256;9 B- b" a9 q0 {% U  B' y0 v
        break;
; ?) e. i0 ~+ ?* P- f2 r. @  h" H4 g/ ?- F& Pcase 8:  
5 f8 b. V* h! [# @& u1 W        PWM0_3=0;       # A$ w# y8 ?3 A9 I; q
        TH0=-(3300-PWM_Value1[3])/256;( l" G. E9 K3 V8 c5 K- l
        TL0=-(3300-PWM_Value1[3])%256;% |9 [) ~" ~$ U# f
        break;8 Z$ ]& R; m7 x, A
case 9:   7 W: a2 V, }3 e, h6 ?
        PWM0_4=1;
) v1 {+ T% ~$ c  z/ T8 X: m) ?$ M        TH0=-PWM_Value1[4]/256;
+ B( t" ^3 F! L        TL0=-PWM_Value1[4]%256;; u$ A4 o0 K9 n& G- e; X+ n
        break;
1 E$ I: P: k( s% p* J. vcase 10:   1 g8 q& j9 _5 m. u3 ~. Q7 N2 v
        PWM0_4=0;& z; O! P& j  x; U" ^  d
        TH0=-(3300-PWM_Value1[4])/256;
9 e- {: d/ ~' }3 D3 x        TL0=-(3300-PWM_Value1[4])%256;+ I, [. U$ ]( M/ g& X
        break;
+ u. ^$ y' ~. R( Q3 g9 L* W" E/ ucase 11:   $ e; t  q6 L! [/ Z- s! y
        PWM0_5=1;* j+ L) v$ U0 L
        TH0=-PWM_Value1[5]/256;
( Z- g3 |# W, l        TL0=-PWM_Value1[5]%256;) a+ M9 r! O+ l: k% u* B4 ?
        break;
* Q) g- D) w0 @7 Q9 Y7 p4 dcase 12:   $ B# C, U6 S" d+ q6 i: ]5 M+ Z  `
        PWM0_5=0 ;0 x/ }( E7 N( {- ^
        TH0=-(3300-PWM_Value1[5])/256;3 G+ T8 I% ]0 I' u# R. ^+ l
        TL0=-(3300-PWM_Value1[5])%256;/ i( [! V/ O/ t& N5 r7 n7 ?9 h
    order1=0;
7 Z" g5 |4 H3 X5 o        TR1=0;
' n4 L+ M+ {1 z1 F1 S; ]        break;
* B" R; v5 x/ i    }, c# N: i  L' ~5 S. H# u7 T, T
order1++;5 h1 C; }, @+ g- x( A
}
回复 支持 反对

使用道具 举报

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

使用道具 举报

5#
 楼主| 发表于 2011-5-2 18:37:06 | 只看该作者
回复 Michael.MG 的帖子! i# K* e  L+ h) G6 }; S) R6 M' e

- P6 ^& K) q0 `( k. r这个实在是不明白了,才上来求教的
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2011-5-2 18:51:36 | 只看该作者
回复 无能 的帖子+ ^; ]3 f( A# ]  W
# d* s+ W" O# X- a, ]/ D
前辈,能帮忙解决一下吗?谢谢,程序贴出来了。
回复 支持 反对

使用道具 举报

7#
发表于 2011-5-2 20:19:19 | 只看该作者
本帖最后由 晓昀 于 2011-5-2 20:20 编辑 . L5 K; a+ }' c" u. c9 a0 @5 z
! V6 k3 E/ L/ e/ T
单步执行,看看执行到break之后去执行哪一步?
, W% D% w" o1 S' \" f# U; F+ J% v4 W$ ]' V+ q- V
很久不玩这个,忘得差不多了。! S( `6 u# r: \* [4 Z* k$ }( _
回复 支持 反对

使用道具 举报

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 | 只看该作者
回复 晓昀 的帖子
0 m5 E! Z: v3 |8 J7 I+ |" L+ |; W
# d7 l2 D$ q! Z! z就是单步执行的,才知道跳到case12中去了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 02:11 , Processed in 0.059053 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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