📄 1.asm
字号:
;##################################################################
; #
; 位移电机左右动作 步进电机控制 (1-2相励磁) #
; 可以调步数 #
; #
; P3.0启动试验
; 李斌 #
; #
;##################################################################
; p1.3为跨度开关,为低时允许P3.3口的负沿脉冲触发中断,
; 并对P1.1 P1.0的脉冲做两种不同的状记录,如,P1.0做加处理工作,
; P1.1做减处理工作,以完成内部两个存储单元的内容的调节.
ddL EQU 59H
ddH EQU 58H
ORG 00H
LJMP CHUSHI
ORG 13H
LJMP INT1INTER
;################## 开机动 位移电机动作步数初置100步 ##################
ORG 100h
CHUSHI:mov ddl,#00h ;脉冲数据调节区初始置零
mov ddh,#00h ;脉冲数据调节区初始置零
mov 40h,#00H ;1段
mov 41h,#64H
mov 42h,#00H ;2段 ;反转(由右往中心点)
mov 43h,#64H
mov 44h,#00H ;3段 ;反转(由中心点往左)
mov 45h,#64H
mov 46h,#00H ;4段 ;正转(由左往中心点)
mov 47h,#64H ;正转(由左往中心点)
mov 48h,#00H ;5段 ;正转(由左往中心点)
mov 49h,#64H ;正转(由左往中心点)
mov 4Ah,#00H ;6段
mov 4Bh,#64H
mov 4Ch,#00H ;7段
mov 4Dh,#64H
mov 4Eh,#00H ;8段
mov 4Fh,#64H
;###################### 复位到中间点 ##################################
START:JNB P3.5,TOZ ;开始检测位移传感原位
TOF:mov r0,#00h ;反转到tab取码指针初值
TOF1:mov a,r0
mov dptr,#tablez ;取码
movc a,@a+dptr
jz TOF ;是否到了结束码00h
ANL a,#11110000B ;取码的高4位
ANL P1,#00001111B ;取P1口的低4位
ORL A,P1 ;调整后的P1口的高4位与低4位合并
MOV P1,A ;P1口回送
MOV P1,A ;P1口输出
SETB P1.2 ;开位移电机电源控制
call delay3 ;电机速度(通电间断时间)
jnb P3.5,stopp ;断后是否到位,若到位,则进入停机
mov p1,#0bh ;相断电
inc r0 ;没到位,取下一个码
ljmp TOF1 ;继续反转
stopp:dec r0 ;反转的下个相序,将要由这反转
ljmp TOZ1
TOZ:mov r0,#00h ;反转到tab取码指针初值
TOZ1:mov a,r0 ;取码
mov dptr,#tablef ;
movc a,@a+dptr
jz TOZ ;是否到了结束码00h
ANL a,#11110000B ;取码的高4位
ANL p1,#00001111B ;取P1口的低4位
ORL A,P1 ;调整后的P1口的高4位与低4位合并
MOV P1,A ;P1口输出
SETB P1.2 ;开电机电源控制
call delay3
jb P3.5,stop ;判断正转是否到位
mov p1,#0bh ;断相电源
inc r0 ;取下一个码
ljmp TOZ1 ;继续正转
stop:mov p1,#0fbh ;步进电机停止,关电机电源
;################# 与主芯片的通信子程 ####################################
;
; (预设1#为此芯片的地址)
; RS:
; ORG 0000H
; RSMAIN:MOV TMOD,#20H ;设置波特率
; MOV TL1,#0FAH
; MOV TH1,#0FAH
; SETB TR1
; MOV SCON,#0F8H ;从机工作于方式3,REN=1,SM2=1,TB8=1
; MOV PCON,#00H
; CLR EA ;关中断
; CLR RI ;清接收标志
; RSWAIT:JBC RI,JSDZ ;接收等待
; AJMP RSWAIT
; JSDZ:MOV A ,SBUF ;读接收地址
; XRL A,#01H ;与本机地址比较
; JNZ RSWAIT ;不是呼叫本机返回
; CLR SM2 ;若呼叫本机,打开数据接收
; MOV SBUF,#02H ;回送本机地址
; WAIT1:JBC RI,CONT1 ;等待主机回应
; AJMP WAIT1
; CONT1:JNB RB8,CONT2 ;联络失败,1#从机复位,置位SM2,等待接收地址
; SETB SM2
; AJMP RSWAIT
; CONT2:MOV A,SBUF ;联络成功,读主机命令(数据)
; CPL A
; MOV P1,A ;驱动发光二极管显示本机地址号
;; SETB SM2 ;重置地址接收状态
; AJMP RSWAIT ;返回
;
;
;########### 合并(调节的步数与以前的步数整合) #########
ZH:MOV 40H,60H
MOV 41H,61H
MOV 42H,62H
MOV 43H,63H
MOV 44H,64H
MOV 45H,65H
MOV 46H,66H
MOV 47H,67H
MOV 48H,68H
MOV 49H,69H
MOV 4AH,6AH
MOV 4BH,6BH
MOV 4CH,6CH
MOV 4DH,6DH
MOV 4EH,6EH
MOV 4FH,6FH
;################## 等待动作(转, 送脉冲) ################################
MOV SP,#70H
WAIT:;jnb P0.x5, ;某动作
;jnb P0.x,
;P3.4 ;试做为自动/手动开关
jnb p1.3, oninter
MOV IE,#00000000B
OOO:jnb p3.0 ,hui00 ;有操作
LJMP IN1
IN1:ljmp ZH ;反复监测键盘
oninter:MOV IE,#10010100B
SETB IT1
LJMP OOO
;################## 正转 反转 ###################################################
;############ 正转1 ##################################
hui00:SETB 20H.0 ; 本次的标志位置1
inc r0 ;换向时,相序调到对应相
mov a,r0
ljmp for1
for:mov r0,#00h ;正转到tab取码指针初值
for1:mov a,r0 ;取码
mov dptr,#tablef ;
movc a,@a+dptr
jz for ;是否到了结束码00h
ANL A,#11110000B ;取码的高4位
ANL P1,#00001111B ;取P1口的低4位 [
ORL A,P1 ;调整后的P1口的高4位与低4位合并
MOV P1,A ;P1口输出
SETB P1.2 ;开电机电源控制
lcall delay0 ;电机速度(时间间断)
mov p1,#0bh ;相断电
mov a,41h
jz g1 ;判断正转步数是否完成
dec 41h
ljmp n1
g1:mov a,40h
jz hui1
mov 41h,#0FFH
DEC 40H
n1:lcall delay1 ;转动的辅助速度(时间间隔)
inc r0 ;没走完总步数,则取下一个码
ljmp for1 ;继续正转
hui1:lcall delay2 ;转完后停会后再转
JNB p1.3,h2
; jb p3.4 ,h3 (将来与自动状态接口用)
ljmp PP10 ;设步数完成后,若有调节步数,则完成调节步数
h2: MOV A,41H
CJNE A,#00H,PP1
MOV A,40H
CJNE A,#00H,PP1
LJMP PP10
PP1:INC R0
LJMP FOR1 ;完成调节步数后,将等第二次的启动信号
PP10:JNB P3.0, hui202
LJMP h2 ;若没有启动,则再次问有否要再走的步数
hui202:clr 20h.0 ;清本次标志位
;######################### 反转1 ##############################
hui22:SETB 20H.1 ; 本次的标志位置1
inc r0 ;换相序时,指向对应的下一相
mov a,r0
ljmp rev1
rev:mov r0,#00h ;反转到tab取码指针初值
rev1:mov a,r0
mov dptr,#tablez ;取码
movc a,@a+dptr
jz rev ;是否到了结束码00h
ANL A,#11110000B ;取码的高4位
ANL P1,#00001111B ;取P1口的低4位
ORL A,P1 ;调整后的P1口的高4位与低4位合并
MOV P1,A ;P1口输出
SETB P1.2 ;开电机电源控制
lcall delay0 ;电机速度(时间间断)
mov p1,#0bh ;相断电
;每走一步,总步数减1
mov a,43h
jz g2
dec 43h
ljmp n2
g2:mov a,42h
jz hui2
mov 43h,#0ffh
dec 42h
;判断正转步数是否完成
n2:lcall delay1 ;转动的速度
inc r0 ;没走完,则取下一个码
ljmp rev1 ;继续反转
hui2:lcall delay2 ;转完后停会后再转
JNB p1.3,h3
; jb p3.4 ,h3 (将来与自动状态接口用)
ljmp PP20 ;设定的步数完成后,若有调节步数,则完成调节步数
h3: MOV A,43H
CJNE A, #00H,PP2
MOV A,42H
CJNE A,#00H,PP2
LJMP PP20
PP2:INC R0
LJMP rev1 ;
pp20:
JNB P3.0, hui303 ;完成调节步数后,将等第三次的启动信号
LJMP h3 ;若没有启动,则再次问有否要再走的步数
hui303:CLR 20H.1 ;清本次标志位
;######################### 反转2 ##############################
hui33:CLR 20H.1 ; 清上次动作的标志位
SETB 20H.2 ; 本次的标志位置1
inc r0 ;换相序时,指向对应的下一相
mov a,r0
ljmp rev11
revv:mov r0,#00h ;反转到tab取码指针初值
rev11:mov a,r0
mov dptr,#tablez ;取码
movc a,@a+dptr
jz revv ;是否到了结束码00h
ANL A,#11110000B ;取码的高4位
ANL P1,#00001111B ;取P1口的低4位
ORL A,P1 ;调整后的P1口的高4位与低4位合并
MOV P1,A ;P1口输出
SETB P1.2 ;开电机电源控制
lcall delay0 ;电机速度(时间间断)
mov p1,#0bh ;相断电
mov a,45h
jz g3
dec 45h ;每走一步,总步数减1
ljmp n3
g3:mov a,44h
jz hui3
mov 45h,#0ffh
dec 44h
;判断正转步数是否完成
n3:lcall delay1 ;转动的速度
inc r0 ;没走完,则取下一个码
ljmp rev11 ;继续反转
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -