一.超声波模块测距
跳线帽连接1-3和2-4!
1.原理图
2.代码及注释
sbit TX=P1^0;
sbit RX=P1^1;
//延时函数
void Delay10us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 25;
while (--i);
}
//发送超声波,规定每次发送8个40kHz的方波
void send_ware(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
TX=1;
Delay10us(); //高电平10us
TX=0;
Delay10us(); //低电平10us
//加上赋值等操作消耗的时间,1个周期可近似看作25us,即40khz的频率
}
}
//定时器1初始化
void Timer1Init(void) //@11.0592MHz
{
AUXR &= 0xBF; //定时器时钟12T模式,每1us计数器加一
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x00; //设置定时初值
TH1 = 0x00; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 0; //定时器1关闭计时
}
//接收并计算距离
unsigned int receive_ware(void)
{
unsigned int time;
unsigned int distance;
TR1=1; //打开定时器1,开始计时
while((TF1==0)&&(RX==1)); //当接收到信号(RX=0)或定时器1溢出(TF=1)时,关闭定时器1
TR1=0; //关闭定时器1,停止计时
if(TF1==1) //如果定时器1溢出即超出最大距离
{
TF1=0; //溢出标志位清零
distance=999; //显示999,意思为超出测量范围
}
else
{
time=(TH1<<8)|TL1; //获得从发出信号到收到信号的间隔时间
distance=(unsigned int)(time*0.017); //dis=time*0.034cm/us(340m/s)/2,
//除以2是因为声波来回是两倍的距离
}
TH1=0x00; //清空定时器1的计数器
TL1=0x00;
return distance; //返回距离
}
二. 红外收发模块测距
跳线帽连接3-5和4-6!
代码可用超声波,但测距实际效果并不理想,所以很少用来测距。第十四节会有用红外接收进行解码,从而可以使用红外遥控器进行控制。