|
上上一楼主说程序没办法看出你的控制细节,本人修改了程序,现在按照同样的电路原理图
http://bbs.21ic.com/upfiles/img/20079/200791111853101.jpg
在89C51 P2.1 端接按键脚,另一端接地. 按键名为CCW
P2.0 端接按键脚,另一脚接地,按键名为CW
此程序的功能为按一下CW开关,马达顺时针转60度,按一下CCW开关,则反时钟循环60度
本程序使用20H.0与20H.1存放CW与CCW两开关新输入的数据,而使用21H.0与21H.1存放旧数据,用于检查是
否有按键.
ACTION子程序的前半部做正转控制,后半部则做反转控制.程序首先检查21H.0,若21H.0=0,则表示已按正转
开关,所以将R5的低4位取出左循环1位,并自P1输出.而若21H.1=0,则表示已按反转开关,所以将R5的低4位
取出右循环1位,并自P1输出.
步进马达数据表
输入 CCW CW
新 20H.1 20H.0
旧 21H.1 21H.0
本人从仿真器调试过程序,当按下CCW键,步进电机反转一步,再按CW电机正转一步,但本人重复按正转或反
按键,电动机都是向前向后原地踏步,请大家给点指示,我应怎样修改程序,我想按正转或反按键时电动机一
步一步转动,可以转360度
CW EQU P2.0 ;CW=0表示按下正转开关
CCW EQU P2.1 ;CCW=0表示按下反转开关
;--------R5: P1值暂存用---------------------
MAIN: MOV R5,#0FEH ;设置R5的初值
MOV 20H,#00H ;设置地址20H的初值
MOV 31H,#00H ;设置地址21H的初值
CHEKSW: ACALL SWIN ;输入按键值至20H
MOV A,20H ;检查键值至20H
XRL A,21H ;
JZ CHEKSW ;若无键被按,则跳回CHEKSW
ACALL DELAY ;等待抖动时间
ACALL SWIN ;再输入按键值至20H
MOV A,20H ;检查键值是否改变
XRL A,21H
JZ CHEKSW ;若无按键,则跳回CHEKSW
MOV 21H,20H ;更新旧数据
ACALL ACTION ;调用主控制子程序:ACTION
SJMP CHEKSW
;--------------输入按键值子程序:SWIN--------------------
SWIN: MOV C,CW ;CW为正转开关
MOV 20H.0,C
MOV C,CCW ;CCW为反转开关
MOV 20H.1,C
RET
;-------------主控制子程序ACTION---------------------------
ACTION: JB 21H.0,REVERSE ;若未按CW开关,则至REVERSE
FORWARD:MOV A,R5 ;取出R5的低4位左循环1位
RL A
JB ACC.4,SKIP1
MOV A,#0FEH
SKIP1: MOV R5,A
MOV P0,A
SJMP RETURN
REVERSE:JB 21H.1,RETURN ;若未按CCW开关,则至RETURN
MOV A,R5 ;取出R5的低4位右循环1位
RR A ;并自P1输出
JB ACC.7,SKIP2
MOV A,#0F7H
SKIP2: MOV R5,A
MOV P0,A
RETURN: RET
DELAY: MOV R0,#00H
XL2: MOV R1,#00H
DL1: NOP
DJNZ R1,DL1
DJNZ R0,XL2
RET
END
|
|