580 字
3 分钟
超声波相关功能解析
-
板子设置
使用超声波模块时,要将J2的1-3和2-4口用跳线帽连接起来
-
原理

-
底层代码
#include <ultrasound.h>#include "intrins.h"sbit Tx = P1 ^ 0;sbit Rx = P1 ^ 1;void Delay12us() //@12.000MHz{unsigned char i;_nop_();_nop_();i = 38; //这里软件生成的数值要改成38while (--i);}void Ut_Wave_Init() // 超声波初始化函数 产生8个40Mhz的方波信号{unsigned char i;EA=0;//关闭总中断for (i = 0; i < 8; i++){Tx = 1; //发送信号Delay12us();//由isp软件自动生成Tx = 0;Delay12us();}EA=1;//开启总中断}unsigned char Ut_Wave_Data() // 超声波距离读取函数{unsigned int time; // 时间储存变量CMOD = 0x00; //使用PCA定时器,设置为16位不重载CH = CL = 0; // 复位计数值 等待超声波信号发出Ut_Wave_Init(); // 发送超声波信号CR = 1; // 开始计时while ((Rx == 1) && (CF == 0)); // 等待返回信号消失或者定时器溢出CR = 0; // 停止计时if (CF == 0) // 定时器没有溢出 //因为计数溢出后CF自动置1{time = CH << 8 | CL; // 读取当前时间return (time * 0.017 + 3); // 返回距离值,注意+3是减小测量误差//如果设置介质中的速度是可以改变的//那么就,return ((unsigned long)(time/2)*(speed * 100)) / 1000000 +3;//这个公式就是照着上面的原理写成的(单位m->cm,单位s->us)//注意这个(unsigned long)强制转换为长类型变量,//这是因为/1000000已经超出unsigned int的最大长度,要用更大的变量类型才行//也可以直接把100和1000000先结合,return (time/2)*speed)/10000+3;//还要注意,如果speed的速度超出一定值,return的值就超出256的界限//这是函数返回类型就应该从unsigned char 改为 unsigned int}else{CF = 0; // 清除溢出标志位return 0;}} -
函数调用
提前定义变量:unsigned char Dis_value; 在数据读取模块。Dis_value = Ut_Wave_Data(); 这样Dis_value 就显示这测得的距离值
-
注意事项
蓝桥杯单片机超声波测距的最大距离大概是130cm左右,并且在测距过程中,板子附近尽量不要遮挡物体,否则会导致测量出问题。
部分信息可能已经过时














