
求89c51与直流电动机的PWM调速的控制原理图和程序
2个回答
展开全部
给个邮箱,我发原理图给你,不知怎么搞的,照片传不上来
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uchar);
/*************位声明函数**************/
sbit in1=P2^0;//控制左边轮子
sbit in2=P2^1;
sbit in3=P2^2;//控制右边轮子
sbit in4=P2^3;
sbit ena=P2^4;//使能左边轮子
sbit enb=P2^5;//使能右边轮子
sbit key1=P0^0;
sbit key2=P0^1;
sbit key3=P0^2;
sbit key4=P0^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=P2^0;//控制左边轮子
sbit in2=P2^1;
sbit in3=P2^2;//控制右边轮子
sbit in4=P2^3;
sbit ena=P2^4;//使能左边轮子
sbit enb=P2^5;//使能右边轮子
sbit key1=P0^0;
sbit key2=P0^1;
sbit key3=P0^2;
sbit key4=P0^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--);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询