【C语言】51单片机超声波测距(实作 非仿真)

这篇具有很好参考价值的文章主要介绍了【C语言】51单片机超声波测距(实作 非仿真)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、设计目标

    使用51单片机和超声波测距模块实现超声波测距。

二、主要功能

    超声波测距。

三、硬件部分

    51单片机,超声波测距模块,导线,动态数码管,74HC245芯片,74HC138芯片。

图1                      

【C语言】51单片机超声波测距(实作 非仿真)

图2

 文章来源地址https://www.toymoban.com/news/detail-489124.html

【C语言】51单片机超声波测距(实作 非仿真)

图3

 

【C语言】51单片机超声波测距(实作 非仿真)

图4

【C语言】51单片机超声波测距(实作 非仿真)

    图1为超声波测距模块的内部电路图。

    图2为超声波测距的输出和接收声波的时序逻辑图。

    图3、图4为动态数码管的控制。使用51单片机的P0_0、P0_1、P0_2端连接74HC138芯片的A、B、C引脚,从而控制哪一个数码管被点亮。

 

四、程序框图

【C语言】51单片机超声波测距(实作 非仿真)

 

五、代码说明

    代码由延时函数、定时器函数、算距离函数、测时间函数、数码管控制函数、数码管显示结果函数、主函数组成

    延时函数和数码管控制函数配合,负责动态数码管显示的硬件控制。

    定时器函数用于测距时定时。

    测时间函数计算超声波发出到接收的时间。

    算距离函数用于对测量的时间进行计算得出距离。

    数码管显示结果函数用于对测量出的结果进行显示。

    数码管控制函数用来控制动态数码管点亮第几位和显示的数字。

1.主函数

    主函数对函数进行调用,首先调用测时间函数得出超声波发出到接收的时间。然后调用算距离函数将时间转化为距离(单位:厘米)。最后调用数码管显示结果函数显示测量的结果。

/******************************************主函数***************************************/
void main()
{
 unsigned int time = 0;
 float distance;

 while(1)
 {  
  time = RunOnce();//传感器接收到高电平的时间
  distance = GetDistance(time);
  xianshi(distance);
 }
}

 

2.子函数1

    数码管控制函数。使用switch()功能,根据硬件中的表格,提前将点亮每个动态数码管所需的信号定义好。Switch()可以采集输入动态数码管函数的值,其中前边一位是点亮第几位动态数码管。另外再定义一个数字数组,数组的内容为单个动态数码管显示0-9即全灭时所需的P3端输出值。

unsigned char shuzi[]={0x3f/*0*/,0x06/*1*/,0x5b/*2*/,0x4f/*3*/,0x66/*4*/,0x6d/*5*/,0x7d/*6*/,0x07/*7*/,0x7f/*8*/,0x6f/*9*/};//显示的数字(num)的数组

void shumaguan(unsigned char wei,num)//第几位(wei)显示
{
 switch(wei)
 {
  case 1:P0_2=0;P0_1=0;P0_0=0;break;
  case 2:P0_2=0;P0_1=0;P0_0=1;break;
  case 3:P0_2=0;P0_1=1;P0_0=0;break;
  case 4:P0_2=0;P0_1=1;P0_0=1;break;
  case 5:P0_2=1;P0_1=0;P0_0=0;break;
  case 6:P0_2=1;P0_1=0;P0_0=1;break;
  case 7:P0_2=1;P0_1=1;P0_0=0;break;
  case 8:P0_2=1;P0_1=1;P0_0=1;break;
 }
 P3=shuzi[num];
 delay(1);
}

 

3.子函数2

    延时函数。和数码管控制函数配合,负责动态数码管显示的硬件控制。

/******************************************延时函数***************************************/
void delay(unsigned int xms)//延时x毫秒 
{
  unsigned int i,j;
  for(i=xms;i>0;i--)
    for(j=112;j>0;j--);
return;
}

 

4.子函数3

    定时器函数。因输出超声波时需要10us的高电平,因此定义该函数。同时也可以用于计算发出到接收的时间。

/**********************************定时器函数 延时10us*************************************/
void Delay10us()
{
 TMOD |= 0x01;//16位定时器/计数器
 TH0 = 0xFF;//赋初值
 TL0 = 0xF6;//赋初值
 TR0 = 1;//启动

 while(!TF0);//溢出

 TF0 = 0;//清溢出
}

 

5.子函数4

    算距离函数。用于将测出的时间转化为距离。

/******************************************算距离函数***************************************/
float GetDistance(unsigned int time)  
{
 float distance;
 distance = (float)time * 0.017;//cm	   距离=高电平时间×声速/2        0.017cm/us
 
 return distance;//将距离返回主函数
}

 

6.子函数5

    测时间函数。与定时器函数配合实现超声波的发出与时间测量。

/******************************************测时间函数***************************************/
unsigned int RunOnce()  
{
 unsigned int time;

/******************发送10us高电平信号*************/
 Trig = 0;
 Trig = 1;
 Delay10us();
 Trig = 0;
/**************等待高电平信号接收*****************/
 while(!Echo);
/*********T0清0重新计数(高电平持续时间)*********/
 TH0 = 0;
 TL0 = 0;
 TR0 = 1;
/*********等待高电平信号接收结束******************/
 while(Echo);
/*******************关闭T0计数********************/
 TR0 = 0;
/**********高电平时间赋值,单位us*****************/
 time = TH0*256 + TL0; 
 TH0 = 0;
 TL0 = 0;

 return time;
}

 

7.子函数6

    动态数码管显示结果函数。用于控制动态数码管显示测量出的距离。

/**************************************动态数码管显示结果***********************************/
void xianshi(int d)
{
  int k=8,m;
  while(d!=0)
  {
    m=(d%10);//在数码管上显示个位,从后往前显示
    shumaguan(k,m);
	k--;//数码管向前移位
	d=d/10;
  }
}

 

六、系统测试  

 

测最近有效距离,为3cm。【C语言】51单片机超声波测距(实作 非仿真)

 测最远有效距离,为560cm。

【C语言】51单片机超声波测距(实作 非仿真)

 

 七、源代码

#include <REGX51.H>
#include<intrins.h>

sbit Trig = P1^0;
sbit Echo = P1^1;
/******************************************延时函数***************************************/
void delay(unsigned int xms)//延时x毫秒 
{
  unsigned int i,j;
  for(i=xms;i>0;i--)
    for(j=112;j>0;j--);
return;
}
/******************************************数码管控制函数***************************************/
unsigned char shuzi[]={0x3f/*0*/,0x06/*1*/,0x5b/*2*/,0x4f/*3*/,0x66/*4*/,0x6d/*5*/,0x7d/*6*/,0x07/*7*/,0x7f/*8*/,0x6f/*9*/};//显示的数字(num)的数组

void shumaguan(unsigned char wei,num)//第几位(wei)显示
{
 switch(wei)
 {
  case 1:P0_2=0;P0_1=0;P0_0=0;break;
  case 2:P0_2=0;P0_1=0;P0_0=1;break;
  case 3:P0_2=0;P0_1=1;P0_0=0;break;
  case 4:P0_2=0;P0_1=1;P0_0=1;break;
  case 5:P0_2=1;P0_1=0;P0_0=0;break;
  case 6:P0_2=1;P0_1=0;P0_0=1;break;
  case 7:P0_2=1;P0_1=1;P0_0=0;break;
  case 8:P0_2=1;P0_1=1;P0_0=1;break;
 }
 P3=shuzi[num];
 delay(1);
}
/**********************************定时器函数 延时10us*************************************/
void Delay10us()
{
 TMOD |= 0x01;//16位定时器/计数器
 TH0 = 0xFF;//赋初值
 TL0 = 0xF6;//赋初值
 TR0 = 1;//启动

 while(!TF0);//溢出

 TF0 = 0;//清溢出
}
/******************************************算距离函数***************************************/
float GetDistance(unsigned int time)  
{
 float distance;
 distance = (float)time * 0.017;//cm	   距离=高电平时间×声速/2        0.017cm/us
 
 return distance;//将距离返回主函数
}
/******************************************测时间函数***************************************/
unsigned int RunOnce()  
{
 unsigned int time;

/******************发送10us高电平信号*************/
 Trig = 0;
 Trig = 1;
 Delay10us();
 Trig = 0;
/**************等待高电平信号接收*****************/
 while(!Echo);
/*********T0清0重新计数(高电平持续时间)*********/
 TH0 = 0;
 TL0 = 0;
 TR0 = 1;
/*********等待高电平信号接收结束******************/
 while(Echo);
/*******************关闭T0计数********************/
 TR0 = 0;
/**********高电平时间赋值,单位us*****************/
 time = TH0*256 + TL0; 
 TH0 = 0;
 TL0 = 0;

 return time;
}
/**************************************动态数码管显示结果***********************************/
void xianshi(int d)
{
  int k=8,m;
  while(d!=0)
  {
    m=(d%10);//在数码管上显示个位,从后往前显示
    shumaguan(k,m);
	k--;//数码管向前移位
	d=d/10;
  }
}

/******************************************主函数***************************************/
void main()
{
 unsigned int time = 0;
 float distance;

 while(1)
 {  
  time = RunOnce();//传感器接收到高电平的时间
  distance = GetDistance(time);
  xianshi(distance);
 }
}

 

 

 

到了这里,关于【C语言】51单片机超声波测距(实作 非仿真)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机的超声波测距系统【proteus仿真+程序+报告+原理图】

    该系统由AT89C51单片机+数码管模块+LED指示灯模块+按键模块构成。 利用51单片机实现超声波测距功能。利用单片机控制超声波的发射和对超声波自发射至接收往返时间的计时。系统定时发射超声波,在启动发射电路的同时启动单片机内部的定时器,利用定时器的计数功能记录超

    2024年02月11日
    浏览(119)
  • 超声波测距模块HC-SR04详解(基于51单片机)

    本篇文章是个人整理的包含超声波测距模块HC-SR04的基本介绍与基本工作原理以及分别通过LCD1602、数码管和串口显示距离的实例讲解与代码的笔记,部分内容来自《HC-SR04超声波测距模块说明书》,代码使用模块化编辑,部分模块来自江科大自化协的51单片机教学视频。 希望大

    2023年04月16日
    浏览(40)
  • 基于单片机超声波测距语音播放

    一、系统方案 本设计采用52单片机作为主控器,HC-SR04测距,液晶1602显示,按键设置报警阀值,语音报警。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 uint dist; // 保存超声波模块测量到的结果 2、液晶显示程序 / / // 1602液晶写命令函数,cmd就是要写

    2024年02月09日
    浏览(36)
  • 基于单片机的超声波语音测距系统

    一、系统方案 超声波具有指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的

    2024年02月10日
    浏览(42)
  • 基于Arduino单片机超声波测距仪设计

    文章目录 摘  要 1.课程设计任务 1.1课程设计题目 1.2设计的要求 2.设计总体方案 2.1初步设计方案 2.2各个单元电路的设计要求 2.3主要性能指标 2.4总体方案 3.单元模块设计 3.1显示模块 3.2超声波测距模块 3.3蜂鸣器模块 3.4电机模块 3.5 LED二极管模块 4.软件流程图 5.设计代码 5.1核

    2024年02月11日
    浏览(35)
  • 51单片机使用HC-S104超声波模块

      HC-S104超声波模块是一种测量距离的传感器,可以用于51单片机的测距应用。下面是使用HC-S104超声波模块的步骤: 1.将HC-S104超声波模块的VCC引脚连接到51单片机的3.3V或5V电源,GND引脚连接到51单片机的GND,TRIG引脚连接到51单片机的一个可编程输出口,ECHO引脚连接到51单片机的

    2024年02月12日
    浏览(50)
  • 【毕业设计】基于超声波智能跟随小车 - 单片机 物联网 stm32 c51

    自动跟随小车系统由两部分组成:跟随小车和移动目标携带装置。 工作原理:跟随小车系统通过无线通信模块发送寻找信号,同时超声波接收器开始计时,如果移动目标接收到无线寻找信号,则立即发送超声波信号。这样小车的三角超声波接收器陆续收到超声波信号,CPU通过

    2023年04月08日
    浏览(54)
  • 基于51单片机驱动HC-SR04超声波模块(LCD1602显示)

    点击图片购买 HC- SR04+是一款宽电压工作的超声波测距模块。模块外形尺寸及软件与老版本 HC- SR04完全兼容;可以与老版本HC SR04无缝切换。低至3V的低工作电压, 使其与3.3V供电的MCU可以直接连接。 特点 探测角度: 15° 采用工业级MCU,工作温度:-20C~80C 探测距离:5V:2cm-- 450cm;3.3V: 2c

    2024年02月02日
    浏览(50)
  • 基于单片机的超声波探伤仪

    摘要 超声波探伤仪是目前工业制造和现代化检测的重要途径之一,广泛的应用在质量检测和产品检测中,通过使用其产品能够有效地降低产品次品的风险。尽管随着电子技术的发展, 国内出现了一些数字化的超声检测仪器,但其数据处理及扩展能力有限,缺乏足够的灵活性

    2024年04月11日
    浏览(47)
  • 基于单片机的超声波探伤仪设计

    摘要 超声波探伤仪是目前工业制造和现代化检测的重要途径之一,广泛的应用在质量检测和产品检测中,通过使用其产品能够有效地降低产品次品的风险。尽管随着电子技术的发展, 国内出现了一些数字化的超声检测仪器,但其数据处理及扩展能力有限,缺乏足够的灵活性

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包