一.硬件方案; V( a* @. V& u1 M% d
本文介绍了一种基于单片机的脉冲反射式超声波测距模块。该模块以空气中超声波的传播速度为确定条件,利用反射超声波测量待测距离。主要是利用STM32单片机、超声波传感器完成测距报警系统的制作,以STM32单片机为主控芯片,利用超声波对距离的检测,将前方物体的距离探测出来,然后单片机处理运算,与设定的报警距离值进行比较判断,当测得距离小于设定值时,STM32发出指令控制蜂鸣器报警。& u9 `/ L& V7 m( U
主要由STM32单片机最小系统、超声波CH-SR04模块、LCD1602显示模块、按键模块,蜂鸣器声光报警模块和电源模块组成;如图:
. M' D% T* C/ z* N7 K
; [' \% C: p( @
; H/ z" x+ x! V. _* `) i8 F J
' i9 K' M! ?$ K- ^8 C+ \/ v二.设计功能
$ z; }" a3 ~; C/ ~6 a4 T(1)可设置报警距离,按下设置键后就可以再按加减键修改报警距离并具有掉电保存功能。# D d# o# N& c1 {+ w+ x2 Y
(2)当超声波探测的距离小于设定的距离时蜂鸣器发出报警声。9 E, ^4 r3 b" F2 w( d) _% b
(3)测量范围:2cm–4m。# Z) B! p! d5 u5 P7 ~! |5 c( S* |, M! W
, K% T* H6 M; h: ~4 X) h3 g三.设计原理图0 E) m+ T* R8 s1 S G3 H5 g
(1)原理图主要采用AD软件进行设计,如图:
0 H3 Y6 `4 w- N& U9 }
! `* {& [( U$ N
* P+ P: R# ]2 @( e3 T+ B" |* _1 `4 s2 L( @' Y) O
(2)PCB图如下:
& y& u- u, |7 }! t7 X n+ k' A# C( {! b4 n( A! L
- W- S3 T4 r7 p3 G4 \
6 V1 k5 O; a/ | J' H; s( e8 e
四.软件设计
6 i; ^! @# x2 w* @5 o主程序源码
$ p8 Q' o& H( o/ v: m! a
8 x( z/ n9 `& e9 {9 a' z- int main(void)
) m* H3 ] J2 p6 u# `) ~' Y - { ) B8 h, F9 F0 s" \
- u16 datatemp[1];
+ Q/ }' E: _7 w' k$ I - BEEP_Init();0 Y5 n0 l2 A- l9 l& A
- KEY_Init();
1 r* m. N5 [, }1 a - delay_init(); //延时函数初始化
/ t! b P) I* \2 u: O/ e/ H - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
2 i/ Z8 B1 V3 r - uart_init(115200); //串口初始化为1152001 O. x1 i5 C& O- Y
- LED_Init(); //LED端口初始化
" s5 E0 N/ s+ y" S - UltrasonicWave_Configuration(); //初始化超声IO3 ]4 c: d- M& Y( l) R; W- H
- TIM3_Cap_Init(1,72-1); //以1Mhz的频率计数,第一个选项,最小只能是1
' h3 m4 P3 x7 I - LCD1602_Init();
& w+ N, q* J" v( V5 i - STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,1);
, N& }& l. ?; U- n - TL=datatemp[0];
# L8 ?) @+ w+ Y# W - if(TL<5||TL>400)1 \! g6 P8 q A/ z0 ~
- TL=50;0 X3 J# l4 C$ _
- ceju();* I7 ?3 e P: G8 P7 o
- printf("Distance"); //串口打印一下,调试用
% \6 B8 `9 [, R, T3 ^* s/ r - while(1)
+ A' ?* R' R) B! ^! j - {/ U- L7 b9 x {
- if(beep1==1) //如果蜂鸣器标志等于1,则开始滴滴叫,指示灯也是闪烁
; c( e& n* X( R- M, t( d - {5 m2 R& U* s/ W* D9 \4 G* M0 _
- BEEP=!BEEP;
0 A+ h! x l8 |0 ~ - LED0=!LED0;6 n0 x8 W! G1 {( ]8 o- a. V
-
. Z, o& i% ^% C$ N3 j3 W - }
: D# D% ~# s6 M* E: W. q - else # W. g. i# D9 `( |) w
- BEEP=0; H# I' H0 w1 G6 M' I7 P; N7 h
- show(); //调用显示函数
1 V- X/ a. s: v0 G6 Y! t# `. Q - key(); //调用按键函数
6 D7 t$ q7 u* W; i% l @, v& D - problem();//调用报警处理函数
5 ?- d# Y n6 p, [. m- C - t++; //变量自加,加到5的时候,对5取余会等于0,则启动一次测距函数
, ?# l' d, ?/ G- p) X+ A - if(t%5==0)+ B- ]7 B0 `' {# \9 O5 `5 Q
- {
& y7 K* z1 d0 r, O - t=0;
8 B4 K# M4 X9 S: [. B/ K, Q7 U - ceju();
' e V1 |: W3 U; O$ ^ - }* `+ \& u# S& U
- }
# O3 g# F5 |5 h; r, X% B# k - }
复制代码
" `1 b' y2 I2 G+ k% W$ ^# V9 E: }( x) v6 c I
+ e1 p4 e- n! z2 `2 e+ B0 f; U
A% ]( i; R! i$ j |