当前位置: 首页 > news >正文

HCSR04超声波测距仿真示例

Windows 10,Proteus 8.17 sp4。80C52单片机晶振频率11.0592兆赫。使用Proteus内置超声波测距传感器模组HCSR04。

原理:MCU向TRIG引脚输出一个正脉冲,时长大于十微秒。在正脉冲下降边沿t1处,传感器立即发送8个40千赫声波并于t2时刻结束,此时ECHO输出高电平,时刻t3回波结束,ECHO引脚回到低电平。t2~t3的时长就是声波一个来回的时间。据此可推算距离。

HCSR04需要的是对高电平计时。可以用定时器0、1的GATE。或者CPU原地等待。前者需要硬件电路配合,很好理解,ECHO必须接INT0/1引脚才行。后者浪费时间。按照最大量程4米,一个来回是800厘米,假设ECHO返回的高电平信号的比例因子是58us/cm(此数字由声速决定),那么CPU需要原地等待46.4ms。这显然不太好。

使用定时器0的GATE,配合INT0下降沿中断,可以实现测量INT0引脚上的高电平。因为量程的问题,定时器0的16位不会溢出。

sbit Trig = P2^7;
sbit Echo = P3^2;
static WORD timingResult = 0;
static BOOL canRead = 0;
static BOOL canTrig = 1;void Timer0_Isr(void) interrupt 1 {TR0 = 0; //溢出了(实际不会)canRead = 0;
}
void Timer2_Isr(void) interrupt 5 {static BYTE x = 0;TF2 = 0;//需要手动清零if(++x == 20) {x = 0;// 200ms到了TR2 = 0;canTrig = 1;//允许再次触发}
}
void Ex0_Isr(void) interrupt 0 {timingResult = ((WORD)TH0 << 8) | TL0;TR0 = 0;TF0 = 0;ET0 = 0;canRead = 1; //本次ECHO结束,可以读结果
}
BOOL Radar_Trigger(void)
{ifnot(canTrig) return FALSE;Trig = 0; // 准备Echo = 1; // 输入模式TR0 = 0;TMOD &= 0xF0;TMOD |= 0x01; // 16位TMOD |= 0x08; // GATETL0 = 0;TH0 = 0;ET0 = 1; // 也可以是0,因为实际不会溢出TF0 = 0;TR0 = 1; // INT0高电平时才会计数EX0 = 0;IT0 = 1; // 下降沿触发IE0 = 0;PX0 = 1; // 测量任务比较紧迫(其实INT0已经是最优先了)TR2 = 0;T2CON = 0;TL2 = 0x00;TH2 = 0xDC;RCAP2L = 0x00;RCAP2H = 0xDC; // 10ms @11.0592MHzET2 = 1;TR2 = 1; // 检查周期用Trig = 1;Delay20us(); // 触发Trig = 0;EX0 = 1; //准备接受canRead = 0; //canTrig = 0; //等return TRUE;
}
BOOL Radar_GetTiming(LPWORD res) {if(res && canRead) {*res = timingResult;return TRUE;}return FALSE;
}

最后是测试效果。用下面主循环代码。

void main(void) {WORD d;UART_Init();EA=1;while(1) {if(Radar_Trigger())printf("Radar_Trigger: OK"  CRLF);if(Radar_GetTiming(&d))printf("%dcm" CRLF, (WORD)((float)d * 1.085f / 58.0f + 0.5f));}
}

表达式里面的1.085f是计数器计一次数的耗时(微秒),58.0f是根据声速换段得来的比例因子,单位us/cm:一米距离下用时5800us=5.8ms跑完一个来回,所以声速V=2m/5.8ms,约等于344.8m/s,大概对应22℃左右。查表法即可。

最终的效果是这样。

image

http://www.jsqmd.com/news/473719/

相关文章:

  • 解决OpenWeatherMap API秘钥激活后仍无法使用
  • 基于STM32的电机控制器:Keil与Proteus的嵌入式之旅
  • 鸿蒙中 应用的权限(一)
  • 心理聊天App 5款产品实测对比,哪个更适合情绪内耗的你?
  • 内存涨价、供应不稳?嵌入式工程师必看:适合轻量级项目ARM选型与存储避坑指南
  • GESP C++一级认证完全指南:考点解析与备考策略
  • SpringBoot3实战集成mzt-biz-log,一行代码搞定业务日志记录
  • 电网电压扰动下相光伏并网逆变器控制的Simulink仿真探索
  • 技术人思维看渠道品牌管理:如何让“多渠道不走样”成为可执行的工程化规则?
  • 基于Matlab的螺丝轮廓识别:数字图像处理流程
  • STM32串口双机模拟汽车电量里程项目:Protues仿真与源码解析
  • 无人零售/五金厂必看!边缘设备Java+YOLOv11推理稳定性全攻略:崩溃率从15%降到0.1%,断点续检1秒恢复
  • ThinkPHP反序列化漏洞深度解析:CacheStore组件为何成为攻击入口?
  • 探索Matlab在两相流动相场法与自适应网格中的应用
  • MATLAB代码:基于多能互补的热电联供型微网优化运行 关键词:多能互补 综合需求响应 热电联...
  • 微电网二次控制:下垂控制与基于数据采样二次控制的奇妙融合
  • 运用stata对CFPS数据库进行打开清洗和处理,以政府转移支付为例
  • 基于PDR算法的室内定位应用:运用行人轨迹推算算法实现连续定位,并优化轨迹采用卡尔曼滤波及无痕...
  • Screeps Arena 实战编程:从零构建你的RTS对战AI
  • 油藏数值模拟中的两相流动 IMPES 方法及 Matlab 实现
  • VSCODE离线环境也能玩转AI编程?手把手教你用CodeGPT插件本地跑大模型
  • 从实验室到开源社区:Scloud+后量子密码算法如何借力openHiTLS加速产业化
  • 提示词工程:这样跟AI说话,它才听你的!
  • 大模型(2):大模型推理文本分类
  • Passmark计算机系统测试工具全解析:从压力测试到性能评分
  • OAuth2.0中state参数的深度应用:业务数据的安全传输与防CSRF实践
  • 新年限定零食礼包推荐:生肖款与新品礼盒,哪一种更能代表节庆氛围? - Top品牌推荐官
  • 优化电动汽车充放电策略实现削峰填谷:一种面向多目标的Matlab调度算法
  • 如果 Canal 跑得比 MySQL 主从同步还快,脏数据怎么防?
  • CentOS7下DuckDB JDBC驱动兼容性构建实战:绕过GLIBC版本限制的三种方案