机械必威体育网址

找回密码
注册会员

QQ登录

只需一步,快速开始

搜索
查看: 5072 | 回复: 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 | 只看该作者
这是部分程序,前面的程序没有任何问题,当执行# D7 X5 m) _. _& y
case 1:{" ~" d* Y5 M3 L; W
PWM0_0=1;& v g" G7 `* Q0 A% c: q% Q# `
TH0=-PWM_Value1[0]/256;
# [* N" x3 }) l( v6 ?2 Z0 fTL0=-PWM_Value1[0]%256;
9 k5 T1 Q/ i) I) a `4 w7 Bbreak;
' o% \2 v5 y9 E# K时,break没有起作用,反而直接到了case 12中的这一步
/ f5 ^( j0 j* P9 I) H* iTL0=-(3300-PWM_Value1[5])%256;
; Y7 h" j7 y( [9 M& g0 z* lorder1=0;) x0 B' C1 A4 @
TR1=0;- k/ i9 s" ^# O
break;8 L# @& s: z- M9 M* G' _1 k
}8 M, J3 |% O6 J- K6 @- ]& {. r3 _
order1++;2 [. N* ~/ U. I/ h7 w9 s- Z
在case12中结束循环的
( ^( S! O! Q# d. C: v/*===================================================================================6 k: U, l- u7 Y' @6 a# B/ w
定时器T0的中断服务程序
& `7 `: y! _5 Y. d0 y$ N7 \8 [一个循环20MS ≈ 6*3.33ms
/ H8 b7 O2 o. A, l=====================================================================================*/$ W1 S! L; U* j, |3 O
void timer0(void) interrupt 1 using 12 |5 g5 M* N4 ]& G! H" t6 Y
{
2 @. b- w, \( h( f5 `switch(order1)4 G; I2 Y9 M+ a5 A
{
6 ]5 j! j3 c( Z, W% D) A5 _- Mcase 1:
^$ `$ C+ g SPWM0_0=1;
$ {% K! p1 ~& L, b" q0 CTH0=-PWM_Value1[0]/256;9 c! v& q/ N1 o0 l% Z/ _8 w. b% n
TL0=-PWM_Value1[0]%256;, n/ j6 l1 d7 S3 h% u' N
break;
, [7 O/ v. [( I+ z3 r& R! Vcase 2:6 G7 Q! V3 g3 ~2 \6 i
PWM0_0=0;" q- K' D! p. g, \2 E( F
TH0=-(3300-PWM_Value1[0])/256;
7 g Z `% }6 a. P/ v& [% q1 qTL0=-(3300-PWM_Value1[0])%256;6 V) @2 J$ h$ w8 M% ?( N
break;
+ W' `9 k( y& P. W/ b$ X! Vcase 3:
' }$ Q+ [' O! {# f: }PWM0_1=1;
9 ~2 ]* a; }7 I" Q" ]6 NTH0=-PWM_Value1[1]/256;h5 G0 r$ z2 m# z
TL0=-PWM_Value1[1]%256;
6 v' U4 J9 D& i0 o! ?break;3 l# |' f/ M1 o. J8 C7 o! u( q
case 4:?( y: W# L. i
PWM0_1=0;
! Z8 t6 [9 R; N* N. t$ RTH0=-(3300-PWM_Value1[1])/256;
4 v$ ]' v$ F( v* I/ W& m+ f+ i1 |TL0=-(3300-PWM_Value1[1])%256;
. [' l n, G2 g& A6 R% e h. {6 Zbreak;
/ u- y+ S. I$ q/ j1 z) {case 5:l* a3 ~9 s" ?# s, ?8 B6 e9 k
PWM0_2=1;
7 K/ r A* h- l+ X( V3 m: ^0 c) \TH0=-PWM_Value1[2]/256;
3 x1 u0 t) N3 A. K/ C/ RTL0=-PWM_Value1[2]%256;/ [6 }* ]8 \5 h* Y9 F& M( e
break;
# ^ P( V& t; U1 Pcase 6:
, p8 Y/ s' |8 B1 H( e; CPWM0_2=0 ;
7 L: U8 n* L7 ~0 _2 V2 j5 ~4 f( i' wTH0=-(3300-PWM_Value1[2])/256;
6 ~0 S- b$ a4 Y' e! Y0 k* W3 f+ ZTL0=-(3300-PWM_Value1[2])%256;# _8 M, k$ ~) N( H* R
break;
" i( H M! p- {case 7:: W7 V) d, h' H4 A
PWM0_3=1;
; ~0 [: V. S# ] fTH0=-PWM_Value1[3]/256;- ~0 [& R/ H: v. }
TL0=-PWM_Value1[3]%256;
" I- d7 A7 N; `& i9 ?break;
) ?( x& x B3 x& dcase 8:
+ S" h" }* g6 S0 b% Y, DPWM0_3=0;
/ h) q! K4 A( P* X6 t4 E4 l% zTH0=-(3300-PWM_Value1[3])/256;
/ A1 ~7 L$ v# y3 j- |TL0=-(3300-PWM_Value1[3])%256;! c; Z7 ~! {7 ]5 p' W: o! \
break;; Z& m/ Z6 w! j0 ^2 X( b4 x8 g
case 9:
0 L% U4 K: X$ M8 j ZPWM0_4=1;
% [3 W4 f: k7 J. S2 g# ^TH0=-PWM_Value1[4]/256;
1 b0 y. l' K2 v" _ ?% o. X. _3 [TL0=-PWM_Value1[4]%256;
% M' m9 W+ i8 N! u9 [6 r7 ubreak;
8 ?; C! Y, T4 \, n+ ~4 _case 10:
) T' v J0 s# p2 K. JPWM0_4=0;1 F) q" k+ P2 D
TH0=-(3300-PWM_Value1[4])/256;9 W1 e9 _ S G: V
TL0=-(3300-PWM_Value1[4])%256;
' f( v' B( f) Q0 }break;) k& p! Z* q- |! ?2 B# q/ X2 K
case 11:" X- Q/ d7 t8 ?4 |
PWM0_5=1;; C( s- l: J: s, @: P3 ?) `2 K; ]
TH0=-PWM_Value1[5]/256;
0 t, K9 C; J9 F' I" K) F' y6 kTL0=-PWM_Value1[5]%256;
6 |- p ]1 m( B2 Abreak;8 B X6 K( U2 `$ a
case 12:
2 B! o# Q3 P0 ~PWM0_5=0 ;
0 [; x, _& Q2 f) |/ {2 F8 }TH0=-(3300-PWM_Value1[5])/256;, m: p4 H& Y/ h& d6 f7 e
TL0=-(3300-PWM_Value1[5])%256;
. X# B0 C. O' o% T. M2 Vorder1=0;
8 }+ |) V# R/ c! vTR1=0;
& @! ?2 S# K) f# xbreak;$ _2 F: [. U, s, A) x
}
; N+ ?6 ^8 X% morder1++;O3 c' p, e) a! }% T1 B( F
}
4#
发表于 2011-5-2 18:35:43 | 只看该作者
仔细的慢慢检查吧,有时候错误的地方不是你想的地方,呵呵。
5#
楼主 | 发表于 2011-5-2 18:37:06 | 只看该作者
回复Michael.MG的帖子
" i' Y% _5 ]) ]# |' p+ ]
0 P2 i% H9 `; `* U J, N' u6 v; C这个实在是不明白了,才上来求教的
6#
楼主 | 发表于 2011-5-2 18:51:36 | 只看该作者
回复无能的帖子
+ v$ b# u( Z7 ~/ }+ \ `7 p$ g$ r
4 N* ^* g5 s; p( P前辈,能帮忙解决一下吗?谢谢,程序贴出来了。
7#
发表于 2011-5-2 20:19:19 | 只看该作者
本帖最后由 晓昀 于 2011-5-2 20:20 编辑
$ P! J% n) `/ w$ N5 O. Z; e4 R$ W: E4 @% Q, F. r! }* k% H
单步执行,看看执行到break之后去执行哪一步?* r$ J% f# K' I& q
+ Y T3 `3 | [7 Q, u ]9 G
很久不玩这个,忘得差不多了。
+ E2 `+ ?9 f2 u" ~1 D
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 | 只看该作者
回复晓昀的帖子
4 W8 u6 _4 w, c( u4 E( |
' p6 y2 y+ j' w, E就是单步执行的,才知道跳到case12中去了
您需要登录后才可以回帖 登录| 注册会员

本版积分规则

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

GMT+8, 2025-1-9 14:28, Processed in 0.052662 second(s), 15 queries , Gzip On.

Powered byDiscuz!X3.4Licensed

? 2001-2017Comsenz Inc.

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