0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

自動(dòng)避障小車(chē)仿真

Harmony&嵌入式學(xué)習(xí) ? 來(lái)源:Harmony&嵌入式學(xué)習(xí) ? 作者:Harmony&嵌入式學(xué) ? 2023-07-17 09:28 ? 次閱讀

課題的技術(shù)要求:本次課題最終要求小車(chē)能在無(wú)人操作的條件下實(shí)現(xiàn)自動(dòng)避障,避障基于超聲波測(cè)距的原理實(shí)現(xiàn)的,當(dāng)超聲波檢測(cè)到小車(chē)與障礙物的距離大于設(shè)定值時(shí),小車(chē)按照原先設(shè)定的速度正常行駛;當(dāng)超聲波檢測(cè)到小車(chē)和障礙物的距離小于設(shè)定值時(shí),單片機(jī)控制蜂鳴器發(fā)聲同時(shí)控制小車(chē)停止。因?yàn)楸敬卧O(shè)計(jì)的小車(chē)時(shí)兩輪驅(qū)動(dòng)的小車(chē),也沒(méi)有安裝舵機(jī),所以小車(chē)的轉(zhuǎn)彎通過(guò)控制兩個(gè)車(chē)輪間的轉(zhuǎn)速差實(shí)現(xiàn)。
課題研究的主要內(nèi)容:本次設(shè)計(jì)以超聲波避障為研究對(duì)象,以自動(dòng)避障為核心控制功能。要研究?jī)?nèi)容包括:以STC89C52為控制核心的智能系統(tǒng)的平臺(tái)搭建、各個(gè)模塊的選型、多傳感器的組合應(yīng)用、PWM控制電機(jī)驅(qū)動(dòng)的相應(yīng)動(dòng)作、外置儲(chǔ)存器的選型、測(cè)距系統(tǒng)的選擇與搭建、報(bào)警與顯示系統(tǒng)的選擇與搭建等。

wKgaomSzwd-AeUulAABMh2oW4eg474.png

系統(tǒng)總體流程圖

wKgaomSzwfSAQQB9AAAsS8T4vYo292.png

STC89C52單片機(jī)接通電源后開(kāi)始運(yùn)行,首先對(duì)LCD1602的寄存器發(fā)送數(shù)據(jù)進(jìn)行初始化,完成最基本的屏幕顯示配置,然后在界面上顯示主界面的框架,接下來(lái)在While循環(huán)中不斷采集超聲波發(fā)送的數(shù)據(jù),進(jìn)行轉(zhuǎn)換后變?yōu)檎麛?shù)字節(jié)型顯示在LCD1602屏幕上,若采集的數(shù)值大于設(shè)定值即報(bào)警。

鍵盤(pán)程序流程圖

wKgZomSzwh2AJ08bAAA0k8-XoV8106.png

在鍵盤(pán)處理函數(shù)中,分別判斷按下的為哪個(gè)按鍵,若按下設(shè)定值增加按鍵,則設(shè)定值的數(shù)值增加10;若按下設(shè)定值減少按鍵,設(shè)定值的數(shù)字減少10,并在變動(dòng)后均存入外部?jī)?chǔ)存器。

wKgaomSzwiqABh9dAAGZunv_pXw635.png
#include "reg51.h"
#include 
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^6;
sbit LCD1602_RS=P2^5;
sbit Trig = P1^1;
sbit Echo = P1^0;
sbit BEEP = P2^4;
sbit MotorA_1 = P2^0;
sbit MotorA_2 = P2^1;
sbit MotorB_1 = P2^2;
sbit MotorB_2 = P2^3;
sbit I2C_SDA =      P1^2;  		
sbit I2C_SCL =      P1^3; 
unsigned char Set_dis = 80;
unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
static unsigned char DisNum = 0; //顯示用指針				  
unsigned int  time=0;
unsigned long S=0;
bit      flag =0;
unsigned char disbuff[4]	   ={ 0,0,0,0,};
unsigned int DIstance;



void D_10()
{
	uchar a, b;
	for(b=1; b>0; b--)
	{
		for(a=2; a>0; a--);
	}
}

void IIC_S()
{
	I2C_SDA = 1;
	D_10();
	I2C_SCL = 1;
	D_10();
	I2C_SDA = 0;
	D_10();
	I2C_SCL = 0;			
	D_10();		
}

void IIC_ST()
{
	I2C_SDA = 0;
	D_10();
	I2C_SCL = 1;
	D_10();
	I2C_SDA = 1;
	D_10();		
}

uchar WD_SB(uchar dat, uchar ack)
{
	uchar a = 0,b = 0;
			
	for(a=0; a> 7;
		dat = dat  200)
		{
			I2C_SCL = 0;
			D_10();
			return 0;
		}
	}

	I2C_SCL = 0;
	D_10();
 	return 1;		
}

uchar WD_RB() 
{
	uchar a = 0,dat = 0;
	I2C_SDA = 1;
	D_10();
	for(a=0; a0; c--)
	{
		 for (b=199;b>0;b--)
		 {
		  	for(a=1;a>0;a--);
		 }      
	}
    	
}

/*******************************************************************************
* 函 數(shù) 名         : LcdWriteCom
* 函數(shù)功能		   : 向LCD寫(xiě)入一個(gè)字節(jié)的命令
* 輸    入         : com
* 輸    出         : 無(wú)
*******************************************************************************/
void LcdWriteCom(uchar com)	  //寫(xiě)入命令
{
	LCD1602_E = 0;     //使能
	LCD1602_RS = 0;	   //選擇發(fā)送命令
	LCD1602_RW = 0;	   //選擇寫(xiě)入
	
	LCD1602_DATAPINS = com;     //放入命令
	Lcd1602_Delay1ms(1);		//等待數(shù)據(jù)穩(wěn)定

	LCD1602_E = 1;	          //寫(xiě)入時(shí)序
	Lcd1602_Delay1ms(5);	  //保持時(shí)間
	LCD1602_E = 0;
}
/*******************************************************************************
* 函 數(shù) 名         : LcdWriteData
* 函數(shù)功能		   : 向LCD寫(xiě)入一個(gè)字節(jié)的數(shù)據(jù)
* 輸    入         : dat
* 輸    出         : 無(wú)
*******************************************************************************/		   	   
void LcdWriteData(uchar dat)			//寫(xiě)入數(shù)據(jù)
{
	LCD1602_E = 0;	//使能清零
	LCD1602_RS = 1;	//選擇輸入數(shù)據(jù)
	LCD1602_RW = 0;	//選擇寫(xiě)入

	LCD1602_DATAPINS = dat; //寫(xiě)入數(shù)據(jù)
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;   //寫(xiě)入時(shí)序
	Lcd1602_Delay1ms(5);   //保持時(shí)間
	LCD1602_E = 0;
}


/*******************************************************************************
* 函 數(shù) 名       : LcdInit()
* 函數(shù)功能		 : 初始化LCD屏
* 輸    入       : 無(wú)
* 輸    出       : 無(wú)
*******************************************************************************/		   
void LcdInit()						  //LCD初始化子程序
{
 	LcdWriteCom(0x38);  //開(kāi)顯示
	LcdWriteCom(0x0c);  //開(kāi)顯示不顯示光標(biāo)
	LcdWriteCom(0x06);  //寫(xiě)一個(gè)指針加1
	LcdWriteCom(0x01);  //清屏
	LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點(diǎn)
}




//按指定位置顯示一個(gè)字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
 Y &= 0x1;
 X &= 0xF; //限制X不能大于15,Y不能大于1
 if (Y) X |= 0x40; //當(dāng)要顯示第二行時(shí)地址碼+0x40;
 X |= 0x80; // 算出指令碼
 LcdWriteCom(X); //這里不檢測(cè)忙信號(hào),發(fā)送地址碼
 LcdWriteData(DData);
}
//按指定位置顯示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
 unsigned char ListLength;

  ListLength = 0;
 Y &= 0x1;
 X &= 0xF; //限制X不能大于15,Y不能大于1
 while (DData[ListLength]>=0x20) //若到達(dá)字串尾則退出
  {
   if (X <= 0xF) //X坐標(biāo)應(yīng)小于0xF
    {
     DisplayOneChar(X, Y, DData[ListLength]); //顯示單個(gè)字符
     ListLength++;
     X++;
    }
  }
}

void  StartModule() 		         //啟動(dòng)模塊
{
	  Trig=1;			                     //啟動(dòng)一次模塊
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  Trig=0;
}

/*******************************************************************************
* 函 數(shù) 名         : main
* 函數(shù)功能		   : 主函數(shù)
* 輸    入         : 無(wú)
* 輸    出         : 無(wú)
*******************************************************************************/
void Conut(void)
	{
	 time=TH0*256+TL0;
	 TH0=0;
	 TL0=0;
	
	 S=(time*1.7)/100;     //算出來(lái)是CM
	 DIstance = S;
	 if((S?>=700)||flag==1) //超出測(cè)量范圍顯示“-”
	 {	 
	  flag=0;
	 
	  DisplayOneChar(0, 1, ASCII[11]);
	  DisplayOneChar(1, 1, ASCII[10]);	//顯示點(diǎn)
	  DisplayOneChar(2, 1, ASCII[11]);
	  DisplayOneChar(3, 1, ASCII[11]);
	  DisplayOneChar(4, 1, ASCII[12]);	//顯示M
	 }
	 else
	 {
	  disbuff[0]=S%1000/100;
	  disbuff[1]=S%1000%100/10;
	  disbuff[2]=S%1000%10 %10;
	  DisplayOneChar(0, 1, ASCII[disbuff[0]]);
	  DisplayOneChar(1, 1, ASCII[10]);	//顯示點(diǎn)
	  DisplayOneChar(2, 1, ASCII[disbuff[1]]);
	  DisplayOneChar(3, 1, ASCII[disbuff[2]]);
	  DisplayOneChar(4, 1, ASCII[12]);	//顯示M
	 }
}


void zd0() interrupt 1 		 //T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
{
    flag=1;							 //中斷溢出標(biāo)志
}

void main()
{
	 TMOD=0x01;		   //設(shè)T0為方式1,GATE=1;
	 TH0=0;
	 TL0=0;          
	 ET0=1;             //允許T0中斷
	 EX0=1;       //外部中斷0開(kāi)()  EX1 為外部中斷1 (P3^3)
	 IT0=1;        //低電平觸發(fā)   IT1為中斷1
	 EX1=1;       //外部中斷0開(kāi)()  EX1 為外部中斷1 (P3^3)
	 IT1=1;        //低電平觸發(fā)   IT1為中斷1
	 EA=1;			   //開(kāi)啟總中斷	
	 Set_dis = CC_RD(0x01);
	LcdInit();
	DisplayListChar(4,0,"Car system");
	while(1)
	{
		StartModule();
	  while(!Echo);		//當(dāng)RX為零時(shí)等待
	  TR0=1;			    //開(kāi)啟計(jì)數(shù)
	  while(Echo);			//當(dāng)RX為1計(jì)數(shù)并等待
	  TR0=0;				//關(guān)閉計(jì)數(shù)
    Conut();			//計(jì)算
		DisplayOneChar(8,1,(char)(Set_dis/100)+'0');
		DisplayOneChar(9,1,(char)(Set_dis/10%10)+'0');
		DisplayOneChar(10,1,(char)(Set_dis%10)+'0');
		if(DIstance>Set_dis)
		{
			BEEP = 0;
			RUN_RIGHT();
		}else
		{
			BEEP = 1;
			RUN_UP();
		}

	}
}


void Key1_INT( )  interrupt 0  // 這里0對(duì)應(yīng)下表
{
    Set_dis = Set_dis+10; 
		CC_WR(0x01,Set_dis);
}


void Key2_INT( )  interrupt 2  // 這里0對(duì)應(yīng)下表
{
	   Set_dis =Set_dis-10;
			CC_WR(0x01,Set_dis);
}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6037

    文章

    44558

    瀏覽量

    635212
  • 仿真
    +關(guān)注

    關(guān)注

    50

    文章

    4082

    瀏覽量

    133596
  • 蜂鳴器
    +關(guān)注

    關(guān)注

    12

    文章

    891

    瀏覽量

    45947
  • 避障小車(chē)
    +關(guān)注

    關(guān)注

    1

    文章

    24

    瀏覽量

    19029
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    智能小車(chē)問(wèn)題

    誰(shuí)有小車(chē)的程序與仿真圖,請(qǐng)發(fā)我郵箱,804902426@qq.com,謝謝了。
    發(fā)表于 04-30 08:07

    尋人小車(chē)

    想做一個(gè)自動(dòng)尋人小車(chē),人身上裝有特定的信號(hào)源,小車(chē)捕捉信號(hào)源跟著人走,行走途中可以自動(dòng)
    發(fā)表于 10-11 16:28

    紅外小車(chē)設(shè)計(jì)論文

    紅外小車(chē)設(shè)計(jì)論文紅外小車(chē)設(shè)計(jì)論文紅外
    發(fā)表于 11-13 15:57 ?0次下載

    尋跡一體小車(chē)

    尋跡一體小車(chē)尋跡一體小車(chē)尋跡
    發(fā)表于 11-13 15:53 ?0次下載

    自動(dòng)紅外電動(dòng)小車(chē)C51程序

    自動(dòng)紅外電動(dòng)小車(chē)C51程序自動(dòng)紅外電動(dòng)
    發(fā)表于 11-18 17:08 ?31次下載

    arduino版的自動(dòng)小車(chē)程序

    自動(dòng)小車(chē) arduino版的自動(dòng)
    發(fā)表于 11-24 15:24 ?0次下載

    論文1

    小車(chē)模糊控制算法的設(shè)計(jì)與仿真。本文詳細(xì)闡述了智能小車(chē)
    發(fā)表于 05-10 15:12 ?36次下載

    循跡小車(chē)(尋跡程序+程序)

    循跡小車(chē)(尋跡程序+程序),感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 11-23 15:45 ?457次下載

    自動(dòng)充電小車(chē)5110電壓檢測(cè)版

    自動(dòng)充電小車(chē)5110電壓檢測(cè)版
    發(fā)表于 04-28 08:57 ?0次下載

    紅外小車(chē)原理介紹及制作

    紅外小車(chē)原理介紹及制作
    發(fā)表于 07-18 09:39 ?53次下載

    怎樣制作小車(chē)

    本項(xiàng)目是在 PVCBOT-A型 基礎(chǔ)平臺(tái)車(chē)——BEAM小車(chē)的基礎(chǔ)上,加裝了傳感器以及控制電路,組成了一臺(tái)具體有功能的
    的頭像 發(fā)表于 09-18 09:35 ?1.9w次閱讀

    使用Arduino設(shè)計(jì)的智能小車(chē)自動(dòng)的接線說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用Arduino設(shè)計(jì)的智能小車(chē)自動(dòng)的接線說(shuō)明。
    發(fā)表于 11-22 08:00 ?18次下載
    使用Arduino設(shè)計(jì)的智能<b class='flag-5'>小車(chē)</b><b class='flag-5'>自動(dòng)</b><b class='flag-5'>避</b><b class='flag-5'>障</b>的接線說(shuō)明

    基于單片機(jī)的自動(dòng)小車(chē)設(shè)計(jì)課設(shè)

    基于單片機(jī)的自動(dòng)小車(chē)設(shè)計(jì)課設(shè)(單片機(jī)編程器)-該文檔為基于單片機(jī)的自動(dòng)
    發(fā)表于 07-22 13:32 ?24次下載
    基于單片機(jī)的<b class='flag-5'>自動(dòng)</b><b class='flag-5'>避</b><b class='flag-5'>障</b><b class='flag-5'>小車(chē)</b>設(shè)計(jì)課設(shè)

    基于單片機(jī)的小車(chē)自動(dòng)循跡的設(shè)計(jì)(proteus仿真+源碼+原理圖+軟件設(shè)計(jì)流程+硬件清單+視頻講解)

    基于單片機(jī)的小車(chē)自動(dòng)循跡的設(shè)計(jì)(proteus仿真+源碼+原理圖+軟件設(shè)計(jì)流程+硬件清單+視頻講解)
    發(fā)表于 11-11 15:51 ?92次下載
    基于單片機(jī)的<b class='flag-5'>避</b><b class='flag-5'>障</b><b class='flag-5'>小車(chē)</b>及<b class='flag-5'>自動(dòng)</b>循跡的設(shè)計(jì)(proteus<b class='flag-5'>仿真</b>+源碼+原理圖+軟件設(shè)計(jì)流程+硬件清單+視頻講解)

    AGV小車(chē)使用雷達(dá)

    AGV(自動(dòng)導(dǎo)引車(chē))小車(chē)使用雷達(dá)是為了確保其在運(yùn)行過(guò)程中的安全性和穩(wěn)定性。雷達(dá),如激光雷
    的頭像 發(fā)表于 05-20 10:48 ?630次閱讀