找回密码
 注册
关于网站域名变更的通知
查看: 558|回复: 1
打印 上一主题 下一主题

超声波测距资料(HC-SR04)Arduino UNO与单片机例程 

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-8 07:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
超声波测距资料(HC-SR04)Arduino UNO与单片机例程
6 e8 E- l4 v% ^# R3 ^
1、库文件使用:请将库文件解压后以文件夹格式拖至Arduino文件夹下的Libraries文件夹里。& ?% ?( J) C0 ~% r9 ~* i
    例:C:\Program Files (x86)\Arduino\libraries
5 N% E% \; a! ]$ D( A* g注:无库文件的,为Arduino IDE自带库,无需添加。
3 \# `& g) I8 m; o7 M: J) c$ e2、原理图与技术手册为厂家提供,仅供参考使用,不提供技术支持。( l* ~7 D+ s3 R/ X- I# l
' T5 U, f, D, v- z7 Z3 N
/**********************HL-1实验开发板例程************************
( p; P% e" Z4 s, d) h5 z$ A5 a) e*                文件名称:led.c
6 L9 T% q$ n* d. L, [* b*                功能描述:本例程为超声波测距的学习。使用前先根据超声波模块的IO修改本程序的端口定义。
8 l8 ~$ g; {7 e*                                        本例程为网络资料搜集整理 。
" t  A7 v; b* S" O*                使用环境:TS-51A开发板 + STC89C52 + 11.0592M晶振 + Keil C51 V9.0 ! g6 Y# x" `* ^
******************************************************************/
2 n0 d' l3 j2 p1 z/**********************************包含头文件**********************************/- x2 x2 Y4 ?( Q, `& ~' G
#include <reg52.h>
) z9 F" E/ ^4 |#include "1602.h"
7 j- O; l5 u$ w1 O: o7 A/************************************宏定义************************************/& v$ j. y% ]: `  W5 s
#define VELOCITY_30C        3495       //30摄氏度时的声速,声速V= 331.5 + 0.6*温度; ) x; E, G- V# q1 ~* S" K, G
#define VELOCITY_23C        3453       //23摄氏度时的声速,声速V= 331.5 + 0.6*温度; 6 o1 X3 U% k9 w; g; D2 _1 Y
/************************************位定义************************************/
9 F! [9 C- Q; o' Z5 Y3 U' isbit INPUT  = P3^2;                //回声接收端口
5 I( R" J6 R8 U$ Y5 }( `/ M; Msbit OUTPUT = P1^4;                //超声触发端口
+ K( k6 k* @* B, m; \# ]3 t# Usbit Beep   = P2^2;                           // 蜂鸣器 ) \# a1 L, j  s; I3 @
/********************************定义变量和数组********************************/
) D6 W9 G3 e! R9 Zlong int distance=0;               //距离变量
' G$ s) b+ m0 T  H) Q; I  ^" Euchar table[]  = "                ";$ i2 b% y! l8 c& r5 d
uchar table0[] = "    TS-51A      ";
. h$ g0 q& u" T3 K  R# E) i& Huchar table1[] = "There's no echo.";
' A+ O( o* B/ q+ ?& x  ~* a& luchar table2[] = "    TS-51A      ";5 L0 A) w* [7 K# E
uchar table3[] = "Distance:";6 A. N6 {8 o3 h. f
uchar count;4 h/ J; d& C- J* L
/***********************************函数声明***********************************/2 F/ N( c" H. T' Y" l: a- d
extern void initLCD();* b$ C' r- }; O0 ~! \' V
extern void write_date(uchar date);# o8 Z: E1 K7 v0 D
extern void write_com(uchar com);6 _- h2 l2 G0 r2 w
extern void delay(uint x);7 Q% t5 O8 E# U$ A" J3 ]' q8 P
/******************************************************************************/
0 r- M% v# s8 A1 {; V; u' J/* 函数名称  : Delay_xMs                                                      */2 p/ {9 Q5 \# v: z
/* 函数描述  : 延时函数                                                       */
3 e* _5 Z: a7 T9 z& E. d( N# F/* 输入参数  : x                                                              */
3 K7 ]8 T6 Q  m. x0 O& t! C/* 参数描述  : 延时时间                                                       */
8 V! J, X" b; |+ ~/* 返回值    : 无                                                             */
. N" n5 s3 {2 M" Y) t/******************************************************************************/9 [6 r# X# J4 Q
void Delay_xMs(unsigned int x)
4 V& W! ~8 }; K) M+ y{4 c4 Z5 w( i8 ?8 z6 }3 l
    unsigned int i,j;8 x( b4 ~3 [2 ]1 Q
    for(i = 0;i < x;i++ )6 R. F* g3 K$ L6 L% }7 R0 l
    {
& T: Y5 D) [" @2 o2 t: M5 x        for(j = 0;j < 3;j++ ), F& I( X2 Y( @, \, @. ~2 e" @5 u
        {% W# v  S9 z/ c( r8 p* Y
            ;' r9 D4 k' J" t# q9 @6 v! q; j8 t
        }
5 d, e  m% M, ~    }& e; I8 X* E4 {  x5 f
}4 {' v0 a' i3 U% s. Y3 n
/******************************************************************************/( L# A; Z( h, M0 b6 I5 m
/* 函数名称  : AlARM                                                          */
9 j/ t" o- H3 p/ p9 z; R5 X/* 函数描述  : 蜂鸣器发声函数                                                 */
; m+ k' V- q1 b) v, o% d/* 输入参数  : t                                                              */- ~& l. i/ T5 T- }6 j& i
/* 参数描述  : 发声的次数                                                     */
; @# H% ?+ a. f* \5 A. {; `/* 返回值    : 无                                                             */
4 }5 E; D0 n5 v3 x$ [/******************************************************************************/# ^' u2 L! {* z- E% r* L
void Alarm(uchar t)& B. ]' u, d3 m9 t  L
{" \+ U4 _4 u3 R( t5 Y" N- l$ ~
        uchar i;3 b& m' v/ ^9 l6 T
        for(i = 0;i < t;i++)6 K) h% n6 L2 A/ b0 ?: C( p: b" Q
        {. g4 j. U- Y: e  M- z
                Beep = 0;" n) j0 C4 k: r! [3 U
                Delay_xMs(1000);: \. o) F4 ]1 B) q2 o
                Beep = 1;
( }0 V5 V  {# _* o7 C/ W# ?. \2 W                Delay_xMs(1000);$ _! x3 O: m7 w& ^" b! D
        }
' u. L' O1 P( ]}        2 b- I0 i* x8 C
/******************************************************************************/0 x) w) w& I1 G! Q: G" C/ l
/* 函数名称  : delayt                                                         */* ]" V8 D  i4 I, ^4 u0 J9 ?8 S
/* 函数描述  : 延时函数                                                       */, v8 b- ^9 |5 M8 p5 w/ [
/* 输入参数  : x                                                              */, P8 q$ h* ~7 b; q* R
/* 参数描述  : 延时时间数据                                                   */
* \) r. g( z, m' P/* 返回值    : 无                                                             */: m! I4 t. h& ]) t
/******************************************************************************/          u4 T: M, `; c4 T  _
void delayt(uint x)  w3 d7 }  z7 ^: e7 J% ?" i* r
{
0 ~' E, t# O/ Q: Z( [9 v* c    uchar j;
% Q- V( p( }5 f- l/ u    while(x-- > 0)
; p( n: ^' H! `" n+ ^1 y/ u    {
  A$ g* U' t+ f* e              for(j = 0;j < 125;j++): z8 @) x. o; h9 M
        {
  F, X5 I/ R  D3 k  e            ;
, E/ P9 L# [: N0 l, N9 E  R        }
( ?7 @$ F2 k. n% S1 o    }, d0 {4 G/ ~3 O
}
5 s* {, @; O& B9 {  ?" \! r/ `/******************************************************************************/
8 C8 ~  z* I& l4 Y- a7 A/* 函数名称  : Init_mcu                                                       */
+ j$ j6 D7 w9 F5 u  ^/* 函数描述  : 初始化单片机函数                                               */
, g6 o1 T$ l0 w2 Y/* 输入参数  : 无                                                             */, @( N8 L, d7 \; \( S! ]3 l2 _( k
/* 参数描述  : 无                                                             */
* H& N% w# y5 L  q& c/* 返回值    : 无                                                             *// h, s) [0 B9 W
/******************************************************************************// w+ I. s6 R% t% C. d2 _: ^
void Init_MCU(void)  t+ Q7 B- x' x  {
{
2 l& O' d0 Y" D; a: M        TMOD = 0x01;          //定时器2初始化,设置为16位自动重装模式  u! H/ ]# p% W6 G
         TL0 = 0x66;
1 a- n, i) W5 t8 E9 X, t        TH0 = 0xfc;              //1ms$ Z9 t+ D2 f8 |3 ?, o" }
    ET0 = 1;              //开定时器2: [) B  c" U- ]
        EA = 1;                      //总中断使能1 L/ o4 v/ r  Z/ z+ Y# u
}
6 u2 Z8 n3 P3 R9 w) q1 l/******************************************************************************/: e" u  ?& a8 t9 b, W9 I3 [5 S
/* 函数名称  : Init_Parameter                                                 */
/ M+ \( y1 X; a7 M+ v( `  b2 y* Y/* 函数描述  : 初始化参数和IO口函数                                           */& W) m0 w, h) L" g. A
/* 输入参数  : 无                                                             */5 b7 ~# v# T( {) ~- w
/* 参数描述  : 无                                                             */
! V2 M$ r5 i  p7 R' l2 `5 s/* 返回值    : 无                                                             */
( V3 W% a2 Q- |; \/ d# M: A4 l0 P/******************************************************************************/
/ R0 Y: m9 ?) i( g# u1 ovoid Init_Parameter(void)
2 a" u7 {6 q( R& {1 Q) h, b{
2 b" `+ p& D1 A- }- |6 ]+ K8 I1 m, I         OUTPUT =1;  {; Y  o+ [+ O% |5 |
         INPUT = 1;5 |4 U1 G  E4 I7 t. f  K6 Y* z
         count = 0;  y. d2 C3 m7 H; {- F
         distance = 0;
+ O( [  g# W& E* k' s; i2 j}
( @% i5 u# V/ w4 j( J/******************************************************************************/0 B/ `5 l, |  {) M# U# |7 y
/* 函数名称  : display_char                                                   */
  q) l; Y( g+ p5 T( U" E/* 函数描述  : 显示字符串函数                                                 */
$ G* W( u7 k. O4 F/* 输入参数  : point,address                                                  */
: X  b4 W1 T) ]& u: u3 k0 G* e2 q/* 参数描述  : 写入的字符串的地址指针 1602显示对应的地址                      */6 L3 N! E4 ~5 {, R& u3 a2 c
/* 返回值    : 无                                                             */* }* D2 q5 _& h
/******************************************************************************/
- P) e. C" S: I3 o% ^2 hvoid display_char(uchar *point,uchar address)6 K3 _1 a4 ~; Z& ^% Q
{
0 e  M" }, v* g1 f) Q8 @. P0 r        uchar i;  _* u+ u5 v( E% U; O- q/ r% K. Y
        write_com(0x80 + address);5 |4 j& ^( k4 Z' q# ~0 j
        for(i = 0;i < 16; i++)0 y/ q4 k$ O- Z  r( {
        {# {. P, @5 s) Q$ p4 j3 C
                write_date(*point);. L7 @4 z+ T" B
                point++;
4 |* d  w+ E/ _+ D0 q        }# c$ O2 o- N* w" m
}7 O& r8 G2 T8 [, ?& s3 u3 C8 R8 k
/******************************************************************************/
! S/ [0 M' E) Q, D# p) k- j/* 函数名称  : display                                                        */- z; o; h* V" J  _) U0 ]1 R
/* 函数描述  : 显示数字                                                       */
4 O$ H$ |; k! i: ~* ?3 C8 T/* 输入参数  : number,address                                                */4 y9 a) w+ ^. I# ?, Q
/* 参数描述  : number写入的数据,address地址                                  */
5 F6 W5 c8 D  B5 g/* 返回值    : 无                                                             */3 D& [1 K5 F& Z& F
/******************************************************************************/        " v; l5 ]5 P+ H# g
void display(int number,uchar address)
7 D, i+ g: H0 ?3 T1 T! @{
1 M( `7 w4 `* d: _7 v        uchar b,c,d,e;. l5 ]6 K  m( o3 t, y! d
        b= (number / 1000);
2 @# I$ t( n; I$ U% B        c= (number / 100) % 10;9 \5 K0 E9 S+ `3 R$ v. [/ I
        d = (number / 10) % 10;' l# F% ~! h% G+ e
        e = number % 10;
. P3 e) t0 u: c7 m3 N3 C
3 d  g5 [  M+ w; q$ e7 d        write_com(0x80 + address);
$ w( Q% j! m' g$ f    write_date(b + 48);
9 O3 a5 G) R  I        write_date(c + 48);) F2 A, N* A5 B
        write_date(d + 48);0 _( a# O4 O" @- Y* a; W
        write_date(46);           //小数点的ASCII
" E$ I5 @" R4 t! v        write_date(e + 48);
5 C) i  M% b% d    write_date(99);           //"c"的ASCII
0 p& k8 r- e% l, T        write_date(109);          //"m"的ASCII
# u  p: x  {2 A" m1 h/ C6 o}7 `/ N5 s9 O0 ~* A# e/ a
/******************************************************************************/
9 p: ]; I: b2 a: x* b  J6 d/ J/* 函数名称  : Trig_SuperSonic                                                */
. K. v. \# Q/ G6 q. H6 f: X& J/* 函数描述  : 发出声波函数                                                   */9 v6 U! M+ X$ w* X
/* 输入参数  : 无                                                             */
5 l: e8 W% h  ~2 i* A/* 参数描述  : 无                                                             */
: l+ ?/ d. u+ V8 ]6 {; u. P/* 返回值    : 无                                                             */
% ^7 X; }+ V2 D. p. q/******************************************************************************/- t+ o- [* z  |: V8 o9 R! p
void Trig_SuperSonic(void)//出发声波
$ N1 W/ d7 P, U. E3 y# V0 h{- H; U% i4 r; }5 `. w4 t
         OUTPUT = 1;+ [9 Z; [+ G3 ]6 P) y: i
         delayt(1);
4 h; {( L/ u/ v* W         OUTPUT = 0;
! M! g: Q3 f; _3 k9 `$ y}
- ]! e% v( _2 ?; D; O! Y/******************************************************************************/' c/ z4 s6 U( N: f# y  w5 y0 g0 ?
/* 函数名称  : Measure_Distance                                               */
4 h( x2 R- w# k+ n. X/* 函数描述  : 计算距离函数                                                   */4 H0 c% u! |8 l3 _
/* 输入参数  : 无                                                             */+ o  Z: h0 @1 W8 ?
/* 参数描述  : 无                                                             */1 A: r0 T, v6 L7 m- [7 u4 f
/* 返回值    : 无                                                             */2 N* {% S2 w$ M% [- I
/******************************************************************************/  B- _& I/ T, n8 t3 y$ _9 I
void Measure_Distance(void)
  a6 j9 M0 o4 K" K& m' J6 N{: C# o% S. D/ q% l) _# B
        uchar l;6 L8 S! R; f) R  ?4 m
        uint h,y;
/ _. C/ x# |5 o' z# q5 C. t5 r) T        TR0 = 1;
1 _9 i2 a# ]/ q) A* p" v$ O. r        while(INPUT)9 ~. D; i% E! q4 j
    {2 V8 f, r$ n' Y$ ]9 ^
        ;( ?# [; n( L" J! p' c
    }        
3 q; Y" K) A& Q' {* n4 z        TR0 = 0;
6 J4 x# m0 c/ W7 g. A4 @        l = TL0;* M" A: y" ^5 Z, n
        h = TH0;2 _4 h- A4 H$ y3 C$ y
        y = (h << 8) + l;+ ~& D9 J+ A6 l* I- i
        y = y - 0xfc66;//us部分' k& L: q: N% `2 k
        distance = y + 1000 * count;//计算总时间% f6 o  L  \* e+ ^2 h) b! b8 C+ V8 Z
        TL0 = 0x66;% L9 `( E" [1 z" ~& Q6 \
        TH0 = 0xfc;
  C5 z6 ~8 y6 O+ ~; |- p  x6 c        delayt(30);* z  C. X2 w) n/ N" M5 N, l9 [
        distance = VELOCITY_30C * distance / 20000;
# G! q# N$ `1 Y1 Z& G}! I7 R3 n$ u3 S. Y
/******************************************************************************/- P# v8 O/ b2 G8 s4 P
/* 函数名称  : main                                                           */% O5 }+ L+ ~% k9 |  g* y) K7 [* s
/* 函数描述  : 主函数                                                         */% p: E7 ~: k! \
/* 输入参数  : 无                                                             */+ D1 O! G. U% N4 s9 P
/* 参数描述  : 无                                                             */& b& q& c' z+ d
/* 返回值    : 无                                                             */2 }, [/ _5 a, @/ d. N7 [7 k+ ^3 S
/******************************************************************************/                                       
& {6 x% V( e  Q  h4 o9 G$ avoid main(void)
" \/ E" C7 i5 O* _/ l6 H' P7 f{        
, K' Q3 l, L' w+ z" B) ^    rw = 0;7 n# W8 I" `( E( P; p$ ]1 R
        initLCD();! m) }6 n* F3 ~6 N( Q4 Q8 g7 J* |
        Init_MCU();
; _3 V) }; T0 G. r- s        Init_Parameter();$ u, o; I% w0 U/ z( [- Y" i
        Alarm(2);0 _( X9 T  Y2 O4 g. x& n
        display_char(table,0x00);
$ a# h' f& y9 j& q  n2 b        display_char(table0,0x40);& `; T7 t+ x7 ]3 f0 }: R+ a& ~
        Delay_xMs(30000);0 N  e  l5 \8 F( v% r. {* z1 T
        display_char(table2,0x00);5 Q; J) B# M( a- h
        display_char(table1,0x40);* q: C. i  c4 \& [0 K% C$ f

7 k4 n) ]+ r$ Y8 _4 d1 I        while(1)
. F) ?, T0 \* ?        {& A; O# o- S7 j* q6 E7 L5 Y1 Y( Y
                 Trig_SuperSonic();         //触发超声波发射3 Y4 p4 w1 J4 Q3 Q! Z# j7 d% z/ U
                 while(INPUT == 0)          //等待回声
% a" I0 i$ Y2 q8 ]5 {         {
4 ?  ?* x0 {; G# D6 _             ;
9 I* X3 j( z* j" g, y  Y$ j" d( Z         }
) s5 O" E6 L+ z" e3 x. [1 S1 @( O                 Measure_Distance();        //计算脉宽并转换为距离* |6 e) M) [: N6 B1 h. q2 p9 A5 n
……………………
% q, k$ c; B2 H( x  l/ L" }. ^! B0 ^
…………限于本文篇幅 余下代码请从eda365.com下载附件…………. O/ H- c" z0 }
& W( G+ Z) `% D/ B% A9 E' Z
# r; h$ T% q+ _1 i5 N
游客,如果您要查看本帖隐藏内容请回复
8 ]6 z! b, a1 ]* q7 F$ b
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-16 01:08 , Processed in 0.093750 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表