STM32感应垃圾桶' M. \4 g. E' n& C4 |3 q7 Y
学习最重要的是学会学以致用,基于学习的一些简单串口、定时器、中断…/ s% E$ E- @) Y' K; f7 ~
来做一个简单的感应垃圾桶,在制作过程中也提高了自己调试能力,虽然说是简单的串口打印测试还是花了很久时间,感谢自己的坚持和学长的帮助。最终还是成功完成了该小项目(冲冲冲)
' t0 V! ^- G5 N2 T) n. C0 W$ o s% q1 F+ u% E) i' b
所需硬件
5 ^4 n' T% {6 a8 E) v* E& H6 {) ` Y0 s C! X |" u* g {- n
7 Q3 d0 Y6 c+ r7 Z" s
7 A s# I) S( B U& ]1 O- //1.HCSR04 配置部分
0 m- O5 P' d$ F - #include "stm32f10x.h"" G; ~" A6 M' _) c4 L
- //宏定义相应的引脚 F6 D; O# j6 a# x
- #define HCSR04_PORT GPIOB
9 L4 [ n# M9 o/ b - #define HCSR04_CLK RCC_APB2Periph_GPIOB* ^) L8 W% Y3 p( W4 t
- #define HCSR04_TRIG GPIO_Pin_11
$ x: [9 x2 q/ H1 E - #define HCSR04_ECHO GPIO_Pin_10. p0 ~8 \. ]2 S9 {, e" y9 n
; m: Q6 e5 i6 i. m4 S- 5 F' Q9 w8 o; M3 l2 ^
- 8 k6 O. ?+ b, G3 Q% L
- //定义一个变量来记录定时器的值
: v( `- b0 p/ J - u16 msHcCount = 0;9 B& R. A/ ^9 i) X! G7 k. J" {
- # c7 F' U6 g7 H! _9 U; h+ G; F
- //中断配置5 R4 p$ J; Z O0 e1 @) r1 q
- void hcsr04_NVIC()+ ]& f% X* d2 K0 o, N; R9 p8 G( P
- {- t1 M4 G9 X* A$ `( k: y
- NVIC_InitTypeDef NVIC_InitStructure;2 i5 j* I* E6 ` H' f8 ]
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);3 ?; K. S7 `0 B6 _0 j [/ O( M T+ |+ }
-
' v" \; M" L6 b1 t9 `$ N - NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; + [. R- G2 o5 \% @2 V
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; * W j) F- M" ]. {. U f
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
J( g: X1 W1 O2 G. `' Q" _ - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 9 E6 F$ X& m) W0 q& n2 J
- NVIC_Init(&NVIC_InitStructure);5 O" L0 \; d; D* Q
- }
) {# ~" I5 s# [ P2 [5 C" K9 D - 4 L7 S' w9 m7 P% T
- //超声波配置¯
1 Q0 I8 J3 O+ `0 v6 } - void Hcsr04Init()' X" ]3 }$ m0 R5 i( A0 k3 S
- {
; {9 D/ D( `5 \ E4 W0 [0 T5 q' f7 ~ - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定时器结构体
3 ?) e7 X$ n1 W6 s, z4 R - GPIO_InitTypeDef GPIO_InitStructure; //GPIO结构体6 Y/ A6 N" s7 Q2 M0 l9 S
- RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE); //时钟使能
6 c! f0 g# d( B/ A - // trig pb11$ f) X- z4 T3 C- o. Y( f
- GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG; : f3 B. h1 i7 e/ O9 [. r. r
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;4 Z5 h4 F7 g1 E% s g
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;8 l0 l5 `. p$ }
- GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);' V" d) b2 P. h% C' k9 }
- GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
5 s u# m6 g5 Z3 T! `0 M - 1 Q/ D" ]- @: Y" e
- //echo pb10
9 I @$ j" J6 ]2 s - GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO;
( D B0 k! }: p8 d9 W) H, { - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- Q7 D! S- J+ A$ F% @2 g+ G$ I - GPIO_Init(HCSR04_PORT, &GPIO_InitStructure); * M% E4 f7 ^4 P; s
- GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);
! [2 U/ R4 g `& V; a) x
; G! } Y% M+ `& d% F& _1 s" A- 1 G6 q- r0 M! [3 U j/ r/ |! x" C C
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //定时器时钟
- I* |+ J% F+ i+ D
+ L2 `, V9 c( _: ~1 r- TIM_DeInit(TIM2);
( Q* t1 P. t' p$ k - TIM_TimeBaseStructure.TIM_Period = (1000-1);
( N% J. B0 p7 a$ T3 r9 C4 D4 q- _ - TIM_TimeBaseStructure.TIM_Prescaler =(72-1);
+ k9 K- C% H: g( ` - TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;9 S q2 R; o2 i7 p$ T1 Z
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 2 s8 }) V2 z# N( G* N
- % o" Q8 M# @6 b9 F: F3 [# ~
- TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
. H# t! H( [5 y) u$ [ - TIM_ClearFlag(TIM4, TIM_FLAG_Update); 6 e: ~6 o- O9 Q3 f0 }4 [# y: Y
- TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //定时器中断配置这个千万不要忘记配置了' x5 x' R0 V5 H
- hcsr04_NVIC();
4 ^; X; `* v- m1 D1 G) i" x' { - TIM_Cmd(TIM4,DISABLE);
7 k' W# C! {' j# g8 A" p - }$ m" Y5 c3 i T" d
- " w- i+ w6 d+ @8 a- {0 i. t
4 p4 l0 v7 f' A. C1 ~$ T3 X- //打开定时器 3 G8 ]# N! d" n- o0 t
- static void OpenTimerForHc()
( @; E8 m5 W9 V) c7 B4 y0 e" y( Q - {
( \7 O1 M8 R K/ @; u - TIM_SetCounter(TIM4,0); //初始化开始计数
! N d6 d5 U J - msHcCount = 0;$ E, |5 `$ Y; B, g
- TIM_Cmd(TIM4, ENABLE); ( Z- n# u3 }* [
- }
, B9 O o/ t! e: F( o q0 ` - $ H0 Y S! G, Q- l: I1 Z; V
- //关闭定时器
, d0 u4 Y$ N; w- S) v. Q$ y - static void CloseTimerForHc()
( I2 W7 |* w3 m - {
) [6 z2 [: T/ T - TIM_Cmd(TIM4, DISABLE);
* J7 \9 K- q$ K. Y; p' K4 } - }. o4 ]7 u4 w1 ^7 @6 M
- : c/ Q& L+ S6 V6 K: I$ R
- //定时器4中断函数( j" w* S# R3 I! Q
- void TIM4_IRQHandler(void) * M5 N* I/ P; l0 S* W$ K
- {/ e P+ B) |% h) Y7 @2 O
- if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
/ k% C; P# s$ M$ _ - {
& J3 @/ E2 ~2 ^6 Y. o5 Y4 ] - TIM_ClearITPendingBit(TIM4, TIM_IT_Update );
3 F( Z: \8 a' m( j: x) @" c - msHcCount++;
; g& H. @0 j4 j7 } - }- ]# ~4 B0 i& N- L6 ]
- }( y4 C6 E& g* U- f& ~0 E& j- W7 k
7 _% j1 T0 @) l: I% P
1 R1 T6 t4 x0 c# w2 ~- //获取时间( D" Y7 A; r# _0 g
- u32 GetEchoTimer(void)
& P& y# J* b; S8 O5 d8 M S - {
% v, l9 X' k5 Y. Q - u32 t = 0;1 C* l8 y) X* c ]# Y
- t = msHcCount*1000;$ V; H+ N5 a6 J( v* [: C
- t += TIM_GetCounter(TIM4);
2 G. H! D8 f9 Z' S - TIM4->CNT = 0;
6 s: P; n) b. k - delay_ms(50);
( U9 f2 V9 o O. ] - return t;
* M t3 J- |4 r/ A- K, [ - }
. ]: m4 C3 P5 A+ ^0 f: I7 G - . m3 R2 E2 ^2 K: c! c# P! Z$ A
- //计算测量距离$ d! z; F$ j, @
- float Hcsr04GetLength(void ): x; i, `2 @# Q+ b' ]
- {5 q2 V( }* t# _9 z1 u
- u32 t = 0;
: a5 F' @# F# R# l) L - int i = 0;
# F- {: z& {1 N2 d# l7 o! U - float lengthTemp = 0;
: {8 L! O& p7 y$ \6 X - float sum = 0;4 o0 {, k( R9 z
- while(i!=5)8 m! T* \: g. {6 @1 l
- {
: C, ]! l. _6 ` - TRIG_Send = 1; $ f: G2 D- B# A. X' I2 F
- delay_us(20);. t! M. C% S& s& I ?
- TRIG_Send = 0;& Y6 b# `# e$ V% f8 h$ V
- while(ECHO_Reci == 0);
# M+ a! @. {' m. ^ - OpenTimerForHc(); 6 f0 |5 r2 `& a5 ^; e
- i = i + 1;
X/ Y( o% M% t x T5 O - while(ECHO_Reci == 1);0 g% H# A9 L: _" \2 t- f
- CloseTimerForHc();
% Z; X0 E. h- a/ C/ U6 j" b - t = GetEchoTimer(); / |, c) i9 O ~8 i$ F
- lengthTemp = ((float)t/58.0);//cm
! l" N' ], E1 w/ T1 }' U - sum = lengthTemp + sum ;
6 j \' k7 T4 k% W, o - 2 c* ]# B* m6 I5 H& M* r9 s
- }
9 P0 o6 X2 C: A* @$ } - lengthTemp = sum/5.0;/ B% ^8 Y' G; {7 ]6 Z }5 g; v4 N9 X6 N
- return lengthTemp;
2 X' m$ Z" Q$ F1 E1 z4 P4 O+ ~ - }
复制代码
* y0 A- q% }- m `1 }SG90配置* S# }. X$ X. z# S
# e( j! ]8 c+ e2 i! d+ Q8 Y+ G. y
- //motor.h
' _ W! q6 m% e1 V- ?3 ^ - #include "stm32f10x.h"- ?) o8 s% E8 o* C* e+ g! u
- void Motor_Init(void);
复制代码- //SG90.c
5 \9 w- ~/ l& ~; t# _) ~* x
5 O3 H5 Q+ [6 ?/ J7 D: {- #include "motor.h"
; f; H Z! E$ r: e - #include "stm32f10x.h"8 {0 r" o- F$ z( Z7 u
$ s! ]1 ?; \1 L- / f! M2 }( X& t2 ?. O5 z( ^. y
- void Motor_Init(void)
3 @+ B( b. U) I L) k -
% I, c ~+ {1 x& ~) e - {
. o2 o: @" q0 L# C6 u/ u - " a; x* @. d1 w6 ~! }$ K
- //GPIO结构体配置/ ? N, p* J7 \1 A5 ~* {8 Q" d
- GPIO_InitTypeDef GPIO_Config;% k" _2 |( ~+ O
-
4 u1 E% n7 L) c) [4 L - //定时器结构体
" H* \. I# R! ] b - TIM_TimeBaseInitTypeDef TIME_Config;' n7 _+ ~' I1 j
- . d& z2 {4 ]* Y/ j" K. h$ T. P
- //复用配置
0 C% j7 }0 [' V- E O - TIM_OCInitTypeDef TIMEPWM_Config ;) a5 N9 o& M$ X" [7 c" t6 {* @- h
- 7 T3 h* M+ ]/ r3 U; V2 N0 w1 e
- //时钟使能
7 O4 F0 ?& J, ] |2 x, \) ? - RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
5 ?' A* D G! O- e$ A4 I$ U - RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3 , ENABLE);
' L: u/ Y8 t9 B% T - RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO , ENABLE);
! ] _1 ~0 G0 O* i; d3 n -
3 o' {8 A4 F) Q2 n" p! _* V - GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 ,ENABLE); //部分映射% Y/ o3 F7 z9 \' M+ |" h* a
4 b0 d8 c* |- |/ E/ L5 e k5 ]- , e" u' t- r% a! L
- GPIO_Config.GPIO_Mode = GPIO_Mode_AF_PP ;//¸´ÓÿªÂ¥5 t) @& I1 Y8 r5 G$ }
- GPIO_Config.GPIO_Pin = GPIO_Pin_5 ;
4 I3 x; W8 o, }* A% d - GPIO_Config.GPIO_Speed = GPIO_Speed_50MHz;
6 O* `" z* x1 ~- y# K' z - GPIO_Init( GPIOB, &GPIO_Config);2 O/ c# @* M/ f3 \# u1 q
- & X" w2 n0 c0 N* m3 \( I; Q
-
/ {, l9 |1 k' a+ s! B4 _ - TIME_Config.TIM_ClockDivision = TIM_CKD_DIV1 ; 5 \ N/ K( B" c" @2 I4 G6 V3 K
- TIME_Config.TIM_CounterMode = TIM_CounterMode_Up ;
_# M7 X V. {/ ~4 O# F: x7 @ - TIME_Config.TIM_Period = 200 - 1;
: g& q( |7 j u d) W2 Y - TIME_Config.TIM_Prescaler = 7200 - 1; ; a( G: L; b* U0 i' ]9 w+ U
- TIM_TimeBaseInit( TIM3, &TIME_Config); p6 J! S! z6 [) l+ n! }1 W9 x
) U6 U( i6 w- M2 i. k/ s- % f( H) Y, ^, [
- " ?, r) [( {: @7 E& y5 _# ^
- TIMEPWM_Config .TIM_OCMode = TIM_OCMode_PWM1 ;
8 o# ]& E" D1 i& `4 M - TIMEPWM_Config .TIM_OutputState = TIM_OutputState_Enable ;
1 |! Q( ~, R! P1 o - TIMEPWM_Config .TIM_OCPolarity = TIM_OCPolarity_Low ;
: `! r1 U5 N: F* \& U0 o7 d5 } -
/ r+ e! n8 w! [. G - TIM_OC2Init( TIM3, &TIMEPWM_Config);
4 j: j: I& |' P9 J' y5 a* e; j - TIM_OC2PreloadConfig( TIM3, TIM_OCPreload_Enable);
: Y. Q, H" I e/ I* M - TIM_Cmd( TIM3, ENABLE);& ^9 M# s( D1 r9 u
- 6 ?% U7 i4 r X% C
- }
复制代码
. I. {. X1 C. S4 W- A: q: L7 jUsart串口代码
+ D; c, Z. H& z m- D; k/ h6 p/ V* S# _" c6 ]6 h
- //Usart.h7 V7 f+ j* y: u7 v2 v
$ @9 Q, m8 h# N% o; v- #include"stm32f10x.h"6 V6 V9 [$ d# h& E1 Z! O9 o
- void Usart_Init(void);
复制代码- #include "usart.h"
# C9 @- |) A9 ]( m5 S5 n3 l, V; F - #include "stm32f10x.h") m7 `' Q& W( e, h
, k6 y T& c y" Z
' k( s( s. T% `6 q" Z+ {2 G- L- void Usart_Init(void)/ p2 J/ i& B, G$ u- `
- {! c) p# \4 B5 B/ J
- " Z J( [* m, w3 r& S- D
- GPIO_InitTypeDef Gpio_Init; , k' g' p& ~5 c# _0 F U7 L
- USART_InitTypeDef Usart_Init ;( i+ ^( F0 I6 `! {# J) |
-
5 N6 K! k5 O* x8 J7 V+ c4 [ - NVIC_InitTypeDef nvic_init;
2 n' a7 S1 u/ R' V5 [ -
* f9 l6 _. |9 U; e7 H; o. e - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
% C. a& ] @& D( e- J6 X8 K - RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE); - N: E- _# D1 e: f% b
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 ,ENABLE);# n* O# M5 [5 r n# ?1 E
-
7 F1 C6 {6 h( X/ N+ y3 E5 f -
1 c2 f+ Z9 }: r* j. J- z0 h% F - //tx A9
4 t9 Y7 V* k3 ^1 B -
1 a+ p+ r' N6 E - Gpio_Init.GPIO_Mode = GPIO_Mode_Out_PP; t6 `- {' [# ]; D) f* D- @
- Gpio_Init.GPIO_Pin = GPIO_Pin_9 ;
. D' z1 z+ z4 k* _ - Gpio_Init.GPIO_Speed = GPIO_Speed_50MHz;% ?6 [0 i7 W, n' ^
- GPIO_Init(GPIOA ,&Gpio_Init); //³õʼ»¯GPIO
9 K& f; e3 b w4 W& c6 z7 w - 3 e1 J9 d: B* S$ |5 M
- ! V* I6 y* I& R+ |; O- E6 I5 Y
- //rx A10
/ R2 J/ H; t. } - Gpio_Init.GPIO_Mode = GPIO_Mode_IN_FLOATING;% K; Z: W/ h& ?' i" Y; E# D' U+ e
- Gpio_Init.GPIO_Pin = GPIO_Pin_10 ;! G: I: Y& I, w+ K
- GPIO_Init(GPIOA ,&Gpio_Init);) |& s: |( p& c* c5 y
- 8 G1 }+ w( q) A7 L
- Usart_Init.USART_BaudRate = 115200; " [' p) M2 H' I* I! M6 o1 w
- Usart_Init.USART_HardwareFlowControl = USART_HardwareFlowControl_None ;
' r, @7 ^6 ?! m7 m' M6 {9 z8 u - Usart_Init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx ; /
; ? e; u' o" l) N* p - Usart_Init.USART_Parity = USART_Parity_No ;
" W5 d5 n7 n3 Y+ C - Usart_Init.USART_StopBits = USART_StopBits_1; o: _& Q/ |: L9 \, j: ^. z
- Usart_Init.USART_WordLength = USART_WordLength_8b ;
2 T$ |3 L1 [* _8 Z _- w- L -
) L) ^- j4 T# `# g/ R - USART_Init (USART1 , &Usart_Init); ' O! J' J' D: w5 D& w" ]
- USART_ITConfig( USART1, USART_IT_RXNE , ENABLE);' g/ `) `! u5 f! q ?
- USART_Cmd (USART1 ,ENABLE ); 8 O5 x7 V& R0 b* O5 P
-
+ u+ z6 B' Z e9 F# E -
4 U0 ~1 D$ h2 }& E4 D5 P% u; v -
- Q9 {7 L6 b- d8 G - nvic_init.NVIC_IRQChannel = EXTI1_IRQn;; Z( f6 |6 l) C1 E' \3 O& \/ A
- nvic_init.NVIC_IRQChannelCmd = ENABLE ;
' F7 H, A( q n6 z) h2 L# B - nvic_init.NVIC_IRQChannelPreemptionPriority =1;6 X v& v" U( ]1 m" J, j4 n
- nvic_init.NVIC_IRQChannelSubPriority = 1;
; M' R- q( I0 Z+ y+ A6 C
1 _4 h Y8 p; {- NVIC_Init(&nvic_init);+ V4 y+ P/ ]6 r5 V
-
/ x6 O0 G H1 I9 u* n - % P( c ^! I5 m: {/ J3 n- H7 Q, e
- }
2 U% J3 d' M* p
( }! E) y; ]. a1 ~% K
- R0 B- E4 t" D1 y- //打印当个字符
4 Q* d& q. x0 E: _' f# N9 C - void USARTSendChar(USART_TypeDef* USARTx, uint16_t Data)
1 i. W4 u5 ~5 A7 [ - {
) _: F9 J8 e6 A! [8 H2 f* A - - h+ z0 T$ V: o T, j
- USART_SendData(USARTx, Data);
; M1 n+ y& L9 ]% ~) m, x - while(USART_GetFlagStatus(USARTx ,USART_FLAG_TXE ) == RESET);- `9 ]5 B# k0 t Q) G
-
1 A: b8 Q6 \" _3 h- f3 _& }" V - }
( @9 \0 A$ l5 `7 W* {1 S; Z - ) W9 e# W9 F6 T3 \5 e: E# `) @
- + W* k) p* ]0 ]+ K
% U# ?" b! M* q- //字符串; H( R$ M: b+ Y# N: V8 t- ^
- void UsartSendStr(USART_TypeDef* USARTx, char *str)
0 p X6 v; Z" [& N4 O( C% } - {
5 K( H4 h$ b6 X3 X3 { - uint16_t i=0;
; w n, Z9 C2 P9 n - do. o( R# q; i; [) G5 L$ }# T
- { _. X6 F; G5 |- }8 R* o
- USARTSendChar(USARTx ,*(str+i));3 a3 D& @5 e5 E2 f8 S3 \
- i++;
# i9 h; f0 ~' w F, D - }while(*(str+i)!='\0');
( e, J& ^; Y8 P# y: p6 }! ~4 P - . M% V+ x6 s9 h6 Q; P. ^; d" b/ J/ t) F
- while(USART_GetITStatus( USARTx,USART_FLAG_TC) == RESET) ; //判断是否接受完成
3 m M, y a+ X! R
8 o7 B6 c5 e# y7 S8 T, T6 S" O- }
; J. ^# ]9 c/ K7 x4 O7 F
( |7 d U+ Y; b- //重定义Printf
) B; \- L3 ~) d8 O - int fputc(int ch, FILE *f)2 X$ M5 q; n5 q- Q7 [
- {9 k9 T6 h* d; {2 L0 i9 I
- 8 }) L! ^+ Y+ j2 V( s5 \( b
- USART_SendData(USART1 ,(uint8_t )ch);
8 v1 G+ O F8 Y% {3 I8 U! L: ] - while(USART_GetFlagStatus(USART1 ,USART_FLAG_TXE ) == RESET);* M$ I: X% z+ V$ G1 G& \3 c' u
- return (ch);
A$ ]! E9 M5 V9 b9 k - }3 Q. L( q; o; e( j
# j5 {) t- E; j- \# P
( T% }: S* X( N& M/ d- int fgetc(FILE *f); p& ?# R* R$ ]+ t( x
- {( D4 r: X9 R l: f3 P
- while(USART_GetFlagStatus(USART1 ,USART_FLAG_RXNE ) == RESET);+ ]* D( E3 Q! n! [0 k- j
- ( v3 V! @( M+ c: h; W8 C4 w2 f
- return (int)(USART_ReceiveData(USART1));
6 |$ X" m1 E4 w+ S - }
复制代码 % C( o& _0 o# J4 J$ {
main.c主函数$ ^4 r$ _3 k" O z8 [; \. `
) S. M% D, l B( o
- #include "stm32f10x.h"
- t- N6 `. a8 Y$ O8 }* Q- ] - #include "usart.h" , ?* f, `7 ?3 B! v0 k# Z) g" M
- #include "motor.h"
2 }7 F3 B k+ P$ i9 S( t - #include "hcsr04.h"+ k& V' ^+ j$ d4 X/ s B" g$ Q
3 E2 y% n2 O4 g-
3 s) p4 R4 a. J5 P! ~ - //主函数
0 B( I; U# P4 e3 t - int main(void)
/ P, N" L B9 v8 P - {
/ Q5 E" C1 m5 z" M - float length;
; G( J3 X% w5 L; i& Y - int pwmval = 195 ; 2 E9 y/ b; B2 w5 ^2 c% W9 ]" V+ Q
- delay_init(); //延时函数初始化 % [' r9 {2 \$ B0 S5 `! I% z9 v+ z
- NVIC_Configuration(); //设置NVIC中断分组
9 A2 D0 d. `& }& j, l. e8 f2 b9 D - Hcsr04Init();
/ G# o+ t: H5 ] - Motor_Init();
2 B- x0 P- F! S# U - printf("xaio yin serial test\r\n"); & @8 s6 U2 f5 k; K9 F, W7 @
" T3 j. `6 T3 }! \ r" t- Hcsr04Init();
! H3 ~* |7 p% r3 m - printf("超声波初始化成功!\n");
$ D' t- c# N3 z- _
1 ?- ~3 F: T' D- while(1) ( g$ \/ ^$ b) i( P
- { . G* c. h" L7 P
- pwmval = 155 ; //设定最初舵机值" j' C2 p' g& o: T! {5 Q
- length = Hcsr04GetLength();
2 Y' V" x0 w1 f' p. u: z - printf("%.3fcm\n\n",length); //打印距离
* f, D O. b( j* h7 ] w) w. R Y - printf("\n");: N& V c+ x* G/ h
- delay_ms(1000);
W6 @0 S" ^0 x- L - if(length < 5): ?1 d4 R4 v! R0 w
- { t! A% d0 B* ?8 B% i. `
- for (pwmval = 195 ; pwmval >= 155 ; pwmval -=15)
- u# x+ W$ C! l3 U - {/ p- g# z. @3 a8 {1 B
- 2 R* B5 [6 e& g7 M+ c
- TIM_SetCompare2(TIM3 , pwmval);
; F3 V/ K7 Y2 x, E$ D/ D; ~1 [7 ?, V - delay_ms(1000);7 U; Z1 h" r. ~: a7 C9 P
- }' U4 l0 n3 T4 P) x. R8 ^
- }
& v9 @: B: K. |+ K1 [ a% k - else if( pwmval >5)
/ L( ?6 f* W9 C0 u - {+ F2 Y+ Y# O/ m9 C- k+ G+ n* A) x
- TIM_SetCompare2(TIM3 , pwmval -20);
! R! Z9 | Q9 h/ b; ~ - delay_ms(1000);
, }1 N k' [% \. p6 c - }
) I* q+ R+ r" j; E - 8 h$ }& Y" L( y: `' o- ~6 o
- } 5 h- C( z/ l0 U$ C1 ^6 a! B
- }
复制代码 2 ?) K! [& L1 O3 }$ C# I4 x5 a
4 }5 I/ `; d2 W7 m
3 M3 O" l/ u; X7 l# o: i# n) @
6 k3 g2 m2 p- r3 n7 T4 d+ N6 H b; M; R' ^( u
————————————————
8 G8 X- G6 V$ r- A1 D% |4 n) @版权声明:@slow-walker
9 F6 v4 e9 J3 ]7 b& F( L& ~4 u: D$ e% A3 }
|