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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
用STC12C5A60S2编写的程序不能正常运行,进入for中正反转循环就跳不出来,数码管也不亮了,其他红外按键也没用了,还有就是PWM给电机调速只有CCAP1H的值在200至255中间有效,跪求大神解惑。% R3 n" p0 m4 ]& a1 B$ H  Y
#include //头文件" b4 _3 c7 u& b8 i5 U
#include
% h% y. l4 ^6 M) s#define uchar unsigned char0 ^0 w3 ^/ g3 O, @$ s% x5 W; _- e
#define uint unsigned int  
0 W0 H1 ^! F5 E- b. y* e% ttypedef uchar INT8U;, k: b2 w, M( T9 Y0 a; W$ T1 i
typedef uint INT16U;$ K% o7 b4 a/ V' S) z& H- L* \
***it PWM_1=P1^4;               //PWM输出端口  
. J$ F2 x1 S9 v: P  |+ y***it A1=P1^5;   //定义直流电机正端口& Y- @1 _7 ^8 ~( [7 _
***it A2=P1^6;   //定义直流电机负端口1 Z% D. W$ d# f% N- e& o+ Q
***it IR  = P3^2;          //定义红外脉冲数据接口
/ G$ P' j% d% |) [+ W' l***it beep = P3^6;    //蜂鸣器的位置! F0 e: S& e- {, X7 Q
***it P2_0 = P2^0;    //数码管位选接口
" L7 F: l! x( @! H' l" U***it P2_1 = P2^1;
4 G& X2 _" Q6 J1 M5 R/ |/ u# Y& i8 h***it P2_2 = P2^2;
: t5 O; @# D+ I+ ~% A***it P2_3 = P2^3;% J3 M# r; \8 e. l
***it S1=P2^5;      //限位开关1
% x! a; a( z: [$ }7 J***it S2=P2^6;     //限位开关2
  F; A1 M& C$ \  f% y$ U#define D_A1   {A1=1;A2=0;}  //电机正转9 n* K0 D& X7 R' w( M
#define D_A2   {A1=0;A2=1;} //电机反转+ o1 `* w3 J# |: o
#define D_AOFF  {A1=1;A2=1;}  //电机停2 _7 f( \2 c5 h9 \+ g) i
uint W=0;      //定义速度等级
$ S1 P4 W2 O- z; A' U5 ?uchar A=0;      //方向标记 0,1" F/ L$ Q' s' V: T; i4 c8 @+ L
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
& g2 ~; I' N# G4 g* Z                        0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e};
/ q) y% s, m) b/ z# Z$ Nuchar IRtime;   //检测红外高电平持续时间(脉宽)
. N& q/ s/ `) S6 a. tuchar IRcord[4];    //此数组用于储存分离出来的4个字节的数据(用户码2个字节+键值码2个字节)
1 Z3 k. r# T9 f( [- z& Quchar IRdata[33];   //此数组用于储存红外的33位数据(第一位为引导码用户码16+键值码16)
  U6 S9 G. t: J& lbit IRpro_ok, IRok;  //第一个用于红外接收4个字节完毕。IRok用为检测脉宽完毕' |: H0 a! y% a5 ]
5 o# Y8 @3 T. S
void delay(uint z)$ A, g& T  R- o* j  _0 p8 }# j# Z
{
$ w; e- i; J8 juint x,y;3 n8 O( l$ A& A% j% H1 S: _: f% Y9 M. M
for(x = z; x > 0; x--)+ c, E. ]" {" C+ d" m2 d
  for(y = 112; y > 0 ; y--);# j% I) {5 `( `) {. |5 {
}
2 A1 j& F( B& i' ~5 ^2 c& Kvoid time0() interrupt 1   //定义定时器0) u4 K1 u/ ~3 i$ C
{
  B) M; A  |& O5 ~& P- AIRtime++;      //检测脉宽,1次为278us
! _; O& q' n3 B' Y}7 S9 B- I2 }$ s) L
void int0() interrupt 0     //定义外部中断00 \) Q3 Z3 S% x+ t1 E  k4 e; D6 d
{
) k6 _9 g/ @8 v& [) k0 a5 `: lstatic uchar num;     // 声明静态变量# F9 a4 U% a- Z* t* j* _
static bit startflag;  //开始储存脉宽标志位7 I- Q# n' o2 s& A$ b4 J
if(startflag)     //开始接收脉宽检测( s( C5 C6 d, m  }" G9 d
{
: P' P( @$ z0 O  if( (IRtime < 53) && (IRtime >= 32) )4 |5 \4 v* K4 n$ J; U" m; ~$ e
   num= 0;     
2 }% M1 P- `, w( G- i6 Z  IRdata[num] = IRtime;       }# N1 d0 o7 E
  IRtime = 0;     $ H2 `( L$ Z/ t+ _' G. a" l1 g' c
  num++;      
+ X" w- H: e9 g: D0 o! g4 S" M/ _  if(num== 33)      * F  m  t" b6 ~# B' K1 o9 ?
  {8 K) N9 c+ ~( @. A
    IRok = 1;     4 J0 {  O: N3 {; b
   num= 0;      
8 b3 ]! \+ p5 X8 k  }* Q$ y; k3 s* M- O$ h* s7 T
}
/ V% r# n7 H4 Z3 P$ d/ _5 |/ H9 Lelse   3 T& Q, s/ C0 V- d' D/ X0 W$ `
{
! q- Y; _3 ]8 e0 U. ?  IRtime = 0;      " e1 C4 X9 L  V4 W: h" C
  startflag = 1;   
7 k4 k5 I! B& W1 Z( m8 Y0 r1 S}
1 G6 o% Y3 \* \4 u% H+ e- t}
8 `- u0 V) t" P0 R3 ?( ~9 mvoid IRcordpro()        * p3 P$ R& E  j4 U# P& f& {
{
3 f9 O0 I* V9 w% B1 fuchar i, j, k, cord, value;, r  \. a, d" H" d* @; i+ Q+ p' x
cord
* k$ T$ ~" p% Wk = 1;      
( ^6 b0 s% _* T6 k4 o( G# t0 w( ufor(i = 0; i < 4; i++)0 ?& W! Y) {" A2 c0 n7 f
{
8 t8 [. C8 w5 W2 H/ d  for(j = 0; j < 8; j++)
2 k8 _' }  h+ ~  {% M. T: X1 x* i: [) x
   cord = IRdata[k];     0 l! [: ~1 Q; S2 {5 g0 ]8 G+ o* t
   if(cord > 5)   ) [, W6 r8 b% h$ `8 n
   value = value | 0x80;1 |- w+ E% L: w
   if(j < 7)
$ Z% X! [1 {5 i0 U/ s   {" E- K" m& {9 o+ O
    value = value >> 1;- c9 v! W4 T  V( J5 E2 h) M
   }6 ]8 ]$ U1 X0 K7 v2 m2 s. u
   k++;   
  O. f* K( H% r" T0 D8 o& }  }
3 @% E7 q" _" T7 Z, z7 p# X  IRcord[i] = value;   + x9 T  l0 U/ F% G" R8 k
  value = 0;      
+ m4 d7 {& n/ M' I- @" ~}9 p0 U2 Z( B6 W
IRpro_ok = 1;      
. C' \/ E2 E# {}% l2 ]# Q# J* Q
6 f, G* A/ N0 P* k
void init_pwm()  a/ J( h2 C3 M! |' K
{6 e0 g8 I  l, ~
  CCON = 0;2 ?( c% m" [" d' L; C. p  r
CL = 0;& \" g( W  L0 ~; F! g. W; F$ t
CH = 0;
' [0 b  ~, a4 kCMOD = 0X00;, I7 i. K' O( ~
CCAPM1 =0x42;
# j  Z% Q6 {$ e- U! l( C# uCCAP1H=0x00;
' |( t2 B: T2 i2 a( ACCAP1L=0x00;
# ^( h/ k* a, E8 Y0 \7 G; uCR=1;: [  u( ^7 s& U7 X& {! k& d
   
( s( P# }% M7 O, D' k6 l- v8 q7 t}
) F  I' y8 n  ^' }
' E: ^6 S4 S# f% o( z3 ]) u  void pwm1_set (uchar a); \% W# M5 W# j1 T3 {+ Q- z, p3 U
{4 L# w' r4 y/ z5 K
         CCAP1L= a;
9 A+ `1 r. w/ s( B2 w( M" w         CCAP1H= a;
1 `! z: m" r6 T0 Y, g  q  Y* [        
' b9 F+ d1 ?. ?( T/ H; Y, k}
9 C% M5 r; c/ I1 H7 b4 }1 @" i! [' F; c2 ]8 r2 j+ d6 O9 x, N' U
/**********************************************************************4 f8 |, \" Z4 C  y" T6 o4 W6 q2 k+ |
      数码管显示
9 \/ s2 i. \6 s**********************************************************************/
# A4 I; F' ~0 O- Z# Q5 A4 Ivoid disp(void)
; m6 p" V0 D9 M# F9 Q+ V& t{- b3 ~# l  p8 c* q7 _* P
P2_0 = 12_1 = 12_2 = 12_3 = 0;     ' ~5 }4 Z: N  S  @! u: y
P0=table[W%10];       //显示占空比个位/ Q- e, @5 A# v$ ~) B
delay(1);      
  g5 Q/ `2 |6 OP2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;         
, W% X8 }" E" G  t  
% d( J5 f/ Y7 c/ @* S0 G. l7 pP2_0 = 1;P2_1 = 0;P2_2 = 1;P2_3 = 1;
$ v, `, D' g5 |P0=table[W/100];                    //显示占空比十位% Y+ A0 a2 @3 m* I5 I+ t, c; }& P
delay(1);      
1 X; K8 W+ j4 g( {4 i2 qP2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;     ! s5 {* P4 x$ ?. s. p
        P2_0 = 1;P2_1 = 1;P2_2 = 0;P2_3 = 1;
0 C; c4 ~0 E( O$ Y, ^3 m; lP0=table[W/10%10];      //显示占空比百位
3 H9 Q' n* W; R  N& X" F3 m, W* \delay(1);      5 k# `9 p/ y3 m& y) W6 A
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;! v) g$ I8 l5 H4 x+ T, L
P2_0 = 0;P2_1 = 1;P2_2 = 1;P2_3 = 1;( f) G8 T0 ~. |( D9 V$ L/ h
P0=table[A];         //显示方向
7 ]" F# S( D' J1 cdelay(1);     * m) ~. ~0 z7 v% {; {" k
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;     ' K* P* L" b8 G* b& Z, x5 {
}
0 B# F2 {$ |; `  E2 B8 svoid san(). G  C7 A- }9 P! `: \$ r% R
{0 v% O2 j/ D6 e% O# l5 B- p
uchar i;( n3 R9 k& N/ W9 @; P

( _& c5 H8 J+ A' |! R- W3 y  while(1)% F% T9 w  P( N% T* r" v$ K  C
  {     
/ w0 r; ~3 [* {        - V9 p4 s6 Y( r2 i' [; A
     for(i=0;i<2;i++)
, ]# f. a- V9 U( Q5 R9 C. I     {
: R" {- ?8 T& l, c6 a9 T            if(S1==0)
! Z/ l4 A& M" \/ s; P, ~         D_A1;   + K/ z$ m" J/ h9 s: u
            if(S2==0)8 M0 i& D( r  T" o7 ~! V
         D_A2;7 g# M  ~4 v$ q$ ?
      }: X1 f, o) z" W2 ^9 P+ `
     if(i==2)
0 X8 N8 l1 x+ t* W; S& `+ [      {$ @. R/ a2 x3 R
         i=0;. q1 H' a1 e: u8 z) C
      }2 Z$ ]& ~' J5 d/ u5 a; |% n
       D_AOFF;
- ?' }* q1 X3 W& A  d' p1 O, {       beep = 0; delay(100); beep = 1;" g6 u8 a8 g% B! M- B$ Q# t
  
# n. [% h6 K2 d0 c9 r/ _   }
8 p' ~( Y, {2 L. i}      
4 c. `/ n; x- Tvoid qi()
% a/ L# P+ [3 O. {2 b{
1 m" P  h5 @3 \* Fuchar i;
& w- m' O& l4 J3 Q9 L0 M
% C/ k- `2 d+ E! ]% p6 b8 |. s  while(1)
/ T% N! c" [% D" ]) c  {     - H( z7 ?3 @! i5 o" C- T( M
        8 [- c) c. @! p1 T. b) f
for(i=0;i<6;i++)
  U+ [7 Q1 n5 u0 J! r4 {( K  {( Z6 R% U& D+ T1 o1 k
                    if(S1==0)
; f$ o9 D$ Z/ _  e- \          D_A1;   0 y6 Y  }- O. D$ ]; a
                    if(S2==0)
) Q& x  o! r6 D8 R% w# T& o, k. a          D_A2;
4 s# H5 A/ ]$ p7 b% M  }8 |* @4 _' v7 y( u% [6 {0 p# p
if(i==6)
8 K4 `, ?1 i/ s/ G+ m{& U# P: a' a8 a' p; b% i
           i=0;
0 _0 S/ q1 I: S9 e5 v, ^         }
9 f1 c8 e& t% u         D_AOFF;6 t' I$ U# Y# Q7 ?2 v/ W
         beep = 0; delay(100); beep = 1;& D* r' J/ m4 @" K* W$ \; ?2 r  P
  
) N3 e$ j) b# i   }% j$ v# K$ Z9 a; P$ {" _
}
; S0 [6 L! O& |2 \. y4 b  o3 xvoid main()
; K/ _5 S# \/ Z: c{' t6 b- l9 v( k/ P2 [  i2 Y
init_pwm();. u7 C. c# [4 s6 l+ A) V2 z
EA = 1;
- ~/ _  G3 [) TTMOD |= 0x02;
7 ^6 H2 b9 j9 t; r8 WTH0 = 0x00;    I' d& W7 p: a% M, }
TL0 = 0x00;! E7 ]9 p% P" x
ET0 = 1;   8 X( B* N5 _5 {- D/ I6 I
TR0 = 1;     
3 M# ?- f+ f$ q' h0 u* ~0 V2 zIT0 = 1;   * M1 Z/ A0 \7 k( J
EX0 = 1;   
& I2 r+ w0 F2 C        disp();
* N) R! o. p: `- rpwm1_set (1);
& {. x2 D9 E( s; J( ]         W = 220;9 W9 K) I. b: E' u
while(1)
- s, X- H& U4 {) ]{
3 d* }* ]3 g2 y/ {$ F0 i" D  if(IRok)                     $ @6 Y# ]1 o* z1 @7 c$ v$ c; I
  {     P( R, b+ ~9 e. Q, z
   IRcordpro();
# D0 p6 L* D/ S# D   IRok = 0;. }1 N+ M5 g3 j  C% t
   if(IRpro_ok)  % O; k- N( ]" C- K9 h
   {
+ X: V' m: x. d! s" g+ T7 z9 k          switch(IRcord[2])5 d$ }9 w+ D) D' c% f3 o" D
       {% R. r* A# N2 x0 c+ j6 @, _9 Z
         case 0x45:   //按键1
6 F& v9 E6 q) o. d% ]" T7 S                                         beep = 0; delay(15); beep = 1;
3 n; C7 r; \$ H1 }3 Q0 J; R      san();  % T7 |+ Y% M" B, r8 m% k
         break;
2 B3 G8 V' o3 G: l         case 0x46:    //按键2
" a) M1 E& e0 Z' e5 J8 l8 N       beep = 0; delay(15); beep = 1;( ~. F2 g2 t6 R  x
                                         qi();
% \; K) u& i# X         break;, \. F2 p( e& |$ T0 y8 M
         case 0x47:    //按键3
' r9 ~/ G" S0 m0 b3 w- H  f       beep = 0; delay(15); beep = 1;' s/ I$ B# n8 z  V3 x) W7 F. U
                                          D_AOFF;
6 b" W5 k1 A- s         break;
( K  j6 A" u3 K: ]' c# x+ p, T1 j5 r* N0 O3 w" [; N4 ^8 T# P
        case 0x5a:    //按键 左 占空比控制 速度增加3 f' H- x5 R, }. w" L' F
       beep = 0; delay(15); beep = 1;     
5 }9 X$ _' Y  _6 t& \! ?                                          W+=5;1 ?# V4 o, w- S5 P3 U
                                          pwm1_set(W);) s% U. U# K/ J) V
                                          if(W > 255)                                 + Q4 ~) v- H1 f% j* P
                                          {  
# Q3 \; l: R; W5 E0 A, s4 c                                             W=255;
2 V% I# ], m( P: v                                           }. f( I; S7 x. d( J2 ]
         break;2 x* k6 b! R  Z1 u6 v2 n# D  b
         case 0x08:   //按键 右 占空比控制 速度减小
, \- D' E/ @) e# a9 ?9 v  V         beep = 0; delay(15); beep = 1;
3 G" z8 `4 k+ m7 k                                           W-=5;6 E( B; S' X) ]" w
                                           pwm1_set(W);: b- R: g5 P0 K4 b0 k- @/ J6 a
                                           if(W < 200)                                 
5 ^/ A" X- d' L, a8 v, Y3 t                                           {
$ f! b4 W. w: c$ _                                               W=200;
! x) Q' f" M7 @4 q; p) y2 b                                            }- z- D2 ]* O3 E' U( O
      
* t) I' C$ Q8 D          break;
& u- I  A2 b1 q8 v+ n2 Z% T5 ?5 D     2 }  F) _/ {3 i! q
        }( H) R3 T+ l  D& s
    IRpro_ok = 0;4 N. q6 i3 j* F7 \4 u3 o# m
   }
  v& x1 ~0 V! H2 b' i; ?  }
' h! P' _& w/ i( r. b& l' Q  U& G
0 S% w% j: ]8 V  D}
9 C, k& J2 S2 \3 s3 I' V! ]}
头像被屏蔽
  • TA的每日心情
    奋斗
    2022-11-8 15:10
  • 签到天数: 3 天

    [LV.2]偶尔看看I

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

    该用户从未签到

    3#
    发表于 2023-2-2 10:56 | 只看该作者
    除了主程序,其他地方最好不要用while(1)$ |8 w5 G$ A! i- G1 O! E
    void san()
    & n4 T* o* ^: |8 o+ ?; l; M' l0 h{
    " K% @# X- b9 H  e' _uchar i;  i* K. X5 w7 h$ ^* X" `: T
    $ r, a, `' u$ X7 W
      while(1)
    : t, o8 d/ b2 \' n0 ]  {     , U5 P# S, w' b# [: s2 q' w
    要用带条件的循环语句,不然会退不出循环的

    该用户从未签到

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

    该用户从未签到

    5#
    发表于 2023-2-2 13:37 | 只看该作者
    不愧是新手。令人闻风丧胆的函数命名和Tab对齐。
    5 ^( p6 N* ?% b6 p; Z大概瞄了一眼,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-27 16:51 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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