📄 stepmotor.lst
字号:
__text_start:
__start:
2D E5CF LDI R28,0x5F
2E E0D4 LDI R29,4
2F BFCD OUT 0x3D,R28
30 BFDE OUT 0x3E,R29
31 51CE SUBI R28,0x1E
32 40D0 SBCI R29,0
33 EA0A LDI R16,0xAA
34 8308 STD Y+0,R16
35 2400 CLR R0
36 E6E5 LDI R30,0x65
37 E0F0 LDI R31,0
38 E010 LDI R17,0
39 36E5 CPI R30,0x65
3A 07F1 CPC R31,R17
3B F011 BEQ 0x003E
3C 9201 ST R0,Z+
3D CFFB RJMP 0x0039
3E 8300 STD Z+0,R16
3F E5E4 LDI R30,0x54
40 E0F0 LDI R31,0
41 E6A0 LDI R26,0x60
42 E0B0 LDI R27,0
43 E010 LDI R17,0
44 E000 LDI R16,0
45 BF0B OUT 0x3B,R16
46 35E9 CPI R30,0x59
47 07F1 CPC R31,R17
48 F021 BEQ 0x004D
49 95C8 LPM
4A 9631 ADIW R30,1
4B 920D ST R0,X+
4C CFF9 RJMP 0x0046
4D 940E 020B CALL _main
_exit:
4F CFFF RJMP _exit
FILE: F:\ziliao\新建文件夹\stepmotor\step.c
(0001) /************************************
(0002) * 步进电机的M16驱动程序 *
(0003) * 功 能:用M16驱动步进电机 *
(0004) * 实现三种驱动方式 *
(0005) * 单四拍驱动、双四拍驱动 *
(0006) * 单双八拍驱动 *
(0007) * 驱动芯片:ULN2803 *
(0008) * 联接方式:PC0-3分别通过2803接A-D *
(0009) * 步进电机公共端接+5V电源 *
(0010) * 建立日期:2008年04月10日 *
(0011) * 作 者:弋蔚辉 *
(0012) * 版 本:V1.0 *
(0013) * 修改日期:2008年04月15日 *
(0014) * 主控芯片:M16 *
(0015) * 时钟频率:外部晶体 7.3728MHZ *
(0016) * 编 译 器:ICCAVR 6.31A *
(0017) ************************************/
(0018) #include <iom16v.h>
(0019) #include <macros.h>
(0020) //#include "delay.h"
(0021)
(0022) #define RD_KEY() ((~(PINC|0x0F))>>4)//四按键接于PC4-PC7
(0023)
(0024) unsigned char i=0; //转动计数
(0025) unsigned char m=1; //驱动方式参数
(0026) unsigned char n=0; //转动方向参数
(0027) unsigned int zhuansu=61500; //转速数据
(0028)
(0029) /****************************
(0030) * 端口配置函数 *
(0031) ****************************/
(0032) void port_init(void)
(0033) {
(0034) PORTA = 0x40;
_port_init:
50 E480 LDI R24,0x40
51 BB8B OUT 0x1B,R24
(0035) DDRA = 0x40;
52 BB8A OUT 0x1A,R24
(0036) PORTB = 0x00;
53 2422 CLR R2
54 BA28 OUT 0x18,R2
(0037) DDRB = 0x00;
55 BA27 OUT 0x17,R2
(0038) PORTC = 0xF0;
56 EF80 LDI R24,0xF0
57 BB85 OUT 0x15,R24
(0039) DDRC = 0x0F;
58 E08F LDI R24,0xF
59 BB84 OUT 0x14,R24
(0040) PORTD = 0x00;
5A BA22 OUT 0x12,R2
(0041) DDRD = 0x00;
5B BA21 OUT 0x11,R2
5C 9508 RET
_bj_fs:
a --> R10
5D 940E 030A CALL push_xgset300C
5F 2EA0 MOV R10,R16
(0042) }
(0043)
(0044) /****************************
(0045) * 正转操作函数 *
(0046) * 入 口:a 三种工作方式 *
(0047) ****************************/
(0048) void bj_fs(unsigned char a)
(0049) {
(0050) switch(a)
60 2D4A MOV R20,R10
61 2755 CLR R21
62 3041 CPI R20,1
63 E0E0 LDI R30,0
64 075E CPC R21,R30
65 F051 BEQ 0x0070
66 3042 CPI R20,2
67 E0E0 LDI R30,0
68 075E CPC R21,R30
69 F0D1 BEQ 0x0084
6A 3043 CPI R20,3
6B E0E0 LDI R30,0
6C 075E CPC R21,R30
6D F409 BNE 0x006F
6E C041 RJMP 0x00B0
6F C087 RJMP 0x00F7
(0051) {
(0052) case 1: //单四拍方式驱动
(0053) PORTC |= 1<<i; //A、B、C、D驱动
70 9110 0060 LDS R17,i
72 E001 LDI R16,1
73 940E 031B CALL lsl8
75 B225 IN R2,0x15
76 2A20 OR R2,R16
77 BA25 OUT 0x15,R2
(0054) i++;
78 9180 0060 LDS R24,i
7A 5F8F SUBI R24,0xFF
7B 9380 0060 STS i,R24
(0055) if(i>=4)i=0;
7D 3084 CPI R24,4
7E F408 BCC 0x0080
7F C077 RJMP 0x00F7
80 2422 CLR R2
81 9220 0060 STS i,R2
(0056) break;
83 C073 RJMP 0x00F7
(0057) case 2: //双四拍方式驱动
(0058) if(i!=4) //AB、BC、CD、DA驱动
84 9180 0060 LDS R24,i
86 3084 CPI R24,4
87 F089 BEQ 0x0099
(0059) PORTC |= (1<<i)|(1<<(i-1));
88 2E38 MOV R3,R24
89 2F18 MOV R17,R24
8A 5011 SUBI R17,1
8B E001 LDI R16,1
8C 940E 031B CALL lsl8
8E 2E20 MOV R2,R16
8F E001 LDI R16,1
90 2D13 MOV R17,R3
91 940E 031B CALL lsl8
93 2E30 MOV R3,R16
94 2832 OR R3,R2
95 B225 IN R2,0x15
96 2823 OR R2,R3
97 BA25 OUT 0x15,R2
98 C00B RJMP 0x00A4
(0060) else
(0061) PORTC |= (1<<(i-1))|1;
99 9110 0060 LDS R17,i
9B 5011 SUBI R17,1
9C E001 LDI R16,1
9D 940E 031B CALL lsl8
9F 2F80 MOV R24,R16
A0 6081 ORI R24,1
A1 B225 IN R2,0x15
A2 2A28 OR R2,R24
A3 BA25 OUT 0x15,R2
(0062) i++;
A4 9180 0060 LDS R24,i
A6 5F8F SUBI R24,0xFF
A7 9380 0060 STS i,R24
(0063) if(i>=5)i=1;
A9 3085 CPI R24,5
AA F408 BCC 0x00AC
AB C04B RJMP 0x00F7
AC E081 LDI R24,1
AD 9380 0060 STS i,R24
(0064) break;
AF C047 RJMP 0x00F7
(0065) case 3: //单双八拍方式驱动
(0066) if(i%2) //A、AB、B、BC、C、CD、D、DA驱动
B0 E012 LDI R17,2
B1 9100 0060 LDS R16,i
B3 940E 02F2 CALL mod8u
B5 2300 TST R16
B6 F169 BEQ 0x00E4
(0067) {
(0068) if(i!=7)
B7 9180 0060 LDS R24,i
B9 3087 CPI R24,7
BA F0E9 BEQ 0x00D8
(0069) PORTC |= (1<<(i/2))|(1<<(i/2+1));
BB E022 LDI R18,2
BC E030 LDI R19,0
BD 2F08 MOV R16,R24
BE 2711 CLR R17
BF 940E 02BC CALL div16s
C1 0128 MOVW R4,R16
C2 0192 MOVW R18,R4
C3 5F2F SUBI R18,0xFF
C4 4F3F SBCI R19,0xFF
C5 E001 LDI R16,1
C6 E010 LDI R17,0
C7 940E 0314 CALL lsl16
C9 0118 MOVW R2,R16
CA E001 LDI R16,1
CB E010 LDI R17,0
CC 0192 MOVW R18,R4
CD 940E 0314 CALL lsl16
CF 0128 MOVW R4,R16
D0 2842 OR R4,R2
D1 2853 OR R5,R3
D2 B225 IN R2,0x15
D3 2433 CLR R3
D4 2824 OR R2,R4
D5 2835 OR R3,R5
D6 BA25 OUT 0x15,R2
D7 C015 RJMP 0x00ED
(0070) else
(0071) PORTC |= (1<<(i/2))|1;
D8 9110 0060 LDS R17,i
DA 9516 LSR R17
DB E001 LDI R16,1
DC 940E 031B CALL lsl8
DE 2F80 MOV R24,R16
DF 6081 ORI R24,1
E0 B225 IN R2,0x15
E1 2A28 OR R2,R24
E2 BA25 OUT 0x15,R2
(0072) }
E3 C009 RJMP 0x00ED
(0073) else
(0074) {
(0075) PORTC |= 1<<(i/2);
E4 9110 0060 LDS R17,i
E6 9516 LSR R17
E7 E001 LDI R16,1
E8 940E 031B CALL lsl8
EA B225 IN R2,0x15
EB 2A20 OR R2,R16
EC BA25 OUT 0x15,R2
(0076) }
(0077) i++;
ED 9180 0060 LDS R24,i
EF 5F8F SUBI R24,0xFF
F0 9380 0060 STS i,R24
(0078) if(i>=8)i=0;
F2 3088 CPI R24,0x8
F3 F018 BCS 0x00F7
F4 2422 CLR R2
F5 9220 0060 STS i,R2
(0079) break;
(0080) default:break;
F7 940C 030F JMP pop_xgset300C
_bj_fsf:
a --> R10
F9 940E 030A CALL push_xgset300C
FB 2EA0 MOV R10,R16
(0081) }
(0082) }
(0083)
(0084) /****************************
(0085) * 反转操作函数 *
(0086) * 入 口:a 三种工作方式 *
(0087) ****************************/
(0088) void bj_fsf(unsigned char a)
(0089) {
(0090) switch(a)
FC 2D4A MOV R20,R10
FD 2755 CLR R21
FE 3041 CPI R20,1
FF E0E0 LDI R30,0
100 075E CPC R21,R30
101 F079 BEQ 0x0111
102 3042 CPI R20,2
103 E0E0 LDI R30,0
104 075E CPC R21,R30
105 F109 BEQ 0x0127
106 3043 CPI R20,3
107 E0E0 LDI R30,0
108 075E CPC R21,R30
109 F409 BNE 0x010B
10A C049 RJMP 0x0154
10B 3044 CPI R20,4
10C E0E0 LDI R30,0
10D 075E CPC R21,R30
10E F409 BNE 0x0110
10F C093 RJMP 0x01A3
110 C092 RJMP 0x01A3
(0091) {
(0092) case 1: //单四拍方式驱动
(0093) PORTC |= 1<<(3-i); //D、C、B、A驱动
111 9020 0060 LDS R2,i
113 E013 LDI R17,3
114 1912 SUB R17,R2
115 E001 LDI R16,1
116 940E 031B CALL lsl8
118 B225 IN R2,0x15
119 2A20 OR R2,R16
11A BA25 OUT 0x15,R2
(0094) i++;
11B 9180 0060 LDS R24,i
11D 5F8F SUBI R24,0xFF
11E 9380 0060 STS i,R24
(0095) if(i>=4)i=0;
120 3084 CPI R24,4
121 F408 BCC 0x0123
122 C080 RJMP 0x01A3
123 2422 CLR R2
124 9220 0060 STS i,R2
(0096) break;
126 C07C RJMP 0x01A3
(0097) case 2: //双四拍方式驱动
(0098) if(i!=4) //AD、CD、BC、AB驱动
127 9180 0060 LDS R24,i
129 3084 CPI R24,4
12A F091 BEQ 0x013D
(0099) PORTC |= (1<<(3-i))|(1<<(4-i));
12B 2E38 MOV R3,R24
12C E014 LDI R17,4
12D 1B18 SUB R17,R24
12E E001 LDI R16,1
12F 940E 031B CALL lsl8
131 2E20 MOV R2,R16
132 E013 LDI R17,3
133 1913 SUB R17,R3
134 E001 LDI R16,1
135 940E 031B CALL lsl8
137 2E30 MOV R3,R16
138 2832 OR R3,R2
139 B225 IN R2,0x15
13A 2823 OR R2,R3
13B BA25 OUT 0x15,R2
13C C00B RJMP 0x0148
(0100) else
(0101) PORTC |= (1<<(i-1))|1;
13D 9110 0060 LDS R17,i
13F 5011 SUBI R17,1
140 E001 LDI R16,1
141 940E 031B CALL lsl8
143 2F80 MOV R24,R16
144 6081 ORI R24,1
145 B225 IN R2,0x15
146 2A28 OR R2,R24
147 BA25 OUT 0x15,R2
(0102) i++;
148 9180 0060 LDS R24,i
14A 5F8F SUBI R24,0xFF
14B 9380 0060 STS i,R24
(0103) if(i>=5)i=1;
14D 3085 CPI R24,5
14E F408 BCC 0x0150
14F C053 RJMP 0x01A3
150 E081 LDI R24,1
151 9380 0060 STS i,R24
(0104) break;
153 C04F RJMP 0x01A3
(0105) case 3: //单双八拍方式驱动
(0106) if(i%2) //DA、D、CD、C、BC、B、AB、A驱动
154 E012 LDI R17,2
155 9100 0060 LDS R16,i
157 940E 02F2 CALL mod8u
159 2300 TST R16
15A F061 BEQ 0x0167
(0107) {
(0108) PORTC |= 1<<(3-i/2);
15B 9020 0060 LDS R2,i
15D 9426 LSR R2
15E E013 LDI R17,3
15F 1912 SUB R17,R2
160 E001 LDI R16,1
161 940E 031B CALL lsl8
163 B225 IN R2,0x15
164 2A20 OR R2,R16
165 BA25 OUT 0x15,R2
(0109) }
166 C032 RJMP 0x0199
(0110) else
(0111) {
(0112) if(i)
167 9020 0060 LDS R2,i
169 2022 TST R2
16A F109 BEQ 0x018C
(0113) PORTC |= (1<<(3-i/2))|(1<<(4-i/2));
16B E022 LDI R18,2
16C E030 LDI R19,0
16D 2D02 MOV R16,R2
16E 2711 CLR R17
16F 940E 02BC CALL div16s
171 0128 MOVW R4,R16
172 E024 LDI R18,4
173 E030 LDI R19,0
174 1B20 SUB R18,R16
175 0B31 SBC R19,R17
176 E001 LDI R16,1
177 E010 LDI R17,0
178 940E 0314 CALL lsl16
17A 0118 MOVW R2,R16
17B E023 LDI R18,3
17C E030 LDI R19,0
17D 1924 SUB R18,R4
17E 0935 SBC R19,R5
17F E001 LDI R16,1
180 E010 LDI R17,0
181 940E 0314 CALL lsl16
183 0128 MOVW R4,R16
184 2842 OR R4,R2
185 2853 OR R5,R3
186 B225 IN R2,0x15
187 2433 CLR R3
188 2824 OR R2,R4
189 2835 OR R3,R5
18A BA25 OUT 0x15,R2
18B C00D RJMP 0x0199
(0114) else
(0115) PORTC |= (1<<(3-i/2))|1;
18C 9020 0060 LDS R2,i
18E 9426 LSR R2
18F E013 LDI R17,3
190 1912 SUB R17,R2
191 E001 LDI R16,1
192 940E 031B CALL lsl8
194 2F80 MOV R24,R16
195 6081 ORI R24,1
196 B225 IN R2,0x15
197 2A28 OR R2,R24
198 BA25 OUT 0x15,R2
(0116) }
(0117) i++;
199 9180 0060 LDS R24,i
19B 5F8F SUBI R24,0xFF
19C 9380 0060 STS i,R24
(0118) if(i>=8)i=0;
19E 3088 CPI R24,0x8
19F F018 BCS 0x01A3
1A0 2422 CLR R2
1A1 9220 0060 STS i,R2
(0119) break;
(0120) case 4:
(0121)
(0122) default:break;
1A3 940C 030F JMP pop_xgset300C
(0123) }
(0124) }
(0125)
(0126) /****************************
(0127) * 定时器1配置函数 *
(0128) * 工作模式:普通模式 *
(0129) * 工作方式:溢出中断 *
(0130) * 预 分 频:64 *
(0131) * 时钟频率:外部7.3728MHZ *
(0132) ****************************/
(0133) void timer1_init(void)
(0134) {
(0135) TCCR1B = 0x00;
_timer1_init:
1A5 2422 CLR R2
1A6 BC2E OUT 0x2E,R2
(0136) TCNT1H = zhuansu>>8;
1A7 9020 0063 LDS R2,zhuansu
1A9 9030 0064 LDS R3,zhuansu+1
1AB 2C23 MOV R2,R3
1AC 2433 CLR R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -