1.超声波模块型号
超声波模块是一种常用的测距工具,一般用在避障小车,水位监控系统中,本教程使用的模块型号为HC-SR04,外观形状大体如下
模块除了两个电源引脚外,还有TRIG,ECHO引脚,这两个引脚分别接我们开发板的P2.0和P2.1。
工作原理就是起初先给这两个引脚都拉低,然后让TRIG引脚拉高10微秒以上再拉低产生一个脉冲起始信号(程序中我们是拉高20微秒)。起始信号一开启,ECHO引脚就会被拉高的同时,超声波开始发射,ECHO引脚检测到反射回来的信号时就会被拉低,因为声速为340m/s。那么测出的距离就是
(ECHO引脚高电平持续的时间*340m/s)/2。
中学学过用声波测海底深度,时间*声速=来回的距离,所以需要除以2才是真正的深度,超声波模块也一样。
2.软件分析
计算ECHO引脚高电平的持续时间就用定时器的计数功能完成,如果定时器计数溢出,证明测的距离太远,超出模块的测距范围(最多4米),我们就在数码管上显示999表示距离太远。在测量范围内我们的数码管就显示测出的厘米数。
比如说定时器的计数为9216,那么高电平的持续时间就是9216*(12/11059200)=0.01s
测出的距离就是0.01*340/2=1.7m
数码管就显示170。
不过为了简化单片机的计算过程,我们可以这样算
“( (X*12)/11059200 )*340*100/2”就是厘米数,化简约为“X/54”,X就是定时器的计数值。
本讲代码需要用到“#include 3.代码 #include #include #include #include sbit TRIG = P2^0; sbit ECHO = P2^1; u8 FLAG = 0; void delay_20us() { _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); } void main() { u16 time_data,CM_data; TRIG = 0; ECHO = 0; LED_Init(); //初始化LED硬件模块 EA = 1; //闭合总中断开关 TIM1_Init(1000,0); //定时1ms,用来刷新数码管显示,定时精度要求不高可不微调 TMOD &= 0xF0; TMOD |= 0x01; ET0 = 1; while(1) { TH0 = 0; TL0 = 0; FLAG = 0; //上次如果是超出测量范围,FLAG被置1,这次再测就要清0 //启动发射声波 TRIG = 1; delay_20us(); TRIG = 0; while(!ECHO); //声波开始发射,等待ECHO引脚拉高退出这个循环 TR0 = 1; //ECHO引脚一拉高,就打开定时器进行计数 while(ECHO==1 && FLAG==0); //收到声波返回来的信号ECHO引脚就拉低,退出这个循环;如果定时器溢出,就会进入中断函数执行“FLAG=1;” //也就是测量的距离太远,一直没有收到反射回来的信号,不满足“FLAG==0”的条件只能结束这个循环语句 TR0 = 0; //关闭定时器结束计数 time_data =TH0; time_data=(time_data<<8)|TL0; //把两个八位的寄存器里的值组成一个16位变量的值,也就是定时器计数值 CM_data = time_data/54; //得到厘米的表达式 if(FLAG==1){ShowNumber(999); delay_ms(100);} //超出测量范围显示999,延时的目的:比如测得5cm到6cm之间,数码管会频繁在5跟6之间显示,加入延时就会让它们显示的没有那么频繁 else {ShowNumber(CM_data); delay_ms(100);} } } void TIM0_IRQHandler() interrupt 1 { FLAG=1; } void TIM1_IRQHandler() interrupt 3 { TH1 = T1RH; //重新加载重载值 TL1 = T1RL; SEG_Scan(); }
上一篇:51单片机-舵机与按键
下一篇:51单片机-串口通信入门
推荐阅读最新更新时间:2024-11-12 14:07
推荐帖子
- STM32F0 TX,RX反了,STM32 TX/RX SWAP功能又救了我一次
- 今天又犯了一次低级错误,STM32F0TX,RX反了,STM32TXRXSWAP功能又救了我一次今天板子回来,串口没反应,知道坏了,估计是TX,RX反了。但还是记得以前把TX,RX用软件调换过。今天在QQ和人聊,然后也看了库。stm32f0xx_usart.c中找到下面函数:/***@briefEnablesordisablestheswapTx/Rxpins.*@paramUSARTx:wherexcanbe1or2toselec
- damiaa stm32/stm8
- 【得捷电子Follow me第2期】+ 【任务五】网络控制WS2812B
- 网络控制WS2812B也是有案例的通过连接io.adafruit.com这个网址,设置设备,等操作后相当于创建了一个MQTT服务器,通过其给板子下发指令,然后板子改变灯状态。我们通过注册账号,然后创建Feed。这个主要是数据通信。之后在创建dashboards,这个主要是一个交互界面。然后连接上我们的创建的数据通信部分。通过一个RGB的色板,改变其就能发送不同数据。复制好所有的库。这里都通过外部的settings.toml文件进行配置,不
- 流行科技 DigiKey得捷技术专区
- 一种基于多传感器的交通监控系统智能接口
- 摘 要:提出了一种基于双端RAM的多传感器智能接口设计方法。该智能接口能有效地对传感器数据进行进一步处理,解决了计算机与各传感器之间的信息传输的瓶颈问题,从而能有效地完成计算机与各传感器之间的信息传输和控制;适用于交通监控系统的数据处理。一种基于多传感器的交通监控系统智能接口
- frozenviolet 测试/测量
- 阿牛哥系列故事大嘴歪评世界杯
- 阿牛哥冒着七月的艳阳酷暑,晚上听完国际广播电台的新闻,西瓜荔枝,要看世界杯球赛了。晚上的这场要看,凌晨的那场要听。电视电脑收音机都需要,就是不能影响白天的工作。先说说世界杯比赛,不能在家里看,太影响家人.去哥们马六家看;啤酒不喝了,小心血液里的酒精起左右,喜爱的球队出局砸烂电视机。世界杯就是这样狂热,不可预测,不可捉摸。就是孔明在世,也只能大说无量佛,不晓得结果。想象就是诸葛亮沐浴更衣,焚香抚琴,弹奏的是十面埋伏,平沙落雁也说不尽着二十多人比赛的精彩有趣。阿牛哥系列故事
- jameswangsynnex 创意市集
- 买到次品ws2812模块
- 前段时间,在某宝买了不少的各种电子小零件,其中有两个ws2812LED模块,但是拿回来一点亮发现都有问题,一个绿灯不亮,一个DO不输出数据,我还怕买了一个万一有问题就买了两个,这样的结局我也自认倒霉了,没放在心上,感觉卖这些零件的淘宝卖家也不容易,数量少器件杂,有个小问题也在所难免,不能因为俩LED就来个差评吧。不过我最近在把玩中无意中发现,正常的LED是这样的:而有问题的LED有明显的瑕疵,里面的胶没灌好还是怎么的:板上丝印虽是ws2811,但是led应该是2812的,商品的描述
- lcofjp 综合技术交流
- GPRS基本知识[转帖]
- GPRS基本知识GPRS是什么?GPRS是通用分组无线业务(GeneralPacketRadioService)的英文简称,是在现有的GSM系统上发展出来的一种新的分组数据承载业务。GPRS与现有的GSM语音系统最根本的区别是,GSM是一种电路交换系统,而GPRS是一种分组交换系统。因此,GPRS特别适用于间断的、突发性的或频繁的、少量的数据传输,也适用于偶尔的大数据量传输。这一特点正适合大多数移动互联的应用。GPRS有什么优点?相对原来GSM的
- 2345 RF/无线
设计资源 培训 开发板 精华推荐
- 使用 Analog Devices 的 LT1109CZ 的参考设计
- EVAL-ADXRS623Z,用于评估 ADXRS623、±150 度/秒、单芯片速率陀螺仪的评估板
- AN-1204 使用 ADL5562 差分放大器驱动用于高中频交流耦合应用的宽带宽 ADC
- 使用 Analog Devices 的 LTC1650AIN 的参考设计
- Si24HSPPT-EVB,带有 UART 接口的 Si2403 ISOmodem 评估板
- LT3091MPFE 线性稳压器用于输入电源跟踪的典型应用
- Nand Flash验证模块
- 使用 Analog Devices 的 LT1317CS8 的参考设计
- NCP301LSN16T1 1.6V 电压检测器的典型应用,用于具有附加迟滞的微处理器复位电路
- BA3570F耳放卡:实现老式CD随身听的MBDBBDSL音效