51单片机,步进电机怎么实现循环正反转

我现在会按4*4矩阵按键来控制转多少度,以及停止工作,正转或者反转。

怎么实现不断正反转呢?

如果有时间回答的话,加减速又怎么处理,是通过扫描电机时间来控制么?
我用4相八拍控制。。。。。。

我的意思是比如我按一个按键,电机就开始不断正反转比如90度,然后再按另一个按键,电机就停止,能实现吗?

以下程序是我在实验中自己编写的,几乎全部都有详细注释,相信学过单片机的同学完全可以轻易读懂。
读者可进行一些修改,比如我使用的都是跳转指令,在进入加减速循环中读者完全可以改成调用指令。电机速度也可修改为无上下限。
并且判断按键过程也可有自己的方法,我的判断按下松开可能会比较麻烦。
数表中我设置的是每个脉冲转过9°,大家也可按照实际需要修改自己的数表。
这个程序我是参考了《单片机实用系统设计与仿真经典实例》(主编:周景润 刘晓霞)的P25,读者有兴趣可以去图书馆借阅此书。

ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV 30H,#05H ;加减速速度控制,控制延时循环次数(初值)
MOV DPTR,#TAB1 ;查表法对P2赋值
MOV R0,#03H ;P2初值
MOV R4,#00H ;查表指针值
MOV P2,R0 ;赋值
WAIT: MOV P0,#0FFH ;P0需先输出一个1才可输入
JNB P0.0,SONG3 ;检测按键是否按下,SONG的意思是按键是否松开,否则程序会混乱
JNB P0.1,SONG4 ;程序中SONG均是上述意思
SJMP WAIT ;如果不按键就不启动
SONG3: JB P0.0,ZHENG ;进入正转
SJMP SONG3 ;
SONG4: JB P0.1,FAN ;进入反转
SJMP SONG4 ;
ZHENG: MOV R4,#01H ;开始查表
LOOP1: JB P0.1,YUNXING1 ;检测是否要反转,如果未按反转键就正常运行
SONG1: JNB P0.1,FAN ;按下反转松开后进入反转
SJMP SONG1 ;
YUNXING1:MOV A,R4 ;查表
MOVC A,@A+DPTR ;
MOV P2,A ;
ACALL DELAY ;进入延时程序控制电机速度
JB P0.3,COOL1 ;检测是否按下减速按键,如果未按下再检测是否按下加速按键
SONG5: JNB P0.3,DOWN1 ;按下后进入延时程序中修改循环次数
SJMP SONG5 ;
COOL1: JB P0.2,NOMAL1 ;检测是否按下加速按键,未按下就正常运行
SONG6: JNB P0.2,UP1 ;按下加速键进入延时程序中修改循环次数
SJMP SONG6 ;
NOMAL1: INC R4 ;查下一个数据
CJNE R4,#09H ,LOOP1;表中数据查完一遍后将R4值复位,如未查完就不复位R4
SJMP ZHENG ;使正转循环
FAN: MOV R4,#07H ;反转R4初值
LOOP2: JB P0.0,YUNXING2 ;检测是否按下正转按键,如未按下正常运行反转程序
SONG2: JNB P0.0,ZHENG ;按下正转后松开按键进入正转程序
SJMP SONG2 ;
YUNXING2:MOV A,R4 ;开始查表
MOVC A,@A+DPTR ;
MOV P2,A ;
ACALL DELAY ;进入延时程序控制电机速度
JB P0.3,COOL2 ;检测是否按下减速按键如未按下就检测是否按下加速按键
SONG7: JNB P0.3,DOWN2 ;按下后进入延时程序中修改循环次数
SJMP SONG7 ;
COOL2: JB P0.2,NOMAL2 ;检测是否按下加速按键,未按下就正常运行
SONG8: JNB P0.2,UP2 ;按下后进入延时程序中修改循环次数
SJMP SONG8 ;
NOMAL2: DEC R4 ;循环查表
CJNE R4,#00H,LOOP2 ;数据查完一遍后复位重新查
SJMP FAN ;反转循环
DELAY: MOV R6,#05H ;
DD1: MOV R5,#080H ;
DD2: MOV R7,#05H ;
DD3: DJNZ R7,DD3 ;
DJNZ R5,DD2 ;
DJNZ R6,DD1 ;固定延时
DJNZ R1,DELAY ;通过改变延时程序的循环次数来控制电机速度
SPEED: MOV R1,30H ;每次循环都将速度值放在R1中
SJMP BACK ;
DOWN1: INC 30H ;速度减,因为循环次数+1
CJNE R1,#10H,NOMAL1;速度下限10,如果不到10可继续减速
MOV 30H,#10H ;如果达到下限,无法减速,始终是10
SJMP NOMAL1 ;返回正转循环中
UP1: DEC 30H ;速度加,因为循环次数-1
CJNE R1,#01H,NOMAL1;速度上限1,如果不到1可继续加速
MOV 30H,#01H ;如果速度到达上限,不可再加速,始终是1
SJMP NOMAL1 ;返回正转循环
DOWN2: INC 30H ;速度减,因为循环次数+1
CJNE R1,#10H,NOMAL2;速度下限10,如果不到10可继续减速
MOV 30H,#10H ;如果达到下限,无法减速,始终是10
SJMP NOMAL2 ;返回反转循环中
UP2: DEC 30H ;速度加,因为循环次数-1
CJNE R1,#01H,NOMAL2;速度上限1,如果不到1可继续加速
MOV 30H,#01H ;如果速度到达上限,不可再加速,始终是1
SJMP NOMAL2 ;返回反转循环中
BACK: RET ;延时子程序返回
TAB1: DB 00H,02H,06H,04H
DB 0CH,08H,09H,01H,03H ;控制各项通电顺序的数值表
END ;结束
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-04-13
单片机控制步进电机,我想你说的是两相步进电机,一般是控制其相序分配的顺逆从而控制正反转,一般而言,步进电机相序分配你可以做成一个数组比如step[]={0x03,0x06,0x0c,0x09},这样来说可以假设P0口是步进电机控制口,那么可以按如下方式来控制:
while(1)
{
for(i=0;i<4;i++)
{
if(fx==1)P0=step[i]; //正向
else P0=step[3-i]; //反向
delay(x); //x大小决定电机速度本回答被网友采纳
第2个回答  2014-03-28
单片机控制步进电机,我想你说的是两相步进电机,一般是控制其相序分配的顺逆从而控制正反转,一般而言,步进电机相序分配你可以做成一个数组比如step[]={0x03,0x06,0x0c,0x09},这样来说可以假设P0口是步进电机控制口,那么可以按如下方式来控制:
while(1)
{
for(i=0;i<4;i++)
{
if(fx==1)P0=step[i]; //正向
else P0=step[3-i]; //反向
delay(x); //x大小决定电机速度
}
}本回答被网友采纳
第3个回答  2014-03-28
弄一个WHILE循环 按键正反转去掉 改成延时控制或者其他方式控制就可以一直循环了啊,加减速改变方波频率就可以,也有可能你是用延时来输出的,那就改下延时时间。
第4个回答  2014-03-28
一段时间正传,一段时间反转,不断循环就是 不断正反转了。

51单片机,步进电机怎么实现循环正反转
SJMP ZHENG;使正转循环 FAN: MOV R4,#07H;反转R4初值 LOOP2:JB P0.0,YUNXING2;检测是否按下正转按键,如未按下正常运行反转程序 SONG2:JNB P0.0,ZHENG;按下正转后松开按键进入正转程序 SJMP SONG2;YUNXING2:MOV A,R4;开始查表 MOVC A,@A+DPTR;MOV P2,A;AC...

51单片机,如何给一个指令控制步进电机转动90度,再给另外一个指令,反转...
1、首先看看步进驱动器的细分设定,找出转动一圈需要的脉冲个数,再计算出转动90°需要的脉冲个数N;2、根据接线,使单片机的IO端口输出高电平或低电平,控制转动方向;3、根据需求的转动速度,设定定时器的定时常数,启动定时;4、在定时器的中断程序中,取反IO端口,如CPL P1.1,并计数。使单片机输...

51单片机控制步进电机正反转、加减速
我本来想实现步进电机自由调速的,可现在的程序如果先加速就不能减速了,如果先减速就不能加速了并且减几下就变得很慢了 (经测试上下限都是可以正常速度运转的) 求各位路过的大侠指点#include<reg51.h>sbit k1=P1^1; \/\/启动sbit k2=P1^0; \/\/正反转sbit k3=P1^2; \/\/加速sbit k4=P1^3; \/\/减速unsigned...

51系列单片机 程序设计 用4个开关控制步进电机进行启动停止正转和反转...
1、分析功能需求:四个按键控制步进电机的四种状态,那么必须要在程序中有IO口按键扫描程序;而且步进电机的控制一定要先设置好定时器。2、功能模块定义:四个按键对应四个函数,每个函数实现不同功能,对于正反转,先定义控制电机每一步时P0口的数据列表,把列表地址赋给DPTR,即TAB1,和TAB2,分别为正...

求51单片机步进电动机控制设计程序
(2)控制步51单片进电机的转向 如果给定工作方式正序换相通电,步进电机正转,如果按反序通电换相,则电机就反转。(3)控制51单片步进电机的速度 如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。两个脉冲的间隔越短,步进电机就转得越快。调整单片机发出的脉冲频率,就...

步进电机用单片机控制转动
这个要小到几分之一或几十分之一秒),然后再对CP端口取反;这样,单片机上电后,就会不断地延时,输出脉冲波了。【DIR方向信号】:可以在上述的CP脉冲信号的有限FOR循环结束后,停几秒,再对DIR端口取反; 这样,你的步进电机通电后就会在几秒钟内正转,停转几秒钟后再反转了,如此往复不断。

在51单片机中,如何用一个按键实现步进电机的正反转?驱动芯片用的是ULN2...
在程序里定义一个位变量flag,按下按键时对它取反,若flag为1则正转,为0则反转,就可以了

求用51型的单片机控制步进电机,要求步进电机转90度后停5秒,再转90度
驱动器有两种,一种是直接控制各个绕组的,如有4个绕组,就要4个IO引脚信号,驱动只是功率放大 另一种是带脉冲分配的,单片机发过来一串方波脉冲,脉冲个数决定转动的步数,另外输出一个控制正转和反转的信号 这两种驱动器的单片机程序当然是不一样的 用C语言编程很简单:(第一种驱动器)for(i=0;i<...

求51单片机控制步进电机程序
\/ void MOTOR(void){ \/\/步进电机正反转一步子程序 code unsigned char MOTOR_DB[]={0x00,0xb0,0x90,0xd0,0x50,0x70,0x60,0xe0,0xa0,0x00};\/\/定义电机输出编码 unsigned char i;MOIC=0; \/\/开电机电流 i=0; \/\/电机输出编码初值设00 CBB=10; \/\/设减小电机电流时间设为10...

8051单片机控制步进电机的转速、转向的研究思路???工作流程??_百度知...
我用的是L293D芯片驱动2个电机。举控制一个点击的例子:L293D有N1 N2 口分别接单片机I\/O口,用单片机控制N1 N2高低电平即可控制电机正反转。如:N1=1; N2=0 则电机正转,反之亦然。至于控制转速,L293有两个PWM使能口EN1,EN2,编写pwm占空比程序即可控制电机转速。这个我还在研究哦,我也是新手...

相似回答