📄 step1.asm
字号:
;实验目的:步进电机的使用
;1、步近电机的驱动
;2、步近电机方向的控制(通过改变送电顺序
;系统设计
;1、本实验采用4相4拍步进电机,步进角为7.5
;2、步进电机驱动口连接在RA0-RA3
;3、按下RB0,停止电机转动;按下RB1,电机正转;按下RB2,电机反转
;硬件要求:
;拨码开关S1第6位到第8位置ON,S1其他位和其他拨码开关断开
;拨码开关S15全部置ON。
;其他拨码开关关闭。
include<p16f877a.inc> ;包含877A的头文件
__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC
;芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
#define step1 3h ;转动第1步驱动信号(不同的电机,可以引出线顺序不一样)
#define step2 6h ;转动第2步驱动信号(本程序以“常州市丰源微特电记有限公司的35BY48S053”电机为基础)
#define step3 0ch ;转动第3步驱动信号
#define step4 9h ;转动第4步驱动信号
#define stop portb,0 ;停止键
#define right portb,1 ;正转键
#define left portb,2 ;反转键
cblock 30h
mode ;停止/正转/反转控制寄存器
endc
org 00h ;复位入口
nop ;ICD所需要的空指令
goto main ;跳转到主程序
org 05h
;****************************主程序***************************
main
banksel adcon1
movlw 07h
movwf adcon1 ;设置所有A口为普通数字口
banksel trisa
clrf trisa ;设置A口为输出
movlw 0ffh
movwf trisb ;设置B口为输入
CLRF OPTION_REG ;启用B口的内部弱上拉功能
clrf status
clrf mode ;先停止电机
movlw step1 ;初始电机状态
movwf porta
call delay
;****************************检查电机工作状态*******************
check
btfsc stop ;是否停止工作
goto check1 ;否,转去判断其他状态
movlw 0
movwf mode ;是,清0工作状态控制寄存器
goto check_end ;跳转到驱动电机工作
check1
btfsc right ;是否正转?
goto check2 ;否,转去判断是否反转
movlw 1
movwf mode ;是,工作状态寄存器送1
goto check_end ;跳转到驱动电机工作
check2
btfsc left ;是否反转
goto check_end ;否,跳转到驱动电机工作
movlw 2
movwf mode ;是,工作状态寄存器送1
goto check_end
;*****************************驱动电机工作**********************
check_end
movfw mode
btfsc status,z ;判断是否停止电机
goto check ;是,返回检测控制信号
;通过读回当前的驱动信号,结合正转/反转控制,决定下一步的输出控制信号
movlw step1
xorwf porta,0
btfss status,z ;当前控制信号是否为step1
goto driver2 ;否,转去判断其他信号
movlw 1 ;是,判断下一步正转还是反转
subwf mode,0
btfss status,z ;正转?
goto driver1 ;否,反转
movlw step2 ;下一步驱动信号为step2
movwf porta ;驱动信号送A口
call delay ;调用延时程序
goto check ;返回主程序继续判断
driver1 ;下一步应该为反转
movlw step4 ;下一步驱动信号为step4
movwf porta ;驱动信号送A口
call delay ;调用延时程序
goto check ;返回主程序继续判断
driver2
movlw step2
xorwf porta,0
btfss status,z ;当前控制信号是否为step2
goto driver4 ;否,转去判断其他信号
movlw 1 ;是,判断下一步正转还是反转
subwf mode,0
btfss status,z ;正转?
goto driver3 ;否,反转
movlw step3 ;下一步驱动信号为step3
movwf porta ;驱动信号送A口
call delay ;调用延时程序
goto check ;返回主程序继续判断
driver3
movlw step1 ;下一步驱动信号为step1
movwf porta ;驱动信号送A口
call delay ;调用延时程序
goto check ;返回主程序继续判断
driver4
movlw step3 ;下一步驱动信号为step3
xorwf porta,0
btfss status,z ;当前控制信号是否为step3
goto driver6 ;否,转去判断其他信号
movlw 1 ;是,判断下一步正转还是反转
subwf mode,0
btfss status,z ;正转?
goto driver5 ;否,反转
movlw step4 ;下一步驱动信号为step4
movwf porta ;驱动信号送A口
call delay ;调用延时程序
goto check ;返回主程序继续判断
driver5
movlw step2 ;下一步驱动信号为step2
movwf porta ;驱动信号送A口
call delay ;调用延时程序
goto check ;返回主程序继续判断
driver6
movlw step4 ;下一步驱动信号为step4
xorwf porta,0
btfss status,z ;当前控制信号是否为step4
goto check ;否,返回主程序继续判断
movlw 1 ;是,判断下一步正转还是反转
subwf mode,0
btfss status,z ;正转?
goto driver7 ;否,反转
movlw step1 ;下一步驱动信号为step1
movwf porta ;驱动信号送A口
call delay ;调用延时程序
goto check ;返回主程序继续判断
driver7
movlw step3 ;下一步驱动信号为step3
movwf porta ;驱动信号送A口
call delay ;调用延时程序
goto check ;返回主程序继续判断
;*******************************延时程序********************************
;控制输出的频率
delay
movfw 0FH
movwf 21h
movlw 0ffh
movwf 22h
decfsz 22h,1
goto $-1
decfsz 21h,1
goto $-5
return
;******************************源程序结束*******************************
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -