找回密码
 注册
查看: 296|回复: 6
打印 上一主题 下一主题

用STC12C5A60S2编写的程序不能正常运行

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2023-2-2 09:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
用STC12C5A60S2编写的程序不能正常运行,进入for中正反转循环就跳不出来,数码管也不亮了,其他红外按键也没用了,还有就是PWM给电机调速只有CCAP1H的值在200至255中间有效,跪求大神解惑。
1 n  i7 Z5 e$ m( m- P6 i' M8 o" S#include //头文件0 z; r' E; \0 X3 P
#include
3 [1 x1 S; z9 C6 }( M' A2 n#define uchar unsigned char
' X* o7 i! d0 K5 y& G' k#define uint unsigned int  
* t8 v9 ~$ |% gtypedef uchar INT8U;" j& Q. a7 o# i+ ]' E
typedef uint INT16U;
6 H5 m& p. |- s$ p, W***it PWM_1=P1^4;               //PWM输出端口  
+ n$ u* N- V8 k! H- N5 f" X& Q***it A1=P1^5;   //定义直流电机正端口3 p, E  T* I) N! K
***it A2=P1^6;   //定义直流电机负端口
+ z# @. W: W2 M# C6 s) A***it IR  = P3^2;          //定义红外脉冲数据接口* y/ f9 O  K" _8 d
***it beep = P3^6;    //蜂鸣器的位置
% N  f/ ~! g$ ?9 o, G, g0 w***it P2_0 = P2^0;    //数码管位选接口5 u6 I+ G+ @% m7 N
***it P2_1 = P2^1;; {/ e; l$ u5 e5 |
***it P2_2 = P2^2;/ q5 v* f) Z. e3 m5 h* Y
***it P2_3 = P2^3;% q5 e& q0 F; i7 _- W7 o( l
***it S1=P2^5;      //限位开关1( U) b' c; R) J, \' f4 {
***it S2=P2^6;     //限位开关2
6 N8 c) \& |4 r/ l2 T3 C6 @  F% F9 s#define D_A1   {A1=1;A2=0;}  //电机正转
9 J+ \( f4 ]8 c9 ]* ?#define D_A2   {A1=0;A2=1;} //电机反转; D0 B' W* \: g/ [
#define D_AOFF  {A1=1;A2=1;}  //电机停
! ]. ?2 g+ j4 F' m: [! Buint W=0;      //定义速度等级' ?0 d( y6 l8 ], G1 m
uchar A=0;      //方向标记 0,1
9 S( |5 A) W& d) y4 a2 \uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
5 t5 Z. Z7 b2 o4 B$ u9 h                        0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e};7 s3 ]& r0 b' g+ N8 f9 j
uchar IRtime;   //检测红外高电平持续时间(脉宽), B8 V3 o8 X. P$ a* R% i6 G( n
uchar IRcord[4];    //此数组用于储存分离出来的4个字节的数据(用户码2个字节+键值码2个字节)/ x" M4 T3 Q% M. l$ K$ _
uchar IRdata[33];   //此数组用于储存红外的33位数据(第一位为引导码用户码16+键值码16)3 c9 B3 J# c$ v$ S- L3 P
bit IRpro_ok, IRok;  //第一个用于红外接收4个字节完毕。IRok用为检测脉宽完毕
- x+ [" e  K3 q9 W7 K2 x7 t
* A0 v4 J/ ]; i4 t/ m2 ~* c4 Ivoid delay(uint z)& h  N! |( R4 J+ o' h
{
$ K9 L7 f+ R$ T. o- A/ H9 B- Nuint x,y;
/ m! i/ U* w$ y8 Lfor(x = z; x > 0; x--)8 R  r. p# S$ w) T: W' x/ V
  for(y = 112; y > 0 ; y--);  L7 U- p3 K& q2 {
}# P3 e1 z# Q+ W/ a* ]
void time0() interrupt 1   //定义定时器0' }$ s% J( n9 t5 d1 v0 Z) w- ^
{; E2 H, \& c% Y, [  q6 n3 v
IRtime++;      //检测脉宽,1次为278us
6 e, a4 K& Z, D+ M- V}$ H2 S0 s3 G! c- }
void int0() interrupt 0     //定义外部中断0
' _2 m4 w  T# j( c{4 T. L. a: U% D8 u; ~8 k- A
static uchar num;     // 声明静态变量' \+ V. @9 J9 B9 C
static bit startflag;  //开始储存脉宽标志位% ]% M9 x3 d% M
if(startflag)     //开始接收脉宽检测! t% T$ |: c  Q/ M9 r% A
{' J! l3 o+ H  E7 @; k3 @' c) w
  if( (IRtime < 53) && (IRtime >= 32) )
1 ]# B) i) }* }' f1 t- c   num= 0;     
4 N$ c; W8 l2 d  f! D% K  IRdata[num] = IRtime;     
6 D! M9 p! ]; ^- ]. K! B  IRtime = 0;     
. v7 y& ^. @* |- r; {* T  num++;      7 f2 A" \( o2 X7 N5 A' }3 W
  if(num== 33)      
8 m- C, i$ s- \0 }) C% L  {8 J. ~' d0 E9 m& K4 f& j4 m0 {
    IRok = 1;     
+ W% d! y( T# }0 e" H   num= 0;      : I2 |, R; t' Q3 h+ _
  }
/ P0 }% m# r" K1 E; Z" K}
0 ?; R4 l1 {  m; }- Yelse   
+ X  |" }1 M5 T+ |{' g% {3 A# r; T
  IRtime = 0;      " G5 s, j3 v+ D4 O7 ]* b  m& N
  startflag = 1;   
. k  K" x  h0 w* X4 E) z}6 w! m4 s  L/ Q) a) c
}# T+ k( C( z- K- s
void IRcordpro()        
$ A& Y) ?) p# s; G{
6 |# h9 b3 K, o# R4 ^uchar i, j, k, cord, value;
: {# r. c+ |- g" \' I! ]# Hcord
5 [  b& B6 X) `+ G; C! R: H0 a7 Ok = 1;      2 @- R) ~" `0 x7 R9 Q
for(i = 0; i < 4; i++)
& v$ {- P$ r; g5 U- h8 P{
" U- {2 g- o4 D) |' h  for(j = 0; j < 8; j++), ^/ h$ j$ r& w2 N  m% r
  {
' ?& i* \/ @2 K! ^# w2 R5 P: J   cord = IRdata[k];     
6 Y" }, q7 j+ l7 f5 w6 D   if(cord > 5)   + C$ A! P9 A& W) K/ u+ `+ }
   value = value | 0x80;
7 t  v% V, ^& Q+ c4 W2 V4 ^   if(j < 7)
; f, [# x' \: G: Y5 \+ u" e4 H   {
0 m; w4 M) b/ S! O  m2 g, T    value = value >> 1;* I' q; [* n2 y3 w
   }
+ R, c% Z! [. q/ O   k++;   
7 G+ M3 w' ~' [2 N5 l9 B0 D# N& c  }
5 x8 o. N+ ?# G4 G+ Y  IRcord[i] = value;   ' B; G9 _+ K8 R  T  O+ D
  value = 0;      8 R  T, a" Q1 ]- m+ G* j3 E) u
}
0 H* p& @* I% Q  s0 `" o$ FIRpro_ok = 1;      
. P0 J+ z/ H1 t! J3 W3 M  F6 \# B}  r( b- [  @) h0 ^" [6 v- Z% i

$ `- J" D: }  N% lvoid init_pwm()
3 C. ~7 W' r7 [1 {{+ s+ k. U" p6 p
  CCON = 0;  a! `9 ?9 P% Q2 S
CL = 0;( q$ E# m4 F& i6 [' F5 @
CH = 0;$ Z, [9 a3 _! N: V, ~& z. C& ~
CMOD = 0X00;
4 o' [( T9 g+ Q3 U- V' hCCAPM1 =0x42;: J. d/ G" G3 L7 X# p
CCAP1H=0x00;
" A1 x9 c# O" \CCAP1L=0x00;
3 N/ A6 `* f) |. o/ m6 v" OCR=1;
$ s3 a5 B0 }4 k   
% {/ a* ~6 |- j  B& p; B, j}4 l6 h$ P, O2 F$ e3 t. ]
  s) `3 |8 C, s( f8 w4 Y0 H
  void pwm1_set (uchar a)3 b. i& A5 ^4 Z! w3 O6 Z5 `4 p5 V
{
  ^9 o0 Y, O+ s: a- ~         CCAP1L= a;
8 M$ y& t( H+ w# N8 y1 d, v9 ~) N         CCAP1H= a;6 t. P( w9 Y) a+ s
        ! O( |" R1 u1 s/ n. b1 x) x; L* x
}
$ w! v3 ]0 R  ^% a/ E3 H, l: `  H* K3 q
/**********************************************************************
8 [0 Z" g" v6 `4 v/ Z/ |' E      数码管显示
3 t) j, ~! }5 g2 k**********************************************************************/
" v8 L: C; E( s  E3 uvoid disp(void)" c' d3 A! V+ I' |
{* e. A+ `! c  ^" A; w
P2_0 = 12_1 = 12_2 = 12_3 = 0;     
7 A$ I$ @! @5 x9 @# PP0=table[W%10];       //显示占空比个位
0 e" C% j+ w# i: Wdelay(1);      # h- r: v" N) M5 ~( o
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;         & q/ a$ K% _& z0 F5 |; @
  
$ h, T8 o4 e- c1 WP2_0 = 1;P2_1 = 0;P2_2 = 1;P2_3 = 1;+ V% m) B! U, x, R- T0 N
P0=table[W/100];                    //显示占空比十位- ^% Y0 q. m1 O- _' k2 g9 w5 `2 K
delay(1);      
  Y8 b5 C0 P% i2 GP2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;     
: z* i7 o. j* v5 Z, @        P2_0 = 1;P2_1 = 1;P2_2 = 0;P2_3 = 1;8 S1 u5 _! k* H, S
P0=table[W/10%10];      //显示占空比百位+ r" p5 ?3 p: g2 R5 y
delay(1);      
8 Z% P3 b" D1 I: I: k  }" J7 g1 z  XP2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;9 \' ?3 b% W" j1 P
P2_0 = 0;P2_1 = 1;P2_2 = 1;P2_3 = 1;
* B# z; G9 t# ]0 c8 a5 ]; R% [P0=table[A];         //显示方向
/ Z6 C3 L* T; vdelay(1);     
% G2 W1 I4 F4 e' E5 X5 `& @1 S% X& UP2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;     
" }* }& {) d5 {6 h. y}
3 V. O! h6 r: o5 c* S* Nvoid san()
; f8 U7 ^0 H8 Y! g" R# V- f{" ?3 G/ l' b' d/ @4 i
uchar i;* p$ F% P8 D! m, G" {2 W) C
5 ^4 y- {1 u' v" x6 K% x
  while(1)
0 f: X$ L- @9 a, J7 T- F5 C  {     7 _% o- ~+ M$ G+ h9 j
        
# a/ u" U' t5 k  O     for(i=0;i<2;i++)
5 c% X# }" ]: M) \; U3 J6 D     {
% d! |6 v* C8 v) J            if(S1==0)1 l0 @. o( E) C" M2 n2 D/ j
         D_A1;   
" j; u; n  x$ W7 r5 V- B            if(S2==0)- q4 X( s; R6 N% F( n7 O
         D_A2;
# o' o# J* h/ ]1 T9 Z; K% ]      }! y' s: w% _1 J) K
     if(i==2)
+ Y5 ^0 y0 c9 A: ]9 g      {) y$ ~% Y4 d9 `9 e' }: A+ J
         i=0;* @) O: U. C7 W; B( q) N1 m
      }9 l/ x4 S" Z+ b' U  P0 X& d
       D_AOFF;2 p3 p8 s$ k4 |8 o" S, k
       beep = 0; delay(100); beep = 1;
% D. d# |7 `2 k3 [5 H7 C' S  ! {, Q0 s' y& Y& s* j
   }
9 N/ K! v8 V+ K5 H- ]}      
  A+ S* R# w5 i; r" U: zvoid qi()
5 P; I+ m9 x0 c8 Q7 V% {8 o{8 p# B7 ~# O& c) S) ~( v- ]7 e
uchar i;
1 S# L. |3 @1 N( h
' {! H, U2 ~) T! _* N  while(1)
" R! z" P0 h2 ~5 K) N" r  {     
6 r) C( M2 h& |. H3 d        
( \' w8 `* f' F& F& dfor(i=0;i<6;i++)
6 D5 Q. D' X( _  {3 B3 V3 H; K1 Q; F! q- _8 I8 U
                    if(S1==0)1 n# N9 n0 I. s5 u
          D_A1;   
0 k2 p* x0 C+ b                    if(S2==0)
9 ?; I7 e. }/ R7 N% u$ v" u          D_A2;
& Z* T- `" u1 v" [8 j- G  ^  }
# y( L4 S# S: \6 y, v- Cif(i==6)- D+ h  s8 A$ f  H- h" h3 _0 ]- R
{5 |+ o- z; T) H" F
           i=0;
3 q2 l6 p' I. n& }9 ^$ ?( U         }* m4 Y! G' Y7 A' l$ o
         D_AOFF;
2 k6 m8 D1 h) O, _) K  }& m         beep = 0; delay(100); beep = 1;
9 |6 y, y* M4 |* A+ `, j1 z  
9 X5 U4 ]5 d) b  T  Y) Q! ], ~   }
0 [- ~( W) {8 ]! ~. i) {}6 w! d4 U& W. F& @2 O" T8 b
void main()- I* y2 G3 H$ ?. }) s+ b
{
+ ]  M: @6 ?7 u: h4 j* Sinit_pwm();
; \  I! x7 s, f) _! \EA = 1;
3 C0 ?2 D' ^$ \TMOD |= 0x02;5 g& v% M# i: \3 D( P: g$ F
TH0 = 0x00;  1 N( M) k4 K) C7 e7 D
TL0 = 0x00;
$ a0 k( t- p) h; X' VET0 = 1;   
2 e' Y  h) C1 T& A* _; mTR0 = 1;     
' {: {" j* K0 H/ sIT0 = 1;   
8 ]1 |, q6 ~; O3 xEX0 = 1;   
$ x7 g+ i* p" R" Z1 ?" R        disp();) m3 M7 C6 I& w
pwm1_set (1);" ]; [  [/ T" {! F# ~2 n* A
         W = 220;- p8 |' Q' i$ H4 t
while(1)
9 t# U; Z; b, h{% w1 i' G- |& g8 ~( z. |, c
  if(IRok)                     
- |) E0 U( O) K5 I) S) e" s; ]  {   3 Y5 ^* S' l! }2 f# I
   IRcordpro();
4 y* Y0 R+ [- A. ^0 J6 v   IRok = 0;6 }3 A" ~6 [: j' u
   if(IRpro_ok)  * S# t( ^$ s; L% ~6 T( k
   {
( Z9 n4 }* ~( F% T          switch(IRcord[2])
. J  K" p2 g! g2 a3 w& v& i$ }       {
6 U" v; o" k) Y9 C         case 0x45:   //按键1! X& R8 H) F, }& C8 o, B
                                         beep = 0; delay(15); beep = 1;
- D& O7 k* L/ j7 _+ _5 F4 O      san();  
8 q+ F0 o7 x& s& a( N         break;
3 `5 N0 t& A' I$ x         case 0x46:    //按键2: _5 s, B0 |4 \+ [7 J+ H* Z
       beep = 0; delay(15); beep = 1;
: P9 W% P! q2 C$ z( f                                         qi();0 D" K; ?- h8 o5 D9 ~3 r0 |
         break;
, C9 {1 A, r0 L, O# P         case 0x47:    //按键37 O" f7 ?9 i; y, t8 ]$ q0 |
       beep = 0; delay(15); beep = 1;
* r; o9 x3 @9 X8 t. T. w                                          D_AOFF;
# g1 a+ _; s! f         break;
$ d7 k1 q( ]" u* i* ^; ^
' ^  I7 s. m' n7 A. }/ g7 l        case 0x5a:    //按键 左 占空比控制 速度增加) Q$ |) Y; Z3 x2 k3 T
       beep = 0; delay(15); beep = 1;     9 \: K, E. a5 A  I5 j; }& w+ e
                                          W+=5;, `5 e$ K. v/ D) y: I, h
                                          pwm1_set(W);
* W% P& |* J( k1 q1 Q4 Y                                          if(W > 255)                                 ) {' y! W, p$ G7 F
                                          {  " j0 P& [5 h5 ^) F
                                             W=255;& F# J2 X- A( x" t4 ^! Y
                                           }
" h6 I* N- P0 R2 z         break;2 J2 x9 }5 V1 p1 m+ ]
         case 0x08:   //按键 右 占空比控制 速度减小
) Z, h& |' S2 F8 A+ L         beep = 0; delay(15); beep = 1;
+ R4 g. [1 _( s, p                                           W-=5;
; x" u( f0 ~$ @                                           pwm1_set(W);# m/ F! P( \# K9 z
                                           if(W < 200)                                 / y" Z, Z! y. L3 X/ m
                                           {$ |3 K9 D( E& g2 W5 N
                                               W=200;
2 c# H9 t$ y7 @. b! k                                            }
8 f# |; `6 l) M* C$ a% ?$ |      
1 p3 o: \9 m" J. Y0 v! V          break;' c- m& }( q% y' b' \  G2 h7 O
     
) D9 }% H$ V  c3 D" ^        }; }7 X2 s% V6 k* j
    IRpro_ok = 0;6 Q2 A9 w% {' A) d$ Z2 N
   }
3 u. I; k( u: V2 Y' A  }
4 N/ Z3 R# U- l  a* z6 k2 X9 A5 a2 L3 t
}6 r8 s- F+ \& j9 }
}
头像被屏蔽
  • TA的每日心情
    奋斗
    2022-11-8 15:10
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    2#
    发表于 2023-2-2 09:46 | 只看该作者
    提示: 作者被禁止或删除 内容自动屏蔽

    该用户从未签到

    3#
    发表于 2023-2-2 10:56 | 只看该作者
    除了主程序,其他地方最好不要用while(1)
    7 k% [) H( }/ |# N( M9 qvoid san()
    : G( d6 g; [" W( w) X{$ c& a4 B: Q% ~, ~' z* W$ L
    uchar i;
    % _/ g# Q9 E# r0 @( K% ?8 z4 i, p, Y7 x: Q
      while(1)
    6 A& H0 e) T5 P' E/ P# W  {     + d5 q0 C$ j& w# c) I  |
    要用带条件的循环语句,不然会退不出循环的

    该用户从未签到

    4#
    发表于 2023-2-2 11:17 | 只看该作者
    先一个模块一个模块单独调试,都弄好了再往一起组合,现在问题出在哪里都不知道,看着很累。

    该用户从未签到

    5#
    发表于 2023-2-2 13:37 | 只看该作者
    不愧是新手。令人闻风丧胆的函数命名和Tab对齐。2 E! B' O- P) V3 K
    大概瞄了一眼,san()都进入死循环了还怎么显示数码管。要一个个模块调试,一不行就上来问这习惯不好。

    该用户从未签到

    6#
    发表于 2023-2-2 14:04 | 只看该作者
    scan里面既然有while(1)可以加break跳出,不然就进入死循环,或者就不要用while(1)

    该用户从未签到

    7#
    发表于 2023-2-2 14:20 | 只看该作者
    代码中的“while(1)”去掉,打包直接放到main()内的while(1)san();qi();内。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-5-26 09:38 , Processed in 0.093750 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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