打印

有用HC-SR04超声波模块测距的吗?

[复制链接]
5445|15
手机看帖
扫描二维码
随时随地手机跟帖
沙发
autooy| | 2014-8-13 08:16 | 只看该作者
我使用这个模块测试过树直径、距离,倒车雷达等各类项目啊,估计是你的定时器没有设置好的缘故。

使用特权

评论回复
板凳
落笔苍穹| | 2014-8-13 10:41 | 只看该作者
这个模块感觉误差有点大啊

使用特权

评论回复
地板
yuanquan12345|  楼主 | 2014-8-16 17:28 | 只看该作者
程序已经写好,请大家指正。
数码管是自己焊接的,所以排列不规律。

使用特权

评论回复
5
yuanquan12345|  楼主 | 2014-8-16 17:29 | 只看该作者
#include<reg52.h>
#include <intrins.h>
#include <math.h>

#define uchar unsigned char
#define uint unsigned int

sbit Trig = P2^0;
sbit Echo = P2^1;
sbit dula = P2^6;
sbit wela = P2^7;

uint i;

uchar code table[]={0x3f,0x06,0x5b,0x4f,
                                        0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,
                                        0x39,0x5e,0x79,0x71};

void delay_10us();
void delay_ms(uint t);
void init_t0();
void display();
uint fh();

void main()
{
        init_t0();
        while(1)
        {
                display();
        }
}

void delay_10us()
{
        uchar x=3;
        while(x--);
}

void delay_ms(uint t)
{
        uint x,y;
        for(x=t;x>0;x--)
                for(y=120;y>0;y--);
}

void init_t0()
{
        TMOD = 0X01;
        TH0 = 0;
        TL0 = 0;
        EA = 1;
        ET0 = 1;
//        TR0 = 1;
}

void display()
{
        uint j;
        uchar ge,shi,bai;
        j=fh();

        if(j>=20)
        {
                P1=0xfe;
        }
        else
                P1=0xff;
       
        bai=j/100;
        shi=j%100/10;
        ge=j%10;
       
        wela=1;
        P0=0xdf;
        wela=0;
       
        dula=1;
        P0=table[ge];
        dula=0;
        delay_ms(1);
       
        wela=1;
        P0=0xef;
        wela=0;
       
        dula=1;
        P0=table[shi];
        dula=0;
        delay_ms(1);
       
        wela=1;
        P0=0xf7;
        wela=0;
       
        dula=1;
        P0=table[bai];
        dula=0;
        delay_ms(1);
}

uint fh()
{
        TR0=0;
        TH0=0;
        TL0=0;
       
        Trig=1;
        delay_10us();
        Trig=0;
        delay_10us();
        delay_10us();
        delay_10us();
        while(!Echo);
        TR0=1;
        while(Echo);
        TR0=0;
        i=(TH0*256+TL0)/58;
        return i;
}

void t0() interrupt 1
{
        TH0=0;
        TL0=0;
}

使用特权

评论回复
6
zhujunjiejuan| | 2014-8-16 22:38 | 只看该作者
还有可能是给模块供电的电源不稳定哦。。

使用特权

评论回复
7
yuanquan12345|  楼主 | 2014-8-18 22:12 | 只看该作者
现在能测了,我想请大家看看我的程序,还需要优化不。
谢谢。

使用特权

评论回复
8
hwcqcc| | 2014-8-19 09:17 | 只看该作者
我最近也买了一个HC-SR04模块在测,测出来结果误差蛮大的,10%误差,不可接受啊,手头暂时没有示波器,不知道误差从何而来。

使用特权

评论回复
9
旭日东起| | 2014-8-19 09:22 | 只看该作者
还可以,误差也一般般了

使用特权

评论回复
10
hwcqcc| | 2014-8-19 09:22 | 只看该作者
落笔苍穹 发表于 2014-8-13 10:41
这个模块感觉误差有点大啊

我试了误差有10%,你的呢?

使用特权

评论回复
11
yuanquan12345|  楼主 | 2014-8-19 22:41 | 只看该作者
我的也在10%左右。

使用特权

评论回复
12
yushan210| | 2015-9-8 09:21 | 只看该作者
10% 左右 超过100cm就没变化了

使用特权

评论回复
13
悬架| | 2016-4-27 11:09 | 只看该作者

我用的是飞思卡尔 单片机 一直都测不出示数,求教啊

使用特权

评论回复
14
悬架| | 2016-4-27 11:10 | 只看该作者
悬架 发表于 2016-4-27 11:09
我用的是飞思卡尔 单片机 一直都测不出示数,求教啊

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#define  BUS_CLOCK                   32000000           //总线频率
#define  OSC_CLOCK                   16000000           //晶振频率
#define TIMER 2
#define TRING PORTB_PB3  //控制端接PB3
#define ECHO  PORTB_PB4  //接收端接PB4
int time;
void Delay1us(int c)
{ int cnt0;
  for(cnt0=0;cnt0<4*c;cnt0++)
  { _asm NOP;_asm NOP;_asm NOP;
    _asm NOP;_asm NOP;_asm NOP;_asm NOP;
    _asm NOP;_asm NOP;_asm NOP;_asm NOP;
    _asm NOP;_asm NOP;_asm NOP;_asm NOP;
    _asm NOP;_asm NOP;_asm NOP;
  }
}

void Delay1ms(int c)
{ int cnt;
   int cnt1;
   for(cnt=0;cnt<4*c;cnt++)
   {
     for( cnt1=0;cnt1<1000;cnt1++)
      {  _asm NOP;_asm NOP;_asm NOP;_asm NOP;
         _asm NOP;_asm NOP;_asm NOP;_asm NOP;
         _asm NOP;_asm NOP;_asm NOP;_asm NOP;
         _asm NOP;_asm NOP;_asm NOP;_asm NOP;
         _asm NOP;_asm NOP;_asm NOP;_asm NOP;
      }
   }
}

void INIT_PLL(void)          //设置总线频率为32MHZ
{
    CLKSEL &= 0x7f;       //set OSCCLK as sysclk
    PLLCTL &= 0x8F;       //Disable PLL circuit
    CRGINT &= 0xDF;
   
    #if(BUS_CLOCK == 40000000)
      SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
      SYNR = 0x43;     
    #elif(BUS_CLOCK == 24000000)
      SYNR = 0x42;
    #endif

    REFDV = 0x81;         //PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1)=64MHz ,fbus=32M
    asm NOP;
    while(!(CRG**_LOCK==0)); //PLLCLK is Locked already
       CLKSEL |= 0x80;        //set PLLCLK as sysclk
}      
   
void IO_Init(void)
{
  DDRB_DDRB3=1;               //PB4为输入   PB3为输出
  DDRB_DDRB4=0;
}

void PIT_Init(void)
{ PITCFLMT_PITE=0;           //禁用PIT模块
  PITCE_PCE0=1;              //定时器通道0使能
  PITMUX_PMUX0=0;            //定时器0使用微定时基准0计数;
  PITMTLD0=0x01;             //8位微定时装载寄存器0初值为1
  PITLD0=0x000F;             //16位装载寄存器0初值为15   
                             //定时器周期=(1+1)*(15+1)*1/32=1us
  PITINTE_PINTE0=1;           // 使能PIT定时器通道0中断
  
}



void main(void) {
  /* put your own code here */
int t;
PORTB=0X00;
IO_Init();
PIT_Init();                  //PIT初始化
EnableInterrupts;
Delay1us(200);
//for(;;)
//{
  TRING=1;           //给控制端一个高电平
   Delay1us(15);
   TRING=0;
   time=900;
   while(!ECHO);
   PITCFLMT_PITE=1;
   while(ECHO);
   PITCFLMT_PITE=0;
   t=900-time;
   Delay1ms(100);
//}                  
}
#pragma CODE_SEG NON_BANKED
interrupt VectorNumber_Vpit0 void PIT0(void)
{   PITTF_PTF0=0;              //清除中断标志位
    --time;
}
#pragma CODE_SEG DEFAULT

使用特权

评论回复
15
yuanquan12345|  楼主 | 2016-4-27 15:20 | 只看该作者
回来,把我的程序发给你,作参考。
我的程序现在存在的问题:用的延时器太多,出现瞬间距离跳变。

使用特权

评论回复
16
yuanquan12345|  楼主 | 2016-4-28 08:24 | 只看该作者
悬架 发表于 2016-4-27 11:10
#include       /* common defines and macros */
#include "derivative.h"      /* derivative-specific ...

提供邮箱,我发给你。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

1155

帖子

3

粉丝