51单片机学习路之HC-SR04超声波模块避障

51单片机学习路之HC-SR04超声波模块避障

前言

本人是一个小白,第一次写博客,基础欠佳,有待夯实,能力不足,需要进步。大概会在此博客中漏洞百出,望君在阅读后可以进行批评指正,不胜感激。
————————————————

一、HC-SR04超声波模块简介

HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。超声波测距原理是当超声波模块产生超声波后,单片机的计时器开始计时,超声波在遇到障碍物后会被反射,超声波模块接收到反射波后,单片机的计时器停止计时。根据时间差,以计算出超声波模块与障碍物的距离。超声波模块在接收超声波时发生能量转化,当超声波模块接收到反射波后,声信号转换为电信号,使单片机的停止计时。设超声波的声速为v,时间差为t0则超声波的测距公式为S = (v × t0)/2

————————————————

二、实物图

在这里插入图片描述

在这里插入图片描述

三、一些代码

//初始化定时器
void init_timer()
{
	TMOD = 0x11; 	//打开定时器0 1
	//初始化定时器 0
    TH0 = 0x00;
    TL0 = 0x00;
    EA = 1;
    ET0 = 1;
    //TR0 = 1;
	//初始化定时器 1
	TH1 = 0xF8; //定时2ms
    TL1 = 0xCD;
    ET1 = 1;
    TR1 = 1;`
```c
//计算距离
void count_distance()
{
	//s = 340m/s * time us /2 = 170*time *10^-6 m = 0.17*time mm
	uint distance = (TH0*256 + TL0*1)*0.17;  //单位mm
	TH0 = 0;
	TL0 = 0;
	if(distance>=4000 || distance < 20)     //超出测量范围显示“ERR0”
	{
	  	flag = 1;
	}
	else
	{
		date_distance[1] = distance%10000/1000;
		date_distance[2] = distance%1000/100;
		date_distance[3] = distance%100/10;
		date_distance[4] = distance%10/1;
	}
}
void display()
{
	uchar i;
	if(flag == 1)
	{
		flag = 0;
		date_distance[1] = 14;
		date_distance[2] = 14;
		date_distance[3] = 14;
		date_distance[4] = 14;
	}

	for(i = 1;i<=4;i++)
	{
		init_smg(i);
		if(i==1)
			P0 = SMG[date_distance[i]] |0x80;
		else
			P0 = SMG[date_distance[i]];
		delay_ms(1);
		P0 = 0x00;
	}

}

void main()
{
	init_timer();
	while (1)
	{
		while(!RX);		//等待TX发出
		TR0 = 1;        //开始计时
		while(RX);      //当TX发出时,RX为高电平
		TR0 = 0;		//终止计时
		count_distance();
	}
}


```c
//定时器 0 用来计算距离
void timer0() interrupt 1
{
	flag = 1;
}
//定时器 1 用来数码管显示数据和发射超声波信号
void timer1() interrupt 3
{
	TR1 = 0; //终止定时
	TH1 = 0xF8; //定时2ms
    TL1 = 0xCD;

	kk ++;
	display();
	if(kk>100)   //每200ms启动一次超声波模块
	{
		kk = 0;
		//启动超声波模块
		TX = 1;
		delay_10us(2);
		TX = 0;
	}
	TR1 = 1;
}

最后,希望得到批评指正


版权声明:本文为m0_54255407原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。