89C51控制步进电机汇编程序

使用89C51控制四相六线步进电机,求一个汇编语言控制程序
步进电机采用四相六线,步距角1.8度,半步工作0.9度八拍运行。
接口如下:
P15---启动信号输入
P14---停止信号输入
P13---接光电传感器
P22---输出控制步进电机的A相
P23---输出控制步进电机的B相
P24---输出控制步进电机的C相
P25---输出控制步进电机的D相

如下是我给步进电机八拍运行正向通电顺序:

P25(D相)、P24(C相)、P23(B相)、P22(A相)
第一步: 0 0 0 1
第二步: 0 0 1 1
第三步: 0 0 1 0
第四步: 0 1 1 0
第五步: 0 1 0 0
第六步: 1 1 0 0
第七步: 1 0 0 0
第八步: 1 0 0 1

使用光电传感器的输出作为脉冲信号,光电接收管的后面加一个三极管做信号放大。光电传感器前有个齿盘,齿空的间隔距离是相等的,要求齿盘每移动一格,光电传感器输出一个脉冲,步进电机移动一个角度0.9度。齿盘转动的速度不固定,可能快也可能慢。步进电机没有转动之前,齿盘一直是转动的,只有按下启动按钮步进电机才开始转动。

我是这样想的:齿盘转动光电传感器产生的脉冲,一直是在高电平与低电平之间循环的,循环的速度跟齿盘转动的速度成正比,这样脉冲的周期也是由齿盘控制的,这样步进电机转动就受控于齿盘。我把光电传感器接到P13口对不对?
不知道我的思路对不对?如果接口不对,也请给出一个正确的,编程的时候给我带上语句注释(用汇编),请会的朋友帮帮忙,我的邮箱是:[email protected]

我刚刚做过一个步进电机的程序,里面含有步进电机的加速程序。都是自己编写的。程序如下:
RS EQU P1.0
RW EQU P1.2
E EQU P1.1
LCD EQU P2
ORG 0000H
AJMP MAIN
ORG 0030H

MAIN: NOP
C0: SETB P1.4
NOP
NOP
NOP
NOP
NOP
NOP

JB P1.4,C1
AJMP C0

;ACALL WRITE_1

C1: ACALL SET1_LCD
ACALL SHOW1
CLR P0.3
AJMP L2
;LCD初始化程序
SET1_LCD:
MOV R5,#01H ;清屏
ACALL WRITE_1
MOV R5,#3CH ;两行显示,5*10点矩阵
ACALL WRITE_1
MOV R5, #06H ;输入模式为移动光标
ACALL WRITE_1
MOV R5,#0CH ;显示开关控制
ACALL WRITE_1
MOV R5,#02H ;光标归位
ACALL WRITE_1
RET

SHOW1:
MOV DPTR,#TAB1
MOV R1,#00H
A1: MOV A,R1
MOVC A,@A+DPTR
MOV R6,A
LCALL WRITE_D
INC R1
CJNE R1,#0AH,A1
RET
SHOW2:
MOV DPTR,#TAB2
MOV R1,#00H
A2: MOV A,R1
MOVC A,@A+DPTR
MOV LCD,A
MOV R6,A
LCALL WRITE_D
INC R1
CJNE R1,#0AH,A2
RET

;写数据子程序
WRITE_D: SETB RS
CLR RW
MOV LCD,R6
CLR E
ACALL CHECK_BF
SETB E
RET
;写命令子程序
WRITE_1: CLR RS
CLR RW
MOV LCD,R5
CLR E
ACALL CHECK_BF
SETB E
RET
;判断是否忙碌子程序
CHECK_BF:
MOV LCD,#0FFH ;此时不接受外来指令
CLR RS ;RS=0,选择指令寄存器
SETB RW ;RW=1,选择读模式
CLR E ;E=0,禁止读/写LCM

;ACALL DELAY10MS
;延时1微秒
SETB E ;E=1,允许读/写LCM
JB LCD.7,CHECK_BF ;忙碌循环等待
RET
DELAY10MS:
MOV R3,#0AH ;外循环10次
DL2: MOV R4,#0FAH ;内循环50次
DL1: NOP
NOP
DJNZ R4,DL1
DJNZ R3,DL2
RET

DELAY3S: MOV R3,#0FFH
DL3: MOV R4,#0FFH
DL5: MOV R5,#66H
DL6: DJNZ R5,DL6
DJNZ R4,DL5
DJNZ R3,DL3
RET

L2: MOV R1,#18H
L1: MOV R2,#82H
L0: MOV R3,#0C0H
L3: ACALL M2
SETB P1.3
JB P1.3,C2
SETB P1.5
JB P1.5,WBI1
DJNZ R3,L3
DJNZ R2,L0
DJNZ R1,L1 ;延时6秒
M20: MOV A,#036H
AJMP M0

C2: ACALL M4
;ACALL SET1_LCD
AJMP M9

M0:MOV R4,#10H ;电机加速时间参数
M12:SETB P0.5
ACALL M5
CLR P0.5
ACALL M5
DJNZ R4,M12
DEC A
CJNE A,#08H,M0
MOV A,#08H
AJMP M13 ;电机加速程序
RET

M5:MOV R7,A ;延时程序
M1: NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,M1
RET ;延时程序

M13:MOV R4,#0FFH ;电机加速时间参数
M14:SETB P0.5
ACALL M15
CLR P0.5
ACALL M15
SETB P0.5
DJNZ R4,M14
DEC A
CJNE A,#07H,M13
AJMP D0 ;电机加速程序
RET

WBI1: AJMP WBI

M15:MOV R7,A ;延时程序
M16:NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,M16
RET

D0: MOV R5,#2H
ACALL M4
D1: MOV R6,#083H
ACALL M4
D2: MOV R4,#0F0H
M6: ACALL M4
SETB P1.3
JB P1.3,C2
ACALL M4
SETB P1.5
JB P1.5,WBI
ACALL M4
DJNZ R4,M6
DJNZ R6,D2
ACALL M4
DJNZ R5,D1 ;延时18秒
AJMP L2 ;gaiguo

M4: SETB P0.5 ;电机稳定运行程序
ACALL M8
CLR P0.5
ACALL M8
SETB P0.5
RET

M8: MOV R7,#07H ;转速参数
M7: NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,M7
RET

M9: MOV A,#05H
M10:MOV R4,#02H ;电机减速时间参数
M17:SETB P0.5
ACALL M18
CLR P0.5
ACALL M18
DJNZ R4,M17
INC A
CJNE A,#0FFH,M10
;MOV A,#08H
AJMP M3 ;电机减速程序
RET

M18:MOV R7,A ;延时程序
M19:NOP
NOP
NOP
NOP
NOP
NOP
NOP

DJNZ R7,M19
RET

WBI:MOV R5,#058H
N1: MOV R6,#55H
N2: MOV R7,#7DH
N3: ACALL M2
SETB P1.5
JB P1.5,WBI
DJNZ R7,N3
DJNZ R6,N2
DJNZ R5,N1
AJMP M20

M2: SETB P0.5
RET

M3: SETB P0.5
ACALL SET1_LCD
ACALL SHOW2

TAB1: DB 53H,79H,73H,74H,65H,6DH,5FH,4FH,4EH,5FH
TAB2: DB 53H,79H,73H,74H,65H,6DH,5FH,4FH,46H,46H

END
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-10
要是用C的我还能帮上一点忙,汇编的有点无能为力,我的QQ是269829973。本回答被提问者采纳
相似回答