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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
超声波测距资料(HC-SR04)Arduino UNO与单片机例程 " R) h" ?6 |! N+ a' R
1、库文件使用:请将库文件解压后以文件夹格式拖至Arduino文件夹下的Libraries文件夹里。
  J) |5 Z9 C5 T4 \7 J- m% w! h' Y0 B    例:C:\Program Files (x86)\Arduino\libraries) A2 B) R6 a$ s1 X' C  ]
注:无库文件的,为Arduino IDE自带库,无需添加。
& W9 L: }7 e5 Z0 P  W/ p" `2、原理图与技术手册为厂家提供,仅供参考使用,不提供技术支持。
3 p+ \1 U; W3 K; z+ o* {6 }2 X1 E. r  |
/**********************HL-1实验开发板例程************************& K, S: ^) s1 e- Z
*                文件名称:led.c, G; i6 `( [6 f$ r; k  J5 J1 B8 p
*                功能描述:本例程为超声波测距的学习。使用前先根据超声波模块的IO修改本程序的端口定义。' I6 n9 ^0 |9 A) n1 \# Q: R- O
*                                        本例程为网络资料搜集整理 。
2 ?$ |+ y$ Q8 d& {*                使用环境:TS-51A开发板 + STC89C52 + 11.0592M晶振 + Keil C51 V9.0 : ?% L1 C! F+ b0 d# H4 `; R
******************************************************************/3 Q; B% U) H/ f  @: Y# v
/**********************************包含头文件**********************************/
' @# a- I4 B" Y5 x4 a. T#include <reg52.h>" B& {; `# i/ `7 n) A
#include "1602.h"& a3 ~& {; ]4 b
/************************************宏定义************************************/% b$ x, z/ p3 S* O8 }! Z
#define VELOCITY_30C        3495       //30摄氏度时的声速,声速V= 331.5 + 0.6*温度;
' a6 X# c, o( ~- r8 n6 @#define VELOCITY_23C        3453       //23摄氏度时的声速,声速V= 331.5 + 0.6*温度; 2 X$ y* q" `- ~- e/ _+ W
/************************************位定义************************************/
- ?+ A! Q% E- o# |/ m9 s# x" S8 Wsbit INPUT  = P3^2;                //回声接收端口
8 `6 Y$ P! b1 s4 n( f1 Lsbit OUTPUT = P1^4;                //超声触发端口% O, S$ T5 @; S* A1 G  X6 d) `
sbit Beep   = P2^2;                           // 蜂鸣器 
# A3 `8 M, t6 z& l5 I) S. ^/********************************定义变量和数组********************************/  U6 c6 Y0 ~0 L8 Z
long int distance=0;               //距离变量. ]" s6 K4 t. M, x1 a
uchar table[]  = "                ";7 T; ~! T# J+ W; M' ~/ X
uchar table0[] = "    TS-51A      ";( e2 P7 [' ?' |. w0 d1 U
uchar table1[] = "There's no echo.";$ e. l, `* ~1 q" R4 h2 i
uchar table2[] = "    TS-51A      ";: c/ \% e( N" E- `4 V6 F
uchar table3[] = "Distance:";
# o  V: M3 ^' Z: G; i: i  Q7 V3 }8 @uchar count;- d. ~* h3 G& c& [% s" T
/***********************************函数声明***********************************/+ r# @% v8 Y# d% a: m2 U6 Z
extern void initLCD();  }* h5 m0 K! X9 F. C
extern void write_date(uchar date);: m" N/ o% p- r
extern void write_com(uchar com);
4 F3 k: s/ Q5 F& z3 Q* {8 Fextern void delay(uint x);
+ ^3 z( X0 w( o7 K# x, C/******************************************************************************/2 `- r' `% d6 y+ N
/* 函数名称  : Delay_xMs                                                      */
) ~4 s; h) B! B  A5 y$ W8 o! M4 E" d3 H/* 函数描述  : 延时函数                                                       */4 O' G! R, e# t5 @' y8 m
/* 输入参数  : x                                                              */3 m& N: s. f0 {; I
/* 参数描述  : 延时时间                                                       */* I- u" g7 B. R- ?$ t
/* 返回值    : 无                                                             */
8 l9 t- P+ T8 L- V& H& l/******************************************************************************/
  E1 f, n* {. F0 L) J3 y5 I$ {2 qvoid Delay_xMs(unsigned int x)
! _; F% r4 I( l; e! k! @2 n% v8 B4 H{
$ n3 K: Y- x% E7 u5 h4 O    unsigned int i,j;
+ c3 Z+ K8 _1 G, \  z: ^    for(i = 0;i < x;i++ )
+ d! Z+ ?& y" l1 H: F% b( b    {
  o* ^! c: a% @) v5 G        for(j = 0;j < 3;j++ )
' ?) k% S# o+ p" j; ]& {* |        {
) q( S& V6 }& l2 g3 z2 K4 f, |            ;
; f% A+ R) V, p2 ?" t7 n        }7 i  f6 n, ^4 i7 u. q" y- J
    }
; }  M/ R4 G- M' j0 F}9 c# V: {5 P- U1 A7 w
/******************************************************************************/
* H( Z7 |3 v% A4 i/* 函数名称  : AlARM                                                          */
; {- i$ O) ]) ?  v) [% `/* 函数描述  : 蜂鸣器发声函数                                                 */0 `$ B# ?0 {: N* m( \' \4 K. B6 E
/* 输入参数  : t                                                              */) A( H2 b2 I% J, t2 D1 f3 T; m
/* 参数描述  : 发声的次数                                                     */
7 B  I5 e( t6 j7 L4 G, o0 Y( R2 |/* 返回值    : 无                                                             */. x" P$ L# S# W7 i
/******************************************************************************/
8 c* e% R+ ?: p" ~# X# Lvoid Alarm(uchar t)
$ |' B  ~5 X/ u: J% R, d8 j{
" l' i3 u$ v4 W5 i1 m" w        uchar i;
$ o: x6 C6 @! x: P  ~        for(i = 0;i < t;i++). B6 k2 K+ K6 i. J( N
        {
  K  l" B' n0 R6 [1 G6 \, S                Beep = 0;
' _3 C; ^1 w3 J+ r; m  s/ a                Delay_xMs(1000);9 ~3 @* ]- Z, N/ {" `& U' P! |% a
                Beep = 1;3 y" J2 s2 x6 x  Y$ G
                Delay_xMs(1000);
' }1 x! h% G# T3 h* _9 N3 R        }, Z2 ]1 U$ O+ U
}        ' T$ e4 x3 V5 n
/******************************************************************************/8 X# s% Z* H. s5 _3 g2 R
/* 函数名称  : delayt                                                         */0 M# f9 T% x) Z" s6 {
/* 函数描述  : 延时函数                                                       */6 V3 `& X" ^4 l3 m0 w
/* 输入参数  : x                                                              */
9 d. Q1 n% ~5 n( V+ G/ M/* 参数描述  : 延时时间数据                                                   */
; `, \: L+ j% h9 ^# P/* 返回值    : 无                                                             */1 r1 q1 `0 E- v  o0 c, T
/******************************************************************************/        
' ]' u; M5 A4 i/ f3 m- svoid delayt(uint x)( ^" m3 ]/ i. y1 E$ q. C
{( N( k+ M7 }% j8 h9 j' l9 t
    uchar j;
  e6 x( f. v) J' T6 N) ?2 M9 G) k    while(x-- > 0)
' I5 S( A! b! a    {- C2 {( H3 i, K& Z: Y$ O0 i) P, r
              for(j = 0;j < 125;j++)
7 b& \, p* N4 c* Q" @" q! g& n        {2 ?0 m0 {( m; Y' g/ `3 T
            ;
  i  g+ O: ?- |6 h) L: t( i        }: r: Q1 \, m" M" ]+ H% T
    }
; {) W- \# m4 n; [}& t0 P2 a9 M9 S9 F
/******************************************************************************/
7 E$ P% p" \/ }! i  O7 m$ U  Z/* 函数名称  : Init_mcu                                                       */2 o% i4 L) k) T# n8 k/ z
/* 函数描述  : 初始化单片机函数                                               */
' ]6 _* D# C" t2 K) o. v) ~$ K8 v/* 输入参数  : 无                                                             */
' A2 @: z" h: M/* 参数描述  : 无                                                             */; P# V: w9 R+ H5 F2 s
/* 返回值    : 无                                                             */
& C2 s$ D5 `+ e/ ~% O/******************************************************************************/: i! j* i& a# o; D% b- G$ K: q$ I
void Init_MCU(void)
1 ], p$ v* g/ ]6 {{7 v' j- U$ ^0 k/ G5 l) b
        TMOD = 0x01;          //定时器2初始化,设置为16位自动重装模式& W& [7 G4 S, o9 x8 B5 r' ]
         TL0 = 0x66;
2 \+ J1 m2 o3 \6 X$ a        TH0 = 0xfc;              //1ms1 n$ c) s$ {0 g
    ET0 = 1;              //开定时器2' l8 {, y) A" |2 {5 y  }( N0 H
        EA = 1;                      //总中断使能2 U" b" d5 @! W/ `
}( x* L. T3 i( o6 i
/******************************************************************************/
3 u& y' p% n% B1 r/* 函数名称  : Init_Parameter                                                 */
# g- R" W& B0 S- k8 B0 V/* 函数描述  : 初始化参数和IO口函数                                           */% D2 u. k6 M" r, r5 q  ^9 Z& k
/* 输入参数  : 无                                                             */2 F& m6 B( ^( M# d7 c  [, D$ ]
/* 参数描述  : 无                                                             */  O* `/ X: h, ?* v
/* 返回值    : 无                                                             */
1 u( J7 V- i8 i/******************************************************************************/' \5 c; w0 |6 O
void Init_Parameter(void)
/ N% M+ W  n; f. V8 l9 N& H{
, z6 a1 o6 I( m( {) C% w         OUTPUT =1;
+ B- O  T( ^5 J+ l: _. W         INPUT = 1;. q* l' C/ H# R
         count = 0;
) U+ J5 v; t: @" [7 u" C" E         distance = 0;+ k: E) y# d4 [0 c
}
% L* f9 r" E4 ~/******************************************************************************/
5 `' L5 s9 P: R9 e. [% E$ b/* 函数名称  : display_char                                                   */
& C/ V3 C! C; Q: F+ P6 M$ q/* 函数描述  : 显示字符串函数                                                 */
9 x* y! F- Y7 N1 F/* 输入参数  : point,address                                                  */$ l) p6 U6 |( a
/* 参数描述  : 写入的字符串的地址指针 1602显示对应的地址                      */
% p* z1 l  ?+ k- ^/* 返回值    : 无                                                             */
' V6 w! J! X9 [7 g/******************************************************************************/
" l) T" ~2 N1 g# ^- F9 r8 Cvoid display_char(uchar *point,uchar address)! T" k! L" _0 U' Q0 {4 c8 Q
{0 p% i8 G1 ]/ H' R8 R! E: I: a- J, u
        uchar i;
8 P1 w8 J+ m1 q: Y; S        write_com(0x80 + address);
) e" k9 W" z6 l8 Q  d* ?        for(i = 0;i < 16; i++)& v& `* v# L4 c! a. R$ }6 n# j
        {7 i# I4 @: v& J" F3 {
                write_date(*point);" h( `# ^& C4 o/ d( V) c. N
                point++;
1 w0 g' u4 z2 q9 O. h  U1 W5 r1 h        }
! `1 W. d+ j0 n9 k% E9 m}
& x, l% w# l3 q: Q/******************************************************************************/' v. Z! ?% [3 g. ]9 f3 ~/ h8 O
/* 函数名称  : display                                                        */, J) f: c9 O0 r8 {" B
/* 函数描述  : 显示数字                                                       */
' f3 ~+ n. p  Q" \- ?7 n  X2 w/* 输入参数  : number,address                                                */
& P$ c; O9 C1 z/ ?8 C/* 参数描述  : number写入的数据,address地址                                  */
; V! |% X1 Y5 e- `. {; n/* 返回值    : 无                                                             */* k$ `/ s1 b  c/ V* Q
/******************************************************************************/        7 R: G9 D% T3 x
void display(int number,uchar address)" R% B+ R( y) H; U6 x9 f
{. T# R. X% k( q8 v
        uchar b,c,d,e;
/ w. \0 l5 b, l1 {0 r; {        b= (number / 1000);8 E% ~) Y* n) n# o! t" B
        c= (number / 100) % 10;- G& R( t7 p5 f& S; R
        d = (number / 10) % 10;4 W- F: ^# E9 J" I8 z, Y
        e = number % 10;- [1 o6 D) S: M! l
( j3 {/ n7 W3 q" N) @, v
        write_com(0x80 + address);
) z! K* y7 Z. ]1 y- T2 m4 t  E# d/ L    write_date(b + 48);
6 q8 m$ @) w8 |0 b9 |1 [$ n7 Y        write_date(c + 48);% O) _4 K* q, r' {
        write_date(d + 48);6 m7 ?3 s9 S# m$ P/ y
        write_date(46);           //小数点的ASCII
- I3 f! T4 c+ u        write_date(e + 48);
7 w8 {" r4 m! @$ _- h5 y- S& `    write_date(99);           //"c"的ASCII" a- C" O8 c: X7 `
        write_date(109);          //"m"的ASCII
8 K* r4 `( E" Z5 U9 T}
6 v2 P- _- }: n& d  `4 E/******************************************************************************/
7 f' @  w2 `: D) D/* 函数名称  : Trig_SuperSonic                                                */0 u9 G% Y' _  q7 c/ V
/* 函数描述  : 发出声波函数                                                   */* r8 J- k. Z4 ~9 L2 [. G/ L. Y, k1 l
/* 输入参数  : 无                                                             */7 |$ K* o$ O9 N1 q9 P; I- ^
/* 参数描述  : 无                                                             */6 k$ S# \: n/ h1 x( ^1 q% V, n
/* 返回值    : 无                                                             */& U# `+ p  @" {* S+ o- v7 \
/******************************************************************************/
! q, w) P9 p) I/ \$ l: d* A* ]- S, \& cvoid Trig_SuperSonic(void)//出发声波
7 `7 p3 g) F  V4 `! J{
& w1 J! g7 f" o7 l         OUTPUT = 1;. j( u* @) K' j+ ~; n$ o
         delayt(1);! _* _  Z& S' w& |* G
         OUTPUT = 0;7 z/ P! l3 c7 M+ E1 [( h. O" P: _9 t
}4 e3 r  f+ i! P+ Z/ x, z
/******************************************************************************/! ^9 Y8 c- ?8 ?! |& J
/* 函数名称  : Measure_Distance                                               *// m0 C7 f* S  N, b
/* 函数描述  : 计算距离函数                                                   */
! h$ p7 U: Q2 F' u! T0 f) Z% F/* 输入参数  : 无                                                             */2 ~) B: W: ~! p- g2 m$ O9 ?
/* 参数描述  : 无                                                             */
1 H$ W7 {2 R* F/ I5 e; u/* 返回值    : 无                                                             */; D; l, |- |% q$ f- S6 z% z, ?5 Q
/******************************************************************************/5 e! L' X2 d/ e! [9 D* o
void Measure_Distance(void)
6 y  J; V" I1 Z9 }/ @7 f{& i* f8 a/ Y+ \( ^" D
        uchar l;8 {4 w1 o4 C6 t/ m6 V
        uint h,y;! ^/ Z; J! E6 |" p8 z
        TR0 = 1;1 t$ u* |& j# C1 _$ s0 Y  a, j
        while(INPUT), C; O$ s1 D( ?/ B. m2 U0 ^
    {: t* _- E( F- W8 ]+ J+ d. Z- Z
        ;, L( i5 S; V# w: k3 ~
    }        
- [9 C% ^6 F+ L* S        TR0 = 0;# ?7 l2 R1 g. z) V$ j9 z0 B
        l = TL0;9 T$ h3 i7 g( n
        h = TH0;6 G9 W( B7 x8 ?# |
        y = (h << 8) + l;
' e( v4 D$ O$ p        y = y - 0xfc66;//us部分
9 ?9 \) [3 Q% T& q        distance = y + 1000 * count;//计算总时间0 b6 S, _1 w1 C2 B. W- `$ s9 [
        TL0 = 0x66;2 Q1 f& ]% C) h& _! n3 s' p% V0 Y
        TH0 = 0xfc;
( @$ V- V5 Y( S# n        delayt(30);
) I' m7 @9 T2 v2 @        distance = VELOCITY_30C * distance / 20000;& t: i- X2 I& @0 o4 F* X
}; Y! p( y: s# r9 w) t
/******************************************************************************/
3 w( R1 b  v& q* x  x; H/* 函数名称  : main                                                           */
3 E' w; \, f, u8 l8 M. Z1 g; F/* 函数描述  : 主函数                                                         */
' h6 m: J$ g" x3 b/* 输入参数  : 无                                                             */$ d, a0 D! g( c, v
/* 参数描述  : 无                                                             */, i% C0 }' W4 S5 g
/* 返回值    : 无                                                             */+ L( V$ j0 N5 a, w  E; c$ h
/******************************************************************************/                                       
6 T& v: Y3 i0 L/ r1 D* f- Y/ h/ Jvoid main(void)
! r% m" c. j" b0 |{        
+ A! n5 l$ k/ S9 c- T    rw = 0;
( Q$ l* o5 R7 y" K. U        initLCD();0 F/ _1 a5 P1 \- r8 w5 O, H1 F9 z* t
        Init_MCU();
' [' M1 S% d( R! V& r( W        Init_Parameter();3 q! P' P2 J/ g% c' c- M/ u" S  L
        Alarm(2);/ c  A7 q4 f8 l$ \
        display_char(table,0x00);) D  F5 A! z& C  E9 q' R
        display_char(table0,0x40);
5 T3 `4 ?8 B: @; a        Delay_xMs(30000);0 {( b& \7 r, q. u4 Q8 m3 X( r
        display_char(table2,0x00);
4 R# e3 }4 ~3 Y* N        display_char(table1,0x40);" T, {* I: o- r1 y# O/ t, T

- h# `8 k. ?. [5 m0 Z9 I( T4 b        while(1)
8 @3 f7 q. \- u1 t- a        {3 K; l8 m1 Q1 B- H
                 Trig_SuperSonic();         //触发超声波发射
# f2 N/ H8 h1 o                 while(INPUT == 0)          //等待回声* h8 }7 O% w' l8 q$ P
         {( g( d0 D4 P. I5 t
             ;; c" i( m- v# k- ^; R2 P+ `
         }
% Q6 W/ M' V+ m! }# {" u                 Measure_Distance();        //计算脉宽并转换为距离! p4 o0 H% [8 u& t. |+ m" }
……………………
" j) D* q4 B. f7 s% \3 d' `6 a0 F0 u9 x. t7 @: @$ R
…………限于本文篇幅 余下代码请从eda365.com下载附件…………6 E' l' V( }9 v, x& ?2 C5 `, \5 w* I

0 Q9 m0 i& o; D% |6 i$ _+ Z6 K+ M
: D( b$ ^: y! M8 n0 O2 l+ ]
游客,如果您要查看本帖隐藏内容请回复
) s3 Z! C6 S: J* }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-18 18:38 , Processed in 0.109375 second(s), 27 queries , Gzip On.

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

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

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