求一C51单片机控制 步进电机调速程序

我不懂编程,找到一程序控制步进电机,但程序是控制2相4拍的,没有脉冲,使能,方向输出,下面程序测试虽然通过,只能正转和反转,不能调速,怎样修改?请高手帮我修改一下,万分感谢!
#include<reg52.h>
/*------宏定义------*/
#define uchar unsigned char
#define uint unsigned int
uchar keycan=0; //键值
int y=20;//定义转动速度,数值越大电机转速越慢反之则快

sbit shi_neng=P1^0; // 使能控制位
sbit fang_shi=P1^1; // 工作方式控制位
sbit fang_xiang=P1^2;// 旋转方向控制位
sbit mai_chong=P1^3; // 脉冲控制位
sbit zheng_zhuan=P2^0; // 正转
sbit fan_zhuan=P2^1; // 反转
sbit jia_su=P2^2; // 加速
sbit jian_su=P2^3; // 减速

sbit P2_0=P2^0;//正转按键
sbit P2_1=P2^1;//反转按键
sbit P2_2=P2^2;//电机加速
sbit P2_3=P2^3;//电机减速

void delay(i)//延时函数
{
uchar j,k;

for(j=0;j<i;j++)
for(k=0;k<100;k++);
}

void zrun()// 正转运行
{
uchar z;
for(z=0;z<8;z++)
{
delay(y);
}
}

void frun()// 反转运行
{
uchar z;
for(z=0;z<8;z++)
{
delay(y);
}
}

main()
{
while(1)
{
if(P2_3==0) // 电机减速
{
shi_neng=1; // 使能控制位
fang_shi=1; // 工作方式控制位
fang_xiang=1;// 旋转方向控制位
mai_chong=1; // 脉冲控制位
while(1)
{
if(zheng_zhuan==0){fang_xiang=1;}
if(fan_zhuan==0){fang_xiang=0;}
mai_chong=~mai_chong; //输出时钟脉冲

}
}
{
delay(10);
while(!P2_2)
delay(100);
y++;
y++;
if(y>=100)y=100;
}
if(P2_2==0)
{ // 电机加速
delay(10);
while(!P2_3)
delay(10);
y--;
y--;
if(y<=4)y=4;

}

if(P2_0==0) //如果电机正转按键按下
{
delay(10);
while(!P2_0)
keycan=1; //键值等于1
}
if(P2_1==0) //如果电机反转按键按下
{
delay(10);
while(!P2_1)
keycan=1; //键值等于2
}
switch (keycan)
{
case 1: zrun(); //键值等于1 正转
break;
case 2: frun(); //键值等于2 反转
break;

}

}
}

会不会是程序中的y变化太小了?你连续多按几次加速按键试一试,观察一下有没有变化。
或者将程序中的
y++;
y++;
改为:
y+=4(或者10,12,13,14...试一试)
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-10-12
你可以咨询深圳市中软创芯电子有限公司
专业提供电子产品开发设计、成熟控制器方案、自动化设备控制咨询、承接控制板加工等技术服务
第2个回答  2011-10-08
程序中有调速了呀,P2.2加速,P2.3减速

如何用c51编写51单片机控制步进电机转动程序
A=( 50h ),SP=( 50h ),(51H)=( 30h ),(52H)=(50h ),PC=( 5030h )pc总是指向下一条指令的首地址的。但是在返回的时候得看堆栈中的数了。上面程序执行完之后:(A)=50H;sp=50H(因为在程序中,sp减了两次,后来又加了两次,在程序最后ret有在返回的时候减了两次...

51单片机控制步进电机正反转、加减速
while(1);}void time_0 () interrupt 1{EA=0;TR0=0; motor();if(x<65000&&x>36000) \/\/上下限{if(!k3) x=x-2000; \/\/加速else if(!k4) x=x+2000;} \/\/减速TH0=-x>>8;TL0=-x%256;TR0=1;EA=1; }void motor(){if(!k1){ if(!k2) \/\/正反转{i+=1;if(i>5) i=0;}else {i...

我有一51单片机控制步进电机调速程序,转速太慢,22转\/分钟,提到100转\/分...
脉冲间隔只靠delay(Y)来控制,把Y的值变为原来的1\/5即可。

步进电机用单片机控制转动
很简单,看你的意思,你应该已经有了与之配套的【步进电机驱动器】,那就可以用单片机I\/O口控制了,一路输出CP脉冲信号,一路输出DIR方向信号,电源接好后,连通电路,就OK了。简单的C51调试程序:一个大的FOR循环里包含:【C P脉冲信号】:可以用一个有限的FOR循环(循环时间可控制在几秒钟左右)...

单片机步进电机控制
include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit KEY1 = P3^2; \/\/步进电机逆时针方向转 sbit KEY2 = P3^3; \/\/步进电机顺时针方向转 sbit KEY3 = P3^4; \/\/步进电机调速 uchar step = 0; bit AB_flag = 0; unsigned char code A_...

如何用单片机控制步进电机步数
通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的;同时通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。一、步进电机常识 常见的步进电机分三种:永磁式(PM),反应式(VR)和混合式(HB),永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度或15度;反应式...

你好,我有一个57步进电机和C51的学习板,想让电机动起来,该如何做呢...
步进电机只要用直流电源和电机就能动起来 用手把电机线顺序搭接下直流电源 一个线圈得电 就走到它的一步 再同另一个线圈 就又一个一步 不过是一步步走的 只要你顺序对 就能往前往后走。你有学习板 上面应该有对应的驱动装置 所谓驱动就是将收到的脉冲信号等 转换为电机的步序 四相为例a-b-c-...

c51 单片机 四相五线 步进电机 怎么停止?
\/\/根据你的程序j减到零就会停止,不存在一直转下去的情况。\/\/要做到随时停止的话,可以加一个按键切换启停就OK了 main(){ unsigned char i,flag;unsigned int j;j=512*2; \/\/512转一圈 \/\/\/ P0=0XFF;\/\/关掉数码管的位选信号。阻止数码管受到P0口信号的影响。Delay(500);WELA=1; \/\/...

单片机如何控制电机转速
利用单片机的定时器TIMER_A(TA)中断产生脉冲信号,通过在响应的中断程序中实现步进电机步数和圈数的准确计数,通过PWM实现转速控制。可以利用P10端口的中断关闭TA中断程序,并推入堆栈,停止电机;P11中断则开启TA中断,堆栈推入程序计器(PC),开启电机。P31端口输出高电平由PMM8713的U/D端口控制电机的转向...

怎样用单片机控制电机的转数?能够实现不现不用转把吗?
1、首先电机要是可调速的;2、用两个按钮,分别接入单片机的两个输入脚,一个按钮作为增速计数用,一个作为减速计数用。每按一次增速按钮,单片机计数一次,并输出控制信号控制电机增加速度,减速按钮反之。3、例如用单片机pwm控制电机转速:带注释软件清单 ;===使用单元设定=== \/\/...使用单元设定 DIS0...

相似回答