基于Proteus的51单片机超声波测距
之前发过一期使用51单片机开发板完成的超声波测距。今天再发一个基于Proteus仿真的超声波测距。Proteus8.0之前的版本中都没有超声波测距这个模块,所以在Proteus7的软件中大部分超声波测距仿真都是采用的网友自制的超声波测距模块,自制的模块在仿真时交互性不是很友好,所以今天分享的仿真是基于Proteus8.8版本。文章的最后会告知如何仿真和软件的下载方式。
超声波测距模块SRF04
超声波测距模块在Proteus中的名称叫做SRF04,它的工作原理与之前文章中介绍的超声波模块工作原理一致,都是通过一个IO控制超声波模块的发射,通过另外一个IO对超声波接收端的信号进行检测,计算出超声波信号的运动时间,进而计算出模块与障碍物之间的距离。
测距原理
原理方面就不在多说了,贴一下仿真图。
Proteus仿真图
今天分享的超声波测距仿真如图所示,显示部分使用的是LCD1602,由于声波在不同温度下的传播速度不同,所以仿真中使用DS18B20对环境温度进行采集,以便实现超声波的温度补偿。
部分程序截图
检测部分程序如上图所示,程序的大致流程为显示初始化->外设初始化->检测DS18B20温度->发送超声波并启动定时器->等待声波信号返回->计算距离->判断距离是否在范围内->更新显示->进入下一个循环。
程序流程
仿真运行图
仿真运行时效果如图所示。在该仿真的基础上增加按键、蜂鸣器等外设就可以实现倒车雷达的功能。有兴趣的小伙伴可以自行下载研究。
Proteus8.8软件可以在公众号主页发送”Proteus”,系统即可自动回复对应的下载链接。
本文分享的仿真及程序可以在公众号发送”超声波测距仿真”获取相应的下载链接。
下面贴一下主程序。
#include "reg51.h"#include <stdio.h>#include "LCD.H"#include "18B20.H"#include "delay.h"sbit csb=P2^5; //超声波发送引脚sbit csbint=P3^2; //超声波接收引脚unsigned char aa[]={' ',' ','D','i','s','t','a','n','c','e',':'}; //Distanceunsigned char bb[11]={' ',' ',' ',' ','.',' ',' ',' ',' ',' ',};unsigned char cc[]={'A','.','A','A','m'};unsigned char zf; //zf 温度正负标志位unsigned int s,j,bgz,k;int temp;float temperature,csbc,wdz; //温度及温度补偿变量void main(void){TH0=0;TL0=0; //定时器0计数器清0TMOD=0X11; //T1,T0为16位定时器EA=0; //关闭总中断init(); //初始化Init_DS18B20(); //DS18B20初始化bb[6]=0xdf; //显示摄氏度符号bb[7]=0x43;LCD_Write_String(0,0,aa); //对数据进行显示while(1){temp=ReadTemperature(); //读取DS18B20温度数据DelayMs(100); //延时100毫秒if(temp<0) //如果温度小于0{temp=-(temp-1); //温度取反处理,并显示负号zf=1;bb[0]='-';}else //温度为正值{zf=0;bb[0]=' ';}csb=0; //给超声波模块发送一个启动脉冲_nop_();_nop_();_nop_(); //启动脉冲需要一定宽度_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();csb=1; //置位ET0=1; //启动计数器T0,用以计时TR0=1;EA=1; //开启总中断j=80; //延时一段时间 while(j--){}csbint=1;j=0;while(csbint) //判断接收回路是否收到超声波的回波{j++;if(j>=2500) //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序csbint=0;}TR0=0; //关闭定时器0s=TH0*256+TL0; //读取时间数据TH0=0; //定时器清0TL0=0;wdz=0.00000607*temp; //计算温度补偿值if(zf==0){csbc=0.03315+wdz; //对超声波速度进行温度补偿,温度为正值时+,温度为负值时-}else csbc=0.03315-wdz;csbc=csbc/2; //s=s*csbc-4; //速度*时间=位移if(s<5) //测量值小于下限{cc[0]='-';cc[2]='-'; //测量距离小于下限,显示---,cc[3]='-';}else if(s>500) //测量值大于上限{cc[0]='C';cc[2]='C'; //测量距离大于上限值,显示CCCcc[3]='C';}else{cc[0]=s/100+'0';cc[2]=s/10%10+'0'; //距离在范围内,显示距离数值cc[3]=s%10+'0';}//显示测量的温度bb[1]=temp/1000+0x30;bb[2]=temp/100%10+0x30; //显示十位bb[3]=temp%100/10+0x30; //显示个位bb[5]=temp%10+0x30; //小数if(zf==0){if(temp<1000){bb[1]=' ';if(temp<100){bb[2]=' ';}}}else{if(temp<1000){bb[1]='-';bb[0]=' ';if(temp<100){bb[0]=' ';bb[1]=' ';bb[2]='-';}}}LCD_Write_String(4,1,bb);LCD_Write_String(11,0,cc);}}
基于Proteus的51单片机超声波测距相关推荐
- 基于51单片机超声波测距液位检测-温度检测
[毕设课设]基于51单片机超声波测距液位检测-温度检测 效果图 Proteus仿真: 功能简介: 文件内容: 程序框架: 网盘链接: 效果图 更多内容请关注@WENJIE电子科技 基于51单片 ...
- 基于51单片机 超声波测距 倒车雷达
基于51单片机 超声波测距 倒车雷达 51单片机最小系统电路+LCD1602+蜂鸣器报警电路+按键电路+超声波模块+电源电路 实现液晶显示距离 超设置数值报警 按键可修改数值 可加蓝牙模块 用户可以通 ...
- hc05与单片机连接图_基于proteus的51单片机开发实例(13)-LED指示那个按键被按下
1. 基于proteus的51单片机开发实例(13)-LED指示那个按键被按下 1.1. 实验目的 本实例将实现两路外部中断的检测和识别,让我们能够更好地理解51单片机的外部中断以及中断优先级的概念. ...
- c++程序设计_基于proteus的51单片机开发实例30-模块化程序设计
1. 基于proteus的51单片机开发实例30-模块化程序设计 1.1. 实验目的 模块化程序设计 不知不觉我们的51单片机开发实例已经进行到第三十篇了,是时候进行一个总结和反思了,总结什么?反思什 ...
- 水下超声波测距c语言程序,51单片机超声波测距C程序
51单片机超声波测距C程序 (2010-01-26 14:09:10) 电子工程师电子资料大学校园 超声波检测原理 超声波测距的程序流程图 程序如下: //超声波模块程序 #include #defi ...
- c51中断优先级c语言,基于proteus的51单片机开发实例(14)中断嵌套和中断优先级...
1. 基于proteus的51单片机开发实例(14)中断嵌套和中断优先级 1.1. 实验目的 在前面实例中我们已经学习了51单片机的定时器/计数器中断,外部中断,通过这些实例,知道了中断电路的设计,中 ...
- hc05与单片机连接图_基于proteus的51单片机开发实例37-DAC0832
学习手记 1. 基于proteus的51单片机开发实例37-DAC0832 1.1. 实验目的 之前我们学习了数模转换芯片DAC0808,今天我们继续学习另一种D/A转换芯片DAC0832. 1.2. ...
- 51单片机超声波测距带语音播报(源程序+原理图+原理图讲解)
本设计 51单片机超声波测距带语音播报(源程序+原理图+原理图讲解) 原理图:Altium Designer 程序编译器:keil 4 编程语言:C语言 编号S0004 功能说明: 1.本设计采用ST ...
- 基于proteus的51单片机仿真实例二、关于proteus
一.proteus的使用 proteus软件能对单片机系统同时进行软件和硬件仿真.是初学单片机而又没有硬件工具的一个很好的选择. 后面的学习将以protwus 7.4中文版为学习平台. 1.软件的下载 ...
- 单片机测距雷达c语言代码,51单片机超声波测距倒车雷达Proteus仿真+源代码
#include #include #include "LCD.H" #include "delay.h" #define uint unsigned int ...
最新文章
- SolrJ查询Solr数据
- 用Windows Live Writer在51CTO写博客
- python应该怎么自学-Python 应该怎么学?
- 找出两个字符串数组中的相同元素
- android fragmentactivity fragment,Android:Activity与Fragment通信(99%)完美解决方案
- 字段与属性 关于类的封装 c# 1229
- sort ascend matlab,MATLAB sort函数用法
- VMware ESXi/ESX 的内部版本号和版本 (2143832)-2020-10-27更新
- 智慧零售erp通用版管理系统+门店管理+商品管理+厂商管理+财务管理+销售管理+仓储管理+Axure高保真交互ERP通用版零售行业web端简易版管理系统
- Python数据分析之理论知识
- html在线比对工具,在线文本对比工具(mergely示例)
- 自动驾驶中车辆的如何使用点云定位?
- ENVI/IDL 批量裁剪同一地区的多幅影像-第五篇
- 分享这几个在线语音转文字的方法,快快收藏好
- arduino继电器控制风扇_如何基于Arduino制作DHT22控制的风扇
- php 验证码数字英文的,验证码的英文_php 中英文验证码程序
- 【Python_PyQtGraph 学习笔记(五)】基于PyQtGraph和GraphicsLayoutWidget动态绘图并实现窗口模式,且保留全部绘图信息
- 模块加载失败请确保该二进制存储在指定路径中
- linux zip压缩排除目录,Linux系统zip压缩命令详细参数,附文件排除选项的正确用法...
- 【Linux】设备和磁盘分区|/dev/sda