?? 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 + -