自己用仿真器做实验,是一个关于步进电机的简单控制,程序如下: 
 
 
;功能: P1口控制电机产生脉冲,P2.0,P2.1,P2.3口接查询式键盘控制电机的 
;       反转,正转,停止控制。 
 
;接线:P1口接步进电机的P1口,最小系统的p2口接查询式键盘的JD13。 
 
;//**************************************************************** 
        ORG   0000 
STOP:   ORL   P1,  #00H    ; 步进电机停止 
LOOP:   MOV   P1,  #00H  
        JNB   P2.0,FOR2     ; 如果p2.0按下正转 
        JNB   P2.1,REV2     ; 如果p2.1按下反转 
        JNB   P2.2,STOP1    ; 如果p2.2按下停止 
        JMP   LOOP          ;反复监测键盘 
FOR:    MOV   R0,  #00H     ;正转到tab取码指针初值 
for1:   MOV   A,R0          ;取码 
        MOV   DPTR,#TABLE   ; 
        MOVC  A,@A+DPTR 
        JZ    FOR           ;是否到了结束码00h 
        CPL   A             ;把acc反向 
        MOV   P1,A          ;输出到p1开始正转 
        JNB   P2.2,STOP1    ;如果p2.2按下停止 
        JNB   P2.1,REV2     ;如果p2.1按下正转 
        JNB   P2.0,FOR2     ;如果p2.0按下反转 
        CALL  DELAY         ;转动的速度1 
        INC   R0            ;取下一个码 
        JMP   FOR1          ;继续正转 
rev:    MOV   R0,#05H       ;反转到tab取码指针初值 
rev1:   MOV   A,R0 
        MOV   DPTR,#TABLE   ;取码 
        MOVC  A,@A+DPTR 
        JZ    REV           ;是否到了结束码00h 
        CPL   A             ;把acc反向 
        MOV   P1,A          ;输出到p1开始反转 
        JNB   P2.2,STOP1    ;如果p2.2按下停止 
        JNB   P2.1,REV2     ;如果p2.1按下正转 
        JNB   P2.0,FOR2     ;如果p2.0按下反转 
        CALL  DELAY1         ;转动的速度2 
        INC   R0            ;取下一个码 
        JMP   REV1          ;继续反转 
stop1:  CALL  DELAY         ;按p3.4的消除抖动 
        JNB   P2.2,$        ;p2.2放开否? 
        MOV   P1,  #00H  
        CALL  DELAY         ;放开消除抖动 
        JMP   STOP 
for2:   CALL  DELAY         ;按p2.0的消除抖动 
        JNB   P2.0,$        ;p2.0放开否? 
        CALL  DELAY         ;放开消除抖动 
        JMP   FOR 
rev2:   CALL  DELAY         ;按p2.1的消除抖动 
        JNB   P2.1,$        ;p3.3放开否? 
        CALL  DELAY         ;放开消除抖动 
        JMP   REV 
 
DELAY:  MOV   R1,#150       ;键盘消抖和步进电机转速1 
D1:     MOV   R2,#248 
        DJNZ  R2,$ 
        DJNZ  R1,D1 
        RET 
 
DELAY1:  MOV   R1,#350       ;步进电机的转速2 
D2:     MOV   R2,#348 
        DJNZ  R2,$ 
        DJNZ  R1,D2 
        RET 
 
TABLE: 
       db 01h,02h,04h,08h  ;正转表 
        db 00               ;正转结束 
        db 01h,08h,04h,02h  ;反转 
        db 00               ;反转结束 
        END 
 
现在的问题是:正转延时调用的是DELAY,而反转延时调用的是DELAY1,而DELAY1是明显比DELAY要长的,所以,应该反转比正传要来的慢才对,但是事实相反,当我实际运行的时候,反转却比正传快很多,我试着把参数调了一下,还是一样,请问这是为什么? |