一.超声波模块测距

跳线帽连接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!

在这里插入图片描述

代码可用超声波,但测距实际效果并不理想,所以很少用来测距。第十四节会有用红外接收进行解码,从而可以使用红外遥控器进行控制。