百度知道 - 信息提示

日期:2025-01-12 22:04:30 人气:1

百度知道 - 信息提示

    A+
热门评论

跪求51单片机控制28BYJ-48步进电机原理图及程序 要求有正反转,能控制电机转动的度数

/******************************************************* ULN2003驱动5V减速步进电机程序 Target:STC89C52RC-40C Crystal:12MHz Author:战神单片机工作室 Platform:51&avr单片机最小系统板+ULN2003步进电机驱动套件 ******************************************************* 接线方式: IN1 ---- P00 IN2 ---- P01 IN3 ---- P02 IN4 ---- P03 + ---- +5V - ---- GND *********************/ #include #define uchar unsigned char #define uint unsigned int #define MotorData P0 //步进电机控制接口定义 uchar phasecw[4] ={0x08,0x04,0x02,0x01};//正转 电机导通相序 D-C-B-A uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反转 电机导通相序 A-B-C-D //ms延时函数 void Delay_xms(uint x) { uint i,j; for(i=0;i<x;i++) for(j=0;j<112;j++); } //顺时针转动 void MotorCW(void) { uchar i; for(i=0;i<4;i++) { MotorData=phasecw[i]; Delay_xms(4);//转速调节 } } //逆时针转动 void MotorCCW(void) { uchar i; for(i=0;i<4;i++) { MotorData=phaseccw[i]; Delay_xms(4);//转速调节 } } //停止转动 void MotorStop(void) { MotorData=0x00; } //主函数 void main(void) { uint i; Delay_xms(50);//等待系统稳定 while(1) { for(i=0;i<500;i++) { MotorCW(); //顺时针转动 } MotorStop(); //停止转动 Delay_xms(500); for(i=0;i<500;i++) { MotorCCW(); //逆时针转动 } MotorStop(); //停止转动 Delay_xms(500); } }

阅读全文

单片机控制步进电机要求:有加速、减速、停止、正转、反转按钮,电机是四相五线,控制两个步进电机,c程序

我用的是控制一个步进电机的,这个是我以前写的,你的要求在下面的程序做修改就行了;程序如下: #include #define uchar unsigned char #define uint unsigned int //uchar table[]={0x18,0x30,0x60,0x48,0x48,0x60,0x30,0x18}; //二相励磁 uchar table[]={0x08,0x10,0x20,0x40,0x40,0x20,0x10,0x08}; //一相励磁 uchar num=0,maichong,zhengfan; sbit add_key=P3^2; //加速键 sbit reduce_key=P3^3; //减速键 sbit zhengfan_key=P3^4; //正反转按键 void delay(uint z) //延时1ms { uint x,y; for(x=z;x>0;x--) for(y=114;y>0;y--); } void only_key() //按键处理 { static uchar flag; //定义成静态只被定义一次 if(zhengfan_key==0) //检测正反按键是否被按下 { delay(5); if(zhengfan_key==0) { flag=~flag; //取反 if(flag==0) zhengfan=0; //正转,取数组前四位 else zhengfan=4; //反转,取数组后四位 while(!zhengfan_key); } } if(add_key==0) //检测加按键是否被按下 { delay(5); if(add_key==0) //消抖 { num++; //加速键按下,速度标志加1 if(num==4) //已达到最大值3 num=3; while(!add_key); } } if(reduce_key==0) //检测减按键是否被按下 { delay(5); if(reduce_key==0) { if(num!=0) num--; //减速键按下,速度标志减1 else num=0; //减速到0则保持 while(!reduce_key); } } } void deal() //根据速度标志进行数据处理 { switch(num) { case 0: P0=0x06; //数据管显示1 maichong=5; //转速最慢 break; case 1: P0=0x5b; //数据管显示2 maichong=4; break; case 2: P0=0x4f; //数据管显示3 maichong=3; break; case 3: P0=0x66; //数据管显示4 maichong=2; //转速最快 break; } } void start() //电机速度和正反控制处理 { uchar i,j; for(i=zhengfan;i<4+zhengfan;i++) { P1=table[i]; for(j=0;j<maichong;j++) //延时越小,转速越快,但也不得太小 delay(2); } } void main() { while(1) { only_key(); deal(); start(); } }

阅读全文