一.硬件方案
/ g1 \/ O4 n- t本文介绍了一种基于单片机的脉冲反射式超声波测距模块。该模块以空气中超声波的传播速度为确定条件,利用反射超声波测量待测距离。主要是利用STM32单片机、超声波传感器完成测距报警系统的制作,以STM32单片机为主控芯片,利用超声波对距离的检测,将前方物体的距离探测出来,然后单片机处理运算,与设定的报警距离值进行比较判断,当测得距离小于设定值时,STM32发出指令控制蜂鸣器报警。: Z* x; E% L8 ~4 _- t& s. V
主要由STM32单片机最小系统、超声波CH-SR04模块、LCD1602显示模块、按键模块,蜂鸣器声光报警模块和电源模块组成;如图:# S) b' f8 e& ]0 y$ e
; Q" d2 d: y2 D4 b% y
5 v: X# f3 z" ^% U K. v, W
1 M O' M1 d- T1 T0 p4 s二.设计功能 b, K$ y A/ p. G2 ]! T
(1)可设置报警距离,按下设置键后就可以再按加减键修改报警距离并具有掉电保存功能。
! ^ e# S7 U0 c' q. u* b' j(2)当超声波探测的距离小于设定的距离时蜂鸣器发出报警声。
. v I" L# s9 a$ g; ]' M/ P% [(3)测量范围:2cm–4m。4 y# |5 z. B* A# R4 w+ t; [/ X
7 d' F$ F' v/ g
三.设计原理图* ^+ H% `2 o p/ f: ~
(1)原理图主要采用AD软件进行设计,如图:: c: X9 x$ K" w9 p- d
+ k' h9 {4 |, x5 t' ?& f- e
0 I/ h( x! V/ V3 K
6 w+ I# A3 g1 c" }: \
(2)PCB图如下:
5 {# `" E' G+ h# N3 U3 u# v2 B1 w s
! s! w! x0 e/ ] e2 j
k& z/ g8 B* |( V0 n5 s9 j( J* c
5 Q S3 O7 M8 Z( J5 }& p: e四.软件设计2 V6 ^9 @- S1 g) g, f1 U# f
主程序源码/ U- x( ~2 L" `9 V: T3 \. n& K
! }. i% k* {: X6 c4 `0 C# w" T- int main(void)
$ x1 D# o* ^3 O2 O5 |( P - {
' `2 _4 {" I* c6 Q2 t+ {3 e - u16 datatemp[1];
% L) s& o/ L3 D; n, I: Y) V, b - BEEP_Init();
% _$ a0 k1 E% C4 Z5 Z - KEY_Init();( r7 Q8 z# K* Y+ e0 h; T
- delay_init(); //延时函数初始化
( o4 {, v" X6 I% ]. u' O. x - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- `4 f w4 C. W/ o+ j - uart_init(115200); //串口初始化为115200
6 M h* U4 p) Z% x+ I - LED_Init(); //LED端口初始化
9 |1 G( o* N1 D* x; P' F - UltrasonicWave_Configuration(); //初始化超声IO' o" t. J9 m4 {* Z' n' X3 D: F
- TIM3_Cap_Init(1,72-1); //以1Mhz的频率计数,第一个选项,最小只能是1
( U1 v" R. b, O# t2 W. I - LCD1602_Init();4 t1 x' k3 J5 _ b) H4 v) i
- STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,1);
& U( O' S8 @ x( k3 k, { - TL=datatemp[0];
+ G3 y" ]4 a# C - if(TL<5||TL>400)- s5 T# h6 _1 b+ j F3 v
- TL=50;* E* W2 m- v! o8 `: q7 @
- ceju();% m/ ^ Q2 m* r4 P3 l
- printf("Distance"); //串口打印一下,调试用; M8 M! w2 R( ^* J6 B$ V
- while(1)
M+ @# `% Q' P6 ~# D/ h' Y* w - {" y7 x+ t9 H( y# A% |5 I0 o
- if(beep1==1) //如果蜂鸣器标志等于1,则开始滴滴叫,指示灯也是闪烁) O: A( m3 T" h; M
- {. ~% E& l$ y, X( l1 T. c
- BEEP=!BEEP;. r I- J+ C, a# ^
- LED0=!LED0; {; k0 u' n% ]( r# v% s3 |8 X
- * t6 v$ `. a( v. h- t& @1 o/ G6 D
- }
6 V; m& e% T+ n$ ]4 ^% H9 e( { - else
3 x2 h2 I6 V1 p! t6 h - BEEP=0;1 a; G9 {% T! i9 p* D* v
- show(); //调用显示函数
- |4 W# Q K$ y" R# E" L; S* A - key(); //调用按键函数
( t3 [- P2 K6 g; o* w6 s - problem();//调用报警处理函数
" q8 O2 R* U8 t ] e- m5 S4 [ - t++; //变量自加,加到5的时候,对5取余会等于0,则启动一次测距函数 d1 E3 b- v9 ~. Q' T
- if(t%5==0)
% y9 u6 Z$ U1 z - {
. t$ \* I7 Z5 z( q/ L3 b! N - t=0;
, W( T/ V' {/ T& E, } - ceju();. C# n8 L8 q2 K+ F$ m2 o4 \8 g
- }
, B" w1 V% M/ Y6 @4 [& B2 l - }
; g [. Y# ~' [3 n - }
复制代码
1 d0 m+ I( c; @3 w: v9 ^
7 y5 S: F7 r% M9 g. m2 ~* t& z" p
- T; ~! l+ j8 a- i- o* e9 t1 }! o. J5 j: d
|