百度知道 - 信息提示
用51单片机进行c语言步进电机控制。要求可以控制起停,可以控制正反转。
你不说你单片机的型号不好做的,因为电路都不一样,接口也不一样,我给你一个我的,你照着看看吧
#include"Reg52.H" /* 调用MCS51寄存器头文件 */
typedef unsigned char UINT8; /* 类型定义 */
typedef unsigned int UINT16;
/* 参数:PM35永磁电机,步进角为7.5度。
* 单双八拍工作方式:
* A-AB-B-BC-C-CD-D-DA (一个脉冲,转3.75度) */
UINT8 FORWARD_DATA_BUF[ 8 ] = { 0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09 }; /* 全速正转 */
UINT8 REVERSE_DATA_BUF[ 8 ] = { 0x09, 0x08, 0x0C, 0x04, 0x06, 0x02, 0x03, 0x01 }; /* 全速反转 */
void DelayMs( UINT16 Ms )//延时程序
{
UINT8 i;
while ( Ms-- )
{
for ( i = 0; i < 114; i++ ); /* 11.0592M,1Ms延时 */
}
}
void MOTOR_FORWARD( void )
{
UINT8 i;
UINT8 j;
for( i = 0; i < 12 ; i++ ) /* 正转一圈360度 */
{
for( j = 0; j < 8; j++ ) /* 8次转30度 */
{
P2 = FORWARD_DATA_BUF[ j ];
DelayMs( 3 ); /* 调整转速 */
}
}
P2 = 0; /* 停止转动 */
}
void MOTOR_REVERSE( void )
{
UINT8 i;
UINT8 j;
for( i = 0; i < 12 ; i++ ) /* 反转一圈360度 */
{
for( j = 0; j < 8; j++ ) /* 8次转30度 */
{
P2 = REVERSE_DATA_BUF[ j ];
DelayMs( 3 ); /* 调整转速 */
}
}
P2 = 0; /* 停止转动 */
}
void main( void )
{
UINT8 i;
P2 = 0;
while( 1 )
{
MOTOR_FORWARD(); /* 正转一圈 */
DelayMs( 1000 );
MOTOR_REVERSE();
DelayMs( 1000 ); /* 反转一圈 */
}
}
求单片机控制步进电机的C语言程序,急啊
#include
#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_Rotation[8]={0x08,0x18,0x10,0x30,0x20,0x60,0x40,0x48}; //顺时针转表格
unsigned char code B_Rotation[8]={0x48,0x40,0x60,0x20,0x30,0x10,0x18,0x08}; //逆时针转表格
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
void KEY(void)
{
if(KEY1 == 0) //按P3.2,实现步进电机的逆时针转动
{
Delay(15);
if(KEY1 == 0)
{
while(1)
{
if(KEY1 == 1)
{
Delay(15);
if(KEY1 == 1)
{
AB_flag = 0;
break;
}
}
}
}
}
if(KEY2 == 0) //按P3.3,实现步进电机的顺时针转动
{
Delay(15);
if(KEY2 == 0)
{
while(1)
{
if(KEY2 == 1)
{
Delay(15);
if(KEY2 == 1)
{
AB_flag = 1;
break;
}
}
}
}
}
if(KEY3 == 0) //按P3.4,实现步进电机的调速
{
Delay(15);
if(KEY3 == 0)
{
while(1)
{
if(KEY3 == 1)
{
Delay(15);
if(KEY3 == 1)
{
step++;
if(step == 3)
{
step = 0;
}
break;
}
}
}
}
}
}
main()
{
uchar i;
while(1)
{
KEY(); //按键处理函数
for(i=0;i<8;i++) //因为有8路的控制时序
{
if(AB_flag == 0)
{
P1 = A_Rotation[i]; //逆时针转动
}
else
{
P1 = B_Rotation[i]; //顺时针转动
}
Delay(2+step); //改变这个参数可以调整电机转速
}
}
}