找回密码
 注册
关于网站域名变更的通知
查看: 311|回复: 6
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
用STC12C5A60S2编写的程序不能正常运行,进入for中正反转循环就跳不出来,数码管也不亮了,其他红外按键也没用了,还有就是PWM给电机调速只有CCAP1H的值在200至255中间有效,跪求大神解惑。; J; Y$ U" K& `6 \5 V( R
#include //头文件5 A2 l2 H% C: B" H& c: Y0 ], y
#include( y5 m$ a' K* O, y1 M) t( S) A
#define uchar unsigned char: P0 E2 E0 ?1 W$ ?% c" w# H: D
#define uint unsigned int  , y" B5 ~; i* P( R6 e) U1 }  K
typedef uchar INT8U;, Y: G* _  u" o( ?" j. {: N
typedef uint INT16U;4 O. Z( S3 F1 A4 a; u+ d6 z! V
***it PWM_1=P1^4;               //PWM输出端口  
2 f# t0 \5 s. o* r* e, C% k- ]***it A1=P1^5;   //定义直流电机正端口$ q1 |5 S$ f7 J8 j+ b8 ^  K
***it A2=P1^6;   //定义直流电机负端口0 J, X' @$ r& P- o6 T, I! I( w
***it IR  = P3^2;          //定义红外脉冲数据接口
: Q8 H- L1 O1 I$ p+ e0 q***it beep = P3^6;    //蜂鸣器的位置9 m5 ]$ j3 C8 D2 N2 u8 y
***it P2_0 = P2^0;    //数码管位选接口4 a% F$ C/ k8 _, a( I
***it P2_1 = P2^1;
4 L/ Y4 g6 |& }! o***it P2_2 = P2^2;
9 i& ^7 y/ _5 r***it P2_3 = P2^3;4 i" d& F; z* A# l- g
***it S1=P2^5;      //限位开关17 Y- Z. V! N- y# M
***it S2=P2^6;     //限位开关2, U7 f/ X! m  r9 r; P/ h1 K
#define D_A1   {A1=1;A2=0;}  //电机正转
$ H! |% [( D9 }6 r, D& u#define D_A2   {A1=0;A2=1;} //电机反转! F2 N+ R& y% X: n; o7 [6 @5 Z2 {4 i
#define D_AOFF  {A1=1;A2=1;}  //电机停6 a& W) z2 B6 Y1 G" A% a/ k* j
uint W=0;      //定义速度等级) `4 a' I1 Q0 C
uchar A=0;      //方向标记 0,1+ G" G- z  t9 p) i
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
! Q, Q; E! J! T  d. x" N6 N( Z                        0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e};
9 d1 Q% q9 ]" }% G: d1 Muchar IRtime;   //检测红外高电平持续时间(脉宽)
7 E. x8 c$ ]9 Q+ }4 J7 j. J/ Juchar IRcord[4];    //此数组用于储存分离出来的4个字节的数据(用户码2个字节+键值码2个字节); |( @) M2 f. C5 S" n4 w
uchar IRdata[33];   //此数组用于储存红外的33位数据(第一位为引导码用户码16+键值码16). q( I9 n. `# l2 e* W
bit IRpro_ok, IRok;  //第一个用于红外接收4个字节完毕。IRok用为检测脉宽完毕
, W: M( h3 Q8 ?% n* Z* h8 Y" |; d2 u& l
void delay(uint z)
, `- C, F# @9 x% Y+ W9 L{. u9 [3 O" n7 U: H  Q. j  |  \
uint x,y;
- S2 R! w/ ], \for(x = z; x > 0; x--)* f/ d  K0 [. z7 W  [
  for(y = 112; y > 0 ; y--);# J3 p" X) n! V
}' u5 @  o! |7 Q9 k, M
void time0() interrupt 1   //定义定时器0
* C; p" m7 @. J8 h% K% f; F) t{
# b2 b1 s+ E1 H$ f8 BIRtime++;      //检测脉宽,1次为278us) H: c3 O7 ?% N' |  w" r/ c
}
# g. v3 A" k- i% zvoid int0() interrupt 0     //定义外部中断0
6 i% I! v' ~, F) [0 i{
9 C# G. O, `/ n7 y/ }7 u8 }static uchar num;     // 声明静态变量
! R) t6 w0 ]2 ^& |4 T( Xstatic bit startflag;  //开始储存脉宽标志位
) d( ]: _$ V. u$ t  a  l5 `! Nif(startflag)     //开始接收脉宽检测* o0 O9 q- ^1 I6 N0 p: U- p
{
5 }! N( g# Y& a+ h6 x  if( (IRtime < 53) && (IRtime >= 32) )
7 T- Y- a" c& \, v   num= 0;     
5 J9 I; g# k. J' |8 y/ k  IRdata[num] = IRtime;     
; k; h6 D- z: U6 a( X  IRtime = 0;     * m) [  M7 T) o) W6 Y3 C; ?  E5 L
  num++;      
" |1 c3 G; W7 h) q$ Z) V" T  if(num== 33)      " Q1 v. Y) C/ S. u
  {
/ l. C* Z9 p6 K' h+ v+ D, ^    IRok = 1;     
6 Y6 U% V) k0 b% @   num= 0;      
% z" I: k8 K' j. @. _+ A: f; X  }4 n9 Z: Q4 y  o9 R$ R
}
7 A/ x- T- ]% k8 X+ z9 M6 [else   3 a( I7 a/ D- A; f
{- o# P. l# L8 T9 ]6 t
  IRtime = 0;      
' C2 k$ e3 f' F3 V5 L' Y  startflag = 1;   
4 S: z" V2 k7 H}
+ }" P. R. b1 q/ A}
& g8 B7 M( E8 ^6 A- Y5 ^void IRcordpro()        . R7 x6 h  D+ d. H
{
$ c' D. u" ^  F5 I" w* Auchar i, j, k, cord, value;
0 H# u1 x$ {' w: @cord: f. a6 z4 ^% Z" @* ^
k = 1;      6 o9 s9 L* P2 x, E0 F4 _$ e
for(i = 0; i < 4; i++). k- F9 D6 w: f9 `/ {$ |; A
{; r3 U4 e4 g- V  U" e0 X9 c
  for(j = 0; j < 8; j++)
5 m  h+ v: {$ g7 q6 D+ M$ J1 c  {
5 ?. ]/ Z1 x$ A; M   cord = IRdata[k];     % l, F# ]' t" l" ]5 z- n
   if(cord > 5)   
8 l8 ^7 R' c) i2 C) y) b- S   value = value | 0x80;6 R% T5 K: l' P( l6 q( u' w6 H4 }1 m
   if(j < 7)* ~1 `0 M2 A+ \  S) m2 K, y' f
   {$ T6 m1 i0 w1 h3 ~
    value = value >> 1;
7 Q! O- k' V! P) i; u1 h& S   }( Z& x* Y  J9 B, B* o( W  H
   k++;   
3 y& H% B* H  S% Q7 C; F( V  }
) f" n5 i) Z& h; W+ l4 J$ E3 D  IRcord[i] = value;   
" L. J6 P2 T4 d: x+ _7 [9 G  value = 0;      
, v  c: g" M( S& z. {8 s" y- h}7 q1 h/ J0 W7 d) G6 Q
IRpro_ok = 1;      
& ^+ t( \8 G" S) H}
$ @. O3 {: @( N* w# c
5 z% m0 ^* O" V4 E& j. pvoid init_pwm()
* ?/ x2 q& X7 N5 K* ~3 `9 M{4 B, ]) ?0 R6 A0 l
  CCON = 0;% J$ _- E8 S& o; Z
CL = 0;
( ~3 b- F) F4 K( Z& DCH = 0;
+ ]5 B) {- i3 @& r! }% vCMOD = 0X00;
6 H' P) a- p& a- {# aCCAPM1 =0x42;
1 d' q! t4 N% t, p2 m4 t$ ~. GCCAP1H=0x00;
* k! T3 k4 h: ~* iCCAP1L=0x00;% H7 L4 R# S  @' }/ Z6 ]
CR=1;
& R: X0 W) \3 Q# u1 r5 D3 z# I   
  i# `0 r$ _! k0 Y}# v, H; e: \) J1 `4 u

: O6 }0 U& Y8 v4 ?% i  void pwm1_set (uchar a)* M( g  c  H7 u8 y( ^
{
* U9 l4 G- s- Y+ G         CCAP1L= a;  {% x& p# e" Z, ~& q
         CCAP1H= a;, H6 v. c! @/ u6 ~
        
$ U# U" e% p* [2 I3 U, }1 H0 Z}; J( G& }4 S$ c7 o& h" [
: `6 k9 T; x1 N! a
/**********************************************************************
# ^" N9 k  G; n      数码管显示
4 ?9 u$ M* E- I' b) k7 @* B**********************************************************************/
$ i4 ]% D! O+ ^8 ^" ovoid disp(void)2 c7 g1 U5 b" b% M" N/ S$ O
{
2 ?  @& K" i3 G: p4 t, JP2_0 = 12_1 = 12_2 = 12_3 = 0;     0 ?- F! ]3 f8 s% j; q- e
P0=table[W%10];       //显示占空比个位/ [. j. x, p7 O5 O4 H3 W/ U
delay(1);      
& B! a' n0 r+ h4 R1 y. h1 HP2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;         
; G/ F+ G; _2 Q2 ]  
. m7 Z9 X8 f! S3 x) q8 _' TP2_0 = 1;P2_1 = 0;P2_2 = 1;P2_3 = 1;- Z% W* ~# [$ Q$ w& p
P0=table[W/100];                    //显示占空比十位
( [9 n! j9 p+ O+ ldelay(1);      4 L! J2 C& ]+ v& S4 {
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;     8 @  f3 e% _" G5 A) e
        P2_0 = 1;P2_1 = 1;P2_2 = 0;P2_3 = 1;. x* h' O: A: r* m( {. h7 N
P0=table[W/10%10];      //显示占空比百位" _" z; g3 h) a/ e
delay(1);      7 H: K0 R/ p" H! V2 l4 r; e
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;
5 _/ x3 f4 N- X  LP2_0 = 0;P2_1 = 1;P2_2 = 1;P2_3 = 1;
! ^" K7 i% _9 ]P0=table[A];         //显示方向
& f) E# i' \8 c0 A, `delay(1);     ) v: V- c4 k7 k/ U0 y3 d% z3 i
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;     7 Y, X8 @7 t. `2 |" r5 \/ _8 W
}
0 `" L: H) Z" j3 b9 x8 L/ zvoid san()4 R6 H- ^& S  U" V
{5 g0 H+ ]% C& v- t, M/ x
uchar i;
/ v7 t  n) B- I5 D) n: _4 S  k2 }; y1 V* I5 v4 d) N
  while(1)
' i; k- c- J8 ~  l1 d4 C4 d/ E  {     
* m) t6 S, M1 l9 S7 C        4 k1 A  ~- M7 a* J; ~; z8 Z
     for(i=0;i<2;i++)( Z6 w+ J  W  F" K$ M9 s* x
     {* v9 b1 y4 N1 m, \: j
            if(S1==0)
: K# ]; K) g/ t         D_A1;   2 G; u+ e  d4 q0 x" w' }2 G& H: b# s
            if(S2==0)9 \# x* c2 c4 a8 B& e. I
         D_A2;
& c! T+ o6 [, ^& c1 i* M      }, z; m/ a5 T- r# k
     if(i==2)
! @8 B/ s8 o+ d' L$ x      {* n, C6 |2 X8 `8 k
         i=0;
9 x6 i$ h$ ~4 Y- s- W6 U      }/ ^" N! ^$ a9 U1 x2 d, r
       D_AOFF;
6 |' `, I8 b$ J1 I       beep = 0; delay(100); beep = 1;3 R$ E1 e; g( d# a7 i* l' l
  4 |* g0 s) ?$ r  _: C( L5 f% E
   }
5 Q" i, M) \9 k, @% x}      7 Q, ]' z2 q/ d+ L2 T* d
void qi()  `' q8 e* w$ V% W$ y
{
8 n, E# g* U! Cuchar i;
  R( W0 E  E2 H7 V2 W  t
1 f) {; N; L* I& V( m  while(1)& Q& I# ~" f* U( c  b
  {     
5 {+ C3 Q9 ~. n  i$ s6 c        / U" h7 K% ?9 J1 a
for(i=0;i<6;i++)! b6 P& w2 c* U
  {
7 ~6 L' q2 D9 C( o3 ^9 N3 ^( M                    if(S1==0)9 x8 r* s6 }, ~8 @, o
          D_A1;   9 m# g7 o6 y/ N0 u" ]; x
                    if(S2==0): X8 b0 }" y; o7 P9 r
          D_A2;4 C9 h  e2 {& ]) r2 S
  }' S, z4 R+ f8 M% b
if(i==6)
/ {. r8 l: u8 ~& k- w{
* ?. _/ z! |# T* G" A           i=0;4 a' f* a* |" i& x, }4 m. ], f2 {# y
         }
( d7 V% L+ g" O* B. v7 v; T         D_AOFF;6 Q8 h# B5 D1 Y" p; q7 Q* l
         beep = 0; delay(100); beep = 1;
# N" c: G% z8 l0 t- s  
+ |, f1 Z" [* i! u5 N$ _/ h. M   }7 d" B) z- \/ u# C0 T; N9 P
}0 C2 ~9 _( Y( R4 n% x. x
void main()
3 t; G' h# s% Y" H{
) [& N/ ~/ L4 V, M, y) Dinit_pwm();: ^+ O$ W, G+ u' S6 E" @
EA = 1;
, A. _( ~: ~+ K7 ?5 \, H$ STMOD |= 0x02;/ G8 u! b* _+ M6 Y3 k$ l
TH0 = 0x00;  4 Q  l% x) z1 G: P4 D: @( k
TL0 = 0x00;5 m  p8 Q8 f5 F( c& W
ET0 = 1;   
- U' g1 Q: l2 O" Z- q8 z2 @8 jTR0 = 1;     
+ K6 Z2 h5 L5 t; g+ HIT0 = 1;   2 {. O7 @4 A+ A. z, B
EX0 = 1;   . j  ?+ Q) y! u
        disp();
6 l* x2 B- l2 n' H* l( V% ypwm1_set (1);
/ }" u5 c6 N" X# K' X9 t         W = 220;. a. g2 G# r/ i# o) C4 K
while(1)
$ k7 p% |+ p0 b+ N' ^5 c{
) A8 b' [! T, t  if(IRok)                     7 p2 ~; y6 z7 I
  {   ) }2 l9 J4 i6 M% c4 u' Y
   IRcordpro();1 l- {9 k- m% V& X
   IRok = 0;, o4 B8 o; q  `# [
   if(IRpro_ok)  
; W: }3 K) _( R5 k4 H5 S; [6 _   {' {+ N6 v3 T) e/ P/ D) k
          switch(IRcord[2])
; X6 O1 G" n2 L8 l  z- m       {9 r3 E4 C/ W; C& v  _5 T
         case 0x45:   //按键19 q1 E9 E. c5 j2 K) w% K
                                         beep = 0; delay(15); beep = 1;' W. |+ e8 e0 T: ?# _
      san();  - ~$ f* ]& s& Z; O
         break;
8 c  v5 G) l* j5 }2 F5 ]% Q         case 0x46:    //按键2( [, u# N, F! Q& s
       beep = 0; delay(15); beep = 1;
0 X) j- J4 e* p+ B$ m- c& }                                         qi();% u( P4 O! B: `: R% L5 A
         break;
' P0 ?0 H9 h' w# P$ T         case 0x47:    //按键3
7 ?! l! {# P( P! q$ `( M: X       beep = 0; delay(15); beep = 1;9 z1 {# u$ F# Z9 S9 y. C
                                          D_AOFF;
: \2 Z! V* j6 Z. a/ G- F  r         break;/ e7 K: N  }4 o$ F$ f
4 }5 E* o! ?, s. q
        case 0x5a:    //按键 左 占空比控制 速度增加
* m0 q" Y3 p& r& V  _: R: d       beep = 0; delay(15); beep = 1;     . p' Z- D* B" X9 E; I
                                          W+=5;
, ]' c5 a6 A' o( r0 W3 A1 s! S                                          pwm1_set(W);
3 e6 V- o% D: j* a* G                                          if(W > 255)                                 
4 b# ]- V- c  ~2 E$ T5 ?                                          {  # x: m$ `6 B, O7 f. j6 X* q
                                             W=255;: J/ u2 M/ f- ^# C5 ^, J4 _1 S- A' n
                                           }
/ O. k$ G- d7 t+ N" n) ?# P         break;
2 R3 Q) p! j* J         case 0x08:   //按键 右 占空比控制 速度减小
# U- n$ g1 \" c" F* o: J' q         beep = 0; delay(15); beep = 1;
  Q# S7 R) Y$ e+ }                                           W-=5;
% |& I; c7 c! K                                           pwm1_set(W);% c! m  r% C, S8 u3 P- |8 ]
                                           if(W < 200)                                 
1 I% y4 x+ ^! a( h. Z                                           {! {* E8 p" h  V
                                               W=200;9 h7 V- C0 s( \- }4 b4 d' Y
                                            }
/ F) i2 I) ?% W7 A$ [1 F      
5 Z. }" G8 j0 z- z          break;  F) g. p. _' }- y& v, Q; S/ ?: x
     
  g+ x/ e& ?& n" h5 i3 i        }% @  z& x4 W6 j$ _" s
    IRpro_ok = 0;
- ^# G; _6 W: a2 w4 b   }
( E7 b; k* h1 l2 @& g9 I6 x  G  }
) G" T' U2 u1 i% ?
" [! f) W1 s4 }}4 M  q" }  Z  [3 U! _5 @% T
}
头像被屏蔽
  • TA的每日心情
    奋斗
    2022-11-8 15:10
  • 签到天数: 3 天

    [LV.2]偶尔看看I

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

    该用户从未签到

    3#
    发表于 2023-2-2 10:56 | 只看该作者
    除了主程序,其他地方最好不要用while(1)
    . v' D, `% F! ~9 i1 bvoid san()) }! J$ {9 H* w+ z9 L6 Z
    {
    . I: a+ o$ J! U4 C0 Xuchar i;" A. Z4 l$ Y* l/ |/ p, o
    0 h. ]6 N- X# U8 V4 u
      while(1)- t2 i# b' u! ?' v4 z( {/ z. o' m8 i
      {     
    # Q0 G9 D: q8 v) Q要用带条件的循环语句,不然会退不出循环的

    该用户从未签到

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

    该用户从未签到

    5#
    发表于 2023-2-2 13:37 | 只看该作者
    不愧是新手。令人闻风丧胆的函数命名和Tab对齐。" G, j/ D4 ^  t0 o7 c
    大概瞄了一眼,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-7-7 08:39 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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