📄 完好自适应转速的检测128_32hz—键盘——微调.asm
字号:
;电机驱动
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
POINT EQU 20H.0 ;用到20H位寻址位的20.0H作为控制正转和反转的标志位
SIGN EQU 20H.1 ;周期CHANGE
SIGN_1 EQU 20H.2 ;用来指示TIME-0结束
SIGN_2 EQU 20H.3 ;指示1S过了
SIGN_3 EQU 20H.4 ;指示5S过了
SIGN_4 EQU 20H.5 ;指示10S过了
SIGN_5 EQU 20H.6 ;指示机器处在自动控制中
SIGN_6 EQU 20H.7 ;指示35S过了
ASESS_1 EQU 21H ;用来放置T时间内的转速
ASESS_2 EQU 22H ;存放差植
CASE_1 EQU 23H
CASE_2 EQU 24H
CASE_3 EQU 25H
CASE_4 EQU 26H
ASESS_3 EQU 27H ;用来存放CLOCK
SIGN_7 EQU 28H.0 ;指示T0过了
SIGN_8 EQU 28H.1 ;周期切换
SIGN_9 EQU 28H.2
SIGN_10 EQU 28H.3
ASESS_4 EQU 44H ;设定的转速
CHANGE_X1 EQU 34H
CHANGE_X2 EQU 35H
OUT_PUT_1 EQU P1.5
OUT_PUT_2 EQU P1.6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 00H
LJMP MAIN_1
ORG 03H
LJMP INT_0
;;;;;;;;;;
ORG 00BH
LJMP TIME_0
ORG 0013H
LJMP LOOP1
ORG 01BH
LJMP TIME_T1
ORG 50H
MAIN_1: ;CLR POINT ;测试用的
MOV SP,#48H ;测试用的
MOV IE,#0FFH
;SETB PT0
SETB IT1
SETB IT0
;;;;;;;;;;;;;;;;;;;
MOV R0,#7FH
CLEAR: MOV @R0,#0
DJNZ R0,CLEAR
CLR REST ;复位
LCALL LDELAY
SETB REST
LCALL LDELAY
LCALL RESET ;初始化
LCALL CLEARALL ;清屏
LCALL JIEMIAN
;;;;;;;;;;;;;;;;;;;;
;AJMP $ ;测试用的
;;;;;;;;;;;;;;;;;;;;;
MAIN_2: CLR RS1 ;采用的工作寄存器组1
SETB RS0
;;;;;;;;;;;;;;;;;;;;;;;;;
MOV TMOD,#51H ;;;;
MOV TL1,#00H
MOV TH1,#00H
MOV R7,#00H
MOV R3,#046H
MOV R4,#0A3H
MOV ASESS_3,#00H
MOV ASESS_2,#00H
MOV ASESS_1,#00H
SETB SIGN
SETB SIGN_1
SETB SIGN_2
SETB SIGN_3
SETB SIGN_4
SETB SIGN_5
SETB SIGN_6
SETB SIGN_7
SETB SIGN_8
SETB SIGN_9
SETB SIGN_10
SETB OUT_PUT_1 ;初始化
SETB OUT_PUT_2 ;初始化
MOV ASESS_4,#10 ;测试用的 ;;;;;;;;;;;;MOV TL0,#DCH;;;;;;;;;;;;
;;;;;;;;;MOV TH0,#0BH;;;;;;;;;;
SETB TR0
SETB TR1
;;;;;;;;;;;;;;;;;周期自动转换程序 :周期1
LOGO:JB SIGN_10,LOGO2
MOV ASESS_4,#10
LOGO2:JB SIGN_6,LOGO_1
MOV R3,#02BH
MOV R4,#1EH
AJMP $
LOGO_1:JNB SIGN,STEUP
ACALL CHANGE_1
ACALL TIME_1
;;;;;;;;;;;;;;;;;;周期自动转换程序:周期2
STEUP: ACALL CHANGE_2
;;;;;;;;
JB SIGN_2,SETUP_61
JNB SIGN_4,SETUP_61 ;;;;;;;;;;;待电机启动1S过后自动进行数据比较,添装
CLR C
MOV A,ASESS_4
CJNE A,ASESS_1,SETUP_4
AJMP SETUP_6
;;;;;;;;;;;数据比较添装区
SETUP_61:LJMP SETUP_6
SETUP_4:
SUBB A,ASESS_1
JC SETUP_5
MOV ASESS_2,A ;要加速
CLR C
CJNE A,#20H,FAST_0
FAST_0: JC FAST_1 ;<32
MOV CASE_2,#00H ;>32 ;一级调速
MOV CASE_1,#7CH
LJMP CPU_2
FAST_1: CLR C
MOV A,ASESS_2
CJNE A,#10H,FAST_2
FAST_2: JC FAST_3 ;<16
MOV CASE_2,#00H ;>16/////;二级调速
MOV CASE_1,#3EH
LJMP CPU_2
FAST_3: CLR C
MOV A,ASESS_2
CJNE A,#08H,FAST_4
FAST_4: JC FAST_5 ;<8 ;三级调速
MOV CASE_2,#00H ;>8 ;要加速
MOV CASE_1,#5DH
LJMP CPU_2
FAST_5: CLR C
MOV A,ASESS_2
CJNE A,#03H,FAST_6
FAST_6: JC FAST_7 ;<2
MOV CASE_2,#00H ;>=3 ;四级调速
MOV CASE_1,#7cH
LJMP CPU_2
FAST_7: MOV CASE_2,#00H ;>3
MOV CASE_1,#3eH ;要加速
LJMP CPU_2
CPU_2: LCALL CPU_1
CLR C
MOV A,R3
ADD A,CASE_3
MOV R3,A
MOV A,R4
ADDC A,CASE_4
MOV R4,A
AJMP SETUP_6
SETUP_5: CLR C
MOV A,ASESS_1 ;要减速
SUBB A,ASESS_4
MOV ASESS_2,A ;电机步进参数
CLR C
CJNE A,#20H,FASTX_0
FASTX_0: JC FASTX_1 ;<32
MOV CASE_2,#00H ;>32
MOV CASE_1,#7CH
LJMP CPU_3
FASTX_1: CLR C
MOV A,ASESS_2
CJNE A,#10H,FASTX_2
FASTX_2: JC FASTX_3 ;<16
MOV CASE_2,#00H ;>16
MOV CASE_1,#3EH
LJMP CPU_3
FASTX_3: CLR C
MOV A,ASESS_2
CJNE A,#08H,FASTX_4
FASTX_4: JC FASTX_5 ;<8
MOV CASE_2,#00H ;>8 ;要减速
MOV CASE_1,#5DH
LJMP CPU_3
FASTX_5: CLR C
MOV A,ASESS_2
CJNE A,#03H,FASTX_6
FASTX_6: JC FASTX_7 ;<2
MOV CASE_2,#00H ;>=2
MOV CASE_1,#7cH
LJMP CPU_3
FASTX_7: MOV CASE_2,#00H ;>2
MOV CASE_1,#3eH ;要减速
LJMP CPU_3
CPU_3: LCALL CPU_1
CLR C
MOV A,R3
SUBB A,CASE_3
MOV R3,A
MOV A,R4
SUBB A,CASE_4
MOV R4,A
AJMP SETUP_6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SETUP_6:CJNE R7,#10H,SETUP_D ;转到时钟程序(要记得加返回指令噢!)
LCALL CLOCK
SETUP_D: JNB SIGN_8,SETUP_E
;;LCALL ?? ;调用键盘扫描 /////////////
AJMP SETUP_F
SETUP_E: LCALL LCM
SETUP_F: JB SIGN_1,SETUP_1 ;用来识别TIME-0结束
AJMP SETUP_F ;;;;;;;;;;;;;
SETUP_1:AJMP LOGO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;基准时钟 ;;;;左转为正转,右转为反转,
TIME_0: JB SIGN,TIME_3
CLR TR0 ; ??????
JB POINT,OUT_1
CPL OUT_PUT_1
RETI
OUT_1: CPL OUT_PUT_2
RETI
TIME_3: JNB SIGN_7,T_3
MOV TL1,R3
MOV TH1,R4
MOV TL0,#0EEH ;定时器0初始化
MOV TH0,#85H ;定时器0初始化
CPL SIGN_7
SETB TR1 ;????
JB POINT,OUT
CPL OUT_PUT_1 ;PWM脉宽输出32HZ ;;;正转是POINT为0,反转是POIN为1
RETI
OUT: CPL OUT_PUT_2
RETI
T_3: JB POINT,OUT_E
CPL OUT_PUT_1
AJMP T_R
OUT_E: CPL OUT_PUT_2
T_R: CPL SIGN_7
CLR SIGN_9 ;;????
INC R7
;CJNE R7,#10H,T_4 ;转到时钟程序(要记得加返回指令噢!)
;LCALL CLOCK
T_4: CPL SIGN_1
MOV TMOD,#51H
CLR SIGN_2 ;指示1S过了
SETB TR1 ;????????
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;驱动程序 ;;;;左转为正转,右转为反转,
;;;正转是POINT为0,反转是POIN为1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;转速的检测程序
IN_PUT:MOV A,TL1
MOV ASESS_1,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;软件定时31.25ms
TIME_1:MOV R5,#125
DEL: MOV R6,#123
NOP
DEL_1:DJNZ R6,DEL_1
DJNZ R5,DEL
;===================
JB POINT,OUT_X
CPL OUT_PUT_1
MOV TL0,R3
MOV TH0,R4
SETB TR0 ;???????
AJMP TIME_X
OUT_X:CPL OUT_PUT_2
MOV TL0,R3
MOV TH0,R4
SETB TR0 ;???????
;======================软件定时31.25ms
TIME_X:MOV R5,#125
DEL_X:MOV R6,#123
NOP
DEL_X1:DJNZ R6,DEL_X1
DJNZ R5,DEL_X
;===================
MOV TL0,#00H ;;防止T0定时器益出
MOV TH0,#00H
SETB TR0 ;???????
JB SIGN_9,DEL_Y
CPL SIGN_8
INC R7
DEL_Y: CPL SIGN_1
ACALL IN_PUT ;M法测速TC=62.5ms
MOV TMOD,#11H
JB POINT,OUT_3
CPL OUT_PUT_1
RET
OUT_3:CPL OUT_PUT_2
RET
;;;;;;;;;;;;;;;;;;;;周期自动转换子程序
CHANGE_1: CPL SIGN
MOV TL0,R3
MOV TH0,R4
MOV TL1,#00H
MOV TH1,#00H
RET
CHANGE_2:CPL SIGN
MOV TL1,R3
MOV TH1,R4
MOV TL0,#0EEH ;定时器0初始化
MOV TH0,#85H ;定时器0初始化
RET
;;;;;;;;;;;;;;;;;;;;;;;;定时器1中断
TIME_T1:CLR TR1 ;?????
JB POINT,OUT_2
CPL OUT_PUT_1
RETI
OUT_2: CPL OUT_PUT_2
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;; 时钟显示1S调用
CLOCK: MOV R7,#00H
INC ASESS_3
JB SIGN_5,CLOCK_1
MOV A,ASESS_3
CJNE A,#5H,CLOCK_2
CLR SIGN_3
MOV ASESS_4,#03H
AJMP CLOCK_1
CLOCK_2:MOV A,ASESS_3
CJNE A,#0AH,CLOCK_3
CLR SIGN_4
MOV R3,#0DEH
MOV R4,#0FFH
AJMP CLOCK_1
CLOCK_3:MOV A,ASESS_3
CJNE A,#23H,CLOCK_1
CLR SIGN_6
LCALL LCM ;调用LCD
SETB SIGN_5
AJMP $
;LCALL LCM ;调用LCD
;CLR TR0 ;测试用的
;CLR TR1 ;测试用的
; AJMP $ ;测试用的
CLOCK_1:MOV A,ASESS_3
CJNE A,#64H,LCD_1
MOV ASESS_3,#00H
RET
LCD_1: LCALL LCM ;调用LCD
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -