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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
超声波测距资料(HC-SR04)Arduino UNO与单片机例程 : F! X3 [3 C  I8 h1 R
1、库文件使用:请将库文件解压后以文件夹格式拖至Arduino文件夹下的Libraries文件夹里。
3 t2 t7 i7 g- H, l# u    例:C:\Program Files (x86)\Arduino\libraries: Y3 n4 B3 q: _9 _; ]
注:无库文件的,为Arduino IDE自带库,无需添加。
8 ?' X3 {! A* W4 t! d# I8 X2、原理图与技术手册为厂家提供,仅供参考使用,不提供技术支持。# U. R3 l, v) K" G

* v, O8 J& D( o! Z$ I3 W/ B
/**********************HL-1实验开发板例程************************" F+ u) o  p3 W9 \) B
*                文件名称:led.c" q! X# o; Y  U; @- m" ~
*                功能描述:本例程为超声波测距的学习。使用前先根据超声波模块的IO修改本程序的端口定义。, X! ]7 g- i/ Z4 T8 @% ^
*                                        本例程为网络资料搜集整理 。
* g: D- M9 p; ?5 S1 B7 d! h*                使用环境:TS-51A开发板 + STC89C52 + 11.0592M晶振 + Keil C51 V9.0 7 a& }1 D! J) W# a: k7 U( @/ b
******************************************************************/
8 ~; {' y  n7 T( @/**********************************包含头文件**********************************/
" `$ @! ]: \" e, b  G#include <reg52.h>
/ l2 m% D& e6 v#include "1602.h"( r* q0 v. Q! Z
/************************************宏定义************************************/
" q- {" @! v* a#define VELOCITY_30C        3495       //30摄氏度时的声速,声速V= 331.5 + 0.6*温度;
' `2 \# R$ n  C' |% J: H#define VELOCITY_23C        3453       //23摄氏度时的声速,声速V= 331.5 + 0.6*温度;
( ?7 h  J3 N3 n: q/************************************位定义************************************/6 p0 D- m$ v0 X) V) N
sbit INPUT  = P3^2;                //回声接收端口. O2 A1 i+ }# T  o/ Y- |
sbit OUTPUT = P1^4;                //超声触发端口% `% a8 G  m* i) e6 J2 r0 n1 Z9 Y
sbit Beep   = P2^2;                           // 蜂鸣器 * k; y' d- C5 k! [! D* ~' t
/********************************定义变量和数组********************************/9 ]) e! i( v7 T8 J$ z5 b) L- j
long int distance=0;               //距离变量
. t3 x" V3 s$ E' w" ?uchar table[]  = "                ";1 I) }, ^9 }! u* z8 }" \7 n
uchar table0[] = "    TS-51A      ";3 n. k1 P7 T6 v: l1 \4 x
uchar table1[] = "There's no echo.";/ ]" ?( M8 c, G6 Y# R5 m
uchar table2[] = "    TS-51A      ";
* i& p1 N/ X% fuchar table3[] = "Distance:";5 v) T/ v) z3 z+ x3 i/ j' k& f
uchar count;
) E6 [, T* M6 E# h  y* u1 s/***********************************函数声明***********************************/! x: B, N  Y) w3 t/ T5 O/ F
extern void initLCD();
1 X( C$ W4 J; h# S( m& H& nextern void write_date(uchar date);) N  o8 x( N/ h. l. q
extern void write_com(uchar com);7 l+ ?; [* ]/ \" M2 k" R* A
extern void delay(uint x);# d* i2 \/ d0 z# t% m" \5 a
/******************************************************************************/
, L* M. R2 v" q: n/* 函数名称  : Delay_xMs                                                      */: T8 R, K0 r5 Y, D
/* 函数描述  : 延时函数                                                       */- P5 S: Q, k, Z' _* M: P
/* 输入参数  : x                                                              */7 v/ m& A' a7 ?' }/ A
/* 参数描述  : 延时时间                                                       */
$ f6 s( @/ C# p# T/* 返回值    : 无                                                             */; M% a  C  t2 H* }
/******************************************************************************/; p& A! D( V3 d& w' h0 Y2 x; y* m) y
void Delay_xMs(unsigned int x); v- i2 Y& L5 ]
{
; I. `# [# _0 F    unsigned int i,j;
$ |! e) v* P' O, N+ S    for(i = 0;i < x;i++ )  a8 ^+ C1 e) s0 h8 c7 `( N( V/ ?
    {& F. Z8 s/ h* A4 c3 o5 q& }
        for(j = 0;j < 3;j++ )* k" Z, o1 \5 P: M( H5 h  `3 n5 c! X
        {6 k6 S' W# l5 [# e* u# ~
            ;
& I9 }: q$ {& ^1 \" n; O) _        }# W' I& D' w: _
    }% ?. i: S0 m  k# n! `: L1 l
}
8 J' r# ~9 M( ~2 R3 k/******************************************************************************/3 g1 D5 M4 d7 q* ?- s
/* 函数名称  : AlARM                                                          */
) i3 b3 ^( L1 p5 X+ z2 r/* 函数描述  : 蜂鸣器发声函数                                                 */6 ]( M7 \! K! G- w$ w! E' K$ t. Q
/* 输入参数  : t                                                              */% e  Y  p4 r* }4 D  p. Y  K
/* 参数描述  : 发声的次数                                                     */5 G: u  Y6 e3 A/ _0 I. j. U
/* 返回值    : 无                                                             */9 |6 {% d& @9 n/ X3 H/ ]8 }
/******************************************************************************/
( [9 [: V' r& ~, [9 X# U7 Qvoid Alarm(uchar t)- i  U5 _5 B2 R3 z# R6 b" x6 I
{
0 p  x9 A: h4 N% q0 r* v/ H2 H/ ~        uchar i;9 ]# J7 D7 a) B6 q' @
        for(i = 0;i < t;i++)+ z$ k+ v1 R( L) V7 F; y- v+ K
        {6 G7 S. ^0 R/ R5 p
                Beep = 0;
5 G6 y5 r( |, E4 W, n                Delay_xMs(1000);
; y) Y7 o/ Y: E2 T- t                Beep = 1;% U" J2 Z, O# P% }, I
                Delay_xMs(1000);
8 V% t4 z5 r$ Q1 q, r        }
: X, m4 F- W) k; J' U; |: j}        
$ k0 J3 u, ^$ m, r# `/******************************************************************************/
7 m3 c* h% p6 L9 L) `* j! H/* 函数名称  : delayt                                                         */
0 D* t$ g8 j. E2 I9 ?* |+ u5 k5 Q/* 函数描述  : 延时函数                                                       */) }5 d- ~4 x) _6 w: U% s% \
/* 输入参数  : x                                                              */
0 ~( ]+ Z1 I5 c5 A, J1 a/* 参数描述  : 延时时间数据                                                   */
' m, O, ~: t4 W+ A/* 返回值    : 无                                                             */
/ o/ Q4 Q+ u  q3 I# f/******************************************************************************/        
8 z0 T& l' a& p% J% C0 Ivoid delayt(uint x)
. h. v" h% N5 z# P8 D! t{
! y4 W" V" P; Y1 {, Q. b  p    uchar j;" _6 M3 {( \+ o6 G5 e
    while(x-- > 0)
  Z" S# |. z/ h    {
, H& l- A& r# k: X# z! e              for(j = 0;j < 125;j++)
/ m+ @7 |$ M7 J6 ]: t- \        {
- v, I* k( ^$ [2 {* Q            ;4 H/ N! i7 L( A/ c
        }" m: \) J) C% n9 p3 P' G- y
    }) n. ~2 h5 c) D" _, [1 {' f" c
}
1 J$ M9 _3 |: M/******************************************************************************/
5 b/ E3 A( X. @/* 函数名称  : Init_mcu                                                       */
/ v% Q$ b8 Z$ O9 Y/* 函数描述  : 初始化单片机函数                                               */
" x1 s9 \/ g8 H8 d/* 输入参数  : 无                                                             */4 p$ q3 X9 [1 ~6 |7 R
/* 参数描述  : 无                                                             */
6 \' ]- F1 P, S2 [/ m" a/* 返回值    : 无                                                             */
1 k4 V( c9 z+ S8 B& G1 X) G/******************************************************************************/
* B5 ~: \0 R0 s9 }* V) qvoid Init_MCU(void)8 F, M/ V& Z8 [* m/ U7 }
{
1 h6 @, X- T% `: ~% J1 M8 n9 J        TMOD = 0x01;          //定时器2初始化,设置为16位自动重装模式
2 h3 y1 L) H9 Z- A% f- j         TL0 = 0x66;! _3 V8 |+ J; {6 K  r- l0 i/ O
        TH0 = 0xfc;              //1ms* T! j% B2 f  j- a% l. V
    ET0 = 1;              //开定时器2
* M! j8 i* U9 o) h" d/ C; s        EA = 1;                      //总中断使能
5 C  A# C* l2 T9 Z6 H. R}
# c1 _0 S3 A8 C- G/******************************************************************************/# g4 v4 L; U0 t9 q) D6 w5 d* N
/* 函数名称  : Init_Parameter                                                 */
; |; z# V5 W" o! z  l; @  g. E/* 函数描述  : 初始化参数和IO口函数                                           */
7 s) F9 r" C4 X6 s% [" O3 H/* 输入参数  : 无                                                             */
0 C4 o" b7 Q4 g$ z/* 参数描述  : 无                                                             */9 Z3 v: h6 \) r( X9 z4 r- G
/* 返回值    : 无                                                             */8 j$ N4 j% T7 \
/******************************************************************************/
' N9 t7 Y' ^, u; ovoid Init_Parameter(void)
, y  i1 N* H/ Y: E{; Q. Y% |, B0 W( T
         OUTPUT =1;4 Z4 l# t* @7 A! z
         INPUT = 1;
$ X: a" i' V/ f% _- V) s( o5 o         count = 0;
5 u: S. y0 Y5 @. [% G# C* ^         distance = 0;
' t5 q0 v2 t( U( y' [! J}' c! ?# D& R2 e0 V' X! F" A
/******************************************************************************/' w0 d4 z7 k: I
/* 函数名称  : display_char                                                   */
0 I3 _, ?3 ?" T- K/* 函数描述  : 显示字符串函数                                                 */
. [! D5 F; [( Q- f/* 输入参数  : point,address                                                  */6 r9 Y0 Z% _' y. z, a
/* 参数描述  : 写入的字符串的地址指针 1602显示对应的地址                      */
4 E; P0 S  ~) U8 \% F7 ?6 ~/* 返回值    : 无                                                             */
) G9 w) Z  x5 S$ ~/******************************************************************************/9 m% L& o( Q9 z, f( i+ T/ o
void display_char(uchar *point,uchar address)8 B0 a& M; l( @) i0 B
{
5 I/ }* X. C7 m7 E1 i6 z/ v+ {        uchar i;5 }& n9 ]' Y% @: a& j9 O2 y) W* j+ B
        write_com(0x80 + address);& l( S9 {9 `- L! d
        for(i = 0;i < 16; i++), B( j0 J& _, v; p; u  D
        {
7 b5 J* V0 @9 Y                write_date(*point);
( Q( b1 O* B  c                point++;
. b. s6 a; `% c! u/ n( F        }+ z! s$ _- J/ g) {& H5 P
}
5 B( v% n( y" j- ?& z6 u+ P8 H/******************************************************************************/$ m2 B* [* o$ m5 K, l
/* 函数名称  : display                                                        */
) X9 j( n$ u7 I. g* d) |1 \/* 函数描述  : 显示数字                                                       */2 Q- O/ r) x( U. A" a, z
/* 输入参数  : number,address                                                */- r" r# o% Y) ^: Y
/* 参数描述  : number写入的数据,address地址                                  */+ L& g* {( d& ^4 ^+ {4 t
/* 返回值    : 无                                                             */1 M6 j6 C0 u- ?% B. Z4 n  l
/******************************************************************************/        ! C7 V: |8 l4 X0 t* X' y
void display(int number,uchar address)
6 V9 q) x/ H; K' i# d6 c2 x" K. J' R{# U$ M$ V7 O; u/ \
        uchar b,c,d,e;; b) N" J, V, S6 ]# v- [
        b= (number / 1000);
. p9 H6 T, s8 @! }7 B        c= (number / 100) % 10;
5 H+ J, @/ Q' Y  s8 K; x        d = (number / 10) % 10;. U/ y/ @0 Z( f: @. Q2 q/ F
        e = number % 10;
5 L! U: n( Z* Z! |, w- `* U5 q: R+ g0 N
        write_com(0x80 + address);
( |. g/ X2 y( w# a* {  p. C    write_date(b + 48);
6 D' G0 y! o" k, ~: t. X" j        write_date(c + 48);
6 p8 F* S7 V( Z+ q+ b7 Z        write_date(d + 48);8 G3 ]$ B4 k7 i
        write_date(46);           //小数点的ASCII/ }& B# C$ s& u
        write_date(e + 48);# ]8 m+ a8 g2 W# f* A
    write_date(99);           //"c"的ASCII
. N; _3 A- Z: W* ?- _, E' W% M        write_date(109);          //"m"的ASCII/ U' |7 l+ }+ x' Q! c% s
}& X) N* p$ ?' ]1 D, S2 z4 q
/******************************************************************************/% v( r5 {5 A. k$ i1 w
/* 函数名称  : Trig_SuperSonic                                                */
7 u5 @4 i. @" ]6 \. {" c/* 函数描述  : 发出声波函数                                                   */; K) ~9 k) {  @4 K. D
/* 输入参数  : 无                                                             */
2 o; n% l6 l: w0 {% t" p/* 参数描述  : 无                                                             */1 ?3 g2 j: K: J0 `5 R  E
/* 返回值    : 无                                                             */
8 C! Q; k, \) K( z# C  ]/******************************************************************************/
! M5 H1 Q! E  g" }void Trig_SuperSonic(void)//出发声波" W, a8 v0 b! Q/ {' n
{& V# n6 P+ D" G9 ]& v
         OUTPUT = 1;0 g, A3 e5 u/ Y1 ^
         delayt(1);5 J' ~- p! i1 z+ ~. H: _
         OUTPUT = 0;
. F5 T; s! ]9 @' j}" r+ z# `4 [6 V! X( s5 ]
/******************************************************************************/
3 c2 D& M+ j' I  M7 h$ K+ ^% O/* 函数名称  : Measure_Distance                                               */6 u3 e* K, H- `# k. q1 K
/* 函数描述  : 计算距离函数                                                   */
1 i8 G7 t2 F/ f1 n! F+ G/* 输入参数  : 无                                                             */
& ?7 x' c# C2 d  i) `/* 参数描述  : 无                                                             */* t9 {% l# `/ U- o
/* 返回值    : 无                                                             */
6 R# R  A5 r# C0 m9 n  s/******************************************************************************/# J7 g1 ^4 t6 f5 r' M; y
void Measure_Distance(void). t, U0 X6 a) a. l* h
{6 n  Y$ a. }* N- C
        uchar l;
$ R+ |4 H$ F/ R7 S/ _* K. c        uint h,y;
  K! k8 f% C. ?0 J( k! ?        TR0 = 1;
9 c. k8 g' ^! _! I        while(INPUT)
3 s# \, E* W! [# |$ j; q    {
3 ~. e" ?4 H9 ?" m        ;4 {6 Z" i$ [* p1 z* G/ S3 w% P) P
    }        
3 s( t/ o5 n$ `        TR0 = 0;
8 i6 A9 m! i* W9 x0 E& ^5 A+ c        l = TL0;
* C9 m) m% G8 P# q        h = TH0;$ Q! u0 w# T- u0 m4 s% B5 u6 |
        y = (h << 8) + l;
0 d( j: _  g6 E# s        y = y - 0xfc66;//us部分
5 p4 y( j/ e6 M% _% h( v        distance = y + 1000 * count;//计算总时间
+ f; ^' y. C2 Y* _& V        TL0 = 0x66;
. k) Y' w0 l$ N* x* T& l( \        TH0 = 0xfc;
4 C' ~8 L* ^* `9 f# s2 v% _* ^        delayt(30);
0 O9 M. l1 j* o+ U  I, d        distance = VELOCITY_30C * distance / 20000;
( O: e- U9 z2 O}
& F  P" o, \. e) _7 A: x. X' D/******************************************************************************/
" ^: k3 Q/ e) t# D/* 函数名称  : main                                                           */
* i- d2 h" h0 S( r* D! i, n1 s/* 函数描述  : 主函数                                                         */9 R0 o5 v3 a  ]- d
/* 输入参数  : 无                                                             */
" ~& }: W# X5 w* O1 @/* 参数描述  : 无                                                             */! ~7 f( e2 T9 \  N
/* 返回值    : 无                                                             */8 O" W7 q: Z7 V7 L
/******************************************************************************/                                       
5 O* g) q6 X/ }! K' a. ~void main(void)
0 n0 W1 j5 d1 }0 b5 }0 S0 Q{        ! m' P& N2 {. p8 J2 L
    rw = 0;
& q* M- J4 _9 O! _        initLCD();
, F. |7 h( a1 l& g        Init_MCU();
4 M0 d' K7 I7 [  S        Init_Parameter();
* M& o( z3 h1 K# q7 \7 w0 L. a* e        Alarm(2);
- F! k) j( ^7 u" M        display_char(table,0x00);
3 x5 I& |! D. Y5 _( H4 m; k        display_char(table0,0x40);
& _( B, M; Z# o) t( a        Delay_xMs(30000);
" y; }, b8 p5 a" U- J        display_char(table2,0x00);
( X: R' l3 N3 h5 q* f* e        display_char(table1,0x40);  l* t7 b: U2 h( \: e  Q
. v& ~& j) {& w1 u' ^2 \
        while(1)) |  ]) q& _1 k  t6 r8 T! J
        {
# g2 H6 ]1 Y8 ?) a; i- w# h                 Trig_SuperSonic();         //触发超声波发射# }+ b- T4 P8 h5 k
                 while(INPUT == 0)          //等待回声8 J9 ]0 T- ^" x/ n& p: n, V
         {
4 _5 W- l0 }1 j# O             ;
- W. }0 _0 i" v2 Z         }
4 E+ D2 ?* \& v6 E                 Measure_Distance();        //计算脉宽并转换为距离8 Q  i! G6 O& l8 K# V
……………………
8 J- f  a, |5 E1 |$ x0 q. T1 E' \- x! W$ o1 w$ W+ z1 V2 o
…………限于本文篇幅 余下代码请从eda365.com下载附件…………% A6 U' ?4 p8 S1 }5 g# T/ s! q
' ]0 g9 E! g9 T2 S
) ^( B1 p& v: W$ O% X
游客,如果您要查看本帖隐藏内容请回复
' h8 Q3 @1 \' y4 k# B- P' |
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-23 07:17 , Processed in 0.125000 second(s), 27 queries , Gzip On.

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

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

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