【單片機】步進電機控制
- 一、操作目的
- 二、操作内容
- 三、預備知識
- 四、操作接線圖
- 五、程式框圖
- 六、程式清單
- 七、代碼詳解
一、操作目的
了解步進電機控制的基本原理,掌握步進電機轉動程式設計方法。
二、操作内容
讀取顯示器上顯示的正、反轉指令,轉速(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);
}
}
}