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版权协议,转载请附上原文出处链接和本声明。