天天看點

【單片機】步進電機控制

【單片機】步進電機控制

  • ​​一、操作目的​​
  • ​​二、操作内容​​
  • ​​三、預備知識​​
  • ​​四、操作接線圖​​
  • ​​五、程式框圖​​
  • ​​六、程式清單​​
  • ​​七、代碼詳解​​

一、操作目的

了解步進電機控制的基本原理,掌握步進電機轉動程式設計方法。

二、操作内容

讀取顯示器上顯示的正、反轉指令,轉速(16級)和轉動步數後執行,轉動步數減為零時停止轉動。了解步進電機控制的基本原理,掌握步進電機轉動程式設計方法。

三、預備知識

步進電機驅動原理是通過它每相線圈中的電流的順序切換來使電機作步進式旋轉,驅動電路由脈沖信号來控制,是以調節脈沖信号的頻率便可改變步進電機的轉速,微電腦控制步進電機最适合。

四、操作接線圖

五、程式框圖

六、程式清單

#0FFH
  MOV 7EH,#11H
  MOV 7DH,#10H
  MOV 7CH,#10H
  MOV 7BH,#10H
  MOV 7AH,#10H
  MOV 79H,#10H
  MOV A,#89H
  MOV DPTR,#0FF23H
  MOVX @DPTR,A
  mov r0,#59h
  mov a,#7eh
  movx @r0,a
DOJ0:    
  MOV SP,#53H
DOJ6:    
  LCALL X2          ;調鍵掃顯示子程式
  JNC DOJ5                    ;功能鍵轉
  LCALL X3                    ;調數字鍵處理子程式
  MOV R1,#7EH
  SJMP DOJ6
DOJ5:    
  CJNE A,#16H,DOJ6            ;不是執行鍵轉
  MOV A,7AH
  SWAP A
  ORL A,79H
  MOV R6,A                    ;低位元組步距數送R6
  MOV A,7CH
  SWAP A
  ORL A,7BH
  MOV R7,A                     ;高位元組步距資料送R7
  MOV A,7EH
  CJNE A,#00H,DOJ2             ;判轉動方向
DOJ1:
  MOV P1,#03H                  ;順時針轉動
  LCALL DEL0Y
  LCALL GGJ0
  MOV P1,#06H  
  LCALL DEL0Y
  LCALL GGJ0
  MOV P1,#0CH
  LCALL DEL0Y
  LCALL GGJ0
  MOV P1,#09H
  LCALL DEL0Y
  LCALL GGJ0
  SJMP DOJ1
DOJ2:
  MOV P1,#09H            ;逆時針轉動
  LCALL DEL0Y
  LCALL GGJ0
  MOV P1,#0CH
  LCALL DEL0Y
  LCALL GGJ0
  MOV P1,#06H
  LCALL DEL0Y
  LCALL GGJ0
  MOV P1,#03H
  LCALL DEL0Y
  LCALL GGJ0
  SJMP DOJ2
DEL0Y:  
  MOV A,7DH          ;根據(7D)内容改變延時時間
  SWAP A
  MOV R2,A
  MOV R5,#80H
DEL1Y:  
  DJNZ R5,DEL1Y
  LCALL SSEE
  DJNZ R2,DEL1Y
  RET
GGJ0:    
  CJNE R7,#00H,GGJ1             ;步距數為0停止
  CJNE R6,#00H,GGJ1             ;不為0,減1後顯示
  AJMP DOJ4  
GGJ1:    
  DJNZ R6,DOJ3
  CJNE R7,#00H,DDJ8
DOJ4:    
  LCALL DOJ7
  SJMP DOJ4
DDJ8:    
  DJNZ R7,DOJ3
  AJMP DOJ4
DOJ3:    
  LCALL DOJ7
  RET
DOJ7:    
  MOV R0,#79H
  MOV A,R6
  LCALL PTDS5
  MOV A,R7
  LCALL PTDS5
  LCALL SSEE                     ;顯示
  RET
PTDS5:  
  MOV R1,A
  ACALL PTDS6
  MOV A,R1
  SWAP A
PTDS6:  
  ANL A,#0FH
  MOV @R0,A
  INC R0
  RET
  ORG 1D00H
X3:    
  MOV R4,A
  MOV R0,#59H
  MOVX A,@R0
  MOV R1,A
  MOV A,R4
  MOV @R1,A
  CLR A
  POP DPH
  POP DPL
  MOVC A,@A+DPTR
  INC DPTR
  CJNE A,01H,X30
  CLR A
  MOVC A,@A+DPTR
X31:    
  MOVX @R0,A
  INC DPTR
  PUSH DPL
  PUSH DPH
  RET
X30:    
  DEC R1
  MOV A,R1
  SJMP X31
X2:    
  MOV R6,#50H
X0:    
  ACALL XLE
  JNB ACC.5,XX0
  DJNZ R6,X0
  MOV R6,#20H
  MOV R0,#59H
  MOVX A,@R0
  MOV R0,A
  MOV A,@R0
  MOV R7,A
  MOV A,#10H
  MOV @R0,A
X1:    
  ACALL XLE
  JNB ACC.5,XX1
  DJNZ R6,X1
  MOV A,R7
  MOV @R0,A
  SJMP X2
XX1:    
  MOV R6,A
  MOV A,R7
  MOV @R0,A
  MOV A,R6
XX0:    
  RET
XLE:    
  ACALL DIS
  ACALL KEY
  MOV R4,A
  MOV R1,#48H
  MOVX A,@R1
  MOV R2,A
  INC R1
  MOVX A,@R1
  MOV R3,A
  MOV A,R4
  XRL A,R3
  MOV R3,04H
  MOV R4,02H
  JZ X10
  MOV R2,#88H
  MOV R4,#88H
X10:    
  DEC R4
  MOV A,R4
  XRL A,#82H
  JZ X11
  MOV A,R4
  XRL A,#0EH
  JZ X11
  MOV A,R4
  ORL A,R4
  JZ X12
  MOV R4,#20H
  DEC R2
  SJMP X13
X12:    
  MOV R4,#0FH
x11:    
  MOV R2,04H
  MOV R4,03H
X13:    
  MOV R1,#48H
  MOV A,R2
  MOVX @R1,A
  INC R1
  MOV A,R3
  MOVX @R1,A
  MOV A,R4
  RET
LS3:    
  DB 07H,04H,08H,05H,09H,06H,0AH
  DB 0BH,01H,00H,02H,0FH,03H,0EH
  DB 0CH,0DH
DIS:    
  PUSH DPH
  PUSH DPL
  SETB RS1
  MOV R0,#7EH
  MOV R2,#20H
  MOV R3,#00H
  MOV DPTR,#LS0
LS2:    
  MOV A,@R0
  MOVC A,@A+DPTR
  MOV R1,#21H
  MOVX  @R1,A
  MOV A,R2
  CPL A
  DEC R1
  MOVX @R1,A
  CPL A
  DEC R0
LS1:    
  DJNZ R3,LS1
  CLR C
  RRC A
  MOV R2,A
  JNZ LS2
  INC R1
  MOV A,#0FFH
  MOVX @R1,A
  CLR RS1
  POP DPL
  POP DPH
  RET
LS0:    
  DB  0C0H,0F9H,0A4H,0B0H,99H,92H
  DB  82H,0F8H,80H,90H,88H,83H,0C6H
  DB  0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH
KEY:    
  SETB RS1
  MOV R2,#0FEH
  MOV R3,#08H
  MOV R0,#00H
LP1:    
  MOV A,R2
  MOV R1,#20H
  MOVX @R1,A
  RL A
  MOV R2,A
  MOV R1,#22H
  MOVX A,@R1
  CPL A
  ANL A,#0FH
  JNZ LP0
  INC R0
  DJNZ R3,LP1
  MOV A,#20H              ;19H
  SJMP XP3
XP33:    
  MOV A,#20H
XP3:    
  CLR RS1
  RET
LP0:    
  CPL A
  JB ACC.0,XP0
  MOV A,#00H
  SJMP LPP
XP0:    
  JB ACC.1,XP1
  MOV A,#08H
  SJMP LPP
XP1:    
  JB ACC.2,XP2
  MOV A,#10H
  SJMP LPP
XP2:  
  JB ACC.3,XP33
  MOV A,#18H
LPP:    
  ADD A,R0
  CLR RS1
  CJNE A,#10H,LX0
LX0:
  JNC XP35
  MOV DPTR,#LS3
  MOVC A,@A+DPTR
XP35:  
  RET
  ORG 0D50H
SSEE:  
  SETB RS1
  MOV R5,#05H
SSE2:    
  MOV 30H,#20H
  MOV 31H,#7EH
  MOV R7,#06H
SSE1:    
  MOV R1,#20H
  MOV A,30H
  CPL A
  MOVX @R1,A
  MOV R0,31H
  MOV A,@R0
  MOV DPTR,#DDFF
  MOVC A,@A+DPTR
  MOV R1,#21H
  MOVX @R1,A
  MOV A,30H
  RR A
  MOV 30H,A
  DEC 31H
  MOV A,#0FFH      

七、代碼詳解

#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
unsigned char code mon51[3] _at_ 0x3b; //保留0X3B開始三個程式空間作全速中斷用
sbit P10 = P1 ^ 0;
sbit P11 = P1 ^ 1;
sbit P12 = P1 ^ 2;
sbit P13 = P1 ^ 3;

void delay(unsigned int j)
{
  while (j--)
    ;
}

void main(void)
{
  uchar aa;
  P1 = 0x00; //P1口初始化

  while (1)
  {
    uchar k = 0;

    for (k = 0; k < 200; k++)
    {
      P10 = 0;
      P11 = 1;
      P12 = 1;
      P13 = 1;
      delay(250);
      P10 = 1;
      P11 = 0;
      P12 = 1;
      P13 = 1;
      delay(250);
      P10 = 1;
      P11 = 1;
      P12 = 0;
      P13 = 1;
      delay(250);
      P10 = 1;
      P11 = 1;
      P12 = 1;
      P13 = 0;
      delay(250);
    }
    for (k = 0; k < 200; k++)
    {
      P10 = 1;
      P11 = 1;
      P12 = 1;
      P13 = 0;
      delay(250);
      P10 = 1;
      P11 = 1;
      P12 = 0;
      P13 = 1;
      delay(250);
      P10 = 1;
      P11 = 0;
      P12 = 1;
      P13 = 1;
      delay(250);
      P10 = 0;
      P11 = 1;
      P12 = 1;
      P13 = 1;
      delay(250);
    }
  }
}