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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
用STC12C5A60S2编写的程序不能正常运行,进入for中正反转循环就跳不出来,数码管也不亮了,其他红外按键也没用了,还有就是PWM给电机调速只有CCAP1H的值在200至255中间有效,跪求大神解惑。* C1 [- E1 N$ W: [! {
#include //头文件
5 }1 D) m  ]* j5 C1 |#include! \, c% \2 q5 \, t: W" T4 l
#define uchar unsigned char+ M, ?; _, e2 K% O
#define uint unsigned int  ! w4 B2 i3 b- l; r1 F
typedef uchar INT8U;) l1 z& }7 h8 `/ ^  Q: G
typedef uint INT16U;
+ \1 G, I7 J- J) A; Q5 i$ Q***it PWM_1=P1^4;               //PWM输出端口  
6 u  y( J7 R* p***it A1=P1^5;   //定义直流电机正端口" R' o; G' p9 c5 t/ f2 o
***it A2=P1^6;   //定义直流电机负端口+ p) x3 Y# h/ |4 {4 U. O! S
***it IR  = P3^2;          //定义红外脉冲数据接口" h7 q6 I8 C( _* B: v& ^
***it beep = P3^6;    //蜂鸣器的位置/ w$ _1 c9 d5 Q9 f
***it P2_0 = P2^0;    //数码管位选接口
' _" o& ?+ m8 g***it P2_1 = P2^1;
2 w: |2 H7 _9 H. d***it P2_2 = P2^2;1 E' D9 f+ ?+ U: a
***it P2_3 = P2^3;+ L- X# u2 |/ c" I0 L
***it S1=P2^5;      //限位开关1* S. G# w3 r/ ^3 T' J8 }  v" g
***it S2=P2^6;     //限位开关22 e9 v1 I  ]3 \1 V5 L, ~
#define D_A1   {A1=1;A2=0;}  //电机正转
3 f4 @* `' V5 {- \#define D_A2   {A1=0;A2=1;} //电机反转
! s! B& s% o1 z4 D8 k( K#define D_AOFF  {A1=1;A2=1;}  //电机停
4 n7 s/ x9 z" w/ N; |; m8 suint W=0;      //定义速度等级! k2 B3 W7 Y+ X; L, r2 j% T
uchar A=0;      //方向标记 0,1
' x  K' m  Z3 w0 G1 Quchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,, K  E. P+ v, G2 [) T2 d$ K) A
                        0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e};: W( S9 F5 G$ `0 K  y5 X1 `
uchar IRtime;   //检测红外高电平持续时间(脉宽)- X5 J0 M( s$ P( J6 B4 _6 p
uchar IRcord[4];    //此数组用于储存分离出来的4个字节的数据(用户码2个字节+键值码2个字节)
8 I1 @& Y9 \9 d3 C" r, T0 h7 Puchar IRdata[33];   //此数组用于储存红外的33位数据(第一位为引导码用户码16+键值码16)! N; [8 B  z2 i7 A$ o
bit IRpro_ok, IRok;  //第一个用于红外接收4个字节完毕。IRok用为检测脉宽完毕) Y% u6 D/ t* _: @- i( d" g
% r) ~/ i7 U5 }' \' ]1 Z6 w- u
void delay(uint z)4 }6 x5 h$ \; S0 D" J- y2 L
{
$ m! G% t* ]& O" Juint x,y;
9 z7 t6 r4 a3 r) z8 f% L- Sfor(x = z; x > 0; x--)
  R" i: A! R: G0 [! d9 X: w9 h  for(y = 112; y > 0 ; y--);* U3 v' w. M$ t9 U' g
}
; M( y9 |2 p5 Rvoid time0() interrupt 1   //定义定时器0
; D+ H1 R" N" M, t6 k{
" f; J" ~' t3 F2 XIRtime++;      //检测脉宽,1次为278us
) {+ W1 n) O3 R1 Z3 U}0 ^5 l# e) u" c8 q" M
void int0() interrupt 0     //定义外部中断0# b* q- W  G4 @: I3 Q
{2 [) ^  k0 l$ \# p
static uchar num;     // 声明静态变量% C& ?3 v" i0 H! H8 ?6 E3 N
static bit startflag;  //开始储存脉宽标志位
; h3 I3 `9 @& z5 \. ]4 d' Bif(startflag)     //开始接收脉宽检测
3 ^; f. {+ d1 T! Q; O{
4 }7 f. A* ^; n/ A/ x( ?: b  if( (IRtime < 53) && (IRtime >= 32) )4 |& k: A) ]1 z" n
   num= 0;     
% j( P0 h( o, v- \2 v  IRdata[num] = IRtime;     
1 f7 y0 r5 K& Q" g$ V  IRtime = 0;     6 ]5 K2 t6 t6 D  G1 R6 D3 p
  num++;      0 p+ H3 G: j) P7 Y* N$ x6 _
  if(num== 33)      
$ q) k  ]/ g3 \8 Y( R7 N2 z  {1 k/ ?" A# V* b( a" @9 _
    IRok = 1;     
2 D! P: l# ^3 V& d. O   num= 0;      9 k& O: f9 X. T, b
  }% @+ F: h  V2 n' ]0 }; O! ^" |' P$ s
}! _0 n( C$ K# ]# }' S  t
else   1 a1 ?- h# s' O
{
. B0 @9 Y8 D" g9 f4 g$ \  IRtime = 0;      
3 P* Z$ j' I$ q; L1 t# U+ _  startflag = 1;   2 P. c1 u& H1 _
}
5 T: W. T/ C2 l' T3 Q* q}
% `" \" ]4 F  `. {, |void IRcordpro()        
4 W- q. G9 h' T) h( o+ t2 K# }{% I& O* T# `& y9 G0 c
uchar i, j, k, cord, value;
9 N5 C2 J+ X# ?' @$ o7 W. Dcord. K: a) _7 Q& J. t
k = 1;      8 O2 Y# X; j$ v/ a: K1 ]. s
for(i = 0; i < 4; i++)
8 b7 {" B: I9 j{
9 R7 Y+ N. _, W8 N  for(j = 0; j < 8; j++), `8 ]$ [" o6 f/ q( |0 U
  {
2 @+ Z5 l  i( S1 g: t) t( u7 C8 u   cord = IRdata[k];     
: K; |) N  U4 J4 C   if(cord > 5)   * D* D' _" t9 x( K0 a: M
   value = value | 0x80;
: e4 f* @, a& ?! a6 F1 B   if(j < 7)9 V, e  j+ g: m/ F6 q+ G
   {# M' i8 E4 [: A! v% M3 Y+ G2 R
    value = value >> 1;
" \: c# s$ {( [' \6 e   }
8 S! |+ L& a& _( I$ m  |9 f" U& [   k++;   
7 \6 f9 f2 R# x" S  }
- K; P! }2 j7 s3 L3 f  IRcord[i] = value;   + c$ @! M& `3 J
  value = 0;      " z! w7 G- j9 t, P0 A. F
}
, ]) s1 p3 a% f. ]+ T" j: }IRpro_ok = 1;      
3 e7 }' A; a$ g+ j( E( t}% _& h. @! x1 d5 L
9 G. O$ a; V2 ~7 z5 u+ j
void init_pwm()
" l' Y& Q. y, X' Z" F; V{) y# ?. J5 A0 B/ K
  CCON = 0;
& e' J, K; y" S. e) uCL = 0;$ {0 M- A2 m# s* {# x$ J3 h
CH = 0;
+ l3 {, ~' I# V2 |+ nCMOD = 0X00;% j, z; Q( K4 E
CCAPM1 =0x42;% \) i0 c# V4 j6 ]! S7 B0 n# b
CCAP1H=0x00;
8 y7 ~# G2 T' Z. w9 ECCAP1L=0x00;
$ W! P# o( \' S5 v6 H1 zCR=1;9 @  ]! ?7 P2 |+ e
   1 f+ C' w+ m+ N2 S- s- M
}6 N5 c; ]0 |% x
- G( }1 w- Z2 U; N7 f4 z8 X
  void pwm1_set (uchar a)4 P- h+ x8 K$ j4 g: m) s
{. Y5 Q9 l+ [3 v! X, ~
         CCAP1L= a;
: I$ N5 n! d( [, h  @         CCAP1H= a;
9 M7 e- `! ^; v/ k$ C( E        1 `, J3 ^- H5 E5 f# e
}
- u# j1 D/ j4 {* ?# i8 V' ^
4 X( k4 L5 x+ d/ G* y/**********************************************************************
8 F; B3 X) f4 h      数码管显示' c+ o/ |. ?4 w% E3 m* I: ?
**********************************************************************/
) Q7 k" p* G8 wvoid disp(void)$ u8 `" N) M  f3 L" |% O
{
9 W: ]. d/ t$ A1 W! E8 aP2_0 = 12_1 = 12_2 = 12_3 = 0;     
/ p3 G* T5 ?) e7 Q, c1 @- XP0=table[W%10];       //显示占空比个位
3 a% M: f$ D* F4 K, X# ]2 `3 J$ Ndelay(1);      9 g* G. H  ?( Z' L5 V
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;         
" E1 \' W2 {2 b* [/ C) H) Y) l  ! N- l! I8 |, m/ g% u: W' k, s6 g
P2_0 = 1;P2_1 = 0;P2_2 = 1;P2_3 = 1;
; ~! [: H7 [) L7 KP0=table[W/100];                    //显示占空比十位+ @% C( t& j3 h) g
delay(1);      
* ^: `. C+ u" e2 Z/ H$ ?( T; E0 sP2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;     
# \( I/ M( I* A7 @1 P' U: V& N        P2_0 = 1;P2_1 = 1;P2_2 = 0;P2_3 = 1;
+ j% w" p$ B3 j( J* Y* BP0=table[W/10%10];      //显示占空比百位
+ D$ Z  T. Q! R% {6 xdelay(1);      
% f8 {) `6 L& r1 o3 L! G* ]6 JP2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;0 A6 ]/ s% Z% T, }" r' g/ k
P2_0 = 0;P2_1 = 1;P2_2 = 1;P2_3 = 1;
0 Y: h  D1 N2 e0 Z. `% R' T9 t) DP0=table[A];         //显示方向7 s8 _% B0 H4 I% ]! g, [2 Q
delay(1);     ! ?$ y- K2 T1 T  M  X5 E2 G$ w7 p
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;     1 ^3 F7 K) U) s0 m3 C
}# q5 K+ y# L& b* L3 ~3 f0 U2 i
void san()
: K% l- E$ b+ D: v{; U  Y/ R% O6 a. S  p2 R) v
uchar i;3 Z& M! ]9 ~% |- B

7 A1 K+ L, z) P6 O  y  while(1)
( ^  k1 o6 J1 b  {     
* ?% ^$ t- T# r        # a" U0 t0 [; D
     for(i=0;i<2;i++)
  [% j- R6 [: t8 o% C; X1 r     {7 x# L: ^) q+ _2 c
            if(S1==0)/ w' Q, q: N! X" F" |  r( Z
         D_A1;   ; D" t  \  i7 [; t" U5 n
            if(S2==0)0 @8 M. R) Q0 M. }% P) O
         D_A2;7 Z4 J* ]6 v% A/ Z+ {" w' p
      }- R" w; k  n/ {% }9 J
     if(i==2)7 B$ F4 V. D# Z
      {5 y* ^/ Q9 s9 P
         i=0;
! }( G: y7 A5 U" _/ u; r      }
) O" n  A8 `/ G: X6 |       D_AOFF;
8 s6 m0 b, ^+ T       beep = 0; delay(100); beep = 1;. v0 U- O  p) b5 Y% ^
  
5 z+ e) \: c& D   }
& [$ R7 N6 N* v+ ~% n# u& k. |: {# u* k}      % z( v9 x8 J- A+ {) i* q- F- y- v
void qi()" M  b7 k$ \/ J: _/ e
{
$ e+ l, Q( ^5 W- z0 z; v- ^! e; Juchar i;; ?  G$ o4 X* i+ K$ z
' ]6 c; m* c% N1 A# d  G7 \
  while(1)
7 e  z6 Z4 }0 ]4 z9 X+ t  {       ]) h4 g2 }& w" Y$ A/ z
        
+ x& w0 M' Z9 J& Y* Bfor(i=0;i<6;i++)
& [$ c0 v' K! H) N- U  {
/ Y1 R& W$ g* A5 W; {3 I                    if(S1==0)+ N7 @# Z% {  q; A4 Z1 G7 [
          D_A1;   / o9 @, G1 M8 W+ @# l
                    if(S2==0)0 U$ p/ Y/ o4 I: s* R
          D_A2;  {& S) D1 O, \+ g
  }
2 @  K+ p0 Z% a/ q* Tif(i==6); n# u, r: X# q8 S6 J2 \: w( `( G
{, B( L: w( q& J9 H  P
           i=0;8 W3 [, A7 I- ~
         }0 B( S  k3 L; _2 c& E! A
         D_AOFF;4 k) g" p  d8 `: a5 Y' K
         beep = 0; delay(100); beep = 1;+ E3 @) I0 l0 n, p4 W) {5 W
  
& A# E6 }! F  l" r7 @   }! A* E- \+ C% P
}
8 t+ W9 f; c! ^5 Q8 [void main()4 X# D! E$ R7 i
{
" M% ~) N1 Z% R6 binit_pwm();
. w+ I- q( Z( a$ `3 o" H2 }EA = 1;* o4 y7 R# R5 v! l
TMOD |= 0x02;4 Z& ^! h/ l! S* `
TH0 = 0x00;  4 i. g6 u1 s9 t4 x9 W+ |+ B
TL0 = 0x00;, v- f, X' z- \- K: j9 ?
ET0 = 1;   9 x2 Z6 Q0 z% B* Y+ D
TR0 = 1;     6 t& r2 P" ]' p& o
IT0 = 1;   
* @7 N4 q* @6 ^/ r" I$ BEX0 = 1;   
. M$ q4 D1 V! ]        disp();
" D7 |7 ~6 a' o9 X& C6 Epwm1_set (1);
* `5 [& |; o2 R( K/ Y         W = 220;
6 Z: `6 w+ v$ rwhile(1)
+ B7 o  C( f! i; t. Z8 M: ^: O# q{
$ p$ ]5 h: ~7 N$ ?  Y! N8 Q  if(IRok)                     
. _5 {9 U' X! {& s, Q* b! g  {   " w( R2 ^' R4 Z# Q# m
   IRcordpro();: P2 l2 X4 H) F
   IRok = 0;
! ~4 M' [6 S$ |" U" h   if(IRpro_ok)  ' C+ M, B* {7 u7 |7 d
   {0 }: o1 B+ l+ i$ H0 X+ y
          switch(IRcord[2])
8 d- T3 @1 l8 ~: z9 ?3 s       {
* h! ?9 R7 c2 K         case 0x45:   //按键1
$ [+ x6 I8 V* T: x# y: _                                         beep = 0; delay(15); beep = 1;
' ?* A) o- X& I7 J6 u      san();  
9 x  R  S8 ^+ R- S         break;; Q) P5 G  l! ^5 ?2 }) x& Q
         case 0x46:    //按键2- k# P8 V  J; d. }' _
       beep = 0; delay(15); beep = 1;
/ p8 k/ M* \( _# Z2 O$ J) S                                         qi();. }, R( [* z" y& E" m
         break;
9 }$ B$ L( L9 o( Y2 }         case 0x47:    //按键3
, a1 f9 b2 O; g       beep = 0; delay(15); beep = 1;2 {* L9 G1 M  V* {, S
                                          D_AOFF;
  e& ]: L, O) K         break;& Z+ `% ^: r+ t2 W

. g$ \( X9 z# d: p! Z8 w& ?        case 0x5a:    //按键 左 占空比控制 速度增加0 H! E( c0 x6 c6 a* h" n
       beep = 0; delay(15); beep = 1;     
* K1 Q( O, h8 ]$ L6 a0 G. Y% ?                                          W+=5;
/ B. |3 |: V- A5 e$ B) p                                          pwm1_set(W);2 n3 K- p6 y6 n; G5 n
                                          if(W > 255)                                 
2 l& h7 S% t; l' h! d                                          {  
( t5 c! }3 h/ z                                             W=255;. i9 }) p! O  y2 x" K
                                           }
8 B1 M; T2 C" l: L. Y; K% U& e2 K         break;
: s/ q$ E" W: B3 B: o+ f         case 0x08:   //按键 右 占空比控制 速度减小
2 b" j1 j2 w0 u5 s         beep = 0; delay(15); beep = 1;
% m( C: }$ I. v8 u# I, c: w; d3 j                                           W-=5;, `0 V/ {/ i' p9 m- M
                                           pwm1_set(W);
" c& b% N+ _, W6 r                                           if(W < 200)                                 
( [4 P$ P6 g$ E% ^& W! ?7 |                                           {4 L7 G0 k8 J2 A: x
                                               W=200;9 E5 `3 O9 M9 O
                                            }
" i" G3 H5 b' `      
' L0 M2 ]# F/ B3 B* P          break;
1 `! j7 @1 b) f4 X$ z     
$ s! z- s/ }1 r, P( y        }
! M- f- v( T; W' e0 m    IRpro_ok = 0;" b0 d3 t. i$ o, M
   }: x. m+ z8 o) [2 @& o
  }4 _7 W6 B! b0 P, ^& _, S: }0 _
5 R6 R0 w- t- k: ^# G7 E# q
}6 D) b! T$ a9 G; _7 `" U7 z
}
头像被屏蔽
  • TA的每日心情
    奋斗
    2022-11-8 15:10
  • 签到天数: 3 天

    [LV.2]偶尔看看I

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

    该用户从未签到

    3#
    发表于 2023-2-2 10:56 | 只看该作者
    除了主程序,其他地方最好不要用while(1)
    # P9 }% Z( {8 g$ ?2 Ovoid san()
    4 o- w. m0 b- y4 E1 J# q{7 I, _6 b* ^+ l1 E
    uchar i;" ]! H/ M. L; g% ?  X

    8 m8 p0 Q0 @# W* n# p% {  while(1)
    2 l: G' m+ Z, C% o$ ?5 W5 l- k  {     " m$ x1 E' v5 B1 f; L& q
    要用带条件的循环语句,不然会退不出循环的

    该用户从未签到

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

    该用户从未签到

    5#
    发表于 2023-2-2 13:37 | 只看该作者
    不愧是新手。令人闻风丧胆的函数命名和Tab对齐。
    8 U# p$ J) l- d大概瞄了一眼,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-8-2 03:11 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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