标题:
51单片机控制步进电机的转动,加减速,停止,反转
[打印本页]
作者:
xueren
时间:
2013-7-19 02:23
标题:
51单片机控制步进电机的转动,加减速,停止,反转
51单片机控制步进电机的转动,加减速,停止,反转,单双八拍工作方式:A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度)
#include <reg52.h>
sbit inc=P3^2;
sbit dec=P3^3;
sbit zhzhd=P3^6;
sbit fazhd=P3^7;
bit flag=1;
unsigned char t=0x00; //表正反速度
void delay(unsigned int t);
void motor_ffw();
unsigned char code led7code[]=
{0x81,0xe7,0x92,0xc2,0xe4,0xc8,0x88,0xe3,0x00,0xc0};
unsigned int num=0;
unsigned char code FFW[8]={0x40,0x60,0x20,0x30,0x10,0x18,0x08,0x48};
unsigned char code FFZ[8]={0x48,0x08,0x18,0x10,0x30,0x20,0x60,0x40}; //反转
void main()
{
EA=1;
IT0=1;
EX0=1;
IT1=1;
EX1=1;
TMOD=0x06;
TL0=0xff;
TH0=0xff;
TR0=1;
ET0=1;
P3=0x3f;
P0=led7code[num%10];
while(1)
{
motor_ffw();
}
}
void motor_ffw() /* 步进电机驱动*/ //
{
unsigned char i;
int j;
while(1)
{
for(j=0;j<12;j++) //12个周期转一圈
{ for (i=0; i<8; i++) //一个周期转30度
{
if(flag==1)
P2 = FFW[i]; //取数据
else
P2 = FFZ[i];
delay(t); //t调节转速
}
}
}
}
void int0(void) interrupt 0
{
EX0=0;
delay(10);
if(inc==0)
{
num++;
P0=led7code[num%10];
if(num%10!=0&&flag){zhzhd=0;fazhd=1;}
else if (num%10==0){zhzhd=0;fazhd=0;}
else {zhzhd=1;fazhd=0;}
switch(num%10)
{
case 0:t=0x00;break;
case 1:t=0x12;break;
case 2:t=0x11;break;
case 3:t=0x10;break;
case 4:t=0x09;break;
case 5:t=0x08;break;
case 6:t=0x07;break;
case 7:t=0x06;break;
case 8:t=0x05;break;
case 9:t=0x04;break;
}
}
while(!inc);
EX0=1;
}
void int1(void) interrupt 2
{
EX1=0;
delay(10);
if(dec==0)
{
num--;
if(num==65535)num=65529;
P0=led7code[num%10];
if(num%10!=0&&flag){zhzhd=0;fazhd=1;}
else if (num%10==0){zhzhd=0;fazhd=0;}
else {zhzhd=1;fazhd=0;}
if(num==65535)num=65529;
switch(num%10)
{
case 0:t=0x00;break;
case 1:t=0x12;break;
case 2:t=0x11;break;
case 3:t=0x10;break;
case 4:t=0x09;break;
case 5:t=0x08;break;
case 6:t=0x07;break;
case 7:t=0x06;break;
case 8:t=0x05;break;
case 9:t=0x04;break;
}
}
while(!dec);
EX1=1;
}
void huanx(void) interrupt 1
{
ET0=0;
TR0=0;
delay(10);
if(P3^4==0)
{
if(flag==1) {flag = 0;zhzhd=1;delay(500);fazhd=0;}
else {flag = 1;fazhd=1;delay(500);zhzhd=0;}
}
while(!(P3^4));
ET0=1;
TR0=1;
}
// 延时程序
void delay(unsigned int t)
{
unsigned int k;
while(t--)
{
for(k=0; k<80; k++);
}
}
复制代码
作者:
朗朗繁星
时间:
2013-7-22 09:26
楼主用的是仿真还是开发板的
作者:
星期天
时间:
2013-7-25 14:43
昨天用的28BYJ-48电机做了一个实验,四相八拍的,但转速特别慢,一分钟最多十圈的样子,问下楼主这款电机额定转速就是这么多么?
作者:
lxa0
时间:
2015-3-31 14:43
楼主有汇编的吗?
没学过c
看不懂呀
作者:
lxa0
时间:
2015-3-31 14:44
星期天 发表于 2013-7-25 14:43
**** 作者被禁止或删除 内容自动屏蔽 ****
我也买了一个28BYJ-48电机
正在学习呢
能把你的代码发来看看吗?
谢谢
作者:
成森林
时间:
2015-4-8 10:12
学习来了,正在学习呢
作者:
6ningning
时间:
2015-4-12 14:24
学习了。谢谢。
作者:
nieli12345
时间:
2015-9-20 16:39
漂亮 这就是我想要的
作者:
qxuem
时间:
2016-10-20 20:41
请问上面的数组是什么意思呢
作者:
sxxy
时间:
2018-5-11 00:28
请问楼主,点触式限位开关怎样接在单片机上实现往复运动哦?
作者:
99312312
时间:
2018-5-20 21:41
初学者在此谢过
作者:
宇明先生
时间:
2018-5-21 16:55
代码先复制去试试了
作者:
sfgccy
时间:
2018-5-21 21:15
开发板的,不错,多谢楼主
作者:
贺烨
时间:
2018-5-21 21:21
强 6666666666
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1