慕枫宁波网站建设,深圳企业年报,织梦做的网站后台怎么进,网站类型怎么分目录 一、超声波工作原理
二、超声波电路图
三、程序设计
1-设计思路
2-具体实现
四、程序源码 一、超声波工作原理
超声波时间差测距原理超声波发射器向某一方向发射超声波#xff0c;在发射时刻的同时开始计时#xff0c;超声波在空气中传播#xff0c;途中碰到障碍…目录 一、超声波工作原理
二、超声波电路图
三、程序设计
1-设计思路
2-具体实现
四、程序源码 一、超声波工作原理
超声波时间差测距原理超声波发射器向某一方向发射超声波在发射时刻的同时开始计时超声波在空气中传播途中碰到障碍物就立即返回来超声波接收器收到反射波就立即停止计时。
超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s)即:s340*t/2。这就是所谓的时间差测距法。
超声波测距的原理是利用超声波在空气中的传播速度为已知测量声波在发射后遇到障碍物反射回来的时间根据发射和接收的时间差计算出发射点到障碍物的实际距离。由此可见超声波测距原理与雷达原理是一样的。测距的公式表示为: L C x T
式中L为测量的距离长度;C为超声波在空气中的传播速度T为测量距离传播的时间差(T为发射到接收时间数值的一半)。
二、超声波电路图 我们用跳线帽把N A1引脚和P10引脚连接起来把NB1引脚和P11引脚连接起来这样就能用P10和P11两个引脚分别操控超声波发射和接收。
如果将NA2引脚和P10引脚连接NB2和P11引脚连接我们使用的就是电路板上红外线的发射接收模块。
三、程序设计
1-设计思路 1、产生8个40KHz的超声波信号 通过TX引脚发射出去。 2、启动定时器开始计时。 3、等待超声波信号返回如果接收到反射回来的信号RX引脚变为低电平。 4、停止定时器读取脉冲个数即获得时间T。 5、根据公式L V*T/2m进行距离的计算。
2-具体实现
我们默认每300ms进行一次超声波检测这个300ms的检测我们用定时器2来完成即可。
在我们主函数中如果检测到要开始进行超声波检测了就要开始发送超声波信号send_wave函数也就是发送8次40KHZ的超声波信号。超声波信号是40KHZ周期就是25微秒正负周期各占一半也就是TX口置0和置1的时间各占周期的一半12.5微秒13微秒即可。所以我们要在正负信号后面加一个13微秒的延时。
但经过实际测量之后发现由于电路中电容较多存在误差所以使用16微秒的延时会更好。当然这个也不是唯一选择可以根据自己实际情况选择 发送完信号之后就要开始用定时器进行计时。这里我们要用另一个定时器定时器1这里要注意的是定时器时钟设置上要选择12T其他程序用定时器选择1T即可。定时长度选择0。然后把程序中的TR11给注释掉要在发送完信号之后开始计时。 接着我们在主函数内进行检测
如果RX没有接收到低电平返回信号并且检测中断标志位没有溢出中断就一直等待。
当检测到返回信号或者一直没有接收到返回信号但是中断溢出了程序就继续往下进行。首先进行判断如果是一直没有接收到返回信号但是溢出中断了就让距离等于9999表示没有检测到返回信号了数据超出范围。如果是另一种情况也就是检测到了返回信号
LCM_Time TH1;
LCM_Time 8;
LCM_Time | TL1;
就读出超声波从发送到接收信号所用的时间LCM_Time但这读出来的是定时器计数的值所以下面我们要对其进行换算。
LCM(uint)(LCM_Time*17/1000);
原因定时器计数一次需要 1/1000000秒1/12000000/1212M晶振总共计数了 LCM_Time次LCM_Time * 1/1000000 * 17000(34000/2) 距离单位是厘米。
最后把计数值清零方便下次计数。
TL10X00;
TH10X00;
四、程序源码
#include STC15F2K60S2.H
#include intrins.H#define uchar unsigned char
#define uint unsigned intsbit TX P1^0;
sbit RX P1^1;uchar code tab[]{0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
uchar Smg_num0;
uchar Smg[]{0,7,10,5,6,10,1,2};unsigned int LCM_tt 0 ;//超声波采集时间的计数 间隔多长时间进行一次超声波测量
bit LCM_Ref 0 ;//超声波开始测量的标志位
unsigned int LCM 0 ;//超声波测量的距离 单位cm
unsigned int LCM_Time 0 ;//超声波从发送到接收返回信号的时间void Allinit();
void Delayms(uint ms);
void Timer2Init(void); //1毫秒11.0592MHz
void Timer1Init(void); //0微秒12.000MHz
void Delay16us(); //12.000MHz
void Send_wave();//发送超声波信号void main()
{Allinit();Timer2Init();Timer1Init();while(1){if(LCM_Ref1){LCM_Ref0;Send_wave();TR11;while((RX1)(TF10));//如果RX没有接收到低电平返回信号就一直等待或者检测中断标志位没有溢出中断//当检测到返回信号或者一直没有接收到返回信号但是中断溢出了程序就继续往下进行。TR10;if(TF11)//这种情况是 一直没有接收到返回信号但是溢出中断了{TF10; LCM999;//表示没有检测到返回信号了数据超出范围}else{LCM_Time TH1;LCM_Time 8;LCM_Time | TL1;//读出超声波从发送到接收信号所用的时间,但这读出来的是定时器计数的值所以下面我们要对其进行换算LCM(uint)(LCM_Time*17/1000);//定时器计数一次需要 1/1000000秒1/12000000/1212M晶振总共计数了 LCM_Time次//LCM_Time * 1/1000000 * 17000(34000/2) 距离单位是厘米}TL10X00;TH10X00;//清零方便下次计数 }Smg[5]LCM/100;Smg[6]LCM%100/10;Smg[7]LCM%10;}
}void Timer1Init(void) //0微秒12.000MHz
{AUXR 0xBF; //定时器时钟12T模式TMOD 0x0F; //设置定时器模式TL1 0x00; //设置定时初始值TH1 0x00; //设置定时初始值TF1 0; //清除TF1标志//TR1 1; //定时器1开始计时
}void Send_wave()//发送超声波信号
{uchar i8;do{TX1; Delay16us();TX0; Delay16us();}while(i--);
}void Delay16us() //12.000MHz
{unsigned char i;_nop_();_nop_();i 45;while (--i);
}void timer2() interrupt 12
{P2|0XC0;P20XDF;P0(1Smg_num);P2|0XE0;P20XFF;P0tab[Smg[Smg_num]];if(Smg_num8) Smg_num0;if(LCM_tt699)//每三百毫秒进行一次超声波检测 999的时候数据可以上 60cm499的时候数据可以上 50cm{LCM_tt0;LCM_Ref1;}
}void Timer2Init(void) //1毫秒11.0592MHz
{AUXR | 0x04; //定时器时钟1T模式T2L 0xCD; //设置定时初始值T2H 0xD4; //设置定时初始值AUXR | 0x10; //定时器2开始计时IE2|0X04;EA1;
}void Allinit()
{P20XA0;P00X00;P20X80;P00XFF;P20XC0;P00XFF;P20XE0;P00XFF;
}void Delayms(uint ms)
{uint i,j;for(ims;i0;i--)for(j845;j0;j--);
}