步进电机控制程序是一个电脑的控制程序,用来控制电机的运行。
MOV P2,#0FFH
MOV R7,#00H
;R7为电机转动正反
状态寄存器:为1时为正转,为2时为反转,为0时为停止
CLR F0 ;F0为速度状态,为0慢,为1加速
CLR P3.7 ;关七段数码显示开关,为1开,为0关
CLR P3.4 ;同上
MOV 30H,#00H;数码管要显示的值
MOV 31H,#00H;第一个数码管显示的值
MOV 32H,#00H; 第二个数码管显示的值
clr 08h
clr 09h; 按次数正反转状态位
MAIN:MOV A,P2; 扫描p2口按键
CPL A
JZ NOKEY; 没键就跳到nokey
ACALL qudou ;去抖动
MOV A,P2; 再次扫描p2口看是否为真的按下
CPL A
JB ACC.0,KEY1
JB ACC.1,KEY2
JB ACC.2,KEY3
JB ACC.3,KEY4
NOKEY:CJNE R7,#01H,nokey1
mov dptr,#tab1
acall fuzhi
AJMP main
nokey1:CJNE R7,#02H,finish
mov dptr,#tab2
acall fuzhi
finish:AJMP MAIN
KEY1:JNB P2.0,$ ;按键控制正转
MOV R7,#01H
mov r0,#0
AJMP NOKEY
KEY2:JNB P2.1,$ ;按键控制反转
MOV R7,#02H
mov r0,#0
AJMP NOKEY
KEY3:JNB P2.2,$ ;按键控制速度
CPL F0
AJMP NOKEY
KEY4:JNB P2.3,$ ;stop按键
CJNE R7,#00H,KEY44;判断步进电机是否已经停止,没有就执行停止,否则就调转动次数
Acall led71
acall led72
ACALL XZCS;调旋转次数
KEY44:MOV R7,#00H;
CLR F0
AJMP MAIN
LED71:mov dptr,#tab3; 十位数数码管显示
MOV A,31H
MOVC A,@A+DPTR
SETB P3.7
MOV P0,A
ACALL QUDOU
CLR P3.7
ret
led72:mov dptr,#tab3; 个位数数码管显示
MOV A,32H
MOVC A,@A+DPTR
MOV P0,A
SETB P3.4
ACALL QUDOU
CLR P3.4
RET
XZCS:MOV A,P2
CPL A
JZ MJ;没键按下
ACALL qudou ;去抖动
MOV A,P2
CPL A
JB ACC.0,JIAN1
JB ACC.1,JIAN2
JB ACC.2,JIAN3;第四键表示次数已经调好了,按照数码管显示次数转动
JB ACC.3,JIAN4
MJ: ACALL LED71
acall led72
SJMP XZCS
JIAN1:ACALL LED71;十位数数码管的数值调节,k0按一次加一
acall led72
JNB P2.0,JIAN1
MOV A,31H
CJNE A,#09H,JIA1
MOV 31H,#0
AJMP XZCS
JIA1: INC A
MOV 31H,A
AJMP XZCS
JIAN2:ACALL LED71; 个位数数码管的数值调节,k1按一次加一
acall led72
JNB P2.1,JIAN2
MOV A,32H
CJNE A,#09H,JIA11
MOV 32H,#0
AJMP XZCS
JIA11: INC A
MOV 32H,A
AJMP XZCS
JIAN4:JNB P2.3,$; 返回并且停止转动
RET
JIAN3:ACALL LED71 ;控制步进电机的转动
acall led72
JNB P2.2,JIAN3
MOV A,31H
mov b,#10
mul ab
add a,32h; 求出数码管显示的数值
jjxz: MOV R6,A; 控制转动次数
JXZ: cjne r6,#00h,jxz1 ;如果是0就不要转了,返回
ajmp xzcs
jxz1: MOV R0,#50; 转动一圈需要的步距角数
LOOPP:jnb p2.2,fanzhuan; k2键控制转动的方向,按一下就改变一下
jnb p2.3,jian44; k3键按一下停止转动
jian44:acall qudou
jnb p2.3,jian4
sjmp cc
fanzhuan:acall qudou
jnb p2.2,fanzhuan1
fanzhuan1:acall led71
acall led72
jnb p2.2,fanzhuan1
cpl 09h
cc: jnb 09h,aa
mov dptr,#tab2
sjmp bb
aa: MOV DPTR,#TAB1
bb: ACALL FUZHI
djnz R0,LOOPP;一圈完了
MOV A,32H; 数码管减一
CJNE A,#00H,DEC11
DEC 31H
MOV 32H,#0aH
DEC11:DEC 32H
DJNZ R6,JXZ; 继续转
AJMP xzcs
FUZHI:MOV R2,#8; 给p1口送脉冲
MOV R3,#0
LOOP:MOV A,R3
MOVC A,@A+DPTR
MOV P1,A
INC R3
cjne r0,#00h,loop1
ACALL DELAY
sjmp loop2
loop1:push acc
push DPL
push DPH
jnb 08h,loop3
acall led72
ajmp loop4
loop3:acall led71
loop4:cpl 08h
pop dph
pop dpl
pop acc
loop2:DJNZ R2,LOOP
RET
delay: JNB F0,DELAY2;控制步进电机中途延时时间,即速度
MOV R4,#6
AJMP DELAY1
DELAY2:mov r4,#12
delay1:mov r5,#250
djnz r5,$
djnz r4,delay1
ret
QUDOU:MOV R4,#6 ;延时去抖动3ms
QUDOU1:MOV R5,#250
DJNZ R5,$
DJNZ R4,QUDOU1
RET
TAB1:DB 0f7h,0f5h,0fdh,0f9h,0fbh,0fah,0feh,0f6h;正转
TAB2:DB 0f6h, 0feh,0fah,0fbh,0f9h,0fdh,0f5h,0f7h;反转
TAB3:DB 08H,3BH,14H,11H,23H,41H,40H,1BH,00H,01H ;七段数码显示
END