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

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

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

自動避障小車仿真

Harmony&嵌入式學習 ? 來源:Harmony&嵌入式學習 ? 作者:Harmony&嵌入式學 ? 2023-07-17 09:28 ? 次閱讀

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

wKgaomSzwd-AeUulAABMh2oW4eg474.png

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

wKgaomSzwfSAQQB9AAAsS8T4vYo292.png

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

鍵盤程序流程圖

wKgZomSzwh2AJ08bAAA0k8-XoV8106.png

在鍵盤處理函數(shù)中,分別判斷按下的為哪個按鍵,若按下設(shè)定值增加按鍵,則設(shè)定值的數(shù)值增加10;若按下設(shè)定值減少按鍵,設(shè)定值的數(shù)字減少10,并在變動后均存入外部儲存器。

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寫入一個字節(jié)的命令
* 輸    入         : com
* 輸    出         : 無
*******************************************************************************/
void LcdWriteCom(uchar com)	  //寫入命令
{
	LCD1602_E = 0;     //使能
	LCD1602_RS = 0;	   //選擇發(fā)送命令
	LCD1602_RW = 0;	   //選擇寫入
	
	LCD1602_DATAPINS = com;     //放入命令
	Lcd1602_Delay1ms(1);		//等待數(shù)據(jù)穩(wěn)定

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

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

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


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




//按指定位置顯示一個字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
 Y &= 0x1;
 X &= 0xF; //限制X不能大于15,Y不能大于1
 if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
 X |= 0x80; // 算出指令碼
 LcdWriteCom(X); //這里不檢測忙信號,發(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) //若到達字串尾則退出
  {
   if (X <= 0xF) //X坐標應小于0xF
    {
     DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
     ListLength++;
     X++;
    }
  }
}

void  StartModule() 		         //啟動模塊
{
	  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;
}

/*******************************************************************************
* 函 數(shù) 名         : main
* 函數(shù)功能		   : 主函數(shù)
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void Conut(void)
	{
	 time=TH0*256+TL0;
	 TH0=0;
	 TL0=0;
	
	 S=(time*1.7)/100;     //算出來是CM
	 DIstance = S;
	 if((S?>=700)||flag==1) //超出測量范圍顯示“-”
	 {	 
	  flag=0;
	 
	  DisplayOneChar(0, 1, ASCII[11]);
	  DisplayOneChar(1, 1, ASCII[10]);	//顯示點
	  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]);	//顯示點
	  DisplayOneChar(2, 1, ASCII[disbuff[1]]);
	  DisplayOneChar(3, 1, ASCII[disbuff[2]]);
	  DisplayOneChar(4, 1, ASCII[12]);	//顯示M
	 }
}


void zd0() interrupt 1 		 //T0中斷用來計數(shù)器溢出,超過測距范圍
{
    flag=1;							 //中斷溢出標志
}

void main()
{
	 TMOD=0x01;		   //設(shè)T0為方式1,GATE=1;
	 TH0=0;
	 TL0=0;          
	 ET0=1;             //允許T0中斷
	 EX0=1;       //外部中斷0開()  EX1 為外部中斷1 (P3^3)
	 IT0=1;        //低電平觸發(fā)   IT1為中斷1
	 EX1=1;       //外部中斷0開()  EX1 為外部中斷1 (P3^3)
	 IT1=1;        //低電平觸發(fā)   IT1為中斷1
	 EA=1;			   //開啟總中斷	
	 Set_dis = CC_RD(0x01);
	LcdInit();
	DisplayListChar(4,0,"Car system");
	while(1)
	{
		StartModule();
	  while(!Echo);		//當RX為零時等待
	  TR0=1;			    //開啟計數(shù)
	  while(Echo);			//當RX為1計數(shù)并等待
	  TR0=0;				//關(guān)閉計數(shù)
    Conut();			//計算
		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對應下表
{
    Set_dis = Set_dis+10; 
		CC_WR(0x01,Set_dis);
}


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

審核編輯:湯梓紅

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

    關(guān)注

    6023

    文章

    44376

    瀏覽量

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

    關(guān)注

    50

    文章

    3971

    瀏覽量

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

    關(guān)注

    12

    文章

    887

    瀏覽量

    45690
  • 避障小車
    +關(guān)注

    關(guān)注

    1

    文章

    24

    瀏覽量

    18976
收藏 人收藏

    評論

    相關(guān)推薦

    智能小車問題

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

    尋人小車

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

    紅外小車設(shè)計論文

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

    尋跡一體小車

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

    自動紅外電動小車C51程序

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

    arduino版的自動小車程序

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

    論文1

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

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

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

    自動充電小車5110電壓檢測版

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

    尋跡一體小車

    尋跡一體小車
    發(fā)表于 01-30 16:48 ?27次下載

    怎樣制作小車

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

    使用Arduino設(shè)計的智能小車自動的接線說明

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

    基于單片機的自動小車設(shè)計課設(shè)

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

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

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

    AGV小車使用雷達

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