原理:
超声波方面:
超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波可用于距离的测量。
超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),
即:S=Vt/2 。
51单片机方面:
震荡周期,时钟周期:晶振提供
机器周期:CPU完成一个独立操作,为十二个震动周期
即:外接12MHz晶振51单片机每进行一次操作需要1us
HC-SR04方面:
(1)采用IO口TRIG触发测距,给至少10us的高电平信号; (2)模块自动发送8个40khz的方波,自动检测是否有信号返回; (3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
时序图:

代码实现部分:

#include <reg52.h>
#include <intrins.h>
typedef unsigned int u16;     //对数据类型进行声明定义
typedef unsigned char u8;sbit Trig = P2^1;
sbit Echo = P2^0;
sbit LED=P2^2;u8 str[20]={0};
u8 zhi=10;
u8 code strerror[]={"error"};
u8 i;
u16 time;
u16 S=0;
bit flag=0;/*******************************************************************************
函数功能        :串口通信配置
*******************************************************************************/
void USARTinit()
{SCON=0X50;            //设置为工作方式1TMOD=0X20|TMOD;          //设置计数器工作方式2PCON=0X80;         //波特率加倍TH1=0XF3;               //计数器初始值设置,波特率是4800TL1=0XF3;ES=1;                      //打开串口中断EA=1;                      //打开总中断TR1=1;                  //打开计数器
}/*******************************************************************************
函数功能        : 串口通信发送中断函数
输入           : 要发送的一字节数据
*******************************************************************************/
void send(u8 Data)
{SBUF=Data;     //数据放入到发送寄存器while(!TI);             //等待发送数据完成TI=0;                             //清除发送完成标志位
}/*******************************************************************************
函数功能        : 定时器0初始化,用于计算时间
*******************************************************************************/
void T0inti()
{TMOD=0x01|TMOD;          //设T0为方式1TH0=0;TL0=0;          ET0=1;             //允许T0中断EA=1;             //开启总中断
}/*******************************************************************************
函数功能        : 外部中断初始化
*******************************************************************************/
void EXinit()
{EX0=1;              //打开外部中断0IT0=1;             //边沿触发方式EX1=1;              //打开外部中断1IT1=1;             //边沿触发EA=1;        //打开总中断
}/*******************************************************************************
函数功能        : 阈值初始化
*******************************************************************************/
void zhiinit() interrupt 0
{zhi=10;
}/*******************************************************************************
函数功能        : 阈值加10
*******************************************************************************/
void zhichuli() interrupt 2
{zhi=zhi+10;
}/*******************************************************************************
函数功能:  提示计数器溢出,超过测距范围
*******************************************************************************/
void error() interrupt 1         {flag=1;                           //中断溢出标志S=0;}/*******************************************************************************
函数功能        : 定时器0初始化,用于计算距离
*******************************************************************************/void Conut() {if(flag==0){time=TH0*256+TL0;TH0=0;TL0=0;(u16)S=(time*1.7)/100;     //算出来是CM}}/*******************************************************************************
函数功能        : 对计算数据做处理,并发送,同时做量程判断
*******************************************************************************/void chuli(){ES=1;                                       //打开串口中断TI=0;        if(S<=zhi)                              //距离小于阈值cm或者距离大于测量值LED点亮,LED低电平点亮    (初始为10){LED=0;}else {LED=1;}if(S==0){for(i=0;i<=5;i++){send(strerror[i]);}flag=0;TH0=0;TL0=0;}if(S>0){for(i=1;S>=1;i++){str[i]=(unsigned char)(S%10)+'0';(u16)S=S/10;}for(i=i-1;i>0;i--){send(str[i]);}send('\r');send('\n');ES=0;                                                                    //关闭串口中断            }
}/*******************************************************************************
函数功能        : 启动HC-SR04
*******************************************************************************/
void  Start()                                                          //启动HC-SR04需要10us高电平,一个_nop_()是1us,保险起见设置20个{Trig=1;                              _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); Trig=0;                       }void main(){T0inti();EXinit();USARTinit() ;while(1){Start() ;while(!Echo);      //当Echo为零时等待TR0=1;             //开启计数while(Echo);          //当Echo为1计数并等待TR0=0;               //关闭计数Conut() ;chuli();}}

收获:
对于单片机串口通信有了更深理解。
模块化编程有了一些尝试。

基于51最小系统的超声波测距相关推荐

  1. 基于51单片机的智能超声波四轮遥控小车proteus仿真

    硬件设计 下边讲一下遥控小车,同样是基于51单片机,利用超声波进行测距,利用蓝牙模块实现遥控(仿真里边没有蓝牙,所以采用的是RS485通信模拟) 仿真图: 由LCD1602作为显示器,具有蜂鸣器报警, ...

  2. 基于51单片机驱动HC-SR04超声波模块(LCD1602显示)

    基于51单片机驱动HC-SR04超声波模块(LCD1602显示) 一.基本参数 二.通信时序 三.部分代码展示 四.实际效果 总结 一.基本参数 点击图片购买 HC- SR04+是一款宽电压工作的超声 ...

  3. 【8088】基于8088最小系统板的打地鼠游戏实现【简】

    文章目录 研究目的及意义 8088最小系统板的打地鼠游戏具有以下优势: 研究内容和方法 接口板 上位机软件 8080最小系统板 研究目的及意义 随着社会的发展进步,电子技术的不断发展创新,为了紧跟快速 ...

  4. 基于STC89C51/2的的超声波测距(1602A显示)

    基于STC89C51/2的的超声波测距(1602A显示) 楼主在做学校单片机设计的时候为了测试超声波模块的功能与精度,动手DIY一款能用的超声波测距仪器,用1602液晶显示屏动态显示,精度在0.5cm ...

  5. STM32和51最小系统原理图以及PCB板图以及元件库

    写在前面 由于最近社团学习AD的时候,作业要求画一个STM32和51的最小系统板,经过一番学习,自己琢磨出了这两个作业 新手上路,大佬勿喷 更新 2021.9.11更新 实在不好意思,有许多网友找我要 ...

  6. AD学习笔记--构建51最小系统板

    采用AD17,构建51最小系统板 (由于本人也是初学,文章中的具体布线没有涉及到,抛砖引玉,只做参考) 1.预估需要的原件:主芯片,电阻,电容,晶振,按键,4孔排针,8空排针等,根据需求自己再另行构建 ...

  7. 新建Proteus并绘制51最小系统

    新建Proteus并绘制51最小系统 一.新建Proteus工程 二.绘制51最小系统 三.51最小系统讲解 什么是最小系统 最小系统三要素 电源 晶振电路 复位电路 一.新建Proteus工程 1. ...

  8. 51单片机:HCSR04超声波测距模块及1602显示—C51程序(超详细)

    测试完成于STC89C516单片机,晶振12MHZ.超声波模块Echo=P1^0.Trig=P1^1,1602液晶8位数据口=P0.E=P2^7.RS=P2^6.RW=P2^5.. 程序文件分为4部分 ...

  9. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)

    参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...

最新文章

  1. 1024,点亮人间烟火
  2. Socket编程(C语言实现)—— 为什么流式传输类似于管道?不区分边界?
  3. python args kwargs_Python中的args和kwargs
  4. 重磅!就在刚刚,吊打一切的 YOLOv4 开源了!
  5. 如何修改vs2008代码字体
  6. JAVA调用HTTP接口
  7. 如何操作SAP UI5应用Footer区域工具栏按钮的背景颜色
  8. ubuntu12.04 使用gedit 打开txt文件中文乱码的处理方法
  9. Google or Baidu
  10. linux内核的I2C子系统详解4——i2c-s3c2410.c文件中的adapter、algorithm
  11. 怎么样才能更高效的学习区块链
  12. 公有云私有云的区别_私有云 vs. 公有云:谁更安全?
  13. gogs只支持mysql5.7_在docker中跑nginx,gogs,mysql服务
  14. CCCC/PTA 2019模拟赛 L3-3 至多删三个字符
  15. 一个类中域(field)的首字母不要大写
  16. 深信服SCSA认证过程记录
  17. 联想官方出品小工具:关闭或开启 Win10 系统自动更新
  18. IDispatch接口原理与应用
  19. 桌面计算机怎么设置声音,右下角小喇叭不见了-电脑桌面右下角有一个调整声音的小喇叭图标没 – 手机爱问...
  20. 阿里云数据迁移工具解决方案:华为云迁移到阿里云

热门文章

  1. 【iCore3 双核心板_FPGA】实验二十三:使用JTAG UART终端打印信息
  2. POJ3342 Party at Hali-Bula(树型DP求最大独立集+唯一解判断)
  3. linux -- 命令大全
  4. Autobook中文版(七)—9.一个小的GNU Autotools项目
  5. XML解析:PULL解析
  6. 关于vue中watch和computed
  7. 028-进阶(网络编程)
  8. 【编程练习】复习一下树的遍历
  9. PS基础教程[1]如何制作微信泡泡
  10. JSON.stringify(Data) 在IE8 里面不可用