贴下程序如下,求大神补上,字数限制,一部分定义没写,用的是C51
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char speed=5; //步进电机的转速
unsigned char code clockWise[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x0d}; //八拍方式驱动,顺序为A AB B BC C CD D DA
unsigned int a; //a即想要转的圈数
unsigned char b;
unsigned int c;
uchar time;
void DC_motor_run() //普通的5V小直流电机
{
IN1=1;
IN2=0;
TMOD=0x01;//定时器0工作方式1
TH0=0xff;//(65536-10)/256;//赋初值定时
TL0=0xf7;//(65536-10)%256;//0.01ms
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
while(1)
{
;
}
}
void tim0() interrupt 1
{
TR0=0;//赋初值时,关闭定时器
TH0=0xff;//(65536-10)/256;//赋初值定时
TL0=0xf7;//(65536-10)%256;//0.01ms
TR0=1;//打开定时器
time++;
if(time>=100) time=0;//1khz
if(time<=70) PWM=0;//占空比%30
else PWM=1;
}
void delay(unsigned char z) //电机延时程序
{
unsigned char x,y;
for(x=0;x<z;x++)
for(y=0;y<80;y++);
}
void step_motor1_clockwise(a) //步进电机1顺时针旋转
{
for (c=0; c<8*64*a; c++)
{
for (b=0; b<8; b++)
{
P1=clockWise[b];
delay(speed);
}
}
}
void step_motor1_counterclockwise(a) //步进电机1逆时针旋转
{
for (c=0; c<8*64*a; c++) //用的是28BYJ-48步进电机
{
for (b=0; b<8; b++)
{
P1=clockWise[8-b];
delay(speed);
}
}
}
void main()
{
; //大神帮忙写下主程序,实现功能为一开始step_motor1正向旋转3周,同时DC_motor开始转动;正转三周完成后step_motor1开始反转三周,这段时间内DC_motor保持转动,反转完成后DC_motor也同时停止。小白实在是不会,自己写的程序试了很久,都是DC_motor一直在转动,step_motor1动都不动。求解救。
}
首先纠正你的几个错误:
1、clockWise[] 最后一拍错了吧,0x0d 改成 0x09 才对;
2、DC_motor_run() 里面的while(1){;} 去掉,否则步进电机怎么转;
3、step_motor1_counterclockwise() 中的 P1=clockWise[8-b]; 改成 P1=clockWise[7-b]; 才对,否则会出现下标越界的问题,因为b的取值是0-7,[8-b]就不对了;
主函数很简单:
这样应该就可以了,具体步进电机的转动圈数你根据实际调试结果修改里面的延时就可以了。
如有问题,欢迎继续提问。
51单片机控制步进电机
我们采用P1口来采集ADC0832的8位数据,用P0.0口控制步进电机动作,利用T0的时间中断来采集P1口的ADC0832数据并做出比较后设置步进电机启动标志位start=1;并设置他的运行频率,当然,楼主没说怎么比较,我这就只是写了个简单的例子,一通百通,希望对你有帮助 下面是程序:include <reg51.h> \/\/选用...
如何用c51编写51单片机控制步进电机转动程序
(51h)=30h;(52h)=50h;因为ret指令返回时,出栈的结果是高地址=(52h)=50h;而低地址=(51h)=30h;故最终结果pc值是5030h;
51单片机两驱驱动小车怎么能让两个电机,转速不一样,就是一个快一个慢...
直流电机的话用PWM控制就可以分别控制两个电机速度,使其大小不一致没有问题。步进电机的话,是控制两个电机的变化频率不一样速度就不一样了。
51单片机怎么让直流电机转动
一般而言,所有单片机的端口驱动能力都有限,还有电机的额定电压也许会比单片机的供电电压高,直接驱动电机有困难。这时候要想驱动电机,就必须根据电机的额定电压和额定功率采用合适的功率器件去驱动。下边的电路图是我工程上实际使用的,可以正反转,脉宽调制的话还可以调速。
51单片机开发板如何驱动直流电机
1、从贴图看,该开发板有步进电机驱动电路。2、开发板上一般有驱动步进电机的驱动芯片,采用ULN2003的较多,这可以驱动步进电机,有的开发板上有直流电机驱动芯片,采用L298等芯片。3、现在利用该开发板,没有直流电机的专门驱动电路,但是ULN2003驱动步进电机,当然也可以驱动直流电机,只要编程时给其中的...
51单片机控制步进电机正反转、加减速
51单片机控制步进电机正反转、加减速 我本来想实现步进电机自由调速的,可现在的程序如果先加速就不能减速了,如果先减速就不能加速了并且减几下就变得很慢了(经测试上下限都是可以正常速度运转的)求各位路过的大侠指点... 我本来想实现步进电机自由调速的,可现在的程序如果先加速就不能减速了,如果先减速就不能...
求用51型的单片机控制步进电机,要求步进电机转90度后停5秒,再转90度...
驱动器有两种,一种是直接控制各个绕组的,如有4个绕组,就要4个IO引脚信号,驱动只是功率放大 另一种是带脉冲分配的,单片机发过来一串方波脉冲,脉冲个数决定转动的步数,另外输出一个控制正转和反转的信号 这两种驱动器的单片机程序当然是不一样的 用C语言编程很简单:(第一种驱动器)for(i=0;i<...
51单片机可以直接驱动步进电机么
51单片机不能直接驱动步进电机,因为单片机的输出的是数字信号,不是驱动电流,所以需要外加驱动,舵机是可以通过单片机直接控制的PWM控制。51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最...
求51单片机控制步进电机,实现其间歇运动的程序,最好要有C语言的_百度...
void qudong(unsigned char t,bit flag) \/\/ t范围0~4控制转速,flag表示正反转 { unsigned char zz,i;if(t) \/\/ 先判断t是否为0,如果是,就没必要进行下面的判断 { if(flag) \/\/flag=1;为正转 { switch(t) \/\/ 选出几级速度 { case 1: zz=4;break;case 2: zz=...
在51单片机开发板上,插上步进电机。。。
电流小一些,系统可以工作。其中一种可能的电路 就是 51单片机直接连接 ULN2003一类的达灵顿管驱动步进电机,就会有上述问题,但是如果电源供电能力不太差,不至于系统不能工作。建议:测量一下工作后复位前后的电压;换一个供电能力强一些的电源试试看。