C51单片机超声波模块代码编写

超声波模块在日常很多地方都有使用到,它的原理是根据发出声波,接收返回的声波的时间来判断此时物体的距离,我们通常可以超声波来进行测距。

1、利用定时器来计算时间

我们利用定时器0的模式1:16位定时器来作为我们的时间计算。此时TMOD要设置为0x01
注意:如果是波特率为9600的时候,要注意此时有用到定时器1,如果要和超声波一起使用,最后使用移步来配置寄存器,直接赋值会将TMOD的值变化。
超声波初始化:

void chaoshenbo_init(){	 //超声波初始化
	TMOD |=0X01;
  	TH0=0; 
	TL0=0;
}

2、计算声波发出到接收声波的时间

超声波模块上有四个引脚,分别为VCC、GND、Echo、Trig,当给Trig一个脉冲后,Echo会发出声波,此时Echo会被拉高,当接收到返回的声波时候,Echo被拉低,所以我们可以根据Echo的变化来计算时间。

void chaoshenbo_start(){	   //超声波发出声波
	Trig=0;     
	Trig=1;
	delay(200);
	Trig=0;
 }
float chaoshenbo_getone(){		 //超声波计时,返回值为float型
	  chaoshenbo_start();
	  while(!Echo);
	  TR0=1;  //开启定时器
	  while(Echo);
	  TR0=0; //关闭定时器
	  return  chaoshenbo_getdis();
}

3、计算距离

声波来回的距离是如何算的呢?距离=声波速度(340m/s)x时间
我们已经通过定时器可以知道声波的时间

float chaoshenbo_getdis(){		 //超声波测距
    int time=TH0*256+TL0;  // 将Th0和TL0的值进行转化
	float distance=(float)(time*0.017); //从发出声波到碰到物体的距离
	TH0=0; //计算完一定要将TH0和TL0清零
	TL0=0;
	return distance; //返回值为 计算出的距离
}

补充:如果用定时器精确算出1s的时间

我们所知道的机器周期:12x晶振的倒数
时钟周期:晶振的倒数
C51单片机超声波模块代码编写_第1张图片
当定时器为16位的模式时,能做2^16次方(65536)的加一,加一就是耗时一个机器周期,定时器爆表一次约等于71ms
那我们要计算1s的时间,可以先算出TH0和TL0需要跳到多少次,已知定时器爆表需要65536x(12/11059200),那我们比例计算出10ms时的TH0和TL0需要跳动几次,然后用66536减去它,就可以得出TH0和TL0的初始值。
注:每定时器爆表一次,后要将TH0和TL0初始化

void init_time(){
   	TMOD |=0X01;
	TH0=0XDC;	  //计算的出RH0和TL0,设置初始化化
	TL0=0X00;
	TR0=1;//开启定时器0

	  
}
void delay1s(){   //定时1s
     int time=1000;
	 if(TF0==1){  //如果定时器报表了,TF0会被拉高
	   	   TF0=0;
		   TH0=0XDC;	  
           TL0=0X00; 
		   time -=10; //报表一次就让time减去10
		if(time==0){
				time=1000;//如果等于0了,就将time变为1000
		   }
	   }
}  

图片来源:来自宏晶科技的STC89C52芯片手册

你可能感兴趣的:(C51单片机超声波模块代码编写)