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< reg51.h >
#include < intrins.h >
#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

    浏览量

    105597
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41023
  • 超声波测距
    +关注

    关注

    5

    文章

    243

    浏览量

    37498
收藏 人收藏

    评论

    相关推荐

    超声波测距系统设计

    超声波测距系统设计由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过
    发表于 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次下载