标题:
基于51单片机的步进电机控制以及仿真
[打印本页]
作者:
a597507774
时间:
2018-1-8 19:08
标题:
基于51单片机的步进电机控制以及仿真
给你一段简单的程序代码,控制步进电机的,不过你要好好看看程序的编写,以适应你的硬件(主要是连线),你可以在实现这个的基础上实现你所说的目标,个人觉得你参考这个程序然后自己实现你所说的功能比较好:
#include <reg52.h>
unsigned char code F_Rotation[4]={0x08,0x10,0x20,0x40};//正转表格
unsigned char code B_Rotation[4]={0x40,0x20,0x10,0x08};//反转表格
void Delay(unsigned int i)//延时
{
while(--i);
}
main()
{
unsigned char i;
while(1)
{
for(i=0;i<4;i++) //4相
{
P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表格
Delay(500); //改变这个参数可以调整电机转速
}
}
}
复制代码
我编了一个程序 ,让单片机发100个脉冲,之后电机就停止转动。但是把单片机、驱动器、电机连起来,运行的时候,步进电机一直转,没有出现预期的停止。我的驱动器的脉冲负接 P1^2,驱动器的脉冲正接+5V。
#include<reg52.h>
#include <intrins.h>
#define VALUE 40
sbit sp = P1^2;
unsigned int a;
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main()
While(1)
{
a=0;
while(1)
{ sp=0;
delay(10);
sp=1;
delay(10);
a++;
if(a==100)
{
sp=0
break;
}
}
}
复制代码
电路图:
程序;
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code s[]={ 0x88,0x22,0x44,0x11 };
void delay(uint z)
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{ int i;
while(1)
{ for(i=0;i<4;i++)
{ P2=s[i];
delay(200);
}
}
}
#include<reg51.h>
sbit k1=P1^1; //启动
sbit k2=P1^0; //正反转
sbit k3=P1^2; //加速
sbit k4=P1^3; //减速
unsigned int x=50000;
unsigned char i=0;
unsigned char code table[6]={0x01,0x03,0x02,0x06,0x04,0x05};//单双六拍
void motor();
void main()
{
TMOD=0x01;
TH0=-x>>8; //
TL0=-x%256; //
TCON=0x10;
IE=0x82;
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-=1;
if(i>5) i=5;}
P2=table;
}
else P2=0;
}
复制代码
51单片机控制的4相步进电机的C语言程序
#include <AT89X51.H>
unsigned char code table[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9,0x00,0xf1,0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0x00};
unsigned char temp,temp_old;
unsigned char key;
unsigned char i,j,k,m,s;
void delay(int i)
{
for(m=i;m>0;m--)
for(j=250;j>0;j--)
for(k=10;k>0;k--);
}
void saomiao()
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case 0x0e:
key=1;
break;
case 0x0d:
key=2;
break;
case 0x0b:
key=3;
break;
case 0x07:
key=4;
break;
}
temp=P3;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
}
}
P3=0xff;
P3_5=0;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case 0x0d:
key=5;
break;
case 0x0b:
key=6;
break;
case 0x07:
key=7;
break;
}
temp=P3;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
}
}
}
void main(void)
{
while(1)
{
saomiao();
if(key==1)
{ P1=0;
P2=0;
saomiao();
}
if(key==2)
{
temp_old=key;
for(s=0;s<8;s++)
{ P2=table[s];
P1_4=0;
delay(13);
saomiao();
if(key!=temp_old)
{
P1_4=1;
break;
}
}
}
if(key==3)
{
temp_old=key;
for(s=0;s<8;s++)
{ P2=table[s];
P1_5=0;
delay(5);
saomiao();
if(key!=temp_old)
{
P1_5=1;
break;
}
}
}
if(key==4)
{
temp_old=key;
for(s=0;s<8;s++)
{ P2=table[s];
P1_6=0;
delay(20);
saomiao();
if(key!=temp_old)
{
P1_6=1;
break;
}
}
}
if(key==5)
{
temp_old=key;
for(s=9;s<17;s++)
{ P2=table[s];
P1_7=0;
delay(13);
saomiao();
if(key!=temp_old)
{
P1_7=1;
break;
}
}
}
if(key==6)
{
temp_old=key;
for(s=9;s<17;s++)
{ P2=table[s];
P1_5=0;
delay(5);
saomiao();
if(key!=temp_old)
{
P1_5=1;
break;
}
}
}
if(key==7)
{
temp_old=key;
for(s=9;s<17;s++)
{ P2=table[s];
P1_6=0;
delay(20);
saomiao();
if(key!=temp_old)
{
P1_6=1;
break;
}
}
}
}
}
复制代码
步进电机驱动程序.docx
2018-1-8 19:07 上传
点击文件名下载附件
下载积分: 黑币 -5
333.66 KB, 下载次数: 48, 下载积分: 黑币 -5
步进电机驱动程序(51)
作者:
李成Lic
时间:
2018-1-27 04:31
好资料,51黑有你更精彩
作者:
lindeijun1
时间:
2020-2-15 12:15
谢谢楼主分享!!!
作者:
lindeijun1
时间:
2020-2-15 20:15
谢谢楼主分享!!!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1