|
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* }
|
|