📄 selrun1.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PositiveChar EQU 0BH ;电机正转信息
ReverseChar EQU 01H ;电机反转信息
Myself EQU 0FH ;本机地址
StepMotorOn EQU 0BH ;电机运行总开关打开信息
Error EQU 0AAH ;出错信息
Success EQU 55H ;成功信息
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Rceivebuffer EQU 30H ;平扫OR滚扫地址寄存器
ReceiveLength EQU 31H ;接受数据长度寄存器
StepMotor EQU 32H ;电机运行总开关寄存器
SpeedL8 EQU 33H ;速度低字节寄存器
SpeedH8 EQU 34H ;速度高字节寄存器
PositiveRunning EQU 35H ;正反转控制寄存器
SendBuffer EQU 3DH ;发送缓冲器
SpeedL EQU 40H ;速度低字节寄存器
SpeedH EQU 41H ;速度高字节寄存器
CheckSum EQU 42H ;校验寄存器
StartFlag BIT 01H ;启动加速标志
Positive BIT P1.6
Reverse BIT P1.7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
AJMP MAIN
ORG 0003H
NOP
NOP
LJMP ERR
ORG 000BH
AJMP TIMER0
ORG 0013H
NOP
NOP
LJMP ERR
ORG 001BH
NOP
NOP
LJMP ERR
ORG 0023H
AJMP IntSeries
NOP
NOP
LJMP ERR
;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0030H
MAIN: MOV SP,#60H
clr p1.0
ACALL ClearBuffer
ACALL INITIAL
SJMP $
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ControllProcessPro:
MOV A,StepMotor
CJNE A, #StepMotorOn, EndControllProcess ;不相等就退出,结束运行
MOV SpeedL,SpeedL8
JugeSpeedH:
MOV SpeedH,SpeedH8
MOV A,PositiveRunning ;判断是正转还是反转
CJNE A,#PositiveChar,JugeDirect1
SETB 70H ;正转标志
ACALL START
SETB Reverse
AJMP EndPro
JugeDirect1:
MOV A,PositiveRunning
CJNE A, #ReverseChar, EndControllProcess
CLR 70H ;反转标志
ACALL START
SETB Positive
AJMP EndPro
EndControllProcess:
clr p1.0
LCALL Initial
EndPro: RET
;;;;;;初始化定时器0,并启动;;;;;;
START: setb p1.0
MOV 52H,#0FFH ;设置启动缓冲脉冲个数低字节
MOV 53H,#10H ;设置启动缓冲脉冲个数高字节
SETB StartFlag ;设置启动标志
MOV TMOD, #21H
MOV TH0, #0FFH ;设置启动缓冲速度高字节
MOV TL0, #30H ;设置启动缓冲速度低字节
SETB TR0 ;启动计数
SETB ET0 ;开中断
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIMER0: PUSH ACC
MOV A,StepMotor
CJNE A, #StepMotorOn, ControlStop ;不相等就退出,结束运行
JB StartFlag,L00 ;若是启动则转
MOV TH0, SpeedH ;正常速度控制
MOV TL0, SpeedL
AJMP L02
L00: MOV TH0, #0FFH ;启动速度控制
MOV TL0, #30H
L02: JNB 70H,DIRECT ;反转则转
CPL Positive ;正转
JNB StartFlag,EXITTIMER0 ;不是启动过程则正常运行
DJNZ 52H,EXITTIMER0
DJNZ 53H,EXITTIMER0
CLR StartFlag ;启动过程结束则清启动标志
AJMP EXITTIMER0
DIRECT: CPL Reverse ;反转
JNB StartFlag,EXITTIMER0 ;不是启动过程则正常运行
DJNZ 52H,EXITTIMER0
DJNZ 53H,EXITTIMER0
CLR StartFlag ;启动过程结束则清启动标志
NOP
NOP
EXITTIMER0:POP ACC
RETI
RETI
RETI
ControlStop:clr p1.0
LCALL Initial
AJMP EXITTIMER0
;;;;;;;串口中断处理子程序;;;;;;;
IntSeries: CLR EA
CLR TR0
PUSH ACC
JNB TI,ReceiveBlock ;是接收中断则转去接收中断处理
CLR TI ;进入发送中断处理
JNB F0,WaitNextInt ;接收错误则等待重新接收
ContinueOld:
LCALL ControllProcessPro ;接收正确则进入过程控制处理子程序
AJMP WaitNextInt
ReceiveBlock: ;进入接收中断处理
LCALL ReceiveaChar ;调用接收一个字节子程序
JNB SM2,ReceiveDataBlock ;如果是数据则转去数据处理
ReceptAddress:
CJNE @R0,#Myself,RestoreOld ;如果不是呼叫本机则继续原来的动作
MOV Sendbuffer,#Myself ;是本机则响应
MOV R0,#ReceiveLength ;初始化接收数据起始地址
CLR SM2 ;准备接收数据
MOV R4,#00H ;接收数据长度
MOV CheckSum,#00H ;校验和初始化
CLR TB8
MOV SBUF,Sendbuffer
AJMP WaitNextInt
ReceiveDataBlock:
JB RB8,ReceptAddress ;如果是地址则转去地址处理
MOV A,@R0
ADD A,CheckSum ;接收数据相加,以便于判断校验和是否正确
MOV CheckSum,A
INC R0
INC R4
MOV A,R4
CJNE A,ReceiveLength,WaitNextInt ;未接收完则等待下一次接收
CLR C
DEC R0
MOV A,CheckSum
SUBB A,@R0
ANL A,#0FEH
MOV CheckSum,A
MOV A,@R0
ANL A,#0FEH
MOV R0,#Rceivebuffer
CJNE A,CheckSum,JugeCheckSum ;校验和错误则转去错误处理
MOV Sendbuffer,#Success ;校验和正确则准备发送成功信息
SETB SM2 ;置位SM2,下一次只有接收到地址才响应
SETB F0 ;置接收成功标志
AJMP WaitReceiveInt
JugeCheckSum:
MOV Sendbuffer,#Error ;校验和错误则准备发送出错信息
CLR SM2 ;准备重新接收数据
CLR F0 ;置接收出错标志
WaitReceiveInt:
CLR TB8
MOV SBUF,Sendbuffer ;启动发送信息
WaitNextInt:
CLR TI
POP ACC
SETB EA
RETI
WaitCall:
SETB SM2
CLR F0
AJMP WaitNextInt
RestoreOld: POP ACC
SETB EA
SETB TR0 ;启动计数
SETB ET0 ;开中断
RETI
;;;;;接受一个字节子程序;;;;;;
ReceiveaChar:CLR RI
MOV A,SBUF
MOV @R0,A
RET
;;;;;;清接收缓冲区子程序;;;;;;;;
ClearBuffer: MOV R0,#Rceivebuffer
MOV R4,#0AH
ClearRceive:
MOV @R0,#00H
INC R0
DJNZ R4,ClearRceive
RET
;;;;;;;;;;;;;;;;;;;;;;;
Initial:CLR EA
MOV R0,#Rceivebuffer ;接收起始地址(即主机呼叫地址)
MOV CheckSum,#00H ;清校验和寄存器
MOV StepMotor,#00H
CLR StartFlag ;清启动加速标志
MOV TMOD, #21H ;定时器1工作方式置为2(可重装载),定时器0工作方式置为1
MOV SCON, #0f0H ;串口工作方式设置为3
MOV PCON,#80H ;波特率加倍
SETB SM2 ;表示只有当RB8=1(接收的是地址),才响应
MOV TH1,#0FDH ;波特率设置为19.2K
MOV TL1,#0FDH
CLR F0 ;正确接收完数据则置位F0,单片机就可以进行下一步处理
CLR TI
CLR RI
SETB Positive ;电机正转
SETB Reverse ;电机反转
CLR TR0 ;禁止定时器0计数
CLR IT0 ;禁止定时器0中断
SETB TR1 ;启动定时器1计数
SETB PS ;使串口中断优先权最高
SETB EA
SETB ES ;允许串口中断
RET
RET
RET
;;;;;;;;;;;;;;;;;;;;;;;
ERR: CLR EA
MOV DPTR,#ESTART
PUSH DPL
PUSH DPH
RETI
ESTART: MOV DPTR,#0000H
PUSH DPL
PUSH DPH
RETI
ORG 300H
NOP
NOP
LJMP ERR
ORG 350H
NOP
NOP
LJMP ERR
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -