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

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

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

Proteus教程:超聲波測(cè)距與顯示

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

視頻鏈接:https://www.bilibili.com/video/BV1ik4y1677Q

pYYBAGSJM9mAGbqDAAa0W4lmbLM237.pngpYYBAGSJM-CAGLbGAAJT1WPZ930267.pngpYYBAGSJM-aAenm_AAM3ons8s6k052.png

#include
#include 
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^2;
sbit LCD1602_RW=P2^1;
sbit LCD1602_RS=P2^0;
sbit Trig = P1^0;
sbit Echo = P1^1;
unsigned long S=0;
bit      flag =0;
unsigned int DIstance,time;

/*******************************************************************************
* 函 數(shù) 名         : Lcd1602_Delay1ms
* 函數(shù)功能		   : 延時(shí)函數(shù),延時(shí)1ms
* 輸    入         : c
* 輸    出         : 無(wú)
* 說(shuō)    名         : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時(shí)。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //誤差 0us
{
    uchar a,b;
	for (; c>0; c--)
	{
		 for (b=199;b>0;b--)
		 {
		  	for(a=1;a>0;a--);
		 }      
	}
    	
}

/*******************************************************************************
* 函 數(shù) 名         : LcdWriteCom
* 函數(shù)功能		   : 向LCD寫入一個(gè)字節(jié)的命令
* 輸    入         : com
* 輸    出         : 無(wú)
*******************************************************************************/
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;	          //寫入時(shí)序
	Lcd1602_Delay1ms(5);	  //保持時(shí)間
	LCD1602_E = 0;
}
/*******************************************************************************
* 函 數(shù) 名         : LcdWriteData
* 函數(shù)功能		   : 向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)
* 輸    入         : dat
* 輸    出         : 無(wú)
*******************************************************************************/		   	   
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;   //寫入時(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);  //寫一個(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;
}
void Conut(void)
{
	 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ù)
	 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, '0');
	  DisplayOneChar(1, 1, '.');	//顯示點(diǎn)
	  DisplayOneChar(2, 1, '0');
	  DisplayOneChar(3, 1, '0');
	  DisplayOneChar(4, 1, 'M');	//顯示M
	 }
	 else
	 {
	  DisplayOneChar(0, 1, (char)(S/100+'0'));
	  DisplayOneChar(1, 1, '.');	//顯示點(diǎn)
	  DisplayOneChar(2, 1, (char)(S/10%10+'0'));
	  DisplayOneChar(3, 1, (char)(S%10+'0'));
	  DisplayOneChar(4, 1, 'M');	//顯示M
	 }
}
void zd0() interrupt 1 		 //T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
{
    flag=1;							 //中斷溢出標(biāo)志
}
void Sr04_Init()
{
	 TMOD=0x01;		   //設(shè)T0為方式1,GATE=1;
	 TH0=0;
	 TL0=0;          
	 ET0=1;             //允許T0中斷
	 EA=1;			   //開(kāi)啟總中斷	
}

void main()
{
	Sr04_Init();
	LcdInit();
	DisplayListChar(0,0,"Welcome");
	while(1)
	{
		Conut();
	}
}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • Proteus
    +關(guān)注

    關(guān)注

    79

    文章

    1692

    瀏覽量

    106575
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    898

    瀏覽量

    41495
  • 超聲波測(cè)距
    +關(guān)注

    關(guān)注

    5

    文章

    246

    瀏覽量

    37923
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    超聲波測(cè)距系統(tǒng)設(shè)計(jì)

    超聲波測(cè)距系統(tǒng)設(shè)計(jì)由于超聲波指向性強(qiáng),能量消耗緩慢,在介質(zhì)中傳播的距離較遠(yuǎn),因而超聲波經(jīng)常用于距離的測(cè)量,如測(cè)距儀和物位測(cè)量?jī)x等都可以通過(guò)
    發(fā)表于 10-15 15:25

    超聲波測(cè)距儀研究

    根據(jù)聲波反射原理,應(yīng)用單片機(jī)(AT89S52)技術(shù)和UCM40T超聲波傳感器設(shè)計(jì)了一種超聲波測(cè)距儀。硬件部分主要由控制模塊、超聲波發(fā)射模塊、
    發(fā)表于 03-04 15:38

    超聲波測(cè)距原理

    為此,文中嘗試以單片機(jī)AT89S52為核心,利用一對(duì)40 kHz壓電超聲傳感器設(shè)計(jì)一款體積較小、價(jià)格低廉、精度較高、具有溫度補(bǔ)償、實(shí)時(shí)LCD顯示和報(bào)警的超聲波測(cè)距儀。1
    發(fā)表于 04-25 11:32

    Proteus中的超聲波測(cè)距

    本帖最后由 huhaihang 于 2015-4-11 16:21 編輯 求高手幫忙,誰(shuí)會(huì)在Proteus中仿真超聲波測(cè)距?請(qǐng)指教,謝謝!
    發(fā)表于 04-11 15:55

    超聲波測(cè)距

    Proteus中怎樣仿真超聲波測(cè)距,我在庫(kù)里找不到Cx20106這個(gè)元件,沒(méi)法仿真了。求高手指教!
    發(fā)表于 04-11 16:27

    基于STM32超聲波測(cè)距設(shè)計(jì)的合集

    ARM內(nèi)核芯片STM32F103ZET6的32位嵌入式微處理器與帶有溫度補(bǔ)償?shù)腢S-100超聲波測(cè)距模塊實(shí)現(xiàn)聲波測(cè)距。STM32的串口資源相當(dāng)豐富,能提供5路串口,通過(guò)微處理器的串口實(shí)
    發(fā)表于 09-05 16:13

    超聲波測(cè)距原理

    藍(lán)橋杯單片機(jī)必備知識(shí)-----(9)超聲波測(cè)距超聲波測(cè)距原理:超聲波發(fā)射器向某一方向發(fā)射超聲波,
    發(fā)表于 07-19 09:08

    超聲波測(cè)距原理

    1.超聲波測(cè)距原理超聲波是利用反射的原理測(cè)量距離的,被測(cè)距離一端為超聲波傳感器,另一端必須有能反射超聲波
    發(fā)表于 07-21 07:01

    超聲波測(cè)距的原理是什么

    1、測(cè)距原理超聲波測(cè)距的原理是利用超聲波在空氣中的傳播速度為已知,測(cè)量聲波在發(fā)射后遇到障礙物反射回來(lái)的時(shí)間,根據(jù)發(fā)射和接收的時(shí)間差計(jì)算出發(fā)射
    發(fā)表于 12-01 06:56

    超聲波測(cè)距原理及簡(jiǎn)介

    超聲波測(cè)距原理,超聲波測(cè)距是什么?本文針對(duì)這些內(nèi)容進(jìn)行詳細(xì)地分析闡述。
    發(fā)表于 11-07 15:37 ?1.1w次閱讀

    超聲波測(cè)距描述+程序

    超聲波測(cè)距超聲波測(cè)距超聲波測(cè)距超聲波
    發(fā)表于 11-19 14:07 ?39次下載

    超聲波測(cè)距

    超聲波測(cè)距源文件,詳細(xì)介紹了基于51單片機(jī)的超聲波測(cè)距原理,該文件包含設(shè)計(jì)的源程序。
    發(fā)表于 05-20 10:12 ?182次下載

    超聲波測(cè)距

    基本的超聲波模塊測(cè)距離,基于51單片機(jī),用1602顯示
    發(fā)表于 11-05 10:20 ?10次下載

    超聲波測(cè)距液晶顯示源碼下載

    LCD模塊+超聲波測(cè)距顯示
    發(fā)表于 01-31 16:40 ?8次下載

    超聲波測(cè)距資料(HC-SR04)_TB

    超聲波測(cè)距資料(HC-SR04)_TB 超聲波PIC單片機(jī)C程序超聲波測(cè)距51C程序超聲波
    發(fā)表于 03-14 15:13 ?195次下載