⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 step1.asm

📁 步进电机的使用 1、步近电机的驱动 2、步近电机方向的控制(通过改变送电顺序 系统设计 1、本实验采用4相4拍步进电机
💻 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 + -