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

📄 stepmotor.lst

📁 用M16驱动步进电机 实现三种驱动方式 单四拍驱动、双四拍驱动 单双八拍驱动
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -