【单片机】步进电机控制
【单片机】步进电机控制
- 一、操作目的
- 二、操作内容
- 三、预备知识
- 四、操作接线图
- 五、程序框图
- 六、程序清单
- 七、代码详解
一、操作目的
了解步进电机控制的基本原理,掌握步进电机转动编程方法。
二、操作内容
读取显示器上显示的正、反转命令,转速(16级)和转动步数后执行,转动步数减为零时停止转动。了解步进电机控制的基本原理,掌握步进电机转动编程方法。
三、预备知识
步进电机驱动原理是通过它每相线圈中的电流的顺序切换来使电机作步进式旋转,驱动电路由脉冲信号来控制,所以调节脉冲信号的频率便可改变步进电机的转速,微电脑控制步进电机最适合。
四、操作接线图

五、程序框图

六、程序清单
ORG 0000HMOV P2,#0FFHMOV 7EH,#11HMOV 7DH,#10HMOV 7CH,#10HMOV 7BH,#10HMOV 7AH,#10HMOV 79H,#10HMOV A,#89HMOV DPTR,#0FF23HMOVX @DPTR,Amov r0,#59hmov a,#7ehmovx @r0,a
DOJ0: MOV SP,#53H
DOJ6: LCALL X2 ;调键扫显示子程序JNC DOJ5 ;功能键转LCALL X3 ;调数字键处理子程序MOV R1,#7EHSJMP DOJ6
DOJ5: CJNE A,#16H,DOJ6 ;不是执行键转MOV A,7AHSWAP AORL A,79HMOV R6,A ;低字节步距数送R6MOV A,7CHSWAP AORL A,7BHMOV R7,A ;高字节步距数据送R7MOV A,7EHCJNE A,#00H,DOJ2 ;判转动方向
DOJ1:MOV P1,#03H ;顺时针转动LCALL DEL0YLCALL GGJ0MOV P1,#06H LCALL DEL0YLCALL GGJ0MOV P1,#0CHLCALL DEL0YLCALL GGJ0MOV P1,#09HLCALL DEL0YLCALL GGJ0SJMP DOJ1
DOJ2:MOV P1,#09H ;逆时针转动LCALL DEL0YLCALL GGJ0MOV P1,#0CHLCALL DEL0YLCALL GGJ0MOV P1,#06HLCALL DEL0YLCALL GGJ0MOV P1,#03HLCALL DEL0YLCALL GGJ0SJMP DOJ2
DEL0Y: MOV A,7DH ;根据(7D)内容改变延时时间SWAP AMOV R2,AMOV R5,#80H
DEL1Y: DJNZ R5,DEL1YLCALL SSEEDJNZ R2,DEL1YRET
GGJ0: CJNE R7,#00H,GGJ1 ;步距数为0停止CJNE R6,#00H,GGJ1 ;不为0,减1后显示AJMP DOJ4
GGJ1: DJNZ R6,DOJ3CJNE R7,#00H,DDJ8
DOJ4: LCALL DOJ7SJMP DOJ4
DDJ8: DJNZ R7,DOJ3AJMP DOJ4
DOJ3: LCALL DOJ7RET
DOJ7: MOV R0,#79HMOV A,R6LCALL PTDS5MOV A,R7LCALL PTDS5LCALL SSEE ;显示RET
PTDS5: MOV R1,AACALL PTDS6MOV A,R1SWAP A
PTDS6: ANL A,#0FHMOV @R0,AINC R0RETORG 1D00H
X3: MOV R4,AMOV R0,#59HMOVX A,@R0MOV R1,AMOV A,R4MOV @R1,ACLR APOP DPHPOP DPLMOVC A,@A+DPTRINC DPTRCJNE A,01H,X30CLR AMOVC A,@A+DPTR
X31: MOVX @R0,AINC DPTRPUSH DPLPUSH DPHRET
X30: DEC R1MOV A,R1SJMP X31
X2: MOV R6,#50H
X0: ACALL XLEJNB ACC.5,XX0DJNZ R6,X0MOV R6,#20HMOV R0,#59HMOVX A,@R0MOV R0,AMOV A,@R0MOV R7,AMOV A,#10HMOV @R0,A
X1: ACALL XLEJNB ACC.5,XX1DJNZ R6,X1MOV A,R7MOV @R0,ASJMP X2
XX1: MOV R6,AMOV A,R7MOV @R0,AMOV A,R6
XX0: RET
XLE: ACALL DISACALL KEYMOV R4,AMOV R1,#48HMOVX A,@R1MOV R2,AINC R1MOVX A,@R1MOV R3,AMOV A,R4XRL A,R3MOV R3,04HMOV R4,02HJZ X10MOV R2,#88HMOV R4,#88H
X10: DEC R4MOV A,R4XRL A,#82HJZ X11MOV A,R4XRL A,#0EHJZ X11MOV A,R4ORL A,R4JZ X12MOV R4,#20HDEC R2SJMP X13
X12: MOV R4,#0FH
x11: MOV R2,04HMOV R4,03H
X13: MOV R1,#48HMOV A,R2MOVX @R1,AINC R1MOV A,R3MOVX @R1,AMOV A,R4RET
LS3: DB 07H,04H,08H,05H,09H,06H,0AHDB 0BH,01H,00H,02H,0FH,03H,0EHDB 0CH,0DH
DIS: PUSH DPHPUSH DPLSETB RS1MOV R0,#7EHMOV R2,#20HMOV R3,#00HMOV DPTR,#LS0
LS2: MOV A,@R0MOVC A,@A+DPTRMOV R1,#21HMOVX @R1,AMOV A,R2CPL ADEC R1MOVX @R1,ACPL ADEC R0
LS1: DJNZ R3,LS1CLR CRRC AMOV R2,AJNZ LS2INC R1MOV A,#0FFHMOVX @R1,ACLR RS1POP DPLPOP DPHRET
LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92HDB 82H,0F8H,80H,90H,88H,83H,0C6HDB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH
KEY: SETB RS1MOV R2,#0FEHMOV R3,#08HMOV R0,#00H
LP1: MOV A,R2MOV R1,#20HMOVX @R1,ARL AMOV R2,AMOV R1,#22HMOVX A,@R1CPL AANL A,#0FHJNZ LP0INC R0DJNZ R3,LP1MOV A,#20H ;19HSJMP XP3
XP33: MOV A,#20H
XP3: CLR RS1RET
LP0: CPL AJB ACC.0,XP0MOV A,#00HSJMP LPP
XP0: JB ACC.1,XP1MOV A,#08HSJMP LPP
XP1: JB ACC.2,XP2MOV A,#10HSJMP LPP
XP2: JB ACC.3,XP33MOV A,#18H
LPP: ADD A,R0CLR RS1CJNE A,#10H,LX0
LX0:JNC XP35MOV DPTR,#LS3MOVC A,@A+DPTR
XP35: RETORG 0D50H
SSEE: SETB RS1MOV R5,#05H
SSE2: MOV 30H,#20HMOV 31H,#7EHMOV R7,#06H
SSE1: MOV R1,#20HMOV A,30HCPL AMOVX @R1,AMOV R0,31HMOV A,@R0MOV DPTR,#DDFFMOVC A,@A+DPTRMOV R1,#21HMOVX @R1,AMOV A,30HRR AMOV 30H,ADEC 31HMOV A,#0FFHMOVX @R1,ADJNZ R7,SSE1DJNZ R5,SSE2CLR RS1RET
DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HDB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEHEND
七、代码详解
#include
#include #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);}}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
