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

📄 step.s

📁 用M16驱动步进电机 实现三种驱动方式 单四拍驱动、双四拍驱动 单双八拍驱动
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module step.c
	.area text(rom, con, rel)
	.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
	.area data(ram, con, rel)
	.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
_i::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
	.dbsym e i _i c
_m::
	.blkb 1
	.area idata
	.byte 1
	.area data(ram, con, rel)
	.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
	.dbsym e m _m c
_n::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
	.dbsym e n _n c
_zhuansu::
	.blkb 2
	.area idata
	.word 61500
	.area data(ram, con, rel)
	.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
	.dbsym e zhuansu _zhuansu i
	.area text(rom, con, rel)
	.dbfile F:\ziliao\新建文件夹\stepmotor\step.c
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 33
; /************************************
; *        步进电机的M16驱动程序        *
; * 功   能:用M16驱动步进电机        *
; *            实现三种驱动方式        *
; *            单四拍驱动、双四拍驱动    *
; *            单双八拍驱动            *
; * 驱动芯片:ULN2803                    *
; * 联接方式:PC0-3分别通过2803接A-D    *
; *            步进电机公共端接+5V电源    *
; * 建立日期:2008年04月10日            *
; * 作   者:弋蔚辉                   *
; * 版   本:V1.0                    *
; * 修改日期:2008年04月15日            *
; * 主控芯片:M16                        *
; * 时钟频率:外部晶体 7.3728MHZ        *
; * 编 译 器:ICCAVR 6.31A            *
; ************************************/
; #include <iom16v.h>
; #include <macros.h>
; //#include "delay.h"
; 
; #define RD_KEY() ((~(PINC|0x0F))>>4)//四按键接于PC4-PC7
; 
; unsigned char i=0;            //转动计数
; unsigned char m=1;            //驱动方式参数
; unsigned char n=0;            //转动方向参数
; unsigned int zhuansu=61500;    //转速数据
; 
; /****************************
; *        端口配置函数        *
; ****************************/
; void port_init(void)
;    {
	.dbline 34
;    PORTA = 0x40;
	ldi R24,64
	out 0x1b,R24
	.dbline 35
;    DDRA = 0x40;
	out 0x1a,R24
	.dbline 36
;    PORTB = 0x00;
	clr R2
	out 0x18,R2
	.dbline 37
;    DDRB = 0x00;
	out 0x17,R2
	.dbline 38
;    PORTC = 0xF0;
	ldi R24,240
	out 0x15,R24
	.dbline 39
;    DDRC = 0x0F;
	ldi R24,15
	out 0x14,R24
	.dbline 40
;    PORTD = 0x00;
	out 0x12,R2
	.dbline 41
;    DDRD = 0x00;
	out 0x11,R2
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e bj_fs _bj_fs fV
;              a -> R10
	.even
_bj_fs::
	xcall push_xgset300C
	mov R10,R16
	.dbline -1
	.dbline 49
;    }
; 
; /****************************
; *        正转操作函数        *
; * 入   口:a 三种工作方式    *
; ****************************/
; void bj_fs(unsigned char a)
;    {
	.dbline 50
;    switch(a)
	mov R20,R10
	clr R21
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L6
X0:
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L9
X1:
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	brne X9
	xjmp L14
X9:
X2:
	xjmp L4
L6:
	.dbline 53
;        {
;        case 1:                //单四拍方式驱动
;            PORTC |= 1<<i;    //A、B、C、D驱动
	lds R17,_i
	ldi R16,1
	xcall lsl8
	in R2,0x15
	or R2,R16
	out 0x15,R2
	.dbline 54
;            i++;
	lds R24,_i
	subi R24,255    ; addi 1
	sts _i,R24
	.dbline 55
;            if(i>=4)i=0;
	cpi R24,4
	brsh X10
	xjmp L4
X10:
X3:
	.dbline 55
	clr R2
	sts _i,R2
	.dbline 56
;            break;
	xjmp L4
L9:
	.dbline 58
;        case 2:                //双四拍方式驱动
;            if(i!=4)        //AB、BC、CD、DA驱动
	lds R24,_i
	cpi R24,4
	breq L10
X4:
	.dbline 59
;                PORTC |= (1<<i)|(1<<(i-1));
	mov R3,R24
	mov R17,R24
	subi R17,1
	ldi R16,1
	xcall lsl8
	mov R2,R16
	ldi R16,1
	mov R17,R3
	xcall lsl8
	mov R3,R16
	or R3,R2
	in R2,0x15
	or R2,R3
	out 0x15,R2
	xjmp L11
L10:
	.dbline 61
;            else
;                PORTC |= (1<<(i-1))|1;
	lds R17,_i
	subi R17,1
	ldi R16,1
	xcall lsl8
	mov R24,R16
	ori R24,1
	in R2,0x15
	or R2,R24
	out 0x15,R2
L11:
	.dbline 62
;            i++;
	lds R24,_i
	subi R24,255    ; addi 1
	sts _i,R24
	.dbline 63
;            if(i>=5)i=1;
	cpi R24,5
	brsh X11
	xjmp L4
X11:
X5:
	.dbline 63
	ldi R24,1
	sts _i,R24
	.dbline 64
;            break;
	xjmp L4
L14:
	.dbline 66
;        case 3:                //单双八拍方式驱动
;            if(i%2)            //A、AB、B、BC、C、CD、D、DA驱动
	ldi R17,2
	lds R16,_i
	xcall mod8u
	tst R16
	breq L15
X6:
	.dbline 67
;                {
	.dbline 68
;                if(i!=7)
	lds R24,_i
	cpi R24,7
	breq L17
X7:
	.dbline 69
;                    PORTC |= (1<<(i/2))|(1<<(i/2+1));
	ldi R18,2
	ldi R19,0
	mov R16,R24
	clr R17
	xcall div16s
	movw R4,R16
	movw R18,R4
	subi R18,255  ; offset = 1
	sbci R19,255
	ldi R16,1
	ldi R17,0
	xcall lsl16
	movw R2,R16
	ldi R16,1
	ldi R17,0
	movw R18,R4
	xcall lsl16
	movw R4,R16
	or R4,R2
	or R5,R3
	in R2,0x15
	clr R3
	or R2,R4
	or R3,R5
	out 0x15,R2
	xjmp L16
L17:
	.dbline 71
;                else
;                    PORTC |= (1<<(i/2))|1;
	lds R17,_i
	lsr R17
	ldi R16,1
	xcall lsl8
	mov R24,R16
	ori R24,1
	in R2,0x15
	or R2,R24
	out 0x15,R2
	.dbline 72
;                }
	xjmp L16
L15:
	.dbline 74
;            else
;                {
	.dbline 75
;                PORTC |= 1<<(i/2);
	lds R17,_i
	lsr R17
	ldi R16,1
	xcall lsl8
	in R2,0x15
	or R2,R16
	out 0x15,R2
	.dbline 76
;                }
L16:
	.dbline 77
;            i++;
	lds R24,_i
	subi R24,255    ; addi 1
	sts _i,R24
	.dbline 78
;            if(i>=8)i=0;
	cpi R24,8
	brlo L4
X8:
	.dbline 78
	clr R2
	sts _i,R2
	.dbline 79
;            break;
	.dbline 80
;        default:break;
L4:
	.dbline -2
L2:
	.dbline 0 ; func end
	xjmp pop_xgset300C
	.dbsym r a 10 c
	.dbend
	.dbfunc e bj_fsf _bj_fsf fV
;              a -> R10
	.even
_bj_fsf::
	xcall push_xgset300C
	mov R10,R16
	.dbline -1
	.dbline 89
;        }
;    }
; 
; /****************************
; *        反转操作函数        *
; * 入   口:a 三种工作方式    *
; ****************************/
; void bj_fsf(unsigned char a)
;    {
	.dbline 90
;    switch(a)
	mov R20,R10
	clr R21
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L25
X12:
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L28
X13:
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	brne X22
	xjmp L33
X22:
X14:
	cpi R20,4
	ldi R30,0
	cpc R21,R30
	brne X23
	xjmp L23
X23:
X15:
	xjmp L23
L25:
	.dbline 93
;        {
;        case 1:                    //单四拍方式驱动
;            PORTC |= 1<<(3-i);    //D、C、B、A驱动
	lds R2,_i
	ldi R17,3
	sub R17,R2
	ldi R16,1
	xcall lsl8
	in R2,0x15
	or R2,R16
	out 0x15,R2
	.dbline 94
;            i++;
	lds R24,_i
	subi R24,255    ; addi 1
	sts _i,R24
	.dbline 95
;            if(i>=4)i=0;
	cpi R24,4
	brsh X24
	xjmp L23
X24:
X16:
	.dbline 95
	clr R2
	sts _i,R2
	.dbline 96
;            break;
	xjmp L23
L28:
	.dbline 98
;        case 2:                    //双四拍方式驱动
;            if(i!=4)            //AD、CD、BC、AB驱动
	lds R24,_i
	cpi R24,4
	breq L29
X17:
	.dbline 99
;                PORTC |= (1<<(3-i))|(1<<(4-i));
	mov R3,R24
	ldi R17,4
	sub R17,R24
	ldi R16,1
	xcall lsl8
	mov R2,R16
	ldi R17,3
	sub R17,R3
	ldi R16,1
	xcall lsl8
	mov R3,R16
	or R3,R2
	in R2,0x15
	or R2,R3
	out 0x15,R2
	xjmp L30
L29:
	.dbline 101
;            else
;                PORTC |= (1<<(i-1))|1;
	lds R17,_i
	subi R17,1
	ldi R16,1
	xcall lsl8
	mov R24,R16
	ori R24,1
	in R2,0x15
	or R2,R24
	out 0x15,R2
L30:
	.dbline 102
;            i++;
	lds R24,_i
	subi R24,255    ; addi 1
	sts _i,R24
	.dbline 103
;            if(i>=5)i=1;
	cpi R24,5
	brsh X25
	xjmp L23
X25:
X18:
	.dbline 103
	ldi R24,1
	sts _i,R24
	.dbline 104
;            break;
	xjmp L23
L33:
	.dbline 106
;        case 3:                    //单双八拍方式驱动
;            if(i%2)                //DA、D、CD、C、BC、B、AB、A驱动
	ldi R17,2
	lds R16,_i
	xcall mod8u
	tst R16
	breq L34
X19:
	.dbline 107
;                {
	.dbline 108
;                PORTC |= 1<<(3-i/2);
	lds R2,_i
	lsr R2
	ldi R17,3
	sub R17,R2
	ldi R16,1
	xcall lsl8
	in R2,0x15
	or R2,R16
	out 0x15,R2
	.dbline 109
;                }
	xjmp L35
L34:
	.dbline 111
;            else
;                {
	.dbline 112
;                if(i)
	lds R2,_i
	tst R2
	breq L36
X20:
	.dbline 113

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -