本人是51单片机菜鸟,求助各位大神.

求一段控制占空比的小程序,可以被调用,如: void PWM_set(float x,float y) 。 x, y分别为两个电机的占空比,当调用PWM_set 函数时,只用给x,y一个值就能达到控制小车转向的目的。

谢谢。

#include<reg52.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
uchar i=0,j=0,t=0,k,m1,m2,tmp1,tmp2,temp;
sbit P10=P1^0;//循迹传感器最左有测得信号 低电平有效
sbit P11=P1^1;//循迹传感器次左有测得信号
sbit P12=P1^2;//循迹传感器中有测得信号
sbit P13=P1^3;//循迹传感器次右有测得信号
sbit P14=P1^4;//循迹传感器最右有测得信号
sbit s1=P2^2;//单片机输出到L298N控制电机左后退
sbit s2=P2^3;//单片机输出到L298N控制电机左前进
sbit s3=P2^4;//单片机输出到L298N控制电机右后退
sbit s4=P2^5;//单片机输出到L298N控制电机右前进
sbit en1=P2^0;
sbit en2=P2^1;
sbit qian=P1^6;
sbit ce=P1^7;
sbit beep=P3^0;
sbit choose=P3^1;
sbit zheng=P3^6;
sbit fu=P3^7;
sbit ceshi=P3^5;
sbit ceshi2=P3^4;
void Delay(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<113;j++)
{
;
}
}
}

void init()
{
TMOD=0x02; /* 设定T0的工作模式为2 */
TH0=0x9c; /* 装入定时器的初值 */
TL0=0x9c;
EA=1; /* 开中断 */
ET0=1; /* 定时器0允许中断 */
TR0=1; /* 启动定时器0 */

}
/* 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) */
void motor(uchar index, int speed)
{
if(speed>=-100 && speed<=100)
{
if(index==1) /* 电机1的处理 */
{
m1=abs(speed); /* 取速度的绝对值 */
if(speed>0) /* 速度值为正则正转 */
{
s1=1;
s2=0;
}
if(speed<0) /* 为负数则反转 */
{
s1=0;
s2=1;
}
}
if(index==2)
{
m2=abs(speed);
if(speed>0)
{
s3=1;
s4=0;
}
if(speed<0)
{
s3=0;
s4=1;
}
}
}
}

void main()
{
init();
zheng=1;
fu=0;
ceshi=0;
ceshi2=1;
P1=0xff;

if(choose==1)
while(1)
{
temp=(P1|0xe0);
switch(temp)
{
case 0xf7:i=1;motor(1,50);motor(2,0);break;
case 0xef:i=2;motor(1,50);motor(2,0);break;
case 0xe7:i=3;motor(1,50);motor(2,0);break;
case 0xe3:i=4;motor(1,50);motor(2,0);break;
case 0xf3:i=5;motor(1,50);motor(2,0);break;
case 0xfe:j=1;motor(1,0);motor(2,50);break;
case 0xfc:j=2;motor(1,0);motor(2,50);break;
case 0xf8:j=3;motor(1,0);motor(2,50);break;
case 0xf9:j=4;motor(1,0);motor(2,50);break;
case 0xfd:j=5;motor(1,0);motor(2,50);break;
case 0xfb:k=1;motor(1,30);motor(2,30);break;
case 0xf1:k=2;motor(1,30);motor(2,30);break;
case 0xe0:motor(1,30);motor(2,30);break;
case 0xff:if(i==1||i==2||i==3||i==4||i==5){i=0;motor(1,50);motor(2,0);}
if(j==1||j==2||j==3||j==4||j==5){j=0;motor(1,0);motor(2,50);}
if(k==1||k==2){k=0;motor(1,30);motor(2,30);}break;
default : break;
}
if(qian==0)
{
beep=0;
TR0=0;en1=0;en2=0;EA=0;ET0=0;
while(!qian);
TR0=1;en1=1;en2=1;EA=1;ET0=1;
beep=1;
}
if(ce==0)
{
beep=0;
TR0=0;en1=0;en2=0;EA=0;ET0=0;

Delay(2000);
TR0=1;en1=1;en2=1;EA=1;ET0=1;
beep=1;
while(ce==0)
{motor(1,15);
motor(2,15);
}
}
}
else
{
P0=0xff;
while(1)
{
switch(P0&0x1f)
{
case 0x11: motor(1,50);motor(2,50);Delay(1000);break;
case 0x12: motor(1,0);motor(2,50);Delay(1000);break;
case 0x14: motor(1,50);motor(2,0);Delay(1000);break;
case 0x18: motor(1,-50);motor(2,-50);Delay(1000);break;
default:motor(1,0);motor(2,0);break;
}
}
}

}

void timer0() interrupt 1 /* T0中断服务程序 */
{

if(t==0) /* 1个PWM周期完成后才会接受新数值 */
{
tmp1=m1;
tmp2=m2;
}
if(t<tmp1)
en1=1;
else
en1=0; /* 产生电机1的PWM信号 */

if(t<tmp2)
en2=1;
else
en2=0; /* 产生电机2的PWM信号 */

t++;
if(t>=100)
t=0; /* 1个PWM信号由100次中断产生 */
}

这个是可循迹智能小车的程序 你自己研究吧追问

我用这个程序调试了,但是仍然不成功。。。
可不可以帮我修改一下,我现在用的是4个st188传感器,由于是刚接触51不到1个星期的新手请大侠顺便告诉我接线图,谢谢,可高分追加

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-02
占空比就用定时器中断来控制就好了
第2个回答  2011-08-03
如果你用的是舵机,它的控制是20ms的脉冲,0.5~2.5分别是脉宽即高电平,还有你的舵机角度是多少,比如是180度的话,那就是0.5对应-90度,1对应-45度,1.5是中性位即停止,2对应45度2.5对应90度。你说的是同向控制即假设你左边舵机用的是0.5ms那么右边用的就是2.5ms就可以控制同向旋转了;
第3个回答  2011-08-02
顶楼上很不错!!!!1
第4个回答  2011-08-02
.
相似回答