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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
用STC12C5A60S2编写的程序不能正常运行,进入for中正反转循环就跳不出来,数码管也不亮了,其他红外按键也没用了,还有就是PWM给电机调速只有CCAP1H的值在200至255中间有效,跪求大神解惑。
% Q1 }3 W1 N3 e. Z" b- ]#include //头文件% H2 ^3 k; j- d& u' W8 f
#include. F/ ~/ x8 ?( F  ]
#define uchar unsigned char6 j/ o, {: D4 k% A% @! T
#define uint unsigned int  
" J# U: C( |: A& @9 S  Btypedef uchar INT8U;
3 L7 {$ m# e% G* b# Q0 Jtypedef uint INT16U;
7 s  ], |% V) ]+ k: ~***it PWM_1=P1^4;               //PWM输出端口  
# W7 o# j0 j3 q7 z. P***it A1=P1^5;   //定义直流电机正端口. x- M; N+ k4 [& S
***it A2=P1^6;   //定义直流电机负端口
2 m; |6 I( E% u2 t" k- u/ p; I***it IR  = P3^2;          //定义红外脉冲数据接口
$ f4 x' v7 d. W9 _" w; {8 a4 a7 j***it beep = P3^6;    //蜂鸣器的位置
3 a& J$ A1 s/ ?4 l1 ]% K! \9 J***it P2_0 = P2^0;    //数码管位选接口
, Q9 N5 M) [$ B* a& E***it P2_1 = P2^1;4 T; Q8 |7 v8 E& S$ J+ s1 t
***it P2_2 = P2^2;  @; O4 p& c2 u  ~+ u3 q
***it P2_3 = P2^3;- f, H1 v6 ^; r1 H+ L* }/ c7 x9 V
***it S1=P2^5;      //限位开关1
1 P0 _, u3 R. T***it S2=P2^6;     //限位开关2: a) L* N" ]7 Y
#define D_A1   {A1=1;A2=0;}  //电机正转
% _' H& K* v8 s, l#define D_A2   {A1=0;A2=1;} //电机反转- I8 H. k5 ?* K4 }& n
#define D_AOFF  {A1=1;A2=1;}  //电机停; y1 h+ L  ~- W( C1 w6 u& F
uint W=0;      //定义速度等级  A$ i, w$ \, \: `$ z- O
uchar A=0;      //方向标记 0,1
' F: _7 B  I1 S4 w6 ^' u! ]6 uuchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
3 I8 f; C( h0 j4 `; a8 e2 r                        0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e};9 c3 |0 B7 Q- ~+ P
uchar IRtime;   //检测红外高电平持续时间(脉宽)
! v) S7 N2 D5 F2 Yuchar IRcord[4];    //此数组用于储存分离出来的4个字节的数据(用户码2个字节+键值码2个字节)
% C- W. c  {3 \" B% Xuchar IRdata[33];   //此数组用于储存红外的33位数据(第一位为引导码用户码16+键值码16)# @, |) t" Q3 ?/ _2 H% R
bit IRpro_ok, IRok;  //第一个用于红外接收4个字节完毕。IRok用为检测脉宽完毕
5 \  f  J) e/ _; e) J4 j1 L8 Q* _* o
void delay(uint z)
  b& z+ [0 f6 T4 y# d1 c7 c+ ]{9 u# T* s1 N, H4 ~" r* [" T
uint x,y;
* j* ]  z8 K. G5 A* \& j- Dfor(x = z; x > 0; x--)( z# Y. `* A  k& J; n8 ~
  for(y = 112; y > 0 ; y--);3 [2 g) d# t- r1 Q3 H2 T" B
}& Z( `9 P. x! ]6 A4 `: d7 f5 _! r5 _
void time0() interrupt 1   //定义定时器04 R3 H1 i# z' i: d" H, f
{
9 Y+ T. B; k" M7 a& O  v* ?8 i% ^IRtime++;      //检测脉宽,1次为278us& o$ m  V/ \+ Y( l- @4 {1 q$ A
}2 b! O& K, C$ N, ]" ]. n
void int0() interrupt 0     //定义外部中断0
1 D& ?$ e5 q% |: P0 e8 {{+ `& o) S' d4 W* Y$ g3 M( J
static uchar num;     // 声明静态变量
/ F6 V/ x; x0 Q' n, cstatic bit startflag;  //开始储存脉宽标志位
) l0 V+ B0 F% [) T- Hif(startflag)     //开始接收脉宽检测# y1 T3 Y$ ^1 q8 x/ q& |
{. ?, I' q5 r* s& C3 d% K
  if( (IRtime < 53) && (IRtime >= 32) )3 G8 j4 c. e% @, Z
   num= 0;     . E3 I% k/ m2 x- B* {
  IRdata[num] = IRtime;     ( k0 Y( d/ W6 m! N* Z
  IRtime = 0;     
/ r& D% G- N5 ?# {' N  num++;      0 v2 i# Y- w  I( ~$ @0 C
  if(num== 33)      
' n+ j. k: c' V+ F' J8 o; [# m3 m+ ]# [  {9 v9 {0 N/ J' m! u+ \* a  m
    IRok = 1;     
8 Y0 B% t, `0 j   num= 0;      
" g6 E% z- C% q& f: e! `  }
3 s  u. Y9 ^; Q) |- I" u3 A- R}
" g5 u, b/ R8 k( ^/ \else   
5 n, D  x# _" v1 f* m/ d{
4 P0 z6 V5 U1 I- W& Y/ y' O  IRtime = 0;      
; L& ~) {4 Y# F3 |* t  startflag = 1;   4 ?8 D( l1 K/ ]8 r- P
}
" w% T" e# o% e* B' w}& \' a' r# L. m3 L
void IRcordpro()          g& x9 `1 ]; n" }' C0 _, s3 L4 g0 J
{. E6 _/ a- \( f6 [/ {6 H
uchar i, j, k, cord, value;
7 R7 i* ?5 B% \1 Z$ f! Ocord# k  |: Q: F( d, p/ ^
k = 1;      
* C* e; i# h# |for(i = 0; i < 4; i++)
( f8 U: I( t' s{2 }' z$ S- m+ g& b7 d1 u+ M
  for(j = 0; j < 8; j++)( U  C/ Y3 v9 g% T$ j8 m8 P
  {
; y2 P9 g9 C4 t   cord = IRdata[k];     9 Z' `* t- V7 I6 j  k
   if(cord > 5)   ' ?: }- x# M; _3 S5 Z5 H! o
   value = value | 0x80;
0 T; P* m' ~0 o, V: K   if(j < 7)
, c  R# E$ c* Q3 j   {: K% o: w0 r# F% V
    value = value >> 1;
% I3 _4 X6 b7 j4 k. A   }# `* b: @% F+ [+ v- y4 k. _
   k++;   
7 ^; {3 u7 o% ?8 _  }
& S7 u' }2 T( O* G! {  IRcord[i] = value;   ; E( V" J! N  H2 Y
  value = 0;      7 H4 ^7 \, t# Z
}
, Z' F+ m6 K# [0 S3 M9 qIRpro_ok = 1;      8 ?! J/ l% ?4 z; ?
}' ~5 l( w* \" T0 H) C

2 [6 e$ u! P; M8 I( Evoid init_pwm()
2 Z# c5 T- t' Q: Q{
0 U' i2 p3 g; q9 b0 K/ J3 R  CCON = 0;# I: o9 c9 J% J
CL = 0;  z! y$ L# E0 A9 O4 D
CH = 0;
$ ]/ y! h8 @, J# [- d  L1 OCMOD = 0X00;
4 }0 F1 A! \( w: GCCAPM1 =0x42;' d+ q& u: p- \: I- C1 V+ k7 r2 @! y
CCAP1H=0x00;* q) g# b3 L& q) Y% g) p1 D
CCAP1L=0x00;
* f7 _" `& n. K3 {7 q5 q6 P9 ]# kCR=1;
+ }' _+ P" F7 i( N   
+ Z# F4 M8 i. c}
6 x2 f/ N6 L3 _# q2 t1 ?7 V
. O; d' p. k! S  void pwm1_set (uchar a)
9 m7 M) O' O0 M) w" o3 W3 P{8 X2 d  t' a- t
         CCAP1L= a;( i3 L! {! ]" p; l& ^- x+ {, `
         CCAP1H= a;
  t& l% |! `& B% Q' Y          d/ K) T# F% M8 V
}
- f( J( x2 x# R' C, a2 T
3 o* v* `1 {  _- I/**********************************************************************
" V5 O! I$ {  X# Z# _, ^6 O7 x. W      数码管显示6 X1 e, K2 p/ K3 c' d) [
**********************************************************************/
( h' q* N! [; I2 ?) N  G5 C$ Mvoid disp(void)& Z$ R9 L$ `! H
{: g5 g: F9 f: {9 i& [- {
P2_0 = 12_1 = 12_2 = 12_3 = 0;     7 K; n% w+ ^' a6 i: C* l
P0=table[W%10];       //显示占空比个位
$ r; [6 n* y1 v( x: z" v2 ^4 Rdelay(1);      
4 A8 ?! h# m1 q( s% _P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;         
% I1 D. p( F  }' p# m1 D- r  
; }6 R( k4 D8 G: D7 EP2_0 = 1;P2_1 = 0;P2_2 = 1;P2_3 = 1;
) W! o2 u3 o) z* r( e' p( o0 O& kP0=table[W/100];                    //显示占空比十位1 N* y4 Z9 t1 M8 m9 u1 a; y2 B
delay(1);      4 }) R: h& ?: L0 Q0 B3 i
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;     : E9 k7 s3 P: h
        P2_0 = 1;P2_1 = 1;P2_2 = 0;P2_3 = 1;- b% ?+ F) C9 n  U4 B1 O
P0=table[W/10%10];      //显示占空比百位: H/ i! G9 T3 D& Q4 \
delay(1);      # j- k, Q/ b2 o4 v
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;
; {# q7 m: a' H; ]2 f+ ^6 a9 \P2_0 = 0;P2_1 = 1;P2_2 = 1;P2_3 = 1;, M! C' a0 c7 o, G/ D4 N
P0=table[A];         //显示方向' X/ D- ?3 l. X# s! P1 D" x
delay(1);     . l/ M4 `& {0 k1 Z
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;     4 z! @& Q, {+ t) M
}' P* _: ^$ Q* u; U5 ~* H6 s% f
void san()
; ^" y4 s; u9 U8 C{
: a2 _! i5 |' p' D0 Iuchar i;
# J* v, v9 H2 [
$ ^" L) p' U4 `3 V  while(1)" O, D4 h: G: F0 v; G& [
  {     
, s, t% C2 v7 M' S7 Z8 @" I        - m7 e' q2 X, \. M5 S
     for(i=0;i<2;i++): c1 v$ e& U- ^7 u) I1 \4 g7 z4 u
     {1 S) P; k7 V: O% j0 b( T- K) d* X
            if(S1==0)3 I2 N! M% D- h4 L) e' K' |+ x
         D_A1;   
7 ?8 |( P$ ]* U            if(S2==0)
% S% P8 ?6 z, a         D_A2;
1 W! Y* {4 i: A+ j( G' |      }
6 A  P9 g: f8 F- Z% ^5 L& T- q/ O. c     if(i==2)+ J& w0 m7 ~& l
      {
: G( V. w7 a: b  ^. _5 l* C& b4 F' V% b         i=0;
: G0 c$ a8 m0 {0 v; N* ~) G      }
2 R; i7 Z3 {8 X4 a       D_AOFF;
1 Y9 s/ [7 j4 q       beep = 0; delay(100); beep = 1;. Y3 u: y5 M5 ]5 {
  
3 R1 v! _$ Q; E$ ?4 Q6 N7 p0 }/ P   }
$ R- A3 B% t. T0 K* ^2 s}      
& M& W& C$ R, J& U5 z. d$ mvoid qi()8 f& g3 }3 Y" l9 p( K
{) b" A# I: a% \1 F* d1 [
uchar i;
5 p- Z+ K6 P& H0 f$ I% d8 s% w' x2 j" w( S
  while(1)
3 [9 s' w; V' M0 J# |" W* O  {     
+ m& [: R: d9 N& A        
5 d+ ?/ x8 u- jfor(i=0;i<6;i++)/ W' h1 _; d9 e" b6 \/ {: R
  {: O; x" Z5 W( g, @1 W
                    if(S1==0)
1 p+ _% G: U1 n( o- ?+ J          D_A1;   0 Y  [& B3 }& [* O" W- r
                    if(S2==0)
6 ]2 Z# l4 O1 Z          D_A2;
4 [9 {( N* S2 {+ O7 o$ }% J& `  }2 ^" P  l( k8 o. O0 h8 y' ~
if(i==6): @- E8 H. ]8 i0 k$ d
{
- }6 J7 C% c0 h8 n; N- p. I           i=0;
# H- h8 i7 f- ?% p6 a, Y8 e$ v         }
3 h5 {6 I0 J9 U  B# X/ Q8 |         D_AOFF;* N% V+ [5 A& Q3 r/ Z( P1 b
         beep = 0; delay(100); beep = 1;2 i" t( f$ H" W( Y
  : F& |. D2 M) B0 x% H4 W( S' @; B
   }
- W( j& p/ }2 T7 a% w  x}9 E- I7 K9 x2 v/ ]& `9 P4 r
void main()( I7 d  |* \$ Z3 u3 h( R. U3 E% }
{
# d3 K. O. q: k5 i$ @init_pwm();9 [  U) L. |6 K* ?
EA = 1;+ ~- _8 G, x# k# H" q
TMOD |= 0x02;4 ?; R( b' @" H2 }  D0 f- [
TH0 = 0x00;  
8 L0 m9 g1 m) Z9 ]' n2 @" k# J+ h: sTL0 = 0x00;) q5 ]5 m# U7 ^; X! Q- p) P
ET0 = 1;   
1 f6 v: a7 L' E, F2 J! rTR0 = 1;     
( g) Y+ p; s2 [4 g2 H3 g" `IT0 = 1;   2 v0 A; @3 q, U7 x
EX0 = 1;   
. c1 M, Y9 W, [        disp();- c8 b. x, x, q7 K: W" g0 N+ I
pwm1_set (1);
, N5 d6 e# Z% H+ t; G         W = 220;
0 w3 @  q7 K* \2 T  Wwhile(1), U9 Q7 C( ~, d0 z, Y+ ^+ _* M
{
% ~7 F5 ?5 B% J9 |8 t  if(IRok)                     
4 J8 a! s% B, Q# G  {   ' S, M8 M. J: s
   IRcordpro();
& F: u  j1 Q$ k& T; f   IRok = 0;
0 f8 q8 q1 g! Z% }. b   if(IRpro_ok)  ( o3 K4 E# @! _
   {
* V/ `* f3 }; D) O6 h          switch(IRcord[2])
3 F& M/ q# L/ {9 _; B/ X       {" `" x8 v% \+ w
         case 0x45:   //按键1
- _. e9 B, H# d! m" D- N% j                                         beep = 0; delay(15); beep = 1;' P% D" e8 j& R- p: o
      san();  
+ ^1 x$ p; u. M/ E1 W! t! I4 E7 _5 u         break;
0 L3 c: K, E6 ^1 W' ~1 c         case 0x46:    //按键2
- V- ^8 |1 A* S% w% N       beep = 0; delay(15); beep = 1;8 x( M  ~. w, Q# n
                                         qi();0 y/ B0 ]' e, ^# G- j6 `. i
         break;
4 ~6 O5 V; o3 T* _         case 0x47:    //按键3
) ]0 ?# e( }/ f       beep = 0; delay(15); beep = 1;
! x) x2 i* A2 q! R& X                                          D_AOFF;
; O. i) z6 G! g+ |  v% u/ q         break;
6 h0 r8 f5 R' q) m+ _
. p* Q5 ^; `4 r5 A        case 0x5a:    //按键 左 占空比控制 速度增加6 ?) T% ]5 H  \
       beep = 0; delay(15); beep = 1;     
/ m: b- v! R. X0 ]5 {8 u3 Y& ^; |                                          W+=5;
5 t' |" Y6 I2 f! N+ z. n  `" r) T                                          pwm1_set(W);0 K( t) C% P! P! Z
                                          if(W > 255)                                 
1 [' c4 `7 {: ^5 ^0 a' A                                          {  
9 O5 x' Z% Z7 e2 z  g+ e                                             W=255;
, \- Y7 M) J: y& n2 T                                           }& ]* B( R! b" Q0 p; }6 a
         break;
4 i$ ^/ [5 _. i$ z         case 0x08:   //按键 右 占空比控制 速度减小
- i+ X. f9 Q7 ?  O  w         beep = 0; delay(15); beep = 1;/ z) X) j: C% L$ p6 V5 i. G5 ?% a
                                           W-=5;
, l5 v  i4 y% ]! \; }                                           pwm1_set(W);
5 M+ w% \. S8 l1 d                                           if(W < 200)                                 
; n+ O/ S+ b0 a; h8 e                                           {
& J8 O3 q9 p3 u1 v                                               W=200;
% Y0 p& I5 ^8 D# i) K) P                                            }  _3 z" q3 a( N/ ~. x
      ( @5 X# C$ h9 h: v# f
          break;( j6 [$ X" E1 r) ~
     ) e) R) G4 ]4 s" V. ]) Y
        }
! Z' d$ U$ u; y) {    IRpro_ok = 0;
, M3 \+ Q6 |  b# R1 Q; w   }6 _, ~8 |% ]8 |/ Y6 g
  }
6 @2 j; E" }( _9 F  y0 X- V, P7 z! O2 D0 i( ^9 d
}
- p. \7 {- _9 A% 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)5 C! }& t7 L: g4 p$ G
    void san()
    0 j$ R* K! n1 p% {6 E{# b* A; S7 t  I2 _
    uchar i;( p3 }/ h! j6 L2 m! i( {

    " d1 C! B! w- l6 K1 B  while(1)1 z( t( |+ T# Z/ L  G5 o$ Q. c
      {     ) ^4 Y0 g# @0 y- i6 A) n2 u( A; F
    要用带条件的循环语句,不然会退不出循环的

    该用户从未签到

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

    该用户从未签到

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

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

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

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