導航:首頁 > 操作系統 > 51單片機避障小車

51單片機避障小車

發布時間:2022-07-10 12:14:58

A. 做基於51單片機的超聲波避障小車方案,還有詳細元器件清單!要詳細的 謝謝

51單片機一個,20或30pf的電容4個,小車一個,L298N電機驅動2個,7V或12V鋰電池一個,晶振2個,杜邦線40根,烙鐵,焊錫絲,超聲波模塊,LED燈若干,舵機一個。
方案很簡單,上述元件做好51最小系統,淘寶買超聲波模塊,有51示例代碼,直接拿來用,這樣你可以取得小車和障礙物的距離了,然後,組裝小車,把7v鋰電池直接接L298N上,L298有轉出5V的插針介面,用它轉出的5v電壓給單片機和超聲波模塊供電,然後淘寶買舵機要參考代碼,當發現前方有障礙後,減速,單片機控制舵機轉動一個角度,避過障礙,至於驅動小車的話,用單片機產生11KHZ的PWM輸出到L298N上,把小車電機也接到L298上,這個可以看L298的說明書,淘寶商家會給你的。大體就是這樣

B. 求51單片機超聲波避障程序

這是一個超聲波避障小車的源程序,可以參考下,用的89C52單片機,舵機控制轉角避障。
#include<AT89x51.H>
#include <intrins.h>
#define Sevro_moto_pwm P2_7 //接舵機信號端輸入PWM信號調節速度
#define ECHO P2_4 //超聲波介面定義
#define TRIG P2_5 //超聲波介面定義
#define Left_moto_go {P1_0=1,P1_1=0,P1_2=1,P1_3=0;} //左邊兩個電機向前走
#define Left_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左邊兩個電機向後轉
#define Left_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0;} //左邊兩個電機停轉
#define Right_moto_go {P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //右邊兩個電機向前走
#define Right_moto_back {P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //右邊兩個電機向前走
#define Right_moto_Stop {P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //右邊兩個電機停轉
unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
unsigned char const positon[3]={ 0xfe,0xfd,0xfb};
unsigned char disbuff[4] ={ 0,0,0,0,};
unsigned char posit=0;
unsigned char pwm_val_left = 0;//變數定義
unsigned char push_val_left =14;//舵機歸中,產生約,1.5MS 信號
unsigned long S=0;
unsigned long S1=0;
unsigned long S2=0;
unsigned long S3=0;
unsigned long S4=0;
unsigned int time=0; //時間變數
unsigned int timer=0; //延時基準變數
unsigned char timer1=0; //掃描時間變數
/************************************************************************/
void delay(unsigned int k) //延時函數
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
/************************************************************************/
void Display(void) //掃描數碼管
{
if(posit==0)
{P0=(discode[disbuff[posit]])&0x7f;}//產生點
else
{P0=discode[disbuff[posit]];} if(posit==0)
{ P2_1=0;P2_2=1;P2_3=1;}
if(posit==1)
{P2_1=1;P2_2=0;P2_3=1;}
if(posit==2)
{P2_1=1;P2_2=1;P2_3=0;}
if(++posit>=3)
posit=0;
}
/************************************************************************/
void StartMole() //啟動測距信號
{
TRIG=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TRIG=0;
}
/***************************************************/
void Conut(void) //計算距離
{
while(!ECHO); //當RX為零時等待
TR0=1; //開啟計數
while(ECHO); //當RX為1計數並等待
TR0=0; //關閉計數
time=TH0*256+TL0; //讀取脈寬長度
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出來是CM
disbuff[0]=S%1000/100; //更新顯示
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
}
/************************************************************************/
//前速前進
void run(void)
{
Left_moto_go ; //左電機往前走
Right_moto_go ; //右電機往前走
}
/************************************************************************/
//前速後退
void backrun(void)
{
Left_moto_back ; //左電機往前走
Right_moto_back ; //右電機往前走
}
/************************************************************************/
//左轉
void leftrun(void)
{
Left_moto_back ; //左電機往前走
Right_moto_go ; //右電機往前走
}
/************************************************************************/
//右轉
void rightrun(void)
{
Left_moto_go ; //左電機往前走
Right_moto_back ; //右電機往前走
}
/************************************************************************/
//STOP
void stoprun(void)
{
Left_moto_Stop ; //左電機停走
Right_moto_Stop ; //右電機停走
}
/************************************************************************/
void COMM( void )
{

push_val_left=5; //舵機向左轉90度
timer=0;
while(timer<=4000); //延時400MS讓舵機轉到其位置
StartMole(); //啟動超聲波測距
Conut(); //計算距離
S2=S;

push_val_left=23; //舵機向右轉90度
timer=0;
while(timer<=4000); //延時400MS讓舵機轉到其位置
StartMole(); //啟動超聲波測距
Conut(); //計算距離
S4=S;
push_val_left=14; //舵機歸中
timer=0;
while(timer<=4000); //延時400MS讓舵機轉到其位置 StartMole(); //啟動超聲波測距
Conut(); //計算距離
S1=S; if((S2<20)||(S4<20)) //只要左右各有距離小於20CM小車後退
{
backrun(); //後退
timer=0;
while(timer<=4000);
}

if(S2>S4)
{
rightrun(); //車的左邊比車的右邊距離小 右轉
timer=0;
while(timer<=4000);
}
else
{
leftrun(); //車的左邊比車的右邊距離大 左轉
timer=0;
while(timer<=4000);
}
} /************************************************************************/
/* PWM調制電機轉速 */
/************************************************************************/
/* 左電機調速 */
/*調節push_val_left的值改變電機轉速,占空比 */
void pwm_Servomoto(void)
{

if(pwm_val_left<=push_val_left)
Sevro_moto_pwm=1;
else
Sevro_moto_pwm=0;
if(pwm_val_left>=200)
pwm_val_left=0;

}
/***************************************************/
///*TIMER1中斷服務子函數產生PWM信號*/
void time1()interrupt 3 using 2
{
TH1=(65536-100)/256; //100US定時
TL1=(65536-100)%256;
timer++; //定時器100US為准。在這個基礎上延時
pwm_val_left++;
pwm_Servomoto(); timer1++; //2MS掃一次數碼管
if(timer1>=20)
{
timer1=0;
Display();
}
}
/***************************************************/
///*TIMER0中斷服務子函數產生PWM信號*/
void timer0()interrupt 1 using 0
{

} /***************************************************/ void main(void)
{ TMOD=0X11;
TH1=(65536-100)/256; //100US定時
TL1=(65536-100)%256;
TH0=0;
TL0=0;
TR1= 1;
ET1= 1;
ET0= 1;
EA = 1; delay(100);
push_val_left=14; //舵機歸中
while(1) /*無限循環*/
{ if(timer>=1000) //100MS檢測啟動檢測一次
{
timer=0;
StartMole(); //啟動檢測
Conut(); //計算距離
if(S<30) //距離小於20CM
{
stoprun(); //小車停止
COMM(); //方向函數
}
else
if(S>30) //距離大於,30CM往前走
run();
}
}
}
/**************************************************************************/

下面是頭文件:
頭文件(一)
/*--------------------------------------------------------------------------
AT89X51.H Header file for the low voltage Flash Atmel AT89C51 and AT89LV51.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __AT89X51_H__
#define __AT89X51_H__
/*------------------------------------------------
Byte Registers
------------------------------------------------*/
sfr P0 = 0x80;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr P1 = 0x90;
sfr SCON = 0x98;
sfr SBUF = 0x99;
sfr P2 = 0xA0;
sfr IE = 0xA8;
sfr P3 = 0xB0;
sfr IP = 0xB8;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
/*------------------------------------------------
P0 Bit Registers
------------------------------------------------*/
sbit P0_0 = 0x80;
sbit P0_1 = 0x81;
sbit P0_2 = 0x82;
sbit P0_3 = 0x83;
sbit P0_4 = 0x84;
sbit P0_5 = 0x85;
sbit P0_6 = 0x86;
sbit P0_7 = 0x87;
/*------------------------------------------------
PCON Bit Values
------------------------------------------------*/
#define IDL_ 0x01
#define STOP_ 0x02
#define PD_ 0x02 /* Alternate definition */
#define GF0_ 0x04
#define GF1_ 0x08 #define SMOD_ 0x80 /
*------------------------------------------------
TCON Bit Registers
------------------------------------------------*/
sbit IT0 = 0x88;
sbit IE0 = 0x89;
sbit IT1 = 0x8A;
sbit IE1 = 0x8B;
sbit TR0 = 0x8C;
sbit TF0 = 0x8D;
sbit TR1 = 0x8E;
sbit TF1 = 0x8F;
/*------------------------------------------------
TMOD Bit Values
------------------------------------------------*/
#define T0_M0_ 0x01
#define T0_M1_ 0x02
#define T0_CT_ 0x04
#define T0_GATE_ 0x08
#define T1_M0_ 0x10
#define T1_M1_ 0x20
#define T1_CT_ 0x40
#define T1_GATE_ 0x80
#define T1_MASK_ 0xF0
#define T0_MASK_ 0x0F
/*------------------------------------------------
P1 Bit Registers
------------------------------------------------*/
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
sbit P1_3 = 0x93;
sbit P1_4 = 0x94;
sbit P1_5 = 0x95;
sbit P1_6 = 0x96;
sbit P1_7 = 0x97; /
*------------------------------------------------
SCON Bit Registers
------------------------------------------------*/
sbit RI = 0x98;
sbit TI = 0x99;
sbit RB8 = 0x9A;
sbit TB8 = 0x9B;
sbit REN = 0x9C;
sbit SM2 = 0x9D;
sbit SM1 = 0x9E;
sbit SM0 = 0x9F;
/*------------------------------------------------
P2 Bit Registers
------------------------------------------------*/
sbit P2_0 = 0xA0;
sbit P2_1 = 0xA1;
sbit P2_2 = 0xA2;
sbit P2_3 = 0xA3;
sbit P2_4 = 0xA4;
sbit P2_5 = 0xA5;
sbit P2_6 = 0xA6;
sbit P2_7 = 0xA7;
/*------------------------------------------------
IE Bit Registers
------------------------------------------------*/
sbit EX0 = 0xA8; /* 1=Enable External interrupt 0 */
sbit ET0 = 0xA9; /* 1=Enable Timer 0 interrupt */
sbit EX1 = 0xAA; /* 1=Enable External interrupt 1 */
sbit ET1 = 0xAB; /* 1=Enable Timer 1 interrupt */
sbit ES = 0xAC; /* 1=Enable Serial port interrupt */
sbit ET2 = 0xAD; /* 1=Enable Timer 2 interrupt */ sbit EA = 0xAF; /* 0=Disable all interrupts */
/*------------------------------------------------
P3 Bit Registers (Mnemonics & Ports)
------------------------------------------------*/
sbit P3_0 = 0xB0;
sbit P3_1 = 0xB1;
sbit P3_2 = 0xB2;
sbit P3_3 = 0xB3;
sbit P3_4 = 0xB4;
sbit P3_5 = 0xB5;
sbit P3_6 = 0xB6;
sbit P3_7 = 0xB7; sbit RXD = 0xB0; /* Serial data input */
sbit TXD = 0xB1; /* Serial data output */
sbit INT0 = 0xB2; /* External interrupt 0 */
sbit INT1 = 0xB3; /* External interrupt 1 */
sbit T0 = 0xB4; /* Timer 0 external input */
sbit T1 = 0xB5; /* Timer 1 external input */
sbit WR = 0xB6; /* External data memory write strobe */
sbit RD = 0xB7; /* External data memory read strobe */
/*------------------------------------------------
IP Bit Registers
------------------------------------------------*/
sbit PX0 = 0xB8;
sbit PT0 = 0xB9;
sbit PX1 = 0xBA;
sbit PT1 = 0xBB;
sbit PS = 0xBC;
sbit PT2 = 0xBD;
/*------------------------------------------------
PSW Bit Registers
------------------------------------------------*/
sbit P = 0xD0;
sbit FL = 0xD1;
sbit OV = 0xD2;
sbit RS0 = 0xD3;
sbit RS1 = 0xD4;
sbit F0 = 0xD5;
sbit AC = 0xD6;
sbit CY = 0xD7;
/*------------------------------------------------
Interrupt Vectors:
Interrupt Address = (Number * 8) + 3
------------------------------------------------*/
#define IE0_VECTOR 0 /* 0x03 External Interrupt 0 */
#define TF0_VECTOR 1 /* 0x0B Timer 0 */
#define IE1_VECTOR 2 /* 0x13 External Interrupt 1 */
#define TF1_VECTOR 3 /* 0x1B Timer 1 */
#define SIO_VECTOR 4 /* 0x23 Serial port */ #endif

頭文件(二)
/*--------------------------------------------------------------------------
INTRINS.H Intrinsic functions for C51.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __INTRINS_H__
#define __INTRINS_H__ extern void _nop_ (void);
extern bit _testbit_ (bit);
extern unsigned char _cror_ (unsigned char, unsigned char);
extern unsigned int _iror_ (unsigned int, unsigned char);
extern unsigned long _lror_ (unsigned long, unsigned char);
extern unsigned char _crol_ (unsigned char, unsigned char);
extern unsigned int _irol_ (unsigned int, unsigned char);
extern unsigned long _lrol_ (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float); #endif

C. 51單片機紅外避障小車教程

time=th1*256+tl1;
這是用定時器t1做計數,time=th1*256+tl1;
這是根據定時器/計數器t1的計數值計算時間,th1是計數器的高8位,計數結果當然要乘256倍了,再加上低8位的值tl1。
th1=0;
tl1=0;
是計算完了,重新寫0,准備下一次計數。

D. 51單片機智能小車製作,求通俗易懂的講解

系統的單片機程序:

#include"reg52.h"

#definedet_Dist2.55//

單個脈沖對應的小車行走距離,其值為車輪周長

/4#defineRD9//

小車對角軸長度。

#definePI3.1415926

#defineANG_9090

#defineANG_90_T102

#defineANG_180189/

全局變數定義區。

/sbitP10=P1^0;//

控制繼電器的開閉sbitP11=P1^1;//

控制金屬接近開關。


(4)51單片機避障小車擴展閱讀:


控制器部分:接收感測器部分傳遞過來的信號,並根據事前寫入的決策系統(軟體程序),來決定機器人對外部信號的反應,將控制信號發給執行器部分。好比人的大腦。

執行器部分:驅動機器人做出各種行為,包括發出各種信號(點亮發光二極體、發出聲音)的部分,並且可以根據控制器部分的信號調整自己的狀態。

對機器人小車來說,最基本的就是輪子。這部分就好比人的四肢一樣。 感測器部分:機器人用來讀取各種外部信號的感測器,以及控制機器人行動的各種開關。好比人的眼睛、耳朵等感覺器官。




E. 做智能小車,壁障程序怎麼寫,用的是51單片機寫的。求解,謝謝

在這里只能說一下思路,具體到程序會比較麻煩。

避障,一般是採用超聲波測距,設定一個最短距離,當檢測到前方近距離有物體障礙,可以按照設定的方案轉彎,障礙物足夠遠的時候再繼續前行。

F. 關於51單片機的避障小車程序問題。我是一個程序菜鳥,已經盡力寫出這樣程序但是不能完成目標。詳細如下:

看著眼疼,建議整理好,讓人看起來比較舒服在穿上來,否則,只能呵呵了

G. c51單片機巡線避障小車的大神過來看下,用的7路灰度

這樣是不可能行得通的。車身抖的厲害,巡線功能特別差。理論可以,但是操作不行。我也曾經這樣做過。我沒時間給你做程序,但是給你提供我當初解決的思路。
首先消抖程序必須有。檢測其檢測到線時不要馬上執行轉彎程序,先延時。延時結束確認觸發,在執行相應的命令
然後轉彎處理命令,本人感覺不要等檢測不到線了結束轉彎命令,而是轉彎命令時間極短,0.01s左右,每個單位時間掃描一次黑線,這樣不會走離黑線。而且也減少了單片機的運行內存。
在最後,一定要注意速度!我看你的程序是開足馬力往前沖的,這樣不行,單片機沒反應過來就已經結束了。此外輪胎滑動可不由單片機控制。所以一定要控制好車速。最好加上調速程序。思路就是用好驅動器的使能端。調整供電和停止供電比例,即可控制車速。
需要幫助可以追問

H. 51單片機避障小車原理圖

我是一單片機避障小車原理圖臂上小車就是避免他的每一個單片取出時的互相交叉四的問題

I. 高分求51單片機超聲波測距避障小車程序(差速轉向)設計。(最好能夠實現pid控制的,不行的話簡單的避障)

我也遇到過你這樣的問題,主要是電源驅動能力不夠,L298把電壓拉低,單片機不正常工作,
我解決的辦法是用一個12V的鋰電池,或者多串幾個干電池,最起碼要10V以上,單獨驅動L298模塊,控制兩個電機,再自製一塊小轉接板,用7805把12V電壓轉到5V,控制單片機電路,單片機肯定正常工作,小車跑的那是嗷嗷的

J. c51單片機應用和c語言程序設計中怎麼寫小車機器人紅外探測避障

紅外探測避障,可以利用紅外發二極體與紅外接收二極體,市面上也有組裝在一起的對管。
發射管發射紅外線,收到障礙物阻擋反射回來,被接收管接收,不同的距離,接受管的都通率不同,因此可以檢測接收管的導通率來確定障礙物的距離,單片機再控制小車避開障礙物

閱讀全文

與51單片機避障小車相關的資料

熱點內容
量柱比前一天多源碼 瀏覽:416
電子書app怎麼上傳 瀏覽:66
國家反詐中心app注冊怎麼開啟 瀏覽:804
全波差分傅里葉演算法窗長 瀏覽:39
程序員如何講自己做過的項目 瀏覽:5
程序員要看的書頸椎 瀏覽:946
php文章cms 瀏覽:553
CSS權威指南第三版PDF 瀏覽:496
android怎麼搭建框架 瀏覽:184
正宗溯源碼大燕條一克一般多少錢 瀏覽:917
電腦感染exe文件夾 瀏覽:916
wpsppt怎麼轉pdf格式 瀏覽:88
騰訊文檔在線編輯怎麼添加密碼 瀏覽:880
本地不能訪問伺服器地址 瀏覽:865
訪問伺服器命令 瀏覽:835
華為雲伺服器分銷商 瀏覽:954
Linux定位內存泄露 瀏覽:198
工程加密狗視頻 瀏覽:720
不在內網怎麼連接伺服器 瀏覽:664
雲伺服器app安卓下載 瀏覽:966