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