机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖

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

[复制链接]
 楼主| 发表于 2011-5-2 20:41:27 | 显示全部楼层
回复 metalstorm 的帖子5 d, z. \8 R2 {  O3 B- O" I4 {
3 M2 v7 i7 _7 @8 R. E# T
额,不好意思,没说清楚,在主函数中已经给order1赋值1了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-2 20:43:34 | 显示全部楼层
回复 robi 的帖子3 B% |# x( X, K) q! G/ ^4 t

- W" o+ u( V/ {4 G7 u: o& N3 B3 z- Y额,那个是switch函数,和pwm没关系
回复 支持 反对

使用道具 举报

发表于 2011-5-2 20:52:18 | 显示全部楼层
回复 三月的暴风雪 的帖子
3 _. B9 f" O1 Z( u5 P7 ~% f- h% v8 y4 i- |, H
OOP编程思想一般都建议子函数使用参数传递机制。当单步执行到case12时,能否通过编程软件的调试功能查看timer()函数中的order1变量的实际值是多少?最好在order++语句前增加一个输出语句,将order1打印出来,这个值才是千真万确的判断条件。如果order1不等于1,能排除不少可能因素。+ X9 t9 B5 e3 O' p5 E( L3 `
回复 支持 反对

使用道具 举报

发表于 2011-5-2 21:01:06 | 显示全部楼层
回复 三月的暴风雪 的帖子
8 U7 F7 |9 v  ^# B2 }) P$ s" ^: ?% ?% ^
               嗯~看懂了~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-2 21:41:59 | 显示全部楼层
回复 metalstorm 的帖子  u6 e, u3 t- g* {

+ B3 a# w, H8 e; O  n' X- I嗯,按您的方法调试了,在执行order1++之前一直等于1,直到执行完order1++之后,那个就是跳到TL0=-(3300-PWM_Value1[5])%256;    order1=0;
" A2 e7 e* p0 z  H
. `2 a8 S! }- z5 S; G* q9 yTR1=0;5 O% g3 J; A, l) I" J0 G

2 R) o) V3 r) zbreak;: S2 G1 Z! f/ U- u) X
9 J0 R' l0 W  V% h/ P) K/ j1 A
相当郁闷8 ?: n7 j; o$ `
回复 支持 反对

使用道具 举报

发表于 2011-5-2 22:11:59 | 显示全部楼层
不太明白,学习了,
回复 支持 反对

使用道具 举报

发表于 2011-5-2 23:19:30 | 显示全部楼层
建议将timer()函数改写为参数传递机制:3 D/ O$ p1 B; G+ L- z
int timer0(int par)7 Z$ J& l6 Q$ E+ Q- v+ Z
{
. {- E) w% e/ W7 M* {- l' K/ N        switch(par)
  r  L: n) v0 c& `; @$ R! H4 J{5 ^2 E0 i8 [( ~% m" |8 b
case 1:
0 P7 C. ?: R& H& G+ v9 `  C$ m...
0 D, s8 U( M* d! f3 o...
; a" D8 u! N7 Ycase 12:  
4 I& y1 M1 @. z; q        PWM0_5=0 ;9 o8 C+ G6 q1 @9 g& a; q
        TH0=-(3300-PWM_Value1[5])/256;-
9 J, L, X3 A. `& s  s$ s        TL0=-(3300-PWM_Value1[5])%256;
* `" B. r9 N+ x# ~! ^        order1=0;  //为什么要在这里清零?建议删除该行,改为在主函数中调用timer0()后,判断如果order1==13,则=1。/ A$ b# R4 A6 h2 c% p: ~2 \
        TR1=0;  //为什么要在这里清零?建议删除该行,改为在主函数中调用timer0()后,判断如果order1==13,则清零。
! ~. [3 h) f" e" j        break;;* `/ G. S* j+ |% A4 A. I
}6 o( Y& G+ \8 J' C* K5 J1 F
return(par++);
, L1 r+ i/ e0 E}8 A0 k0 c: t* R/ l* b
0 g6 f  T7 M" @
在主函数中调用timer0()的语句:
: r$ c6 _* Y& v3 Qorder1=timer0(order1);
' B3 M; h8 v4 n# g. Rif(order1==13) {order1=1; TR1=0;}
. n6 U- j' t6 {+ W# `; u8 {/ Y

点评

Thank you very much!  发表于 2011-5-2 23:37
回复 支持 反对

使用道具 举报

发表于 2011-5-3 20:07:29 | 显示全部楼层
看了一下你的程序,没看明白要实现什么功能,感觉有点乱,switch没这么用的。
9 c1 o8 ~7 G# \. d3 o" ?按说跳转没问题,如果出现异常,建议写个测试函数test(),本函数逐个显示所有变量的当前值,test()加在每个break;之前。

点评

呵呵,谢谢,已经可以了  发表于 2011-5-3 23:02
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-19 06:37 , Processed in 0.056348 second(s), 13 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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