|
#include"reg51.h"
#include<intrins.h>
#define PWM_T 100 //pwm周期100
unsigned char speed_L; //左輪脈寬調(diào)值
unsigned char speed_R; //右輪脈寬調(diào)值
unsigned char pwm_speed; //定義自加變量
unsigned long time; //讀取時(shí)間
unsigned long s;
unsigned long s1;
unsigned long s2; //保存計(jì)算距離
sbit DA_L=P3^6;
sbit DA_R=P3^7; //PWM高低電平輸出口
sbit L_1=P2^0;
sbit L_2=P2^1; //左電機(jī)
sbit R_1=P2^2;
sbit R_2=P2^3; //右電機(jī)
sbit RX=P1^0; //超聲波接收
sbit TX=P1^1; //超聲波發(fā)送
sbit RX_1=P1^2; ///超聲波接收
sbit TX_1=P1^3; //超聲波發(fā)送
sbit RX_2=P1^4; //超聲波接收
sbit TX_2=P1^5; //?超聲波發(fā)送
void delay(unsigned char x)
{
while(x--);
}
void count()
{
while(!RX);
TR0=1;
while(RX);
TR0=0;
time=TH0*256+TL0;
TH0=0;
TL0=0;
s=(time*1.7)/100;
}
void count1()
{
while(!RX_1);
TR0=1;
while(RX_1);
TR0=0;
time=TH0*256+TL0;
TH0=0;
TL0=0;
s1=(time*1.7)/100;
}
void count2()
{
while(!RX_2);
TR0=1;
while(RX_2);
TR0=0;
time=TH0*256+TL0;
TH0=0;
TL0=0;
s2=(time*1.7)/100;
}
void status(unsigned char i)
{
switch(i)
{
case 0: L_1=1; L_2=0; R_1=1; R_2=0; break; //前進(jìn)
case 1: L_1=0; L_2=1; R_1=0; R_2=1; break; //后退
case 2: L_1=1; L_2=0; R_1=0; R_2=1; break; //右轉(zhuǎn)
case 3: L_1=0; L_2=1; R_1=1; R_2=0; break; //左轉(zhuǎn)
case 4: L_1=0; L_2=0; R_1=0; R_2=0; break; //停止
}
}
void main()
{
TMOD|=0x11;
TH0=0;
TL0=0;
ET0=1;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
ET1=1;
EA=1;
TR1=1;
while(1)
{
TX=1;
delay(2);
TX=0;
count();
TX_1=1;
delay(2);
TX_1=0;
count1();
TX_2=1;
delay(2);
TX_2=0;
count2();
if(s<=20&&s1<=20&&s2<=20)
{
speed_L=100;
speed_R=100;
status(1);
}
else if(s1<=20&&s<=20&&s2>=20)
{
speed_L=20;
speed_R=100;
status(0);
}
else if(s1>=20&&s<=20&&s2<=20)
{
speed_L=100;
speed_R=20;
status(0);
}
else
{
speed_L=100;
speed_R=100;
status(0);
}
}
}
void csbyc() interrupt 1
{
}
void time0_pwm()interrupt 3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
if(pwm_speed<=PWM_T)
{
pwm_speed++;
}
else
{
pwm_speed=0;
}
if(pwm_speed<speed_L)
{
DA_L=1;
}
else
{
DA_L=0;
}
if(pwm_speed<speed_R)
{
DA_R=1;
}
else
{
DA_R=0;
}
}
/*加一個(gè)超聲波就能用,但是兩個(gè)以上就不行了,試了好多種方法了,兩個(gè)以上時(shí)pwm也能用。現(xiàn)在是程序燒進(jìn)去小車總保持第一個(gè)狀態(tài)有時(shí)候改了些東西就沒(méi)反應(yīng)了。求大神指點(diǎn)下,哪里出的毛病,想好幾天了,一點(diǎn)進(jìn)展都沒(méi)有。 */
|
|