你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32感应垃圾桶

[复制链接]
STMCU小助手 发布时间:2022-10-27 14:34
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
A}Q[}L$ATVUIHM(Z26]3GXC.png
7 Q3 d0 Y6 c+ r7 Z" s
7 A  s# I) S( B  U& ]1 O
  1. //1.HCSR04  配置部分
    0 m- O5 P' d$ F
  2. #include "stm32f10x.h"" G; ~" A6 M' _) c4 L
  3. //宏定义相应的引脚  F6 D; O# j6 a# x
  4. #define HCSR04_PORT     GPIOB
    9 L4 [  n# M9 o/ b
  5. #define HCSR04_CLK      RCC_APB2Periph_GPIOB* ^) L8 W% Y3 p( W4 t
  6. #define HCSR04_TRIG     GPIO_Pin_11
    $ x: [9 x2 q/ H1 E
  7. #define HCSR04_ECHO     GPIO_Pin_10. p0 ~8 \. ]2 S9 {, e" y9 n

  8. ; m: Q6 e5 i6 i. m4 S
  9. 5 F' Q9 w8 o; M3 l2 ^
  10. 8 k6 O. ?+ b, G3 Q% L
  11. //定义一个变量来记录定时器的值
    : v( `- b0 p/ J
  12. u16 msHcCount = 0;9 B& R. A/ ^9 i) X! G7 k. J" {
  13. # c7 F' U6 g7 H! _9 U; h+ G; F
  14. //中断配置5 R4 p$ J; Z  O0 e1 @) r1 q
  15. void hcsr04_NVIC()+ ]& f% X* d2 K0 o, N; R9 p8 G( P
  16. {- t1 M4 G9 X* A$ `( k: y
  17.         NVIC_InitTypeDef NVIC_InitStructure;2 i5 j* I* E6 `  H' f8 ]
  18.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);3 ?; K. S7 `0 B6 _0 j  [/ O( M  T+ |+ }
  19.                         
    ' v" \; M" L6 b1 t9 `$ N
  20.         NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;             + [. R- G2 o5 \% @2 V
  21.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  * W  j) F- M" ]. {. U  f
  22.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         
      J( g: X1 W1 O2 G. `' Q" _
  23.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       9 E6 F$ X& m) W0 q& n2 J
  24.         NVIC_Init(&NVIC_InitStructure);5 O" L0 \; d; D* Q
  25. }
    ) {# ~" I5 s# [  P2 [5 C" K9 D
  26. 4 L7 S' w9 m7 P% T
  27. //超声波配置¯
    1 Q0 I8 J3 O+ `0 v6 }
  28. void Hcsr04Init()' X" ]3 }$ m0 R5 i( A0 k3 S
  29. {  
    ; {9 D/ D( `5 \  E4 W0 [0 T5 q' f7 ~
  30.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;    //定时器结构体
    3 ?) e7 X$ n1 W6 s, z4 R
  31.     GPIO_InitTypeDef GPIO_InitStructure;              //GPIO结构体6 Y/ A6 N" s7 Q2 M0 l9 S
  32.     RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);       //时钟使能
    6 c! f0 g# d( B/ A
  33.     // trig pb11$ f) X- z4 T3 C- o. Y( f
  34.     GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;      : f3 B. h1 i7 e/ O9 [. r. r
  35.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;4 Z5 h4 F7 g1 E% s  g
  36.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;8 l0 l5 `. p$ }
  37.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);' V" d) b2 P. h% C' k9 }
  38.     GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
    5 s  u# m6 g5 Z3 T! `0 M
  39. 1 Q/ D" ]- @: Y" e
  40.      //echo pb10
    9 I  @$ j" J6 ]2 s
  41.     GPIO_InitStructure.GPIO_Pin =   HCSR04_ECHO;     
    ( D  B0 k! }: p8 d9 W) H, {
  42.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    - Q7 D! S- J+ A$ F% @2 g+ G$ I
  43.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  * M% E4 f7 ^4 P; s
  44.     GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);   
    ! [2 U/ R4 g  `& V; a) x

  45. ; G! }  Y% M+ `& d% F& _1 s" A
  46. 1 G6 q- r0 M! [3 U  j/ r/ |! x" C  C
  47.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);   //定时器时钟
    - I* |+ J% F+ i+ D

  48. + L2 `, V9 c( _: ~1 r
  49.     TIM_DeInit(TIM2);
    ( Q* t1 P. t' p$ k
  50.     TIM_TimeBaseStructure.TIM_Period = (1000-1);
    ( N% J. B0 p7 a$ T3 r9 C4 D4 q- _
  51.     TIM_TimeBaseStructure.TIM_Prescaler =(72-1);
    + k9 K- C% H: g( `
  52.     TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;9 S  q2 R; o2 i7 p$ T1 Z
  53.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  2 s8 }) V2 z# N( G* N
  54.                 % o" Q8 M# @6 b9 F: F3 [# ~
  55.     TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);         
    . H# t! H( [5 y) u$ [
  56.     TIM_ClearFlag(TIM4, TIM_FLAG_Update);  6 e: ~6 o- O9 Q3 f0 }4 [# y: Y
  57.     TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);      //定时器中断配置这个千万不要忘记配置了' x5 x' R0 V5 H
  58.     hcsr04_NVIC();
    4 ^; X; `* v- m1 D1 G) i" x' {
  59.     TIM_Cmd(TIM4,DISABLE);     
    7 k' W# C! {' j# g8 A" p
  60. }$ m" Y5 c3 i  T" d
  61. " w- i+ w6 d+ @8 a- {0 i. t

  62. 4 p4 l0 v7 f' A. C1 ~$ T3 X
  63. //打开定时器  3 G8 ]# N! d" n- o0 t
  64. static void OpenTimerForHc()  
    ( @; E8 m5 W9 V) c7 B4 y0 e" y( Q
  65. {
    ( \7 O1 M8 R  K/ @; u
  66.    TIM_SetCounter(TIM4,0);  //初始化开始计数
    ! N  d6 d5 U  J
  67.    msHcCount = 0;$ E, |5 `$ Y; B, g
  68.    TIM_Cmd(TIM4, ENABLE); ( Z- n# u3 }* [
  69. }
    , B9 O  o/ t! e: F( o  q0 `
  70. $ H0 Y  S! G, Q- l: I1 Z; V
  71. //关闭定时器
    , d0 u4 Y$ N; w- S) v. Q$ y
  72. static void CloseTimerForHc()   
    ( I2 W7 |* w3 m
  73. {
    ) [6 z2 [: T/ T
  74.    TIM_Cmd(TIM4, DISABLE);
    * J7 \9 K- q$ K. Y; p' K4 }
  75. }. o4 ]7 u4 w1 ^7 @6 M
  76. : c/ Q& L+ S6 V6 K: I$ R
  77. //定时器4中断函数( j" w* S# R3 I! Q
  78. void TIM4_IRQHandler(void)  * M5 N* I/ P; l0 S* W$ K
  79. {/ e  P+ B) |% h) Y7 @2 O
  80.    if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  
    / k% C; P# s$ M$ _
  81.    {
    & J3 @/ E2 ~2 ^6 Y. o5 Y4 ]
  82.        TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );
    3 F( Z: \8 a' m( j: x) @" c
  83.        msHcCount++;
    ; g& H. @0 j4 j7 }
  84.    }- ]# ~4 B0 i& N- L6 ]
  85. }( y4 C6 E& g* U- f& ~0 E& j- W7 k

  86. 7 _% j1 T0 @) l: I% P

  87. 1 R1 T6 t4 x0 c# w2 ~
  88. //获取时间( D" Y7 A; r# _0 g
  89. u32 GetEchoTimer(void)
    & P& y# J* b; S8 O5 d8 M  S
  90. {
    % v, l9 X' k5 Y. Q
  91.    u32 t = 0;1 C* l8 y) X* c  ]# Y
  92.    t = msHcCount*1000;$ V; H+ N5 a6 J( v* [: C
  93.    t += TIM_GetCounter(TIM4);
    2 G. H! D8 f9 Z' S
  94.    TIM4->CNT = 0;  
    6 s: P; n) b. k
  95.    delay_ms(50);
    ( U9 f2 V9 o  O. ]
  96.    return t;
    * M  t3 J- |4 r/ A- K, [
  97. }
    . ]: m4 C3 P5 A+ ^0 f: I7 G
  98. . m3 R2 E2 ^2 K: c! c# P! Z$ A
  99. //计算测量距离$ d! z; F$ j, @
  100. float Hcsr04GetLength(void ): x; i, `2 @# Q+ b' ]
  101. {5 q2 V( }* t# _9 z1 u
  102.    u32 t = 0;
    : a5 F' @# F# R# l) L
  103.    int i = 0;
    # F- {: z& {1 N2 d# l7 o! U
  104.    float lengthTemp = 0;
    : {8 L! O& p7 y$ \6 X
  105.    float sum = 0;4 o0 {, k( R9 z
  106.    while(i!=5)8 m! T* \: g. {6 @1 l
  107.    {
    : C, ]! l. _6 `
  108.       TRIG_Send = 1;      $ f: G2 D- B# A. X' I2 F
  109.       delay_us(20);. t! M. C% S& s& I  ?
  110.       TRIG_Send = 0;& Y6 b# `# e$ V% f8 h$ V
  111.       while(ECHO_Reci == 0);      
    # M+ a! @. {' m. ^
  112.       OpenTimerForHc();        6 f0 |5 r2 `& a5 ^; e
  113.       i = i + 1;
      X/ Y( o% M% t  x  T5 O
  114.       while(ECHO_Reci == 1);0 g% H# A9 L: _" \2 t- f
  115.       CloseTimerForHc();        
    % Z; X0 E. h- a/ C/ U6 j" b
  116.       t = GetEchoTimer();        / |, c) i9 O  ~8 i$ F
  117.       lengthTemp = ((float)t/58.0);//cm
    ! l" N' ], E1 w/ T1 }' U
  118.       sum = lengthTemp + sum ;
    6 j  \' k7 T4 k% W, o
  119. 2 c* ]# B* m6 I5 H& M* r9 s
  120.     }
    9 P0 o6 X2 C: A* @$ }
  121.     lengthTemp = sum/5.0;/ B% ^8 Y' G; {7 ]6 Z  }5 g; v4 N9 X6 N
  122.     return lengthTemp;
    2 X' m$ Z" Q$ F1 E1 z4 P4 O+ ~
  123. }
复制代码

* y0 A- q% }- m  `1 }SG90配置* S# }. X$ X. z# S
# e( j! ]8 c+ e2 i! d+ Q8 Y+ G. y
  1. //motor.h
    ' _  W! q6 m% e1 V- ?3 ^
  2. #include "stm32f10x.h"- ?) o8 s% E8 o* C* e+ g! u
  3. void Motor_Init(void);
复制代码
  1. //SG90.c
    5 \9 w- ~/ l& ~; t# _) ~* x

  2. 5 O3 H5 Q+ [6 ?/ J7 D: {
  3. #include "motor.h"
    ; f; H  Z! E$ r: e
  4. #include "stm32f10x.h"8 {0 r" o- F$ z( Z7 u

  5. $ s! ]1 ?; \1 L
  6. / f! M2 }( X& t2 ?. O5 z( ^. y
  7. void Motor_Init(void)
    3 @+ B( b. U) I  L) k
  8.         
    % I, c  ~+ {1 x& ~) e
  9. {
    . o2 o: @" q0 L# C6 u/ u
  10.         " a; x* @. d1 w6 ~! }$ K
  11.         //GPIO结构体配置/ ?  N, p* J7 \1 A5 ~* {8 Q" d
  12.         GPIO_InitTypeDef   GPIO_Config;% k" _2 |( ~+ O
  13.         
    4 u1 E% n7 L) c) [4 L
  14.         //定时器结构体
    " H* \. I# R! ]  b
  15.         TIM_TimeBaseInitTypeDef  TIME_Config;' n7 _+ ~' I1 j
  16.         . d& z2 {4 ]* Y/ j" K. h$ T. P
  17.         //复用配置
    0 C% j7 }0 [' V- E  O
  18.         TIM_OCInitTypeDef    TIMEPWM_Config ;) a5 N9 o& M$ X" [7 c" t6 {* @- h
  19.         7 T3 h* M+ ]/ r3 U; V2 N0 w1 e
  20.         //时钟使能
    7 O4 F0 ?& J, ]  |2 x, \) ?
  21.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
    5 ?' A* D  G! O- e$ A4 I$ U
  22.     RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3 , ENABLE);
    ' L: u/ Y8 t9 B% T
  23.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO , ENABLE);
    ! ]  _1 ~0 G0 O* i; d3 n
  24.          
    3 o' {8 A4 F) Q2 n" p! _* V
  25.      GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 ,ENABLE); //部分映射% Y/ o3 F7 z9 \' M+ |" h* a

  26. 4 b0 d8 c* |- |/ E/ L5 e  k5 ]
  27.         , e" u' t- r% a! L
  28.         GPIO_Config.GPIO_Mode  =   GPIO_Mode_AF_PP ;//¸´ÓÿªÂ¥5 t) @& I1 Y8 r5 G$ }
  29.         GPIO_Config.GPIO_Pin   =   GPIO_Pin_5 ;
    4 I3 x; W8 o, }* A% d
  30.         GPIO_Config.GPIO_Speed =   GPIO_Speed_50MHz;
    6 O* `" z* x1 ~- y# K' z
  31.     GPIO_Init( GPIOB,  &GPIO_Config);2 O/ c# @* M/ f3 \# u1 q
  32.         & X" w2 n0 c0 N* m3 \( I; Q
  33.         
    / {, l9 |1 k' a+ s! B4 _
  34.         TIME_Config.TIM_ClockDivision   =   TIM_CKD_DIV1  ;  5 \  N/ K( B" c" @2 I4 G6 V3 K
  35.         TIME_Config.TIM_CounterMode     =   TIM_CounterMode_Up  ;
      _# M7 X  V. {/ ~4 O# F: x7 @
  36.         TIME_Config.TIM_Period          =   200 - 1;  
    : g& q( |7 j  u  d) W2 Y
  37.         TIME_Config.TIM_Prescaler       =   7200 - 1;  ; a( G: L; b* U0 i' ]9 w+ U
  38.     TIM_TimeBaseInit( TIM3, &TIME_Config);  p6 J! S! z6 [) l+ n! }1 W9 x

  39. ) U6 U( i6 w- M2 i. k/ s
  40. % f( H) Y, ^, [
  41. " ?, r) [( {: @7 E& y5 _# ^
  42.         TIMEPWM_Config .TIM_OCMode       =   TIM_OCMode_PWM1 ;  
    8 o# ]& E" D1 i& `4 M
  43.         TIMEPWM_Config .TIM_OutputState  =   TIM_OutputState_Enable ;   
    1 |! Q( ~, R! P1 o
  44.         TIMEPWM_Config .TIM_OCPolarity   =   TIM_OCPolarity_Low ;
    : `! r1 U5 N: F* \& U0 o7 d5 }
  45.         
    / r+ e! n8 w! [. G
  46.     TIM_OC2Init( TIM3, &TIMEPWM_Config);
    4 j: j: I& |' P9 J' y5 a* e; j
  47.     TIM_OC2PreloadConfig( TIM3, TIM_OCPreload_Enable);
    : Y. Q, H" I  e/ I* M
  48.         TIM_Cmd( TIM3, ENABLE);& ^9 M# s( D1 r9 u
  49. 6 ?% U7 i4 r  X% C
  50. }
复制代码

. I. {. X1 C. S4 W- A: q: L7 jUsart串口代码
+ D; c, Z. H& z  m- D; k/ h6 p/ V* S# _" c6 ]6 h
  1. //Usart.h7 V7 f+ j* y: u7 v2 v

  2. $ @9 Q, m8 h# N% o; v
  3. #include"stm32f10x.h"6 V6 V9 [$ d# h& E1 Z! O9 o
  4. void Usart_Init(void);
复制代码
  1. #include "usart.h"
    # C9 @- |) A9 ]( m5 S5 n3 l, V; F
  2. #include "stm32f10x.h") m7 `' Q& W( e, h

  3. , k6 y  T& c  y" Z

  4. ' k( s( s. T% `6 q" Z+ {2 G- L
  5. void Usart_Init(void)/ p2 J/ i& B, G$ u- `
  6. {! c) p# \4 B5 B/ J
  7.         " Z  J( [* m, w3 r& S- D
  8.         GPIO_InitTypeDef   Gpio_Init;   , k' g' p& ~5 c# _0 F  U7 L
  9.         USART_InitTypeDef  Usart_Init ;( i+ ^( F0 I6 `! {# J) |
  10.         
    5 N6 K! k5 O* x8 J7 V+ c4 [
  11.         NVIC_InitTypeDef nvic_init;  
    2 n' a7 S1 u/ R' V5 [
  12.         
    * f9 l6 _. |9 U; e7 H; o. e
  13.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);   
    % C. a& ]  @& D( e- J6 X8 K
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE);  - N: E- _# D1 e: f% b
  15.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 ,ENABLE);# n* O# M5 [5 r  n# ?1 E
  16.         
    7 F1 C6 {6 h( X/ N+ y3 E5 f
  17.         
    1 c2 f+ Z9 }: r* j. J- z0 h% F
  18.         //tx A9
    4 t9 Y7 V* k3 ^1 B
  19.         
    1 a+ p+ r' N6 E
  20.         Gpio_Init.GPIO_Mode   =   GPIO_Mode_Out_PP;  t6 `- {' [# ]; D) f* D- @
  21.         Gpio_Init.GPIO_Pin    =   GPIO_Pin_9   ;
    . D' z1 z+ z4 k* _
  22.         Gpio_Init.GPIO_Speed  =   GPIO_Speed_50MHz;% ?6 [0 i7 W, n' ^
  23.         GPIO_Init(GPIOA ,&Gpio_Init);   //³õʼ»¯GPIO
    9 K& f; e3 b  w4 W& c6 z7 w
  24.         3 e1 J9 d: B* S$ |5 M
  25.         ! V* I6 y* I& R+ |; O- E6 I5 Y
  26.         //rx A10
    / R2 J/ H; t. }
  27.         Gpio_Init.GPIO_Mode   =    GPIO_Mode_IN_FLOATING;% K; Z: W/ h& ?' i" Y; E# D' U+ e
  28.         Gpio_Init.GPIO_Pin    =    GPIO_Pin_10 ;! G: I: Y& I, w+ K
  29.         GPIO_Init(GPIOA ,&Gpio_Init);) |& s: |( p& c* c5 y
  30.         8 G1 }+ w( q) A7 L
  31.         Usart_Init.USART_BaudRate     =  115200;  " [' p) M2 H' I* I! M6 o1 w
  32.         Usart_Init.USART_HardwareFlowControl  = USART_HardwareFlowControl_None  ;
    ' r, @7 ^6 ?! m7 m' M6 {9 z8 u
  33.         Usart_Init.USART_Mode        =   USART_Mode_Rx  | USART_Mode_Tx  ;  /
    ; ?  e; u' o" l) N* p
  34.         Usart_Init.USART_Parity      =   USART_Parity_No ;  
    " W5 d5 n7 n3 Y+ C
  35.         Usart_Init.USART_StopBits    =   USART_StopBits_1;   o: _& Q/ |: L9 \, j: ^. z
  36.         Usart_Init.USART_WordLength  =   USART_WordLength_8b ;  
    2 T$ |3 L1 [* _8 Z  _- w- L
  37.         
    ) L) ^- j4 T# `# g/ R
  38.         USART_Init (USART1 , &Usart_Init);  ' O! J' J' D: w5 D& w" ]
  39.         USART_ITConfig( USART1,  USART_IT_RXNE  , ENABLE);' g/ `) `! u5 f! q  ?
  40.         USART_Cmd (USART1 ,ENABLE );   8 O5 x7 V& R0 b* O5 P
  41.         
    + u+ z6 B' Z  e9 F# E
  42.         
    4 U0 ~1 D$ h2 }& E4 D5 P% u; v
  43.         
    - Q9 {7 L6 b- d8 G
  44.          nvic_init.NVIC_IRQChannel    =   EXTI1_IRQn;; Z( f6 |6 l) C1 E' \3 O& \/ A
  45.          nvic_init.NVIC_IRQChannelCmd  = ENABLE ;
    ' F7 H, A( q  n6 z) h2 L# B
  46.          nvic_init.NVIC_IRQChannelPreemptionPriority =1;6 X  v& v" U( ]1 m" J, j4 n
  47.          nvic_init.NVIC_IRQChannelSubPriority   = 1;
    ; M' R- q( I0 Z+ y+ A6 C

  48. 1 _4 h  Y8 p; {
  49.           NVIC_Init(&nvic_init);+ V4 y+ P/ ]6 r5 V
  50.                
    / x6 O0 G  H1 I9 u* n
  51.         % P( c  ^! I5 m: {/ J3 n- H7 Q, e
  52. }
    2 U% J3 d' M* p

  53. ( }! E) y; ]. a1 ~% K

  54. - R0 B- E4 t" D1 y
  55. //打印当个字符
    4 Q* d& q. x0 E: _' f# N9 C
  56. void  USARTSendChar(USART_TypeDef* USARTx, uint16_t Data)
    1 i. W4 u5 ~5 A7 [
  57. {
    ) _: F9 J8 e6 A! [8 H2 f* A
  58.         - h+ z0 T$ V: o  T, j
  59.         USART_SendData(USARTx, Data);
    ; M1 n+ y& L9 ]% ~) m, x
  60.         while(USART_GetFlagStatus(USARTx  ,USART_FLAG_TXE ) == RESET);- `9 ]5 B# k0 t  Q) G
  61.         
    1 A: b8 Q6 \" _3 h- f3 _& }" V
  62. }
    ( @9 \0 A$ l5 `7 W* {1 S; Z
  63. ) W9 e# W9 F6 T3 \5 e: E# `) @
  64. + W* k) p* ]0 ]+ K

  65. % U# ?" b! M* q
  66. //字符串; H( R$ M: b+ Y# N: V8 t- ^
  67. void  UsartSendStr(USART_TypeDef* USARTx, char *str)
    0 p  X6 v; Z" [& N4 O( C% }
  68. {
    5 K( H4 h$ b6 X3 X3 {
  69.         uint16_t i=0;
    ; w  n, Z9 C2 P9 n
  70.         do. o( R# q; i; [) G5 L$ }# T
  71.         {  _. X6 F; G5 |- }8 R* o
  72.                  USARTSendChar(USARTx ,*(str+i));3 a3 D& @5 e5 E2 f8 S3 \
  73.                  i++;
    # i9 h; f0 ~' w  F, D
  74.         }while(*(str+i)!='\0');
    ( e, J& ^; Y8 P# y: p6 }! ~4 P
  75.         . M% V+ x6 s9 h6 Q; P. ^; d" b/ J/ t) F
  76.         while(USART_GetITStatus( USARTx,USART_FLAG_TC) == RESET) ;  //判断是否接受完成
    3 m  M, y  a+ X! R

  77. 8 o7 B6 c5 e# y7 S8 T, T6 S" O
  78. }
    ; J. ^# ]9 c/ K7 x4 O7 F

  79. ( |7 d  U+ Y; b
  80. //重定义Printf
    ) B; \- L3 ~) d8 O
  81. int fputc(int ch, FILE *f)2 X$ M5 q; n5 q- Q7 [
  82. {9 k9 T6 h* d; {2 L0 i9 I
  83.         8 }) L! ^+ Y+ j2 V( s5 \( b
  84.         USART_SendData(USART1 ,(uint8_t )ch);
    8 v1 G+ O  F8 Y% {3 I8 U! L: ]
  85.         while(USART_GetFlagStatus(USART1  ,USART_FLAG_TXE ) == RESET);* M$ I: X% z+ V$ G1 G& \3 c' u
  86.         return (ch);
      A$ ]! E9 M5 V9 b9 k
  87. }3 Q. L( q; o; e( j

  88. # j5 {) t- E; j- \# P

  89. ( T% }: S* X( N& M/ d
  90. int fgetc(FILE *f); p& ?# R* R$ ]+ t( x
  91. {( D4 r: X9 R  l: f3 P
  92.         while(USART_GetFlagStatus(USART1  ,USART_FLAG_RXNE  ) == RESET);+ ]* D( E3 Q! n! [0 k- j
  93.         ( v3 V! @( M+ c: h; W8 C4 w2 f
  94.         return (int)(USART_ReceiveData(USART1));
    6 |$ X" m1 E4 w+ S
  95. }
复制代码
% C( o& _0 o# J4 J$ {
main.c主函数$ ^4 r$ _3 k" O  z8 [; \. `
) S. M% D, l  B( o
  1. #include "stm32f10x.h"
    - t- N6 `. a8 Y$ O8 }* Q- ]
  2. #include "usart.h"         , ?* f, `7 ?3 B! v0 k# Z) g" M
  3. #include "motor.h"
    2 }7 F3 B  k+ P$ i9 S( t
  4. #include "hcsr04.h"+ k& V' ^+ j$ d4 X/ s  B" g$ Q

  5. 3 E2 y% n2 O4 g
  6.          
    3 s) p4 R4 a. J5 P! ~
  7. //主函数
    0 B( I; U# P4 e3 t
  8. int main(void)
    / P, N" L  B9 v8 P
  9. {         
    / Q5 E" C1 m5 z" M
  10.          float length;
    ; G( J3 X% w5 L; i& Y
  11.          int pwmval = 195 ; 2 E9 y/ b; B2 w5 ^2 c% W9 ]" V+ Q
  12.          delay_init();                     //延时函数初始化  % [' r9 {2 \$ B0 S5 `! I% z9 v+ z
  13.          NVIC_Configuration();          //设置NVIC中断分组
    9 A2 D0 d. `& }& j, l. e8 f2 b9 D
  14.          Hcsr04Init();
    / G# o+ t: H5 ]
  15.          Motor_Init();  
    2 B- x0 P- F! S# U
  16.          printf("xaio yin serial test\r\n");  & @8 s6 U2 f5 k; K9 F, W7 @

  17. " T3 j. `6 T3 }! \  r" t
  18.      Hcsr04Init();   
    ! H3 ~* |7 p% r3 m
  19.      printf("超声波初始化成功!\n");
    $ D' t- c# N3 z- _

  20. 1 ?- ~3 F: T' D
  21.    while(1) ( g$ \/ ^$ b) i( P
  22.          {                . G* c. h" L7 P
  23.                  pwmval = 155 ;  //设定最初舵机值" j' C2 p' g& o: T! {5 Q
  24.          length = Hcsr04GetLength();
    2 Y' V" x0 w1 f' p. u: z
  25.          printf("%.3fcm\n\n",length);  //打印距离
    * f, D  O. b( j* h7 ]  w) w. R  Y
  26.                  printf("\n");: N& V  c+ x* G/ h
  27.                  delay_ms(1000);  
      W6 @0 S" ^0 x- L
  28.                  if(length < 5): ?1 d4 R4 v! R0 w
  29.                  {  t! A% d0 B* ?8 B% i. `
  30.                                 for (pwmval = 195 ; pwmval >= 155 ; pwmval -=15)
    - u# x+ W$ C! l3 U
  31.                          {/ p- g# z. @3 a8 {1 B
  32.                                  2 R* B5 [6 e& g7 M+ c
  33.                                    TIM_SetCompare2(TIM3 , pwmval);
    ; F3 V/ K7 Y2 x, E$ D/ D; ~1 [7 ?, V
  34.                                    delay_ms(1000);7 U; Z1 h" r. ~: a7 C9 P
  35.                          }' U4 l0 n3 T4 P) x. R8 ^
  36.                  }
    & v9 @: B: K. |+ K1 [  a% k
  37.                                 else if( pwmval >5)
    / L( ?6 f* W9 C0 u
  38.                                 {+ F2 Y+ Y# O/ m9 C- k+ G+ n* A) x
  39.                                         TIM_SetCompare2(TIM3 , pwmval -20);
    ! R! Z9 |  Q9 h/ b; ~
  40.                                          delay_ms(1000);
    , }1 N  k' [% \. p6 c
  41.                                 }
    ) I* q+ R+ r" j; E
  42.                         8 h$ }& Y" L( y: `' o- ~6 o
  43.            }                        5 h- C( z/ l0 U$ C1 ^6 a! B
  44.   }
复制代码
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 }
赞 收藏 评论0 发布时间:2022-10-27 14:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版