<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

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

3天內不再提示

自動避障小車仿真

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

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

wKgaomSzwd-AeUulAABMh2oW4eg474.png

系統總體流程圖

wKgaomSzwfSAQQB9AAAsS8T4vYo292.png

STC89C52單片機接通電源后開始運行,首先對LCD1602的寄存器發送數據進行初始化,完成最基本的屏幕顯示配置,然后在界面上顯示主界面的框架,接下來在While循環中不斷采集超聲波發送的數據,進行轉換后變為整數字節型顯示在LCD1602屏幕上,若采集的數值大于設定值即報警。

鍵盤程序流程圖

wKgZomSzwh2AJ08bAAA0k8-XoV8106.png

在鍵盤處理函數中,分別判斷按下的為哪個按鍵,若按下設定值增加按鍵,則設定值的數值增加10;若按下設定值減少按鍵,設定值的數字減少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--);
		 }      
	}
    	
}

/*******************************************************************************
* 函 數 名         : LcdWriteCom
* 函數功能		   : 向LCD寫入一個字節的命令
* 輸    入         : com
* 輸    出         : 無
*******************************************************************************/
void LcdWriteCom(uchar com)	  //寫入命令
{
	LCD1602_E = 0;     //使能
	LCD1602_RS = 0;	   //選擇發送命令
	LCD1602_RW = 0;	   //選擇寫入
	
	LCD1602_DATAPINS = com;     //放入命令
	Lcd1602_Delay1ms(1);		//等待數據穩定

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

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

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


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




//按指定位置顯示一個字符
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); //這里不檢測忙信號,發送地址碼
 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;
}

/*******************************************************************************
* 函 數 名         : main
* 函數功能		   : 主函數
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
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中斷用來計數器溢出,超過測距范圍
{
    flag=1;							 //中斷溢出標志
}

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

審核編輯:湯梓紅

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

    關注

    6005

    文章

    44015

    瀏覽量

    621931
  • 仿真
    +關注

    關注

    50

    文章

    3876

    瀏覽量

    132250
  • 蜂鳴器
    +關注

    關注

    12

    文章

    850

    瀏覽量

    45364
  • 避障小車
    +關注

    關注

    1

    文章

    23

    瀏覽量

    18935
收藏 人收藏

    評論

    相關推薦

    求教小車小車制作

    想參加學校的創新設計,準備做個小車,求教~~時間緊迫?。?!
    發表于 03-24 08:59

    關于 小車 的設計方案

    請教下 小車 的設計方案 有幾種選擇? 超聲波 如何?有沒有其它設計方案
    發表于 08-31 11:54

    智能小車問題

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

    智能小車

    求各位大神給個智能小車的protel電路圖和pcb圖,有的發到772478656@qq.com不勝感激。
    發表于 10-24 10:54

    循跡小車

    項目說明:使用紅外線、超聲波和無線模塊在52單片機下控制小車,無線模塊用于選擇循跡模式、模式、無線遙控模式,模式時顯示前方障礙物距離
    發表于 11-04 00:14

    智能小車

    那位大神能給我只能自制小車所用元件清單,本人新手大神幫忙。請發到郵箱1473923447@qq.com?;蚣游液糜讯夹?。謝謝
    發表于 05-23 10:50

    循跡小車

    大神,我想做個智能循跡小車,遇到東西會后退,能夠走迷宮,有啥好想法沒,求助,基于89C52
    發表于 11-15 00:45

    尋人小車

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

    循跡小車

    我是一名電子信息工程的大一新生,目前沒有學習專業知識,想要自己做一個循跡小車,想要一個制作循跡
    發表于 10-02 00:09

    智能小車

    求教用51單片機做個小車想用攝像頭采集,傳到計算機處理,這兩個模塊學習什么內容
    發表于 02-06 15:01

    如何去實現一種基于單片機的小車自動循跡的設計?

    如何去實現一種基于單片機的小車自動循跡的設計?基于單片機的
    發表于 07-19 09:28

    自動紅外電動小車C51程序資料分享

    自動紅外電動小車C51程序自動紅外電動
    發表于 08-27 06:59

    怎樣去設計基于單片機的紅外循跡小車

    設計簡介:本設計是基于單片機的紅外、循跡小車,主要實現以下功能:小車可通過手機控制實現紅外
    發表于 11-26 08:25

    聊聊基于STM32F103的紅外循跡小車的Proteus仿真

    紅外循跡及紅外實現較簡單,無論是51單片機還是STM32單片機,其例程隨處可見。但是完全可以運行的Proteus仿真,開源的并不多,更不要說基于STM32單片機的仿真。下面跟大家聊
    發表于 01-05 06:46

    基于單片機的小車自動循跡的設計

    簡介:本設計是基于單片機的小車自動循跡的設計,主要實現以下功能:可實現通過超聲波距離傳感器測得障礙物距離可實現通過紅外對管自動循跡可實
    發表于 02-25 07:01
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>