<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天內不再提示

Proteus教程:超聲波測距與顯示

Harmony&嵌入式學習 ? 來源:Harmony&嵌入式學習 ? 作者:Harmony&嵌入式學 ? 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;

/*******************************************************************************
* 函 數 名         : Lcd1602_Delay1ms
* 函數功能		   : 延時函數,延時1ms
* 輸    入         : c
* 輸    出         : 無
* 說    名         : 該函數是在12MHZ晶振下,12分頻單片機的延時。
*******************************************************************************/

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--);
		 }      
	}
    	
}

/*******************************************************************************
* 函 數 名         : 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;
}
void Conut(void)
{
	 StartModule();
	 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
	 DIstance = S;
	 if((S?>=700)||flag==1) //超出測量范圍顯示“-”
	 {	 
	  flag=0;
	 
	  DisplayOneChar(0, 1, '0');
	  DisplayOneChar(1, 1, '.');	//顯示點
	  DisplayOneChar(2, 1, '0');
	  DisplayOneChar(3, 1, '0');
	  DisplayOneChar(4, 1, 'M');	//顯示M
	 }
	 else
	 {
	  DisplayOneChar(0, 1, (char)(S/100+'0'));
	  DisplayOneChar(1, 1, '.');	//顯示點
	  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中斷用來計數器溢出,超過測距范圍
{
    flag=1;							 //中斷溢出標志
}
void Sr04_Init()
{
	 TMOD=0x01;		   //設T0為方式1,GATE=1;
	 TH0=0;
	 TL0=0;          
	 ET0=1;             //允許T0中斷
	 EA=1;			   //開啟總中斷	
}

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

審核編輯:湯梓紅

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

    關注

    76

    文章

    1688

    瀏覽量

    105677
  • 中斷
    +關注

    關注

    5

    文章

    884

    瀏覽量

    41045
  • 超聲波測距
    +關注

    關注

    5

    文章

    243

    瀏覽量

    37535
收藏 人收藏

    評論

    相關推薦

    超聲波測距系統設計

    超聲波測距系統設計由于超聲波指向性強,能量消耗緩慢,在介質中傳播的距離較遠,因而超聲波經常用于距離的測量,如測距儀和物位測量儀等都可以通過
    發表于 10-15 15:25

    超聲波測距儀研究

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

    超聲波測距原理

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

    Proteus中的超聲波測距

    本帖最后由 huhaihang 于 2015-4-11 16:21 編輯 求高手幫忙,誰會在Proteus中仿真超聲波測距?請指教,謝謝!
    發表于 04-11 15:55

    超聲波測距

    Proteus中怎樣仿真超聲波測距,我在庫里找不到Cx20106這個元件,沒法仿真了。求高手指教!
    發表于 04-11 16:27

    基于STM32超聲波測距設計的合集

    ARM內核芯片STM32F103ZET6的32位嵌入式微處理器與帶有溫度補償的US-100超聲波測距模塊實現聲波測距。STM32的串口資源相當豐富,能提供5路串口,通過微處理器的串口實
    發表于 09-05 16:13

    超聲波測距原理

    藍橋杯單片機必備知識-----(9)超聲波測距超聲波測距原理:超聲波發射器向某一方向發射超聲波,
    發表于 07-19 09:08

    超聲波測距原理

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

    超聲波測距的基本原理

    一、超聲波測距的基本原理超聲波測距原理是在超聲波發射裝置發出超聲波,接收器接收
    發表于 08-06 09:35

    超聲波測距

    您好,我想問一下如果把超聲波測距的距離設置為100,在100處放置參照物,如果有煙霧,會使超聲波測不到參照物嗎
    發表于 11-25 23:12

    超聲波測距的原理是什么

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

    超聲波測距的相關資料分享

    超聲波測距超聲波測距原理超聲波模塊說明書代碼解析超聲波測距
    發表于 12-08 08:06

    什么是超聲波測距?有何特點

    超聲波測距是一種典型的非接觸測量方式。超聲波在氣體、液體及固體中以不同速度傳播,定向性好、能量集中、傳輸過程中衰減較小、反射能力較強。且超聲波測距
    發表于 01-06 08:04

    最簡單的51超聲波測距程序分享

    直接顯示在數碼管上,距離超過20cm就顯示三個A,否則顯示正常的距離值。提示:以下是本篇文章正文內容,下面案例可供參考一、51超聲波測距是什
    發表于 01-24 06:45

    超聲波測距描述+程序

    超聲波測距超聲波測距超聲波測距超聲波
    發表于 11-19 14:07 ?39次下載
    亚洲欧美日韩精品久久_久久精品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>