如何用单片机AT89S52控制直流电机最好有实际电路图和程序
展开全部
这是我以前做的,图上传不了,你给个邮箱,我发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--);
}
#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--);
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
正反转是不
可以联系我
可以联系我
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询