HC-SR04超声波测距探讨
admin 于 2013年05月18日 发表在 嵌入式开发笔记

1. 测量原理:

利用两个端口分别作为发射及接收口,通过对电平高低变化的捕捉,计算出高电平持续时间。

2. 距离公式:

距离=(高电平持续时间*声速(340M/S)/2)

void StartModule_1() 
{
    TRIG_1=1;                                         //启动一次模块
    delay(5);
    TRIG_1=0;            
}
void Conut(void)
{
    time=0;
    time=TH0*256+TL0;
    TH0=0;
    TL0=0;
    S=0;
    S=(time*1.7)/100;                                 //算出来是CM
}  
void chaoshengbo_ceju1(void)
{
    StartModule_1();
    while(!ECHO_1);                                   //当RX为零时等待
    TR0=1;                                            //开启计数
    while(ECHO_1);                                    //当RX为1计数并等待
    TR0=0;                                            //关闭计数
    Conut();                                          //计算
    S1=S;
}

TRIG(控制端):电平由0 -> 1 TTL电平持续至少10Us,启动超声波模块;若启动,则模块自动发送8个40Khz的方波,并自动检测是否有信号返回。

ECHO(接收端):利用程序中: while(!ECHO_1); 等待回响信号发生跳变(遇到障碍物后反射)

ECHO_1从 0 -> 1 TTL电平时,打开计时器,直到电平由1 -> 0 ,记录高电平持续的时间,即:超声波从发射到返回的时间。

3. 模块电路图:

4. 时序图:

5. 源码:点击下载附件

/************************超声波传感器驱动函数*************************/
/***************使用液晶LCD1602显示测量距离,显示单位:厘米cm***********/
/*模块的四位引脚:TRIG/ECH0分别连普通IO口,VCC和GND接JPW电源扩展接口**/
#include<reg52.h>

unsigned long S1,S2;
unsigned long S;
unsigned int time;
bit flag=0;
// 定义转弯指示灯
sbit rled = P0^4;
sbit lled = P1^4;

// 定义左边超声波传感器的变化
sbit lcsb1 = P0^0;
sbit lcsb2 = P0^1;
// 记录右边超声波传感器的变化
sbit rcsb1 = P0^2;
sbit rcsb2 = P0^3;

// 定义超声波模块1引脚
sbit ECHO_1 = P1^0;
sbit TRIG_1 = P1^1;
// 定义超声波模块2引脚
sbit ECHO_2 = P1^2;
sbit TRIG_2 = P1^3;

// 定义延迟函数
void delay(unsigned char t)
{
    unsigned char i;
    unsigned int j;
    for (i = 0; i < 110; i++)
        for (j = 0; j < t; j++);
}

// 超声波传感器计数函数
void Conut(void)
{
    time=0;
    time=TH0*256+TL0;
    TH0=0;
    TL0=0;
    S=0;
    S=(time*1.7)/100;                                 //算出来是CM
}
//  定时器0中断服务函数
void zd0() interrupt 1                                  //T0中断用来计数器溢出,超过测距范围
{
    flag=1;                                             //中断溢出标志
}
// 启动超声波传感器模块函数
void  StartModule_1()
{
    TRIG_1=1;                                         //启动一次模块
    delay(5);
    TRIG_1=0;
}
void  StartModule_2()
{
    TRIG_2=1;                                         //启动一次模块
    delay(5);
    TRIG_2=0;
}
// 超声波传感器模块及中断初始化
void chaoshengbo_init(void)
{
    TMOD=0x11;                                           //设T0、T1为方式1
    TH0=0;
    TL0=0;
    TH1=(65536-50000)/256;
    TL1=(65536-50000)%256;
    ET0=1;                                             //允许T0、T1中断
    ET1=1;
    TR1=1;
    EA=1;                                           //开启总中断
}
// 超声波传感器对外接口函数
void chaoshengbo_ceju1(void)
{
    StartModule_1();
    while(!ECHO_1);                                    //当RX为零时等待
    TR0=1;                                            //开启计数
    while(ECHO_1);                                    //当RX为1计数并等待
    TR0=0;                                            //关闭计数
    Conut();                                        //计算
    S1=S;
}
void chaoshengbo_ceju2(void)
{
    StartModule_2();
    while(!ECHO_2);                                    //当RX为零时等待
    TR0=1;                                            //开启计数
    while(ECHO_2);                                    //当RX为1计数并等待
    TR0=0;                                            //关闭计数
    Conut();                                        //计算
    S2=S;
}

void main(void)
{
    chaoshengbo_init();
    S1=S2=0;
    lled = 1;
    rled = 1;
    lcsb1 = lcsb2 = 1;
    rcsb1 = rcsb2 = 1;
    while(1)
    {
        if((S1>=1)&&(S1<=20))
        {
            delay(10);
            if((S1>=1)&&(S1<=20))
            {
                lcsb1 = 0;
                lcsb2 = 0;
                lled = 0;
            }
        }
        else
        {
            lcsb1 = 1;
            lcsb2 = 1;
            lled = 1;
        }
        if((S2>=1)&&(S2<=20))
        {
            delay(10);
            if((S2>=1)&&(S2<=20))
            {
                rcsb1 = 0;
                rcsb2 = 0;
                rled = 0;
            }
        }
        else
        {
            rcsb1 = 1;;
            rcsb2 = 1;
            rled = 1;
        }
    }
}

void T1_time() interrupt 3                //定时器1中断服务程序,没50ms调用一次超声波测距
{
    TH1=(65536-50000)/256;
    TL1=(65536-50000)%256;
    chaoshengbo_ceju1();
    chaoshengbo_ceju2();
}
注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签:HC-SR04超声波模块,keil4,电路开发,MCU使用