超声波模块工作时,要用跳线帽连接J2的1,3引脚,2,4引脚。即P10引脚代表发射引脚,P11代表接收引脚。
当CX20106A接收到40kHz的信号时,会在第7脚产生一个低电平下降脉冲,这个信号可以接到单片机的外部中断引脚作为中断信号输入。
所以要用发射电路发射频率为40kHz的方波信号,这个信号可以用定时器控制周期。
sbit Tx=P1^0;//定义引脚
sbit Rx=P1^1;
void Timer0Init(void) //12微秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xF4; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0不计时
}
unsigned char Wave_Recv(void)
{
unsigned char Wave_Num = 10;
unsigned char Dis;
Tx=0;//发射引脚设为低电平
TL0 = 0xF4; //设置定时初值
TH0 = 0xFF; //设置定时初值
TR0 = 1; //定时器0计时
while(Wave_Num--)//发射10个连续的频率为40kHz的方波信号,
{
while(!TF0);//TF0为定时器0的中断标志位,定时时间到,TF0置1,产生中断标志
Tx^=1;
TF0=0;
}
TR0 = 0; //关闭定时器0计时
TL0 = 0; //设置定时初值0
TH0 = 0; //设置定时初值0
TR0 = 1; //开启定时器0计时
while(Rx&&(~TF0));
TR0 = 0;
//等待接收方波信号,初值为0,定时器到65535时才会产生中断,这个时间很长,在这段时间内,TF0为0,所以在这段时间内,接收到信号,Rx置0,跳出循环,测出时间。
if(TF0==1)
{
Dis=250;
TF0=0;
}
else
{
Dis=(((TH0<<8) |TL0 )*0.017);//Dis=时间t*10^(-6)*340*10(-2)/2
}
return Dis;
}
Dis=时间t*10^(-6)*340*10(-2)/2 算出来的单位是厘米。