×
嵌入式 > 技术百科 > 详情

【蓝桥杯单片机组】超声波模块

发布时间:2024-05-03 发布时间:
|

超声波模块分为发射、接收两个部分:

发射:通过跳线帽将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


还存在的问题:数码管定时闪烁(推测是超声波测距的程序打断了显示程序,导致显示时间不均匀)尚未找到良好解决方法


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Semtech的LoRa技术携手Chipsafer将牧场连接至云端