欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
利用超聲波避障問題,小車沒反應為什么呀,求大佬
[打印本頁]
作者:
隨風飄揚4859
時間:
2018-12-1 02:08
標題:
利用超聲波避障問題,小車沒反應為什么呀,求大佬
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit Left_moto_pwm =P1^6; //接驅動模塊ENA 使能端,輸入PWM信號調節速度
sbit Right_moto_pwm =P1^5; //接驅動模塊ENB
sbit P21=P1^0; //接電機IN1
sbit P22=P1^1; //接電機IN2
sbit P23=P1^2; //接電機IN3
sbit P24=P1^3; //接電機IN4
sbit EchoPin=P3^6; //超聲波管腳定義
sbit TrigPin=P3^7;
uchar pwm_val_left =0;//變量定義
uchar pwm_val_right =0;//變量定義
uchar push_val_left =0;//左電機占空比N/10
uchar push_val_right=0;//右電機占空比N/10
uint distance;
uint count;
void delayus(uint i) //延時秒函數
{
while(i--);
}
/*******************************************
延時函數
********************************************/
void delay(uint z) //延時函數
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/************************************************************************/
/* PWM調制電機轉速 */
/************************************************************************/
/* 左電機調速 */
/*調節push_val_left的值改變電機轉速,占空比 */
void pwm_out_left_moto(void)
{
if(pwm_val_left<=push_val_left)
Left_moto_pwm=1;
else
Left_moto_pwm=0;
if(pwm_val_left>=10)
pwm_val_left=0;
}
/******************************************************************/
/* 右電機調速 */
void pwm_out_right_moto(void)
{
if(pwm_val_right<=push_val_right)
Right_moto_pwm=1;
else
Right_moto_pwm=0;
if(pwm_val_right>=10)
pwm_val_right=0;
}
/***************************************************/
/************************************************************************/
void run(void) //前進函數
{
push_val_left =3; //PWM 調節參數1-10 1為最慢,10是最快 改這個值可以改變其速度
push_val_right =3; //PWM 調節參數1-10 1為最慢,10是最快 改這個值可以改變其速度
P21=1;
P22=0;
P23=1;
P24=0;
}
/*********************************************************/
void stop(void) //停止函數
{
P21=1;
P22=1;
P23=1;
P24=1;
}
/************************************************************************/
void left()//左轉函數
{
push_val_left =2; //PWM 調節參數1-10 1為最慢,10是最快 改這個值可以改變其速度
push_val_right =4; //PWM 調節參數1-10 1為最慢,10是最快 改這個值可以改變其速度
P21=0;
P22=1;
P23=1;
P24=0;
}
/************************************************************************/
void right()//右轉函數
{
push_val_left =4; //PWM 調節參數1-10 1為最慢,10是最快 改這個值可以改變其速度
push_val_right =2; //PWM 調節參數1-10 1為最慢,10是最快 改這個值可以改變其速度
P21=1;
P22=0;
P23=0;
P24=1;
}
/************************************************************************/
void spin_right()//原地右轉函數
{
push_val_left =3; //PWM 調節參數1-10 1為最慢,10是最快 改這個值可以改變其速度
push_val_right =3; //PWM 調節參數1-10 1為最慢,10是最快 改這個值可以改變其速度
P21=1;
P22=0;
P23=0;
P24=1;
}
/************************************************************************/
void spin_left()//原地左轉函數
{
push_val_left =3; //PWM 調節參數1-10 1為最慢,10是最快 改這個值可以改變其速度
push_val_right =3; //PWM 調節參數1-10 1為最慢,10是最快 改這個值可以改變其速度
P21=0;
P22=1;
P23=1;
P24=0;
}
/************************************************************************/
void back()//后退函數
{
push_val_left =3; //PWM 調節參數1-10 1為最慢,10是最快 改這個值可以改變其速度
push_val_right =3; //PWM 調節參數1-10 1為最慢,10是最快 改這個值可以改變其速度
P21=0;
P22=1;
P23=0;
P24=1;
}
/************************************************************************/
///*TIMER0中斷服務子函數產生PWM信號*/
void timer0()interrupt 1
{
TH0=(65536-800)/256; //1MS定時
TL0=(65536-800)%256;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void timer1()interrupt 3
{
count++;
TH1=(65536-100)/256; //100us
TL1=(65536-100)%256;
}
void ultrasonic_trigger()
{
TrigPin=1;
delayus(15);
TrigPin=0;
}
int measure_Distance()
{
uint distance;
uchar l;
uint h,y;
ultrasonic_trigger();
while(!EchoPin); //觸發超聲波測距后,等待電平變為高電平,計時開始
TR1=1;
while(EchoPin); //超聲波回波后,等待電平變成低電平,計時結束
TR1=0;
l=TL1;
h=TH1;
y=(h<<8)+1;
y=y-0xfce0; //us部分 fc66
distance=y+100*count; //計算總時間,us部分+計時器計數的次數(每次100us)
TL1=0xe0; //66
TH1=0xfc;
distance=distance/58; //換算公式:us/58=cm 即0.017us=cm
TrigPin=0;
count=0;
return distance;
}
/***************************************************
主函數
***************************************************/
void main(void)
{
TMOD=0X01;
TH0=(65536-800)/256;
TL0=(66536-800)%256;
EA=1;
ET0=1;
TR0=1;
TMOD|=0x10; //定時器1工作方式
TH1=(65536-800)/256; //1ms定時,裝入初值
TL1=(66536-800)%256;
ET1=1; //允許T1中斷
TrigPin=0; //初始化超聲波管腳
while(1)
{
measure_Distance();
delayus(100);
if(distance>35)
{
run();
}
else if(distance>=25&&distance<=35)
{
run();
}
else if(distance<25)
{
spin_right();
stop();
delayus(100);
measure_Distance();
delayus(100);
if (distance>=25)
{
run();
}
else if (distance<25)
{
spin_left();
stop();
delayus(100);
if (distance>=25)
{
run();
}
else if(distance<25)
{
spin_left();
stop();
delayus(100);
}
}
}
}
}
作者:
15986262852
時間:
2018-12-1 07:51
那就試一試其他的
作者:
new_hand
時間:
2018-12-1 09:56
一部分一部分的看,先把超聲波測得的距離串口打印出來,看下超聲波測距有沒有問題,再看小車的運動有沒有問題,再調試邏輯
作者:
hello_liu
時間:
2018-12-1 15:58
先把距離顯示出來,驗證邏輯對不對,看看符不符合實際需要結果
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1