超声波模块分为发射、接收两个部分:
发射:通过跳线帽将P10与发射端相连
接收:连接P11,采用CX20106A作为解调芯片,主要频率在38K~41KHz,超声波实验中主要使用40Hz,当CX20106A接受到40KHz的信号时,会在7脚产生一个低电平下降脉冲,在实际调试的时候只关心芯片的7脚在收到信号是是否有一个下降沿产生。在本电路的调试中,如果一直发射超声波,在7脚将会有周期的低电平产生。不会像通常认为的那样,即一直发射信号时,7脚一直为低电平。这是刚用CX20106时的一个常见错误。
编程 思想:
(1)开定时器开始定时
(2)发射超声波40KHz(每个电平维持100个NOP,一共8周期脉冲)
(3)检测是否有RX == 0的情况,若RX == 0则接收到了反馈的波
(4)定定时器,读时间
(5)读温度(读数时:温度 = 读数 * 0.0625)
(6)计算声速(声速 = 332 + 0.607 * 温度 (m/s))、距离(距离 = 时间 (us)* 声速(m/s) / 2)
附:发送超声波代码
void sendsonic()
{
uchar i;
for(i=8;i>0;i--)
{
TX = 0;
SNOP;SNOP;SNOP;SNOP;SNOP; SNOP;SNOP;SNOP;SNOP;SNOP;
TX = 1;
SNOP;SNOP;SNOP;SNOP;SNOP; SNOP;SNOP;SNOP;SNOP;SNOP;
}
}
void main()
{
speed = 0;time = 0;distans = 0;temper = 0;
bit1=0;bit2=0;bit3=0;bit4=0;
cls_buzz();
Timer0Init();
Timer1Init();
EA = 1;
while(1)
{
display();
if(sonic_flag == 1)
{
sonic_flag = 0;
TR1 = 1;
sendsonic();
while(RX == 1 && timeflag < 3);
TR1 = 0;
if(timeflag >= 3) //out of time
{
bit1 = 10; bit2 = 10; bit3 = 10; bit4 = 10;
}
else
{
outarea = 0; //in area
time = ((TH1<<8)|TL1) + timeflag * 65536; //us
temper = readtemper();
speed = 332 + 0.607*temper;
distans = speed * time * 0.00005;
bit1 = ((unsigned int)distans) /1000;
bit2 = (((unsigned int)distans) % 1000)/100;
bit3 = (((unsigned int)distans) % 100)/10;
bit4 = ((unsigned int)distans) % 10;
}
TH1 = 0;
TL1 = 0;
timeflag = 0;
}
}
}
void t0_isr() interrupt 1
{
static uchar iss2;
iss2++;
TL0 = 0xCD; //设置定时初值 //2ms
TH0 = 0xF8; //设置定时初值
if(iss2>= 200) //0.4s
{
iss2 = 0;
sonic_flag = 1;
}
}
void t1_isr() interrupt 3
{
timeflag++;
}
编程的时候出现的问题:距离一直计算出为0或1:
解决:将distance time speed等变量设置成double
还存在的问题:数码管定时闪烁(推测是超声波测距的程序打断了显示程序,导致显示时间不均匀)尚未找到良好解决方法
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』