標(biāo)題:
超聲波避障小車
[打印本頁(yè)]
作者:
anan111
時(shí)間:
2019-6-19 16:52
標(biāo)題:
超聲波避障小車
本帖最后由 anan111 于 2019-6-19 16:58 編輯
這是我自己做的超聲波避障小車。
1.51單片機(jī)
2.L298N驅(qū)動(dòng)板
3.電機(jī)2
4.差速輪2,萬(wàn)向輪1
enA,enB可不接
#include<reg52.h>
//定義L298N端口
sbit in1 = P0^0;
sbit in2 = P0^1;
sbit in3 = P0^2;
sbit in4 = P0^3;
sbit enA = P0^4;
sbit enB = P0^5;
//定義超聲波模塊端口
sbit Trig = P1^2;
sbit Echo = P1^3;
unsigned int distance_cm = 0; //距離
unsigned int overflow_count = 0; //溢出計(jì)數(shù)
unsigned int status = 0; //超聲波模塊狀態(tài)
unsigned int dis_count = 0; //計(jì)數(shù)
unsigned char tmp, dat, flat;
unsigned int num, model, c=0;
unsigned int speed = 100;
void chaoshengbo_init(void);
void GetDistance(void);
void delay(unsigned int z)
{
unsigned int x, y;
for(x = z; x > 0 ; x--)
for(y=110;y>0;y--)
;
}
void delay_us(unsigned int aa)
{
while(aa--);
}
//小車右轉(zhuǎn)
void right(unsigned char pwm)
{
enA = 1;
in1 = 0;
in2 = 1;
in3 = 0;
in4 = 0;
delay_us( pwm );
enA = 1;
in1 = 0;
in2 = 0;
in3 = 0;
in4 = 0;
delay_us( 100 - pwm );
}
void r(void)
{
enA = 1;
in1 = 0;
in2 = 1;
in3 = 0;
in4 = 0;
}
//小車左轉(zhuǎn)
void left(unsigned char pwm)
{
enA = 1;
in1 = 0;
in2 = 0;
in3 = 1;
in4 = 0;
delay_us( pwm );
enA = 1;
in1 = 0;
in2 = 0;
in3 = 0;
in4 = 0;
delay_us( 100 - pwm );
}
void l(void)
{
enA = 1;
in1 = 0;
in2 = 0;
in3 = 1;
in4 = 0;
}
//小車后退
void back(unsigned char pwm)
{
enA = 1;
enB = 1;
in1 = 1;
in2 = 0;
in3 = 1;
in4 = 0;
delay_us( pwm );
enA = 1;
in1 = 0;
in2 = 0;
in3 = 0;
in4 = 0;
delay_us( 100 - pwm );
}
void b(void)
{
enA = 1;
enB = 1;
in1 = 1;
in2 = 0;
in3 = 1;
in4 = 0;
}
//小車前進(jìn)
void forward(unsigned char pwm)
{
enA = 1;
enB = 1;
in1 = 0;
in2 = 1;
in3 = 0;
in4 = 1;
delay_us( pwm );
enA = 1;
in1 = 0;
in2 = 0;
in3 = 0;
in4 = 0;
delay_us( 100 - pwm );
}
void f(void)
{
enA = 1;
enB = 1;
in1 = 0;
in2 = 1;
in3 = 0;
in4 = 1;
}
//小車停止
void stop(void)
{
enB = 1;
in1 = 0;
in2 = 0;
in3 = 0;
in4 = 0;
}
void main(void)
{
chaoshengbo_init();
while(1)
{
b();
GetDistance();
if(distance_cm > 0 && distance_cm <= 15)
{
f();
delay(1000);
r();
delay(1000);
}
}
}
//超聲波模塊初始化
void chaoshengbo_init(void)
{
Trig = 0;
//TH2 = RCAP2H = 0;
//TL2 = RCAP2L = 0;
TH0 = TL0 = 0;
TR0 = 0; //關(guān)閉定時(shí)器2
ET0 = 1; //允許T2中斷
}
//超聲波模塊獲取距離
void GetDistance(void)
{
Trig = 1; //發(fā)送觸發(fā)信號(hào)
status = 1; //status狀態(tài)默認(rèn)位1
TH0 = 0;
TL0 = 0;
TR0 = 1; //打開定時(shí)器2
while(TL0 < 42) //產(chǎn)生超過(guò)10us的脈沖
;
status = 2; //狀態(tài)設(shè)為2
Trig = 0;
TR0 = 0;
TH0 = 0;
TL0 = 0;
overflow_count = 0;
TR0 = 1; //打開定時(shí)器2
while(Echo == 0) //當(dāng)無(wú)信號(hào)返回時(shí)
{
if(status == 5)
{
status = 0;
distance_cm = 0;
break ; //失敗
}
}
TR0 = 0; //清空計(jì)數(shù)
TH0 = 0;
TL0 = 0;
overflow_count = 0;
TR0 = 1;
while(Echo == 1) //有信號(hào)返回時(shí),開始計(jì)算長(zhǎng)度
{
if(status == 5) //status為5時(shí)失敗
{
status = 0;
distance_cm = 0;
TR0 = 0;
break ;
}
}
dis_count = overflow_count * 65536 + TH0 * 256 + TL0;
TR0 = 0;
distance_cm = (unsigned int)( (long)(dis_count) * 34 / 10000);
status = 0 ; //準(zhǔn)備下次發(fā)送
}
//定時(shí)器2中斷
void Timer0Int() interrupt 1
{
TF0 = 0;
overflow_count++;
TH0 = 0;
TL0 = 0;
if(overflow_count == 2)
{
status = 5; //超時(shí)
}
}
car_chaoshengbo.zip
2019-6-19 16:58 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
1.21 KB, 下載次數(shù): 51, 下載積分: 黑幣 -5
作者:
黑子Abner
時(shí)間:
2019-10-1 22:16
感謝分享
作者:
rgbgirl
時(shí)間:
2019-10-2 07:58
感謝分享,不知道實(shí)測(cè)效果如何?
作者:
嘿,波西
時(shí)間:
2019-12-17 08:57
有仿真圖嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1