📄 motor_key_1602lcd.asm
字号:
;/******************************************************************/
;/* */
;/* ME500单片机开发系统演示程序 - 步进电机键控正反转实验 */
;/* */
;/* LCD1602显示 */
;/* */
;/* 版本: V1.0 (2006/11/20) */
;/* 作者: gguoqing (Email: gguoqing@willar.com) */
;/* 网站: www.willar.com(伟纳电子) www.mcusj.com(伟纳单片机世界)*/
;/* 邮箱: support@willar.com */
;/* */
;/*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved */
;/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! */
;/* */
;/******************************************************************/
;K1-启动与停止步进电机运行
;K2-设定步进电机运行圈数
;K3-设定步进电机转动方向
;K4-设定步进电机运行速度
;步进电机的转速控制分16档,数字越小,转速越快。
;7.5度步进电机
;周期7.5×4=30度,电机转动一圈需12个周期。
;--------------------------------------------------
K1 EQU P1.4 ;K1键
K2 EQU P1.5 ;K2键
K3 EQU P1.6 ;K3键
K4 EQU P1.7 ;K4键
BA EQU P1.0 ;步进电机A端
BB EQU P1.1 ;步进电机B端
BC EQU P1.2 ;步进电机C端
BD EQU P1.3 ;步进电机D端
BEEP EQU P3.7 ;蜂鸣器
RS EQU P2.0
RW EQU P2.1
EN EQU P2.2
LCD_X EQU 2FH
RATE EQU 32H ;转速档次
D_BUF1 EQU 33H ;显示缓存1
D_BUF2 EQU 34H ;显示缓存2
TEMP EQU 35H ;临时过渡
TURN_NUM EQU 36H ;存放运行圈数
CYCLE EQU 37H ;存放周期数
;--------------------------------------------
ORG 0000H
JMP MAIN
ORG 000BH
JMP INTT0
ORG 0030H
;---------------------------------------------
MAIN:
MOV SP,#60H
ACALL SET_LCD ;显示启动画面
MOV R4,#0FH
MAIN1 :
MOV R5,#25 ;延时5S
CALL DELAY2
DJNZ R4,MAIN1
ACALL SET_LCD0
CLR 20H.0 ;转速设置加减标记
SETB 20H.1 ;正转、逆转标记
SETB 20H.2 ;圈数设置加减标记
SETB 20H.3 ;运行与停止标记
SETB 20H.4
MOV R0,#00H
MOV R1,#00H
MAIN2:
MOV TURN_NUM,#5 ;默认转5圈
MOV A,TURN_NUM
MOV LCD_X,#04H
ACALL DATA_CONV ;显示圈数
ACALL SET_LCD1 ;显示STOP
MOV R2,TURN_NUM
MOV CYCLE,#12 ;12个周期,电机转一圈。
MOV RATE,#08H ;预设为中速
MOV A,RATE
MOV LCD_X,#0DH
ACALL DATA_CONV ;显示转速比例
MOV P1,#0F0H
MOV TMOD,#01H
MOV TL0,#33H
MOV TH0,#0F5H
SETB EA
SETB ET0
M_LOOP:
MOV A,CYCLE ;12个周期,电机转一圈。
CJNE A,#00H,LOOP0
MOV CYCLE,#12
DEC R2
MOV A,R2
MOV LCD_X,#04H ;显示剩余圈数
ACALL DATA_CONV
CJNE R2,#00H,LOOP0
CLR TR0
MOV P1,#0F0H
MOV R2,TURN_NUM ;重新送圈数
SETB 20H.3 ;STOP
MOV A,R2
MOV LCD_X,#04H ;显示圈数
ACALL DATA_CONV
ACALL SET_LCD1
LOOP0:
JB 20H.1,LOOP0A
ACALL SET_LCDR ;<<
JMP LOOP0B
LOOP0A:
ACALL SET_LCDF ;>>
LOOP0B:
JB K1,LOOP1
JNB 20H.3,LOOP0C
ACALL SET_LCD2 ;RUNNING
SETB TR0 ;启动步进电机运行
CLR 20H.3 ;停止运行标记
CALL BEEP_BL
JMP LOOP1
LOOP0C:
CLR TR0 ;停止步进电机运行
SETB 20H.3 ;启动运行标记
MOV P1,#0F0H
MOV CYCLE,#12
MOV R2,TURN_NUM
ACALL SET_LCD1 ;STOP
CALL BEEP_BL
JMP M_LOOP
LOOP1:
JB K2,LOOP2
CALL BEEP_BL
JNB 20H.2,LOOP1B
MOV A,TURN_NUM ;增加圈数
INC A
MOV TURN_NUM,A
MOV LCD_X,#04H ;显示设定圈数
ACALL DATA_CONV
MOV R2,TURN_NUM
MOV A,TURN_NUM
CJNE A,#20,LOOP1A
CLR 20H.2
LOOP1A:
JMP LOOP2
LOOP1B:
MOV A,TURN_NUM ;减少圈数
DEC A
MOV TURN_NUM,A
MOV LCD_X,#04H ;显示设定圈数
ACALL DATA_CONV
MOV R2,TURN_NUM
MOV A,TURN_NUM
CJNE A,#01H,LOOP2
SETB 20H.2
LOOP2:
JB K3,LOOP3 ;换向
CLR TR0
MOV P1,#0F0H
SETB 20H.3 ;STOP标志
ACALL SET_LCD1
CPL 20H.1 ;换向标志
JB 20H.1,LOOP2A ;根据换向标志来显示转动方向
ACALL SET_LCDR
JMP LOOP2B
LOOP2A:
ACALL SET_LCDF
LOOP2B:
CALL BEEP_BL
MOV R2,TURN_NUM ;换向后,从设定值开始运行
MOV A,R2
MOV LCD_X,#04H ;显示设定圈数
ACALL DATA_CONV
LOOP3:
JB K4,LOOP4
CLR 20H.4 ;在运行过程调整速率时,要使步进电机先停止转动
CALL BEEP_BL
JNB 20H.0,LOOP5
mov temp,CYCLE
MOV A,RATE ;减速过程
INC A
MOV RATE,A
MOV LCD_X,#0DH
ACALL DATA_CONV
MOV A,RATE
CJNE A,#10H,LOOP4
CLR 20H.0
LOOP4:
SETB 20H.4
JMP M_LOOP
LOOP5:
MOV A,RATE ;加速过程
DEC A
MOV RATE,A
MOV LCD_X,#0DH
ACALL DATA_CONV
MOV A,RATE
CJNE A,#01H,LOOP6
SETB 20H.0
LOOP6:
SETB 20H.4
JMP M_LOOP
;---------------------------------------------
;步进电机正转走一步子程序
;---------------------------------------------
FFW:
MOV A,R0
MOV DPTR,#TABLE_F
MOVC A,@A+DPTR
CJNE A,#00H,FFW1
MOV R0,#00H
DEC CYCLE ;每8步为一个周期
JMP FFW2
FFW1:
MOV P1,A
INC R0
FFW2:
RET
;---------------------------------------------
;步进电机逆转走一步子程序
;---------------------------------------------
REV:
MOV A,R0
MOV DPTR,#TABLE_R
MOVC A,@A+DPTR
CJNE A,#00H,REV1
MOV R0,#00H
DEC CYCLE ;每8步为一个周期
JMP REV2
REV1:
MOV P1,A
INC R0
REV2:
RET
;---------------------------------------------
;中断服务子程序
;中断定时2ms
;20H.1=1 正转,20H.1=0 反转
;---------------------------------------------
INTT0:
PUSH ACC
CLR TR0
MOV TL0,#33H
MOV TH0,#0F5H
SETB TR0
JNB 20H.4,INTT0B ;K4键按下时,停止步进电机运行
INC R3
MOV B,R3
MOV A,RATE ;中断次数来调整延时时间的长短
CJNE A,B,INTT0B
MOV R3,#00H
JNB 20H.1,INTT0A
LCALL FFW ;步进电机正转
JMP INTT0B
INTT0A:
LCALL REV ;步进电机逆转
INTT0B:
POP ACC
RETI
;-----------------------------------------------------
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -