|
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' |
|
|