单片机学习小组
直播中

王银喜

7年用户 2371经验值
私信 关注

如何采用HC-SR04模块实现测距功能?

超声波雷达测距的原理是什么?
如何采用HC-SR04模块实现测距功能?

回帖(1)

刘宇

2022-1-25 14:09:28
本篇文章介绍了超声波雷达测距的原理,并通过采用HC-SR04模块实现了测距功能。主要采用CC2530的定时器1测量时间,测距精度大0.17MM。
























完整的源代码


#include
#include


//定义控制灯的端口
#define LED1 P1_0 //定义LED1为P1_0口控制
#define LED2 P1_5 //定义LED2为P1_5口控制
#define LED3 P1_3 //定义LED3为P1_3口控制
#define LED4 P1_4 //定义LED4为P1_4口控制


#define SW1 P1_2        //定义SW1为P1_2端口
#define SW2 P0_1        //定义SW2为P0_1端口


/****************************
//延时
*****************************/
char pause = 0;
void Delay_mS(unsigned int n)
{
      unsigned int tt,i = 0;
      for(i = 0; i < n; i ++)
        for(tt = 0; tt<1040; tt++);
      
      while(pause);
}


void Delay_uS(unsigned int n)
{
      unsigned int i = 0;
      for(;i < n; i++);
}


/****************************
//初始化函数
*****************************/
void Initial(void)
{
      CLKCONCMD &= 0x80; //使用32Mhz时钟
      
      P1DIR = 0xFB;//将P12设为输入,其他设为输出 (0xFB = 11111011)
      LED1 = 0;//关闭LED1
      LED2 = 0;//关闭LED2
      LED3 = 0;//关闭LED3
      LED4 = 0;//关闭LED4
      
      P1_7 = 1; //触发引脚
      
      P0SEL = 0x0C; //大开P0.2,P0.3的外设功能
      U0BAUD = 216; //设置波特率115200
      U0GCR = 11;
      
      U0CSR = 0xC0; //选择UART功能,并使能接收功能   
}


//重定向Printf函数
__near_func int putchar(int c)
{
    UTX0IF = 0;
    U0DBUF = (char)c;
    while(UTX0IF == 0);
    return(c);
}


long t = 0, s = 0; //t用来记录时间,s用来计算激励
/***************************
//主函数
***************************/
void main(void)
{      
      Initial();   //调用初始化函数
      Delay_mS(100);//等待系统时钟稳定
      printf("System Start ... rn");   
      while(1)
      {
        P1_7 = 0;
        Delay_uS(20);
        P1_7 = 1;
        
        while(P0_4 == 0); //等待响应引脚为高电平
        T1CTL = 0x09; //启动定时器,32分频,自由计数模式
        
        while(P0_4 == 1); //等待响应引脚为低电平
        T1CTL = 0x00; //关闭定时器
        
        t = T1CNTH; //读取定时器高8位数据
        t <<= 8;
        t += T1CNTL; //读取定时器低8位数据
        
        s = (t * 34) / 2;
        s = s / 100;
        printf("S:%ld mm rn",s);  
        
        T1CNTL = 0; //清空计数器的值
        T1CNTH = 0;
        
        Delay_mS(1000);   
      }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分