打印
[51单片机]

求助:AT89C2051单片机的P1.0口怎么不能输出高电平

[复制链接]
4289|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本人刚开始做一个无刷电机控制器,要求如下:当BH(P3.7)输入为低时,电机停止转动,P1.0口输出高电平,并持续4s。现在的问题是P3.7输入0时,电机能停止,并持续一定时间,只是P1.0怎么也不能输出高电平,谢谢各位高手指导。
控制器原理图:
C:\Users\Administrator\Desktop\新建文件夹\新建文件夹\无刷电机控制原理
程序代码:
;2.24设计,
S2            BIT  P1.2
S6            BIT  P1.3
S4            BIT  P1.4
S5            BIT  P1.5
S3            BIT  P1.6
S1            BIT  P1.7
BH            BIT  P3.7
WDG           BIT  P1.1
CMP           BIT  P1.0
FOR           BIT  P3.1
BACK          BIT  P3.0
PWM           BIT  08H
FLAG          BIT  09H             ;0-FACT SPEED;1-GIV SPEED
FLAG0         BIT  0AH             ;0-启动定时器,1-获取给定值
FLAG1         BIT  0BH             ;0-启动定时器,1-获取实际转速
OPEN_FLAG     BIT  0CH  
INT1_FLAG     BIT  0DH
         
H_TIME        EQU  31H
L_TIME        EQU  32H
SWITCH_TEMP   EQU  33H
GIVEN_H       EQU  34H             ;给定转速
GIVEN_L       EQU  35H
SPEED_H       EQU  36H             ;电机实际转速
SPEED_L       EQU  37H
INTT0         EQU  38H
INTT1         EQU  39H

ORG  0000H                         ;BEGINE OF CODE
      AJMP   MAIN                  ;JUMP TO MAIN PROGRAM
ORG  0003H                         ;INT0 INTERRUPT
      AJMP   INT0_INT
ORG  000BH                         ;T0 INTERRUPT
      AJMP   T0_INT
ORG  0013H                         ;INT1 INTERRUPT
      AJMP   INT1_INT
ORG  001BH                         ;T1 INTERRUPT
      AJMP   T1_INT
;_____________________________________________________________________

ORG   0100H
MAIN:
      MOV    P3,#11111111B              ;INITIALIZATION
      MOV    P1,#11111101B              ;TO CLOSE DRIVE SIGNAL
      MOV    SP,#60H                    ;SET STACK POINTER
      CLR    OPEN_FLAG
      MOV    H_TIME,#206                ;PWM=60%,此初值可以设定,保证电机正确启动。
      MOV    L_TIME,#56
      MOV    TH1,#206
      MOV    TL1,#56
      MOV    TMOD,#00100001B            ;T1 DEFINE TIMER1 8 BIT AUTO RELOAD MODE
      CLR    FLAG
      CLR    FLAG0                       ;AND T0 16 BIT TIMER
      SETB   EA                         ;TO PERMIT CHIEF INTERRUPT
      SETB   ET1
      SETB   TR1
      SETB   IT0                        ;INT0 AND INT1 UP-DOWN CREATE
      SETB   IT1
      SETB   EX0                        ;TO PERMIT INT0 AND INT1
      SETB   EX1

;_____________________________________
POWJUDGE:
      CPL    WDG
      JB     CMP,POWJUDGE               ;0 POW>GIV,1 POW<GIV
      JNB    FOR, FORWARDRUN            
      JNB    BACK,BACKWARDRUN         
      SJMP   POWJUDGE
;______________________________________________________________________________________
FORWARDRUN:      
      MOV    P3,#11111111B
      JNB    BH,STOP                    ;TO CHECK BH SIGNAL
      LCALL  JUDGE
      MOV    A,H_TIME
      CJNE   A,#240,FORLOOP1
      SETB   OPEN_FLAG     
      LCALL  FORFULL               
      SJMP   POWJUDGE
  FORLOOP1:
      CLR    OPEN_FLAG   
      LCALL  FORWARD
      SJMP   POWJUDGE
;______________________________________________________________      
STOP:
      CLR    EA
      SETB   P1.0
      LCALL  DELAY
      CLR    P1.0
      SJMP   STOP
;______________________________________________________________________  
BACKWARDRUN:   
      MOV    P3,#11111111B
      JNB    BH,STOP                    ;TO CHECK BH SIGNAL  
      LCALL  JUDGE
      MOV    A,H_TIME
      CJNE   A,#240,BACKLOOP1
      SETB   OPEN_FLAG      
      LCALL  BACKFULL               
      SJMP   POWJUDGE
  BACKLOOP1:
      CLR    OPEN_FLAG   
      LCALL  BACKWORD
      SJMP   POWJUDGE
;_____________________________________________________________   
INT0_INT:                        
      PUSH   PSW   
      PUSH   ACC        
      JB     FLAG,END_INT0         ;FLAG0=0,获取给定转速,FLAG=1跳出中断。     
      JNB    FLAG0,GET_GIV         ;FLAG1=0,跳转至启动定时器,FLAG1=1,停止计数,获取给定   
      CLR    TR0
      MOV    GIVEN_H,TH0      
      MOV    GIVEN_L,TL0
   LOOP2:   
      CPL    FLAG      
      SJMP   ENDINT0
   GET_GIV:
      MOV    TH0,#0
      MOV    TL0,#0
      SETB   TR0      
   ENDINT0:
      CPL    FLAG0   
   END_INT0:
      POP    ACC
      POP    PSW
      RETI
;____________________________________________________________________________________
INT1_INT:                          
      PUSH   PSW
      PUSH   ACC     
      JNB    FLAG,END_INT1      
      JNB    FLAG1,GET_FACT
      CLR    TR0
      MOV    SPEED_H,TH0     
      MOV    SPEED_L,TL0      
      CPL    FLAG      
      SETB   INT1_FLAG     
      SJMP   ENDINT1
   GET_FACT:
      MOV    TH0,#0
      MOV    TL0,#0
      SETB   TR0
      NOP
   ENDINT1:
      CPL    FLAG1
   END_INT1:
      POP    ACC
      POP    PSW
      RETI
;___________________________________________________________________________________
T0_INT:   
      
      RETI
;_________________________________________________________________________
T1_INT:
      CPL    PWM                         ;GENERATE PWM
      JB     OPEN_FLAG,END_T1
      JB     PWM,PWM_H                   ;PWM=1,OUTPUT SWITCH_TEMP
      MOV    P1,#0FFH
      MOV    TH1,L_TIME
      SJMP   END_T1
   PWM_H:               
      MOV    P1,SWITCH_TEMP              
      MOV    TH1,H_TIME
   END_T1:   
      RETI
;________________________________________________________________
FORWARD:
   FORWARD_101:
      MOV     A,P3
      ANL     A,#00111000B
      CJNE    A,#00101000B,FORWARD_100
      MOV     SWITCH_TEMP,#01110111B
      SJMP    FORWARDHALL_END
   FORWARD_100:
      CJNE    A,#00001000B,FORWARD_110
      MOV     SWITCH_TEMP,#01111011B
      SJMP    FORWARDHALL_END
   FORWARD_110:
      CJNE    A,#00011000B,FORWARD_010
      MOV     SWITCH_TEMP,#10111011B
      SJMP    FORWARDHALL_END
   FORWARD_010:
      CJNE    A,#00010000B,FORWARD_011
      MOV     SWITCH_TEMP,#10101111B
      SJMP    FORWARDHALL_END
   FORWARD_011:
      CJNE    A,#00110000B,FORWARD_001
      MOV     SWITCH_TEMP,#11001111B
      SJMP    FORWARDHALL_END
   FORWARD_001:
      MOV     SWITCH_TEMP,#11010111B
   FORWARDHALL_END:
      RET
;_______________________________________________
FORFULL:
   FORFULL_101:
      MOV     A,P3
      ANL     A,#00111000B
      CJNE    A,#00101000B,FORFULL_100
      MOV     P1,#01110111B
      SJMP    FORFULLHALL_END
   FORFULL_100:
      CJNE    A,#00001000B,FORFULL_110
      MOV     P1,#01111011B
      SJMP    FORFULLHALL_END
   FORFULL_110:
      CJNE    A,#00011000B,FORFULL_010
      MOV     P1,#10111011B
      SJMP    FORFULLHALL_END
   FORFULL_010:
      CJNE    A,#00010000B,FORFULL_011
      MOV     P1,#10101111B
      SJMP    FORFULLHALL_END
   FORFULL_011:
      CJNE    A,#00110000B,FORFULL_001
      MOV     P1,#11001111B
      SJMP    FORFULLHALL_END
   FORFULL_001:
      MOV     P1,#11010111B
   FORFULLHALL_END:
      RET
;________________________________________________
BACKWORD:
   BWHETHER_101:
      MOV     A,P3
      ANL     A,#00111000B
      CJNE    A,#00101000B,BWHETHER_100
      MOV     SWITCH_TEMP,#10101111B
      SJMP    BHALL_END
   BWHETHER_100:
      CJNE    A,#00001000B,BWHETHER_110
      MOV     SWITCH_TEMP,#11001111B
      SJMP    BHALL_END
   BWHETHER_110:
      CJNE    A,#00011000B,BWHETHER_010
      MOV     SWITCH_TEMP,#11010111B
      SJMP    BHALL_END
   BWHETHER_010:
      CJNE    A,#00010000B,BWHETHER_011
      MOV     SWITCH_TEMP,#01110111B
      SJMP    BHALL_END
   BWHETHER_011:
      CJNE    A,#00110000B,BWHETHER_001
      MOV     SWITCH_TEMP,#01111011B
      SJMP    BHALL_END
   BWHETHER_001:
      MOV     SWITCH_TEMP,#10111011B
BHALL_END:
      RET
;_______________________________________________
BACKFULL:
   BACKFULL_101:
      MOV      A,P3
      ANL     A,#00111000B
      CJNE    A,#00101000B,BACKFULL_100
      MOV     P1,#10101111B
      SJMP    BACKFULLHALL_END
  BACKFULL_100:
      CJNE    A,#00001000B,BACKFULL_110
      MOV     P1,#11001111B
      SJMP    BACKFULLHALL_END
   BACKFULL_110:
      CJNE    A,#00011000B,BACKFULL_010
      MOV     P1,#11010111B
      SJMP    BACKFULLHALL_END
   BACKFULL_010:
      CJNE    A,#00010000B,BACKFULL_011
      MOV     P1,#01110111B
      SJMP    BACKFULLHALL_END
   BACKFULL_011:
      CJNE    A,#00110000B,BACKFULL_001
      MOV     P1,#01111011B
      SJMP    BACKFULLHALL_END
   BACKFULL_001:
      MOV     P1,#10111011B
   BACKFULLHALL_END:
      RET
;________________________________________
JUDGE:
      JNB    INT1_FLAG,END_JUDGE
      CLR    INT1_FLAG
      MOV    A,SPEED_H              
      CJNE   A,GIVEN_H,JUDGE0
      SJMP   RE_JUDGE               
   RE_JUDGE:      
      MOV    A,SPEED_L              ;A>GIVEN_L,C=0,A<GIVEN,C=1
      CJNE   A,GIVEN_L,JUDGE0
      SJMP   END_JUDGE
   JUDGE0:                        
      JC     DOWNSPEED                ;C=1,跳转
      SJMP   UPSPEED
   DOWNSPEED:
      MOV    A,L_TIME
      CJNE   A,#240,DEC_SPEED        ;此处设定占空比的最小值,可以通过实验获取
      SJMP   END_JUDGE
   UPSPEED:
      MOV    A,H_TIME
      CJNE   A,#240,INC_SPEED        ;此处设定占空比的最大值
      SJMP   END_JUDGE   
   INC_SPEED:
      INC    H_TIME
      DEC    L_TIME
      SJMP   END_JUDGE
   DEC_SPEED:
      DEC    H_TIME
      INC    L_TIME
   END_JUDGE:   
      RET
;__________________________________________________________________
DELAY:
      MOV   R7,#40
   DEL1:
      MOV   R6,#0FFH
   DEL2:
      MOV   R5,#80H
   KONG:
      NOP
      DJNZ  R5,$
      DJNZ  R6,DEL2
      DJNZ  R7,DEL1
      RET
;_____________________________________________________________________
      END
      
  

相关帖子

沙发
neutanmin|  楼主 | 2015-8-27 22:48 | 只看该作者
原理图没有上传,现补上

无刷电机控制原理.jpg (827.39 KB )

无刷电机控制原理.jpg

使用特权

评论回复
板凳
xuyaqi| | 2015-8-28 06:35 | 只看该作者
是不是没有上拉的缘故

使用特权

评论回复
地板
neutanmin|  楼主 | 2015-8-28 08:15 | 只看该作者
xuyaqi 发表于 2015-8-28 06:35
是不是没有上拉的缘故

非常感谢你的回答,我分别试了1K和10K、+5V上拉,都没有输出高电平。

使用特权

评论回复
5
ayb_ice| | 2015-8-28 08:28 | 只看该作者
都不看手册的吗

未命名.jpg (26.44 KB )

未命名.jpg

使用特权

评论回复
6
ningling_21| | 2015-8-28 08:30 | 只看该作者
本帖最后由 ningling_21 于 2015-8-28 08:31 编辑
neutanmin 发表于 2015-8-27 22:48
原理图没有上传,现补上

P1.0,P1.1 这2个脚的驱动能力很弱,最好换成其它的管脚

使用特权

评论回复
7
侣行天下| | 2015-8-28 08:41 | 只看该作者
neutanmin 发表于 2015-8-27 22:48
原理图没有上传,现补上

外部没有接上拉电阻吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

1

粉丝