如何用单片机AT89S52控制直流电机最好有实际电路图和程序

如题所述

  对基于MCS-51系列单片机实现直流电机调速系统进行研究和设计,能够在不同按钮的作用下分别实现电机的启动、停止、正转、反转、加速、减速控制;能够实现对直流电机的PWM的调速设计。增大占空比,增加转速,减小占空比,减小转速。

  通过按键的输入,对控制器发出指令,由此来输出电机的启停、正反转、以及加减速和LED的显示。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-07
这是我以前做的,图上传不了,你给个邮箱,我发PCB或者照片给你

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

void delay(uchar);
/*************位声明函数**************/
sbit in1=P0^1;//控制左边轮子
sbit in2=P0^2;
sbit in3=P0^4;//控制右边轮子
sbit in4=P0^5;
sbit ena=P0^0;//使能左边轮子
sbit enb=P0^3;//使能右边轮子

sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;

uchar pwm1,pwm2,a,b,flag=0;

/*************初始化函数**************/
void init_t0()
{
TMOD=0X01;
TH0=(65536-6000)/256;
TL0=(65536-6000)%256;
EA=1;
ET0=1;
TR0=1;
}

/********前进函数*****/
void qianjin()
{
in1=0;
in2=1;
in3=0;
in4=1;
ena=1;
enb=1;
a=19;
while(1)
{
if(pwm1==a)
{
ena=0;
enb=0;
}
if(pwm1==20)
{
pwm1=0;
ena=1;
enb=1;

}
while(~P0)
// delay(5);
// while(~P0)
return;
}

}

/********后退函数*****/
void houtui()
{
in1=1;
in2=0;
in3=1;
in4=0;
ena=1;
enb=1;
a=19;
while(1)
{
if(pwm1==a)
{
ena=0;
enb=0;
}
if(pwm1==20)
{
pwm1=0;
ena=1;
enb=1;

}
while(~P0)
// delay(5);
// while(~P0)
return;
}

}
/*************控制右转函数**************/
void controlright()
{
in1=0;
in2=1;
in3=0;
in4=1;
ena=1;
enb=1;
while(1)
{
a=19;b=0;
if(pwm1==a)
{
ena=0;
}
if(pwm1==20)
{
pwm1=0;
ena=1;
}

if(pwm2==b)
{
enb=0;
}
if(pwm2==20)
{
pwm2=0;
enb=1;
}
while(~P0)
// delay(5);
// while(~P0)
return;
}
}

/*************控制左转函数**************/
void controlleft()
{
in1=0;
in2=1;
in3=0;
in4=1;
ena=1;
enb=1;
while(1)
{
a=0;b=19;
if(pwm1==a)
{
ena=0;
}
if(pwm1==20)
{
pwm1=0;
ena=1;
}
if(pwm2==b)
{
enb=0;
}
if(pwm2==20)
{
pwm2=0;
enb=1;
}
while(~P0)
// delay(5);
// while(~P0)
return;
}
}

/*************主函数**************/
void main()
{
init_t0();
while(1)
{

if(key1==0)
{
delay(5);
if(key1==0)
{
// while(!key1);
// delay(5);
// while(!key1);
flag=0;
}
}

if(key2==0)
{
delay(5);
if(key2==0)
{
// while(!key2);
// delay(5);
// while(!key2);
flag=1;
}
}

if(key3==0)
flag=2;

if(key4==0)
flag=3;
switch(flag)
{
case 0:qianjin();
break;
case 1:houtui();
break;
case 2: controlright();
break;
case 3: controlleft();
break;
}
}
}

/*************定时器0中断1工作方式**************/
void timer0()interrupt 1
{
TH0=(65536-6000)/256;
TL0=(65536-6000)%256;
pwm1++;
pwm2++;
}

void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}本回答被提问者采纳
第2个回答  2011-06-07
正反转是不
可以联系我