#include <reg52h>
#define uchar unsigned char
#define uint unsigned int
uchar key_l,key,i;
uchar code temp1[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
uchar code temp2[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
uchar code aa[16]=" :";
uchar code smg[]=" shun zhuan mian kuai gen kuai ting zhi fan zhuan ";
sbit e=P2^6;
sbit rs=P2^4;
sbit rw=P2^5;
void delay(int tt)
{
while(tt--);
}
void w_cmd(uchar dd)
{
rs=0;
rw=0;
e=0;
delay(50);
P0=dd;
e=1;
delay(50);
e=0;
delay(50);
}
void w_dat(uchar dd)
{
rs=1;
rw=0;
e=0;
delay(50);
P0=dd;
e=1;
delay(50);
e=0;
}
void init(uchar smg4[],uchar time[])
{
w_cmd(0x38);
delay(2000);
w_cmd(0x38);
delay(500);
w_cmd(0x38);//注意顺序 ,设置工作方式,显示模式设置
delay(500);
w_cmd(0x08);//注意顺序,关闭显示
w_cmd(0x01);//清屏
w_cmd(0x07);//光标·画面滚动模式设置
w_cmd(0x0c);//显示及光标模式设置
w_cmd(0x80);//
for(i=0;i<16;i++)
w_dat(time[i]);
w_cmd(0x80+0X40);
for(i=0;i<16;i++)
w_dat(smg4[i]);
}
void Tb(uchar smg[],uchar n,uchar s,uchar l,uchar d)
{
unsigned char m;
w_cmd(0x82);
for(m=n;m<s;m++)
w_dat(smg[m]);
w_cmd(0x80+0X42);
for(m=l;m<d;m++)
w_dat(smg[m]);
}
void main()
{
init(aa,aa);
while(1)
{
P1=0xf0;
key_l=P1;
if(key_l!=0xf0)
{
delay(100);
if(key_l!=0xf0)
{
P1=key_l|0x0f;
key=P1;
}
}
switch(key)
{
case 0xee: Tb(smg,0,10,11,21);
for(i=0;i<8;i++)
{
P2=temp1[i];
delay(500);
}
break;
case 0xde:Tb(smg,0,10,19,29);
for(i=0;i<8;i++)
{
P2=temp1[i];
delay(300);
}
break;
case 0xbe:Tb(smg,0,10,30,40);
for(i=0;i<8;i++)
{
P2=temp1[i];
delay(100);
}
break;
case 0x7e:P2=0xff;Tb(smg,0,10,39,49); break;
case 0xed:Tb(smg,50,60,11,21);
for(i=0;i<8;i++)
{
P2=temp2[i];
delay(200);
}
break;
case 0xdd:Tb(smg,50,60,19,29);
for(i=0;i<8;i++)
{
P2=temp2[i];
delay(120);
}
break;
case 0xbd: P2=0xff;Tb(smg,50,60,40,50); break;
}
}
}
控制换相顺序:
TABLE_F:
DB 0F1H,0F3H,0F2H,0F6H,0F4H,0FCH,0F8H,0F9H
DB 00 ;正转结束
TABLE_R:
DB 0F9H,0F8H,0FCH,0F4H,0F6H,0F2H,0F3H,0F1H
DB 00 ;反转结束
控制电机的转向
MOV DPTR,#TABLE_F
MOVC A,@A+DPTR
MOV P1,A
MOV DPTR,#TABLE_R
MOVC A,@A+DPTR
MOV P1,A
步进电机的速度控制
DELAY:
MOV R5,RATE
DEL2:
MOV R7,#5
DEL3:
MOV R6,#250
DJNZ R6,$
DJNZ R7,DEL3
DJNZ R5,DEL2
RET
步进电机的总转动角度控制
FFW:
MOV R3,#5
MOV R0,#00H
MOV R1,#12
FFW1:
MOV A,R0
MOV DPTR,#TABLE_F
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY
INC RO
JNZ FFW1
MOV RO,#OOH
DJNZ R1,FFW1
MOV R1,#12
DJNZ R3,FFW1
MOV P1,#0F0H
RET
TABLE_F:
DB 0F3H,0F6H,0FCH,0F9H
DB 00H
TABLE_R:
DB 0F9H,0FCH,0F6H,0F3H
DB 00H
步进电机的加减速控制
加速启动
FFW_RISE:
MOV RATE,#10H
MOV R0,#00H
FFW1:
MOV A,R0
MOV DPTR,#TABLE_F
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY
INC RO
JNZ FFW1
MOV RO,#00H
MOV A,RATE
DEC A
MOV RATE,A
CJNE A,#1,FFW1
恒速启动
FFW_CONSTANT:
MOV R1,#0FFH
FFW2:
MOV A,R0
MOV DPTR,#TABLE_F
MOVC A,@A+DPTR
MOV P1,A
LCALL DEALY
INC RO
JNZ FFW2
MOV RO,#00H
DJNZ R1,FFW2
减速停止过程
FFW_FALL:
MOV RO,#00H
FFW3: MOV A,R0
MOV DPTR,#TABLE_F
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY
INC R0
JNZ FFW3
MOV RO,#00H
MOV A,RATE
INC A
MOV RATE,A
CJNE A,#10H,FFW3
RET
设计思路:
1、分析功能需求:四个按键控制步进电机的四种状态,那么必须要在程序中有IO口按键扫描程序;
而且步进电机的控制一定要先设置好定时器。
2、功能模块定义:四个按键对应四个函数,每个函数实现不同功能,对于正反转,先定义控制电机每一步时P0口的数据列表,把列表地址赋给DPTR,即TAB1,和TAB2,分别为正转和反转的数据列表,当按下按键1、2的时候,分别把对应的地址赋给DPTR,然后在定时器1的ISR中,轮询把数据列表中的数据一次发送给P0口控制步进电机;对于按键3、4,就是简单设置TR1,控制定时器1的打开与关闭。
大体思路就是这样,楼主发的这个程序不是很完善,只能实现基本功能,切不可用于实际工程应用,因为没有考虑到按键电流的消斗和按键冲突的处理,所以会不稳定,存在安全隐患
这个是由细分和齿数决定的。
方法一:步进电机细分为1/2,1/3,1/4,1/51/16的计算方法。
首先确定要走的行程或者是齿数。如要走12MM,就是72度,或者是50齿数,每一齿也是=12MM。
其次要确定电机的步距角,下面以50齿数,二相电机细分1/2,步距角18的为例(通常二相电机采用18和72,三相电机采用12)。
计算方法:360/50=72(也就是一齿为72度)
72/12=4(也就是一齿需要4个脉冲)2(以1/2细分为例)=8,也就是一齿需要8个脉冲,假如要走三齿就是24个脉冲。
方法二:步进电机细分为整数(400,500,600)的计算方法。
首先确定要走的行程或者是齿数。如要走12MM,就是72度,或者是50齿数,每一齿也是=12MM。
其次要确定电机的步距角,下面以50齿数,三相电机细分3000,步距角12的为例。
计算方法:360/50=72(也就是一齿为72度)
72/12=6(也就是一齿需要6个脉冲)
360/12=300(也就是一圈需要300个脉冲)
3000/300=106=60,也就是一齿需要60个脉冲,假如要走三齿就是180个脉冲。
注:细分最好使用能除以“一圈所需要的脉冲”等于整数的细分,如3000/300=10
#include<reg51h>
#define uchar unsigned char
sbit key=P3^2;
sbit dir=P0^3;
sbit pluse=P0^2;
sbit en=P0^4;
void delay(int a)
{
while(a--);
}
main()
{
uchar i;
en=0;
pluse=0;
while(1)
{
if(key==0)
{
delay(1000);
if(key==0);
{
while(key==0);
for(i=0;i<200;i++)
{
dir=0;
en=1;
pluse=~pluse;
delay(800);
}
}
}
dir=1;
en=0;
pluse=0;
}
}
以上就是关于关于51单片机控制步进电机编程(c语言),求助全部的内容,包括:关于51单片机控制步进电机编程(c语言),求助、5V步进电机 28YBJ-48驱动电路设计程序怎么写、51系列单片机 程序设计 用4个开关控制步进电机进行启动停止正转和反转等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)