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

基于stm32 FreeRtos的智能台灯控制

[复制链接]
STMCU小助手 发布时间:2022-12-7 16:03
FreeRtos的引入+ Q. \$ I3 [$ Z+ l  a* U6 y+ {
FreeRTOS是一个操作系统内核,提供操作系统最重要的特性:任务调度操作系统允许多个任务同时运行,这个叫做多任务。实际上,一个处理器核心在某一时刻只能运行一个任务。 操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务, 任务调度在各个任务之间的切换非常快!
" |0 B, ^' M; j8 O& [; V  V/ c! o像 FreeRTOS 这种传统的 RTOS 类操作系统是由用户给每个任务分配一个任务优先级, 任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务
3 h2 J5 t1 ^  N0 `" C; Y, G
4 f& |" d/ q- J; _# P单片机引入RTOS,可以将各个功能模块分别设计为单独的任务,每个任务都是一个死循环,就好比有多个人在同时干活,这样CPU的利用率就提高了,并且可以处理一些并行逻辑。
$ S+ i( [6 m" h0 Y% T& T单片机只有一个CPU(核),那怎么让多个人同时干活呢?其实每个子任务虽然都是死循环,但并不是每个子任务一直都在执行,每个子任务在执行期间,可能需要延时,也可能需要等另一个任务的数据到来,所有,在某个任务在等待的时候,CPU就可以停止此任务,然后切换到其它任务执行,这样看起来就是多个人在同时干活了
9 K& O) ~9 \5 z! I3 w7 n# b( s: b/ Z, E
db5c1cb268b94d57aaa705f72b76ba20.png $ D+ y3 @) R4 d) B6 K" w

& S/ y2 R6 I% E; z6 C3 f) H想了解更多FreeRtos的知识需要的小伙伴可以去我专栏里面看哦,有基础实验测试,自己可以试试从移值开始,这个工程的话都是移值好了FreeRtos 直接用就行了。
5 _3 C6 ^0 D% ~5 }8 ~. B1 i
3 |: `  t9 K0 x一、题目说明
+ C9 Y% e7 K  s, J2 b: m: z; |3 {; a
2 }# j+ A' l0 G9 z% W
3ee95b3d09b849d2b6a7764bb291dc1f.jpg 5 `) \6 v. e& j* S; o
5 C6 a) R0 |2 P) C1 c% X
二、功能说明
( T! p- \8 D# T  v% I! k
& Z, p6 L0 G5 Z' o2 f( K; C3 t- P0 E使用说明:6 w# F  X. c) L3 B/ Z8 j
1.按键模式 也是上电默认的功能 在该功能下
" n7 F8 s/ [' F. n& d' W0 S; LPB6 直接用来控制灯的亮灭 第一次按下开灯 再次按下关灯8 B+ e2 S1 m4 b( Q7 h2 R( i2 n6 }
PB7 PB8 用来进行灯的亮度等级调节 一个变亮 一个变暗: M- H& Z" O' n3 T" Z8 d
PB9 按下后为定时模式 默认为定时5s时间到后会关闭灯光 并通过蜂鸣器进行5次提示
) V& w- ?5 ?0 M6 O  {6 z4 \在定时模式的时候 PB6 PB7则为进行时间的调节  按键模式下为亮度的调节(PB6 PB7为两种功能的控制)
- s1 v% {; {  X6 c- L1 f8 _6 [9 R& }
2 E) \0 s% u+ y, h4 g/ X2、光敏模式:在该模式下灯光可以跟随环境的变化而自动调节
% C$ V/ g3 u' X  z! g; t* A  T5 z. r/ k
3、红外模式: 通过检测距离来进行灯光的控制
2 ?  d  C8 [2 N( K
& T7 o& t- Y/ _) i/ w4、定时模式:到一定时间后自动关闭灯光 并以蜂鸣器实行进行提示/ \# M* f) T. ]. i0 n
5、实时检测当前电压, G3 D6 H, K( X, b# V) F3 k0 F4 e
6、超时波测距模式:也是通过距离的检测来控制灯光(该功能屏蔽了)
$ T) K4 ~3 w0 g$ M8 c. P注意:按键是没有模式切换的只有按键 和定时可以控制所有进行其他模式切换时是以蓝牙控制
( u0 Y4 P% X7 k7 V: Y) s" s5 i通过手机来控制的,语音同样可以进行模式切换和亮度控制
( J: v/ L# _3 M2 \% j1 @; g9 C/ L/ R3 k
简单的焊接了一个方便调试
  d0 H9 i/ V9 e: u5 Y& k3 A0 g" g3 V2 R0 a1 S0 }( E# d2 g
4b9dc044c9a843f3bbf7ce224ba9ad97.png
5 R* @7 c* v* X9 P1 W9 [4 ?9 {
由于在进行OLED显示时刷新有点问题,所以将各模式下数据通过蓝牙发送到手机上了,以两种形式进行显示,实时电压值在手机上会一直打印 ,其他显示只有在进行相应功能切换时才打印
% |7 A7 y7 W. X- s0 S/ t5 L# j
% D5 B  P% q9 u7 F5 P+ A7 l
c63d467d05f94e86a073f1eb4afd1cf9.jpg . Q4 ~. R1 u0 X6 r6 e& L- B1 S  H& {
, g. C7 Z% M3 D1 T' m& g( N
三、硬件部分
: z' u- L! A& N! G0 o' I
# `) u" N, I1 E6 k0 L' \& C, }" W( {
ON0U48XNGQKMA42I{]~@(E1.png + f* C& u- N. R6 k5 M
& ?/ [% O) o( d) T
1.stm32f103c8t6
# `6 {% E, [) V
# D; e, B- m4 ], G$ P
668308c112b246259e32bd62dcdbfba4.png ! }7 `3 g. d/ ?/ r
, P4 A! B( J) m2 x- `6 J
2.oled显示屏* {: j9 ?2 s, G; e5 Z2 w

6 Z) D8 z6 H. O( E2 J
6e3ca64307344ec786abf9e752ad228e.jpg * ?" V7 q6 [* ]* O

: @: N6 d% ]: ^6 b4 b- ~3.su-03t语音模块
* A. c# t+ ^7 p. {0 |; y: u4 Q3 [
7b8e8569348f491fa2bcef5e79a093bb.png # Q8 F! v( x- e! R
- |) G5 N5 C. K( E
4.红外模块6 r' V& E& v% x. W/ F( q

) r) W+ m  X6 O- o, _
f16afa62900d4f028a8e6b0ed5d8f59d.jpg " C8 Y3 g  R, y7 W8 I0 ]

0 \$ t5 [5 n( X- d- y5 x3 u5.超声波模块- ]3 C! I$ L+ J4 o4 O3 V! J9 k
' E* U' v. _2 F; k
80258b5e830f4c5194ffea79f31744b6.png ; S3 v. u( N0 o

4 @, m2 L2 [7 \  O4 o* N& U6.光敏模块! F: H! N$ e5 G. D# z( g
3 d8 o8 q* D  K# O8 `3 D9 \1 z- g, J
b6e2d067b95c40e4a18f524d37f89030.png # D5 {1 e7 k" _1 M

/ @3 h8 e6 c4 O9 X7.蓝牙模块. E6 g" O9 K% o& ?
7 R) m. G$ m& l- \% w) P/ t5 P
5554d64a98994fa2b5fea2cbe0d735c9.png 1 P$ E' \/ F) d8 i: g+ D# q
# }: D) [( p1 ~+ Z" l  Y
8.蜂鸣器  M2 Q1 C" w; l1 v, Z5 t0 u
# w  T4 K) S0 R$ u3 M9 h8 _) C9 M
d93dbbd18696412e87ae7850ae4ef68e.png 2 F7 {4 b6 [4 z' t0 Y5 e

/ J3 |- f$ S+ ?5 Q) I四、硬件接线! \/ G6 B2 Y! y7 E1 u* E

2 t1 {$ G  h' g; [% d1.PB6 PB7 PB8 PB9 接四个按键( j$ H' }; Q8 V2 ^3 }4 f! t
2.oled PB13--CLK  PB14--DIN
; C8 q5 H4 p# f3.光敏 A0---PA4
1 A" K0 {- C3 b  v5 h0 _4.LED -- PB5$ _5 p8 t, `9 O, M  Z9 g1 D
5.超声波 Trig--PB10  ECHO--PB11
- e* R1 }  o' b4 U5 a6.蜂鸣器 -- PC14
2 Z) H9 \( D( `( M7 y" r7.红外模块--PB4
5 n/ v8 A4 d( b  m8.电压 ---PA5
/ M5 G9 X4 z% ?5 `1 R9.蓝牙-- TX-PA3 RX--PA2    y* s7 G+ b+ w0 v7 ]
10.语音 TX-PA10 RX--PA97 _2 H: o1 Z, N! Z; v4 r8 P

9 _& h6 f2 M: U& s: R五、软件部分) i8 N' U: d0 c$ r' p0 j' }
) g0 v3 M4 a2 T7 C% x
下面代码为主函数内容
4 r: b7 D  U2 {+ c& z. p8 C0 k. m
  1. /*=============================基于FreeRtos的智能台灯======================& l3 y' H( R3 K; h* E
  2. - a' G/ ]) D6 |
  3. @Author;小殷童鞋7 l3 _* o* {. d6 c! X" T7 A
  4. @Date:2022-11-25' Z' H: U/ `1 I/ P0 O( s: f
  5. # K' |  M  c: G. r! s( z8 b) U
  6. ===========================================================================*/$ e, i9 Y5 l) @' H, d

  7. 8 k% i" M! T/ P0 L# X
  8. /**********************************引脚接线**********************************+ K3 |& ]  I% ]; [! ]! R3 l% g$ m& W
  9. 按键 PB6 PB7 PB8 PB9
    5 k- o; }1 N# i5 q* v6 k" L% V# t
  10. OLED GND VCC  PB13-CLK PB14-DIN$ {4 q' _$ A, E4 w8 N4 g
  11. 光敏 PA4
    + P7 _& |: L, d1 r9 a
  12. LED PB5
    5 @" b/ T+ C6 ?, |# G/ ?
  13. 超声波 gnd vcc  Trig--PB10 Echo--PB117 F% m( f( F9 }0 ~/ p* ~
  14. 蜂鸣器  PC14
    ; j7 h# T- N6 l' T, o2 g
  15. 蓝牙  TX--PA3(PA10)   RX--PA2(PA9)  
    . A9 g1 R* v% k$ V# }0 m3 W
  16. 红外模块 PB44 n' l. D& k5 {; B8 `2 F3 @
  17. 电压  一端接PA5  一端接电源正极
    ) H7 j( D- y" A) N& f0 m9 C6 a
  18. ******************************************************************************/' m) T- @$ e) H+ Z( s9 _8 T

  19. 4 _/ a9 R) S( T/ A3 O+ a* M# ?0 S

  20. * y' q" s4 e0 M  ]' Y, G
  21. /*=====================================功能说明=================================2 B" ?- A" l& d+ A; R
  22. 1.默认界面显示按键模式  PB6 直接开关灯  PB7 PB8进行亮度调高调低  PB9为定时模式
    8 M# A% @, H8 ^# h6 i( P
  23. 按下PB9后 PB7 PB8的功能变为进行时间的加减  (这里PB7 PB8按键有两种功能)
    4 z% a$ L7 L! n+ Z" J
  24. 2.光敏模式  界面只显示光敏界面
    ! ]$ S* j3 x! \' c
  25. 3.定时模式  显示时间 到时自动熄灭
    : f/ p8 W0 g% h* w% u
  26. 4.红外距模式  
    ! `2 H  P  u1 ?7 O
  27. 5.实时电压显示2 ~4 y2 u: A4 ]
  28. 注意:蓝牙和语音与其他模式互不影响& r0 T: w1 Z8 r. }) i
  29. ================================================================================*/
    4 `5 H* D' i; X
  30. & K/ T4 R) F6 C3 |1 X
  31. #include "sys.h"
    3 s- ~& n* j7 q) c& j8 V
  32. #include "delay.h"
    , @' ]4 @) N5 p$ M6 ^2 Q, [& k
  33. #include "usart.h"
    % t! u$ O: o  j  X# C, C3 E
  34. #include "led.h"1 c+ c2 X  j0 {; G
  35. #include "FreeRTOS.h"
    / m, H  s; L! }. i  w$ {
  36. #include "task.h"; f* X4 `" l. C1 O/ o* ?
  37. #include "key.h"* _( q! |. M/ _% n
  38. #include "semphr.h"
    9 B8 e3 l3 i9 y0 s. s* ~
  39. #include "string.h"- ^1 M) }9 R5 W* S/ z' n6 t9 G
  40. #include "HC_SR04.h", y: r8 e; G8 ^- {$ G
  41. #include "beep.h"
    % ^2 ^6 {; H% Q2 v0 J; }
  42. #include "timer.h"
    7 ^# t; W+ A6 n  ^  x0 }* y  @0 L
  43. #include "ldr.h"
    # l8 i) `* O2 {' ~% a
  44. #include "infrared.h"
    % S7 o+ @1 j' b' ?! g. n
  45. #include "oled.h"7 b6 c4 |; T: ^& ]( L. l3 U
  46. #include "adc1.h"
    ' Q( _  Z# z$ K1 K* z

  47. - v0 u2 I- f6 w7 G/ N4 y3 k: u9 {
  48. - i( s: V) w# i# Z+ s
  49. ) N& d% w. o) |8 W& d4 x
  50. /*================单独功能调试时只改变下面宏开关的值即可代码不动==================*/
    ' ~. K: q8 ?) g: P6 V9 R6 B
  51. //开关宏定义   1打开  0关闭% A, ^9 ?0 u8 R- v+ e: ]8 }% C
  52. ( H6 N6 z; e! P# A
  53. #define   USART_START           1
    + b2 o* K0 O+ T. X  W1 Q* P& S
  54. #define   CLOCK_START           19 b: m. M1 l: F" x
  55. #define   CSB_START             0           //超声波检测时有问题 暂时没用: ~) X8 _- D2 q1 M/ O& I
  56. #define   LDR_START             1
    & ~( @, Q: e3 i& @6 ?- a7 v
  57. #define   KEY_START             1- ?0 }0 O; ^3 L6 b
  58. #define   INFRARED_START        1
    2 H* F' z$ d& ~0 u% D
  59. #define   INTERFACE_START       1$ p  F/ i" _, Y$ P7 h- }7 b
  60. 6 C, f; J1 g( s( N/ q3 ^! d
  61. /*=================================任务宏定义====================================*/" a3 y0 W& b# \7 b' s
  62. 2 l' {$ \) i( o3 x6 K# d; s
  63. //任务优先级
    3 g; }# @% o9 s5 E2 s% P, k
  64. #define START_TASK_PRIO                1
    ( ?8 a. m7 Q1 Z: _, W
  65. //任务堆栈大小        ) O1 V. D, C" v; o8 N
  66. #define START_STK_SIZE                 512  
    ! b( [- y5 y. r0 {( N- x
  67. //任务句柄
    " }/ x  c9 o6 I/ C, G" W; V% n) W2 z$ Q
  68. TaskHandle_t StartTask_Handler;6 K! l: F: j: {4 d, B4 D
  69. //任务函数
    , V- c2 o) S8 m
  70. void start_task(void *pvParameters);, m8 S& V9 T1 n. y6 I
  71. + [( @* z* Y9 ~* S
  72. . ?3 W/ Q2 [, O5 x& l9 K
  73. //按键任务$ ?, m, G5 Y- S/ y& x
  74. //任务优先级" C5 \6 i& e! H7 ^" ^
  75. #define BUTTON_TASK_PRIO                53 }! w, P% g5 Y9 \- u4 f, ]
  76. //任务堆栈大小        
    % N5 P! W! D/ V  K. c  }; a9 E" m
  77. #define BUTTON_STK_SIZE                 128  ) Q3 A9 s2 z: U5 D! f
  78. //任务句柄
    + U0 p. }' P, n( v: N! G# J
  79. TaskHandle_t BUTTONTask_Handler;
    # K5 c' [. m0 m7 h# r
  80. //任务函数/ D" k2 A- [, d
  81. void button_task(void *pvParameters);
    * b( f7 O9 u+ @  v
  82. 9 \# u" M$ ?' G. N7 B/ s& g( x

  83. : j  x5 p$ R8 j% D
  84. 1 c& @8 n# Z* O* [" |
  85. 3 w( z, z+ a5 U) B+ o9 z

  86. 6 p$ s  }! Y5 T% ]9 ?- ^$ T( y) R
  87. //超声波任务
    " J+ B- I0 ^6 B4 v, I/ V" A) k- q
  88. //任务优先级' q2 e' M5 [; ?9 D5 s9 i0 X0 g
  89. #define CSB_TASK_PRIO                51 U# {, O" a; {  M* u6 m; S
  90. //任务堆栈大小        
    + e  k, b& [/ k% k0 A6 o* B, }0 L
  91. #define CSB_STK_SIZE                 100  & m% M/ r/ B6 r$ F0 }2 D
  92. //任务句柄
    / d2 T* k* c5 X4 \" V
  93. TaskHandle_t CSBTask_Handler;0 [$ G/ F0 c- N* V% h
  94. //任务函数9 @( e8 j! U0 D; v% @0 Q
  95. void csb_task(void *pvParameters);* t% b& b  u, n- Q. t, `

  96. 4 n" G4 O" t. B6 u% @5 q/ N6 C# ?

  97. 5 v5 y5 I7 {3 j& _
  98. 7 L: j* A* c/ }0 h. g9 X

  99. : u+ l/ `( A/ X* `
  100. //串口数据处理任务9 F8 r- U1 w# y2 q; [2 s! G" u! O
  101. //任务优先级. W# R( C% O( F+ H% Y1 A
  102. #define USART_TASK_PRIO                68 Y, B9 d  `: r+ K' a# Q" h/ A7 C
  103. //任务堆栈大小        
    ' |* D) V( {" Q/ H7 Y
  104. #define USART_STK_SIZE                 128  + @) o) }* v% Q; }  C+ G
  105. //任务句柄
    ( }$ N5 N; ~1 w. [6 b% Q
  106. TaskHandle_t USARTTask_Handler;$ e4 ~' ^3 G& _! ~
  107. //任务函数# m. ]- y# Z. z- }5 }% I  ]7 g/ P0 I
  108. void usart_task(void *pvParameters);
    , G: {* e& Q$ P
  109. ( Q7 Z2 n/ a% V& u& G3 t

  110. ) _; i4 ~- P4 Y8 z/ [

  111. . s8 N, z# }( ^3 q5 w6 M$ Y
  112. //定时任务$ w6 V" u1 ~- S9 {+ V
  113. //任务优先级
    : Z6 G( [& t& \% X* n0 k
  114. #define CLOCK_TASK_PRIO                4
    3 S7 @) d3 O4 U
  115. //任务堆栈大小        0 D4 R! n. I, o
  116. #define  CLOCK_STK_SIZE                 50  $ x8 N! R- o7 u2 z9 Q4 Q
  117. //任务句柄
    : [& z3 I" W/ q& V* ^
  118. TaskHandle_t  CLOCKTask_Handler;
    , a" s9 z) ~/ @1 W+ \8 I
  119. //任务函数
    ' y1 i: ^1 }. |2 \
  120. void clock_task(void *pvParameters);
    ) i+ j- G) I9 Z; }8 x
  121. 4 H& Q& V$ B  y- ]9 R* D  o
  122. 3 V7 t2 {! V* P; n/ x6 W
  123. $ m& u4 I1 Z9 i7 ^7 Q1 y
  124. //光敏任务7 W* b4 V# Q0 N
  125. //任务优先级
    9 b" X& o- y* V1 t1 K
  126. #define LDR_TASK_PRIO                29 h1 w% ]; @, @" x# o' E
  127. //任务堆栈大小        
      E' d; l% w' t0 s$ ]
  128. #define  LDR_STK_SIZE                 50  $ O6 b# R7 R" d2 J. a+ t; }
  129. //任务句柄9 c. f) t& j" k4 g
  130. TaskHandle_t LDRTask_Handler;
    ; H2 v5 R1 s" P4 f& |% k, l
  131. //任务函数, f( R* R: N3 t8 q
  132. void ldr_task(void *pvParameters);$ a0 h' ]1 }$ G4 K1 Q

  133. : J4 f  `  m/ ~) b* o
  134. 2 w' u  O9 U3 n' C
  135. , j* v3 C, A3 ~; A

  136. 9 r0 c- m+ e6 g# o) C0 u* S2 M+ Y  d4 a
  137. //红外任务! o+ s1 W$ V( @  I& X
  138. //任务优先级% K. J; v! ?* s2 B- l, W( ~: }2 `
  139. #define INFARED_TASK_PRIO                4# |3 P" e6 H: }  d, z
  140. //任务堆栈大小        
    * ?8 S. l9 B8 l/ Y7 n
  141. #define  INFARED_STK_SIZE                 50  
    - o( y5 D' T6 I7 C0 n9 X
  142. //任务句柄( J  o" c# X$ ^. q3 h# P
  143. TaskHandle_t INFAREDTask_Handler;
    & O- y. D# Z' t/ [1 Q, h
  144. //任务函数
    ( ^+ [1 o/ c2 }
  145. void  infrared_task(void *pvParameters);7 R) S% L' A+ w, @0 s/ O8 M

  146. : k& l0 u3 {. W; a, B# n+ a

  147. 7 _  Z7 j1 _" E0 h; o, H' s4 H
  148. ) d. F8 R  k/ c. J* @. k  c  Y
  149. //界面显示任务3 U* _9 q1 ^/ D3 i6 e+ T0 t
  150. //任务优先级: U* N/ C+ e% L- V# o5 S
  151. #define INTERFACE_TASK_PRIO                3
    . X: ^7 }, R* r& T$ ]. l7 A* S9 v
  152. //任务堆栈大小          e$ b5 V5 H$ X" G* d: z8 W
  153. #define  INTERFACE_STK_SIZE                 50  + ]9 s( ~% J3 n4 ^# T
  154. //任务句柄2 ~# J- `& v5 K  q
  155. TaskHandle_t INTERFACETask_Handler;
    ; G$ |+ u3 X$ B, s+ ?+ S8 W
  156. //任务函数
    ( T4 W' @' @* l# |1 W) h: }
  157. void  interface_task(void *pvParameters);# N& P6 k, b/ a2 ?: S/ x- Z

  158. 2 u( v0 r* ]% q

  159. 5 w. y; o6 z3 x% q

  160. 8 S/ x4 o- T, h6 N7 e# S
  161. * R7 G5 o  b& z+ s/ {

  162. ) j# v$ l  g. p2 h, N# `
  163. ; c+ W8 O4 X; b- a' J
  164. //========================================变量定义================================*/, |" ^- \4 X6 l6 E

  165.   y5 |) N0 e8 G9 u0 B3 m1 D0 r) i
  166. #define Dis      50                    //实时距离小于DIS的时候灯打开
    - ]  }* {& ^$ H1 d7 a
  167. #define Set_Dis  20                    //距离预设  可根据实际情况进行修改
    8 ~/ M3 Q9 R. a& r" b. J8 k% B
  168. unsigned char Usart1_cmd = 0;           //用来接收蓝牙和语音的指令
    - R7 }/ `. f3 y5 [$ N
  169. unsigned int current_duty = 0;        //当前占空比 默认关闭
    1 C" M  B1 T/ K( e* e, j- J9 U
  170. unsigned char clock_start = 0;            //功能模式
    7 X" r$ j& Z, ]0 @6 `
  171. unsigned char sec;                      //秒
    % P0 r& q& j  k- O5 q0 g( A- z
  172. unsigned char min;                      //分" U- M' h. E  t. Y" M# K
  173. unsigned char hour;                     //时
    , H; X5 P$ W, h: C  F
  174. unsigned int count,clock_flag = 0;      //计数变量   时间到标志
    9 Q- p# @  T: b, Q
  175. unsigned int set_time = 5;              //默认为5s
    ; R0 N: E( N0 }) O
  176. unsigned char time[6];                  //存储时间转换后的值
    # W9 I; J0 p# J/ M& x* u9 S, {
  177. unsigned char adcx; //光敏值 0-100
    # I7 F/ `; `+ M& p- [9 L5 s: E
  178. unsigned char work_mode = 1,send_flag = 1; //模式变量  发送到蓝牙的标志
    $ _" H- C' k) O( Q# C
  179. float voltage = 0.0;                     //电压
    6 p* ~3 j% a: _0 w/ C- Y6 a
  180. char str[24];                           //存储信息字符串的形式显示+ d5 X- l6 D' {! N
  181. void Buzzer_Voice(void);                //蜂鸣器提示声音
    & Y0 F6 d6 P, i) J9 C
  182. void Init_interface(void);              //初始化界面
    # ]" N6 M7 j; A# X& Y7 K9 J
  183. void Time_Display(void);                 //定时显示界面$ V9 g2 B9 p! h( `7 b" `) L
  184. void KEY_Display(void);                  //按键显示界面
    8 P7 T$ h' |3 a: U' j4 r- r" h. K
  185. void Infrared_Display(void);             //红外显示界面- Y, D7 Z: l1 r7 O4 o" n
  186. void LDR_Display(void);                  //光敏界面
    $ F6 b) |- W+ y
  187. void VoltageDisplay(void);               //电压显示  ?) X$ q7 \- V) f( J
  188.   O8 o0 `  |) o+ l: _
  189. 9 r) V6 j- W4 d6 r/ a
  190. /*==================================功能界面显示函数===============================*/: T# e5 K; b. U0 D: ~
  191. //初始化界面
    0 z- j. e, f" L* [9 y! h* [$ D- N
  192. void Init_interface(void)
    : Z, Y6 U+ I1 ?* M: t! O
  193. {9 I1 h$ b" H7 h% t% `
  194.                 OLED_ShowCHinese(6,0,0);//智
    ( W/ n! v8 F8 k1 C8 ^( S8 c4 i
  195.                 OLED_ShowCHinese(26,0,1);//能
    8 b$ H0 T/ T+ j! d0 b
  196.                 OLED_ShowCHinese(46,0,2);//台
    8 L4 P' [% |- ^7 c. Q4 }
  197.                 OLED_ShowCHinese(66,0,3);//灯
    % H9 D% h+ B3 u# M8 k& d2 O" y
  198.                 OLED_ShowCHinese(86,0,4);//系$ T4 n' i5 N- c( Z
  199.                 OLED_ShowCHinese(106,0,5);//统         7 G( R0 _5 W: X" p8 F
  200.                 OLED_ShowNum(6,4,2022,4,16);. P6 o/ u9 D$ m; ^5 j2 P7 e1 Y# k$ Y$ K
  201.                 OLED_ShowCHinese_TWO(40,4,0);//年
    : F  S# o8 _9 C2 v" W7 H
  202.                 OLED_ShowNum(60,4,11,2,16);& ]( ]7 T- I) P, P# F/ c2 E
  203.                 OLED_ShowCHinese_TWO(74,4,1);//月
    2 D/ k) @4 c. C9 ~
  204.                 OLED_ShowNum(92,4,17,2,16);
    ' a4 f1 v# a: L& H4 z
  205.                 OLED_ShowCHinese_TWO(108,4,2);//日
    & i4 W- o3 W# z0 z5 q
  206. }
    : f7 V# O' P9 r' z1 u* r- T: U

  207. ; M/ D! N4 [1 R, j4 U, x1 u
  208. //定时模式显示定时的时间
    $ u& i7 Y1 E; j; K$ R  P( {
  209. void Time_Display(void)
    9 b3 a1 @4 [" B6 Z: R% `
  210. {0 N; |( T3 h4 {4 G+ g% o

  211. + p/ L. T/ _4 h& I+ L
  212.          OLED_ShowCHinese(26,0,12);//定- d3 b& p: U# r
  213.          OLED_ShowCHinese(46,0,13);//时' s9 P- |. X0 g- u9 n2 `- a& A$ f
  214.          OLED_ShowCHinese(66,0,14);//模1 b5 H( ?! {( Z! b
  215.          OLED_ShowCHinese(86,0,15);//式
    4 q( X9 S* c: b' u; J/ v6 `# n. Z
  216.          OLED_ShowNum(30,3,time[0],2,4);
    # |: x8 \7 Z' D8 ?9 q7 U& B  E
  217.          OLED_ShowNum(38,3,time[1],2,4);
    ) Q0 {8 {- b7 B9 i3 N
  218.          OLED_ShowChar(46,3,':',4);
    3 J% \  J$ M& Y6 ~' ?
  219.          OLED_ShowNum(52,3,time[2],2,4);
    / g& I% s+ F3 J' k3 D4 A  i
  220.          OLED_ShowNum(60,3,time[3],2,4);  A( B8 F: H: ~1 K
  221.          OLED_ShowChar(68,3,':',4);
    / R% a! |, }! A/ I+ X
  222.          OLED_ShowNum(74,3,time[4],2,4);
    # r- U4 E% H( Y$ g
  223.          OLED_ShowNum(82,3,time[5],2,4);        
    9 ]1 a3 F4 h2 f( U: @
  224.    //电压显示
    % I% x0 l, j7 ~- U
  225.          OLED_ShowString(10,6,(unsigned char *)str,8);7 @0 c( G; J% q3 I) i" Z
  226. }
    ) e1 C! n5 p( U8 u/ ?

  227. . b: J! i: H* O- y" @6 E4 S
  228. //按键模式
    ! L  w9 F  R7 y8 u7 X
  229. void KEY_Display(void)' \  ~+ z6 I: U: s
  230. {
    9 D) i: x) A1 O+ F$ i
  231.          OLED_ShowCHinese(26,3,10);//按
    2 J$ \( }6 i- p* b0 o5 u* H
  232.          OLED_ShowCHinese(46,3,11);//键6 U% g: \3 l$ B* D' b  t5 h# t$ N
  233.          OLED_ShowCHinese(66,3,14);//模
    * {+ l0 C) Q! ]& K7 }
  234.          OLED_ShowCHinese(86,3,15);//式9 [+ Z- G* |1 p2 u8 B6 c
  235.           //电压显示: Y& R4 E1 p# a: W4 R$ ]/ q; j
  236.          OLED_ShowString(10,6,(unsigned char *)str,8);
    & I( g7 w1 z5 U: L
  237. }
    4 d7 d* A4 @- V# {

  238. . V/ u7 u% h1 ?3 V
  239. //光敏模式模式6 M2 d7 a0 {( x& R9 x! {
  240. void LDR_Display(void)
    / Y2 z. O2 y$ C2 [- _  ]( z
  241. {# l0 s3 P( z; H# h5 Q& r
  242.          OLED_ShowCHinese(26,3,6);//光
    2 m% ~+ |4 |  ?5 m' ?
  243.          OLED_ShowCHinese(46,3,7);//敏+ F8 v6 l: Y  q# S! h$ v
  244.          OLED_ShowCHinese(66,3,14);//模% T  i! B# V0 }3 i
  245.          OLED_ShowCHinese(86,3,15);//式# o7 L1 {: Y" C( E! S( p, d/ L+ ^
  246.           //电压显示
    ; K0 V7 I! g( t" n0 A6 _5 F' ^3 h
  247.          OLED_ShowString(10,6,(unsigned char *)str,8);
    5 U7 R7 o" f, X% r: \* B3 D
  248. }
    ) P% B4 p; g" L5 t% z5 o6 }" z) L
  249. : {2 ?7 p& m4 R3 j7 F- D* H
  250. //红外模式
    / }3 K( X2 p& v& B9 R+ r" `
  251. void Infrared_Display(void)9 Q. t0 p% Y; }' b% m) B0 `, v
  252. {
    + c4 p3 ]0 R/ o
  253.          OLED_ShowCHinese(26,3,8);//红
    ' G$ F% t- {. k/ N6 o
  254.          OLED_ShowCHinese(46,3,9);//外
    ! V4 n# P+ h% J* d5 R
  255.          OLED_ShowCHinese(66,3,14);//模
    2 O+ ~4 ?# g( w1 ^; o+ S# A
  256.          OLED_ShowCHinese(86,3,15);//式
    , D, b- }* ^) _& c: G+ b
  257.           //电压显示% D  G6 U0 d  D; d
  258.          OLED_ShowString(10,6,(unsigned char *)str,8);' `  n8 a( u: \- N! l) w: y
  259. }
    * D  r7 d$ ?! l/ M5 ]4 W
  260.   I7 }. R' f& a

  261. 5 ?5 {- h7 y2 r' G0 v) k9 V
  262. //电压显示
    $ A( M4 M9 D7 N( U5 k1 [( Q8 ]
  263. void VoltageDisplay(void)' v3 P$ ]# {8 E* X6 l
  264. {3 @9 S) m+ h$ a1 f# H  W' F( \
  265. //         OLED_ShowCHinese(26,5,20);//当
    / f4 n# v/ v+ U: Y/ N( T5 R
  266. //         OLED_ShowCHinese(46,5,21);//前
    1 m% a# O4 g8 g- o
  267. //         OLED_ShowCHinese(66,5,22);//电' P- I$ L* b) R* J" ]0 H
  268. //         OLED_ShowCHinese(86,5,23);//压9 g& o1 W. \$ Z! K( i
  269.           OLED_ShowString(10,6,(unsigned char *)str,8);. W5 X2 |! G3 v; h3 ?
  270. }
    ) c4 R' h! ^/ B7 b$ Z+ G
  271. 4 I4 w( W* |8 }, Q/ b* U; g

  272. 3 b" s0 K" E' ~6 N/ _

  273. - `- p7 w' S2 z( q$ z
  274. /*=====================================主函数及功能函数================================*/
    % z, ]; B9 l! S5 d3 B
  275. + g6 p& c& K$ R4 e! T# F$ N, U
  276. int main(void)
    7 Z& `) I/ v* N5 F
  277. {
    4 K6 g- v: }4 A* T/ t( O
  278.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4         
    : ~) e3 [& A3 l. D  y) X
  279.         5 A' V" b& L+ d8 J; [. c
  280.         delay_init();                                                  //延时函数初始化         
    " ]- w) p  X7 ]! ~, m5 i2 Q
  281.         Init_Usart();                                                 //初始化串口
    ! v4 x/ b4 k: N+ v
  282.         LED_Init();                                                               //初始化LED% G$ v3 b6 v% H1 m
  283.         KEY_GPIO_INIT();               //按键初始化' b8 {6 w% D1 ?4 s
  284.         HC_SR04_init();                //超声波初始化
    - u. k) O2 m3 P# \6 ]
  285.         init_timer4_exti();            //定时器中断
    8 `5 M9 d4 P% e6 d; ?; O
  286.         Buzzer_GPIO_Init();            //蜂鸣器初始化# i7 n) @: w+ w0 W3 [# `
  287.         Lsens_Init();                  //光敏初始化: Z4 r5 x! y# o0 ~) {7 b6 T5 S! f5 O
  288.         Infrared_Init();               //红外初始化# L, F% S) j# ~) v6 C
  289.         Power_init();                  //ADC1初始化  测电压
    ; r( z: K" J; k& `4 x
  290.         OLED_Init();                                     //初始化OLED  4 K( Z, h* M$ z  t2 i' e; E0 v0 ^
  291.         OLED_Clear(0);        : }. j: c+ [) o! Y
  292.         TIM3_PWM_Init(100-1,7200-1);        //pwm控制初始化 1hkz  计数到100为10ms         
    " {7 ]& }; G( d* f# u# X3 q, W1 L
  293.         Init_interface();                                                  //初始化界面只显示一次
    6 z) ?. E! x: G$ i, N
  294.         delay_ms(1000);        ' I& w) m* s# ]! G" f
  295. 7 p. e& P1 N- L" j7 h
  296.         //printf("----------------测试---------------\r\n");
    & K5 s. c3 C$ E* h8 `& H
  297.          
    9 Q2 S3 |" q% h5 F: p1 p" w1 t. V3 O
  298.         //创建开始任务) n) K4 u. v  Q9 C! T2 J* f# F: c4 G
  299.     xTaskCreate((TaskFunction_t )start_task,            //任务函数
    : E2 C& G& p" I% X# N3 n" q
  300.                 (const char*    )"start_task",          //任务名称
    # X$ ~& X" p; H. h% l0 e- O$ ?- X
  301.                 (uint16_t       )START_STK_SIZE,        //任务堆栈大小) u8 Z3 N% I1 Q3 s4 C9 p
  302.                 (void*          )NULL,                  //传递给任务函数的参数
    . [* \4 E- t0 B' M/ y7 u
  303.                 (UBaseType_t    )START_TASK_PRIO,       //任务优先级) A9 O( v2 s1 y# {" q
  304.                 (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    / F# q+ g& k* S0 L6 d$ W
  305.     vTaskStartScheduler();          //开启任务调度
    ) e- f* Q% G+ K1 z6 D4 E9 _7 \* j
  306. }
    / Z& K+ B0 {/ \8 h5 N1 u: A

  307. . F) m  T7 U8 B4 {" N- J
  308. //开始任务任务函数: I7 z  d' z3 ^+ ]2 C  _# C
  309. void start_task(void *pvParameters)% U  p. B* K0 p' ~4 L
  310. {: x3 b& \5 V, u" m- I
  311.     taskENTER_CRITICAL();           //进入临界区
    1 R  ~- |2 U! R+ q8 |
  312.         0 q. Q1 D2 F+ n! N  {# w* I' W0 B
  313. & B5 [+ M7 i8 Q& F. T( i
  314. #if KEY_START
    - m" [5 \$ {% s, Z7 k/ w
  315.     //创建按键任务
    2 r" }+ F" u8 ?+ d) N, d
  316.     xTaskCreate((TaskFunction_t )button_task,             ; G+ c6 H8 v$ U6 g; Y& z
  317.                 (const char*    )"button_task",           
    ! D7 t: g4 y1 G
  318.                 (uint16_t       )BUTTON_STK_SIZE, ' v* R" G+ Q7 ^7 I
  319.                 (void*          )NULL,                                / D$ @) h9 Z& i+ F: e2 y/ T( }. R4 V
  320.                 (UBaseType_t    )BUTTON_TASK_PRIO,        " J, @2 _, g" n+ J; }! B3 `- s0 n
  321.                 (TaskHandle_t*  )&BUTTONTask_Handler);     
    4 k0 ^' Y" \& J
  322. #endif. O5 [* g; S6 j' ^+ a* [% ^
  323.         
    5 {7 T0 q$ I  e9 G
  324. #if CSB_START& j' ?, M# L- T- K- M/ _& d* A- X
  325.         + n9 b2 N* y, z! n7 \& ^' z- L
  326.                 //创建超声波任务( }5 A) m  O3 `/ `1 V: l" f6 R
  327.                 xTaskCreate((TaskFunction_t )csb_task,     / H, T8 g3 A( P+ z; v
  328.                 (const char*    )"csb_task",   , d: g6 v8 s  Q
  329.                 (uint16_t       )CSB_STK_SIZE,
    8 n! @8 U1 M* P6 @; T; V
  330.                 (void*          )NULL,' Z+ }  M8 a3 Y/ E/ c; k
  331.                 (UBaseType_t    )CSB_TASK_PRIO,6 W6 f/ ^0 Z( Q- _* J7 T: \
  332.                 (TaskHandle_t*  )&CSBTask_Handler);    ' Q3 h3 ?! \2 d; H( m
  333. #endif
    * L1 ?  i' B8 T6 p$ N7 r5 x

  334. 6 h2 M% e4 g2 `

  335. # J% \- H( T- I9 I" H+ Y
  336. % b: S* J& U9 G, s
  337. #if USART_START& W4 v6 B/ s) }9 @; }
  338.                                                                
    * J' j: V  Y+ r& U: V8 X& }
  339.                         //创建串口处理任务0 l+ E/ ~# W8 s+ ~' _
  340.                 xTaskCreate((TaskFunction_t )usart_task,     
    : J. k8 u' j8 A. f/ ^# n
  341.                 (const char*    )"usart_task",   
    $ J3 K# r8 y7 r) [* G' E
  342.                 (uint16_t       )USART_STK_SIZE, 0 H% q; g0 Q" N
  343.                 (void*          )NULL,
    1 S0 u& ?9 y- h0 @/ D4 H" N
  344.                 (UBaseType_t    )USART_TASK_PRIO,) p3 r8 d8 r! d6 @/ j9 s5 R
  345.                 (TaskHandle_t*  )&USARTTask_Handler);  
    2 }1 [: W5 r) L, [; C4 f2 h2 [
  346. #endif1 z. E/ H) v3 k
  347.                                                                
    + @& \/ T1 h; Y/ l
  348. #if CLOCK_START                                                        
    6 l, q7 v' [4 e! B4 {" ?
  349.                 //创建定时处理任务5 G7 N0 J8 A- v" r6 z! F
  350.                 xTaskCreate((TaskFunction_t )clock_task,     - Y6 ^! r! A! T& \
  351.                 (const char*    )"clock_task",   
    # H) a: O. u3 i% y7 O
  352.                 (uint16_t       )CLOCK_STK_SIZE, 9 }7 {, k* s& b: `/ W
  353.                 (void*          )NULL,
    5 ?! {3 j& m% T+ D: q
  354.                 (UBaseType_t    )CLOCK_TASK_PRIO,( {9 Z& B# p9 K$ z/ W
  355.                 (TaskHandle_t*  )&CLOCKTask_Handler);  ' U6 @3 X6 y3 a; [
  356. #endif
    / Z5 u& M4 Y* h, p$ d! T2 R* v# X+ B* G

  357. : g' \9 K+ I: O  {- [
  358. #if LDR_START                                                                 5 y+ O! R2 ^" m8 E' @# _( g
  359.                                 //创建光敏处理任务4 [" Z8 ]2 e  R1 b7 {( i
  360.                 xTaskCreate((TaskFunction_t )ldr_task,     / G; I& U* h6 B+ W3 w; |) V
  361.                 (const char*    )"ldr_task",   * N( n! o+ j. W0 w& ?6 K
  362.                 (uint16_t       )LDR_STK_SIZE,
    . b. H0 |% \! Q( C% T
  363.                 (void*          )NULL,; G9 b5 }& \9 W9 L
  364.                 (UBaseType_t    )LDR_TASK_PRIO,, n- b! X9 j( U- i" V6 `
  365.                 (TaskHandle_t*  )&LDRTask_Handler);  " @6 U1 S# Q, g9 t, }" q
  366. #endif  I  _1 ]1 g: E. [

  367.   {  Z/ N1 C5 A2 Q" g% |* d

  368. + G7 v6 ~5 q* N3 W
  369. #if INFRARED_START                                                                 
    ; P  u  z+ x2 [5 ?3 ]' `5 @
  370.                                 //创建光敏处理任务! c5 v! e' t9 a) m/ ]1 t
  371.                 xTaskCreate((TaskFunction_t )infrared_task,     
    3 A4 H; t( |* k/ k# ]  @
  372.                 (const char*    )"infrared_task",   
    1 S# U; _2 V4 n/ u& \, L; W
  373.                 (uint16_t       )INFARED_STK_SIZE,
    % j$ E4 f: \0 B! Q  g& W
  374.                 (void*          )NULL,
    1 Q* M- a' i, Z( Y% H8 ^$ q# ?) Q
  375.                 (UBaseType_t    )INFARED_TASK_PRIO,) N$ r9 u+ T( t& `4 |& x6 W# O
  376.                 (TaskHandle_t*  )&INFAREDTask_Handler);  2 f% l7 v$ O; _% i: r: ~
  377. #endif
    7 [; q2 A# R1 F2 s& Z9 P  _4 C

  378. $ `# J- f" e1 ^

  379. 3 K, c1 [9 Q8 w, f: M, x2 R
  380. #if INTERFACE_START                                                                 
    * ~. \  B, A4 x& x! a, Q6 U
  381.                                 //创建界面现实处理任务4 S' l; b3 _' _6 j
  382.                 xTaskCreate((TaskFunction_t )interface_task,     
    & X- W  v/ ]4 e2 W+ }
  383.                 (const char*    )"interface_task",   ; a; q8 `! n: ?5 t4 O
  384.                 (uint16_t       )INTERFACE_STK_SIZE,
    8 m8 l$ H1 P* _' z" I
  385.                 (void*          )NULL,. q2 c; |( `( W; ?/ ?" i( |
  386.                 (UBaseType_t    )INTERFACE_TASK_PRIO,
    ' o, I7 b6 N" @
  387.                 (TaskHandle_t*  )&INTERFACETask_Handler);  ; U2 f4 G% y* o; _
  388. #endif
    9 _9 @* @* P6 r0 g8 Y0 [9 Z) G* T

  389. " [, D5 v) H# |4 _4 q
  390.     vTaskDelete(StartTask_Handler); //删除开始任务
    + m% v1 q5 O! d
  391.     taskEXIT_CRITICAL();            //退出临界区# @9 n$ l' c* j. U1 K, _6 w
  392. }: D, q- ?# k* s! _
  393. 6 V' X0 C; E9 M# p) P* y! T/ |
  394. " M0 o# |) q1 F& A( L. z
  395. , S+ C6 d" s( V' f0 u
  396. //按键声响声音  m每次按下按键会有一声按键声响% l+ W) {2 i1 z; m7 I$ ^
  397. void Buzzer_Voice(void)
    - m' T  `9 B* v) d) \+ k
  398. {
    ' A7 w6 L& U. T% O9 p! ^9 s
  399.                   Buzzer_ON();
    ! V2 R* e+ B- ?/ {3 |  i3 f1 {0 V
  400.                         delay_ms(200);
    ; T! a; T% m7 @) J4 x" @- w
  401.                   Buzzer_OFF();                        
    ( O) L2 N* n1 m0 P  k" t
  402.             delay_ms(200);! x- B" n: G2 y% n% R9 t
  403. }
    ; F- v9 w) h1 {% J! k+ j& G
  404. ; D; _4 H) l' g$ @- r

  405. $ f% ?; o$ Z" e7 [" d
  406. #if KEY_START
    8 n( y. @4 k( |5 c& T1 `, K; W' Z
  407. //按键任务函数
    ; r: X8 G% y! \5 c1 G; J+ d
  408. void button_task(void *pvParameters): |% T" N! v* t' _/ a' F5 {
  409. {
    - u$ q/ P4 G  {) v
  410.         u8 key = 0;
    ' y4 z9 T; z. _6 n. n/ E; p0 R
  411.         static u8 flag = 0;" U4 Q, _. k1 K2 j, C! X
  412.         while(1)9 r" V9 @' [2 [% j
  413.     {- [. p4 |) `! Q) A
  414.                         if(work_mode == 1)4 K  ?+ s* i4 o/ M4 l7 ]
  415.                         {+ x* g. |& _4 X; V
  416.                                  //需要进行调试的时候可将其打开串口观察是否运行
    : V! j% p* e) h# m
  417.                         //        printf("==================按键模式==================\r\n");+ g. Q" E) h1 H( c- Z2 X$ M, @) w
  418.                                 key = KEY_Scan();2 \( M; O6 U- }  s  m; x2 s' p
  419.                                 //进行定时模式
    & `: W4 _6 m, D2 i; t3 |7 F
  420.                                 if(key == KEY0_Value)  //PB9  KEY0_Value 0 Q  J. S- |5 Z1 Z! v0 ~5 e- J
  421.                                 {" Y2 h! R, c0 w7 X1 @+ ~
  422.                                                 Buzzer_Voice();            //按键提示音7 A+ o- ~. r+ S5 i
  423.                                                 clock_start = 1;// 开始计时
    - z$ j  e, l9 R% j# D. e) r
  424.                                                 hour = 0,min = 0,sec = 0;  //每次都从0开始
    " ~1 n1 l( f$ Z4 q5 I5 k& b
  425.                                                 
    " U# ^7 }5 K' ?8 g
  426.                                 }
    ' @3 i: R( c6 `  C4 E
  427.                                 
    ! U0 f# U1 j) W
  428.                                 //clock_start 为0 时表示进行灯光占空比的控制 为1时为时间的控制% C, v6 V7 k- ^. m. _+ u% t3 d
  429.                                 if(clock_start == 0); ?: U; j5 ~/ O5 @1 H
  430.                                 {& i0 Z/ I0 P- ~+ M2 j
  431.                                                 //亮度调高& S* t/ m$ J6 D
  432.                                          if(key == KEY1_Value)
      s  _& {: ^* B
  433.                                                 {
    . f) }+ y9 \+ R; j* B
  434.                                                          Buzzer_Voice();            //按键提示音6 W; O. y1 Y9 N3 T9 Z
  435.                                                         //调整亮度 变量
    4 X7 J% P  T! t  q; [, A$ [
  436.                                                         current_duty += 20;                     //可根据实际效果进行修改
    / W' L! X- x. B% b9 X6 N7 E- @
  437.                                                         printf("current_duty = %d\r\n",current_duty);
    4 E" V% m5 C: A/ D
  438.                                                         //printf("this is key1 = %d\r\n",key);  //需要进行按键检测调试时可将其打开                                        ) v/ w, _3 j8 J# E% `. i& }
  439.                                                 }                2 P7 Z: ?9 c& u: m
  440.                                                 //亮度调低- U  r+ {/ q& R3 m6 y& P1 K* l
  441.                                                 else if(key == KEY2_Value)3 p0 ^8 z0 I# E9 z. M% U7 O
  442.                                                 {
    4 P( b0 T$ H1 Z; V/ G# e1 J
  443.                                                         Buzzer_Voice();            //按键提示音% q" f1 y3 @  X4 g  a
  444.                                                         //调整亮度  变暗! Z7 w8 Z$ `& U. {0 @7 r
  445.                                                         current_duty -= 20;0 F$ q  I6 O( p  P9 c
  446.                                                         printf("current_duty = %d\r\n",current_duty);
    # n3 q4 }  g6 n$ N
  447.                                                         //printf("this is key2 = %d\r\n",key);  //需要进行按键检测调试时可将其打开
    $ c+ W' W0 N1 ?$ T/ F$ J) ^
  448.                                                         # L; Z* C7 N. a( }. ?# W
  449.                                                 }               
    : K7 M; i; L. `% Q% T( X% N
  450.                                         }! V6 I5 t% k$ Q0 N1 u; h
  451.                                 # }1 g( P/ ^  x4 a- u  B4 \
  452.                                 
    & F  L# K5 n/ V5 E6 U& I
  453.                                 else if(clock_start == 1)+ u6 f% x7 T5 J* U( \0 r
  454.                                 {
    6 e7 T% x8 z8 f1 O9 l, w) j
  455.                                         if(key == KEY1_Value)
    # y/ N# _# `6 p
  456.                                                 {1 K, Z1 @, O% m- K
  457.                                                          Buzzer_Voice();            //按键提示音* Q: Z$ z2 {' u5 l
  458.                                                         //调整时间  ++9 u0 r/ \- b/ s7 @; ^7 a
  459.                                                         set_time += 5;                     //可根据实际效果进行修改
    " K' ^3 D! M2 K! Z  ^4 n: y* K
  460.                                                         //printf("this is key1 = %d\r\n",key);  //需要进行按键检测调试时可将其打开                                        9 o% u, |8 R1 Z! M8 q, o0 F3 o) D
  461.                                                 }                4 y5 `7 y: `: u- S" n" e
  462.                                                 //亮度调低( e' ]2 h$ b/ H3 i; S: s, h* y4 K: P* T
  463.                                                 else if(key == KEY2_Value)
    1 h3 @' s  K7 O8 Y2 g1 a
  464.                                                 {: G$ W: u8 ?4 x- H6 L
  465.                                                         Buzzer_Voice();            //按键提示音! k- g: K: m% s) @( J; o  e9 Z0 Z
  466.                                                         //时间 --- p) G$ S+ T; N# V; H! z1 w
  467.                                                         set_time -= 5;
    * \# J3 Q' s6 }3 a
  468.                                                         //printf("this is key2 = %d\r\n",key);  //需要进行按键检测调试时可将其打开
    $ }! m8 ]1 Y1 M& Y+ I8 L% L1 z! m
  469.                                                 }                  S" E" f7 l# M
  470.                                 }
    ' S7 C/ Y3 J( v7 T& ^" C
  471.                         ! i0 M& s" U( q: w+ B8 i- t
  472.                                        
    # |' p' }+ p/ j# V
  473.                                         " M( c& K: `% B' D
  474.                                                 //直接控制LED的亮灭 第一次按下亮 再次按下熄灭1 A" f- j: a. P$ a9 J
  475.                                          if(key == KEY3_Value)
    & m! H9 B1 e4 d  P5 H  R8 y6 V
  476.                                                 {
      J! b) x( W& n8 P5 i9 ^
  477.                                                         Buzzer_Voice();            //按键提示音
    7 |( v& L  o( B6 j5 {' y( {4 v6 H
  478.                                                         if(flag == 0)9 t1 g4 z7 [$ H
  479.                                                         {
    # u1 s- `) P9 s% E: ^8 H2 z
  480.                                                                 flag = 1;8 [  L( J" H- O4 R# F$ d
  481.                                                                 current_duty = 100;   //占空比最大亮
    ! ?7 l2 B( ~; ]# {% e. m6 X0 Z
  482.                                                         }
    ' E5 d- y" s- {( d& X% q: Z: Y. X9 a
  483.                                                         else if(flag == 1)
    ; W* a4 V$ }8 C) P4 u* k5 r7 |* x
  484.                                                         {
    7 w) I# e8 N/ B. N* ~; \& i8 {+ G
  485.                                                                  flag = 0;
      n  ?. i( z, s. L& h9 e
  486.                                                                  current_duty = 0;    //占空比最小 熄灭
    0 S! F# s! e9 h  F2 C3 t
  487.                                                         }
    9 F1 }, m+ t% A
  488.                                                         printf("current_duty = %d\r\n",current_duty);
    9 B8 y# L( Q( V! x2 b
  489.                                                         //printf("this is key2 = %d\r\n",key);  //需要进行按键检测调试时可将其打开                                
    ' ?1 L8 g) f9 N7 L0 }# ^
  490.                                                 }( t/ n  M7 f) h
  491.                                         }5 o/ y, V8 n/ O. p' n
  492.                                        
    ! z1 s8 n8 D& Z2 d
  493.       vTaskDelay(120);
    . U1 T( b: O3 u$ w" m, t/ c
  494.     }
    ! a/ ]3 p+ [: W3 `+ {
  495. }   
    8 U7 @# r; B" U  F
  496. #endif
    % g, o9 X3 K) m

  497. , q+ Q9 T4 m# e! t$ \) n: a
  498. + i1 o0 P' W& r5 Y
  499. #if LDR_START         : ~: L! m' x/ s5 @& m
  500. //光敏任务函数 # T7 o+ v: I) N
  501. void ldr_task(void *pvParameters)- u& @3 [- N7 I
  502. {, E& H/ y2 f5 R; P/ U2 d
  503.                 while(1)
      i9 l) l; _0 g2 M0 G2 ~5 l
  504.                 {; h) F6 G: e) D3 R, {
  505.                         if(work_mode ==2)+ a& @# o+ r% g' [" }0 k6 a8 n
  506.                         {2 J5 o. O7 O+ k% U; F1 j& J
  507.                                  //需要进行调试的时候可将其打开串口观察是否运行
    ( K2 @$ h7 ]" X; S7 }* b
  508.                                 //printf("==================光敏模式==================\r\n");
    & a* j- E' S1 _9 V$ A" V
  509.                                 adcx = Lsens_Get_Val();
    7 d, b9 p7 ]$ Y# f# j' h, L" p
  510.                                 //根据光敏强度自动调节灯光的亮度  这里分为5个等级
    8 o; H( d# D& T1 l$ V* A
  511.                                 if(adcx > 0  && adcx < 20 )
    : ~# h# n2 @( N5 N3 A
  512.                                 {% o) ]# Q2 T4 G1 D' c* k- D
  513.                                         current_duty = 100;" Y( m4 E1 y  F4 g7 i
  514.                                         / F' X0 U3 s6 C8 u3 O, |* O( b
  515.                                 }+ ^+ V$ Z+ A5 u, v
  516.                                 else if(adcx >= 20 && adcx < 40)
    ) q! P8 S1 I- F$ U
  517.                                 {/ A/ s' l$ G, q! H) e
  518.                                         current_duty = 80;
    ! g4 W: X4 g) S8 Y/ W7 q# L
  519.                                 }
    ! K- T, J7 r& R/ J" x7 X2 \
  520.                                 else if(adcx >= 40 && adcx < 60). k# W/ Z' n# i6 H" c
  521.                                 {% v: ?: W! U  ]/ q" q+ _
  522.                                         current_duty = 60;4 `: A8 H3 b9 X% f0 s
  523.                                 }0 g2 o' ?" v( u7 X; h% Z/ D
  524.                                 else if(adcx >= 60 && adcx < 80), w( C9 d1 o9 }7 ~
  525.                                 {; @5 s( [* a- R1 f7 v0 _# d2 Q
  526.                                         current_duty = 40;
    % \$ `7 c% r% W" k, f+ K  ?
  527.                                 }
      d: n5 s% P- s5 V! I/ ^
  528.                                 else if(adcx >= 80 && adcx < 100)% A( o5 N, C7 Z$ x5 {" U4 h
  529.                                 {
    2 H2 {% }2 {, F8 \$ `- G! Z) H
  530.                                         current_duty = 20;
    ! g% ~2 L+ n0 b* I% I
  531.                                 }/ B$ D% J+ |& |+ \6 c, B/ }2 \/ Q
  532.                                 TIM_SetCompare2(TIM3,current_duty);& I! \& Z5 J- N) S
  533.                                 printf("adcx = %d\r\n",adcx);
    ) T2 J$ @- F; q# ^
  534.                         }1 l. V* d# y9 z5 P* o5 `, X* P
  535.                          vTaskDelay(40);
    ) z$ I1 R" j& u% }7 k/ b
  536.                 }
    # o$ u# P4 [* K, X# f0 S: @3 w2 }3 b
  537. }
    6 L* q7 ~! O4 u8 i. x
  538. #endif5 [3 ~+ u" Y/ T7 Z$ P. c1 Y
  539. + u7 H8 Y0 ]: W. @' V
  540.   m9 l5 r; `9 G5 X( R* i. c
  541. , K6 d: r* O0 }( q
  542. #if CSB_START+ _4 `5 O9 x  W9 B4 F
  543. //超声波任务函数 # K* W  m, z1 r# z) o" `
  544. void csb_task(void *pvParameters)
    ) p: D7 Z: m# n, |( ^7 E5 Y
  545. {' h' \# i, t& k! s! w# X
  546.         float distance = 0;2 A) l1 D* [9 r+ G5 q4 Y
  547.         unsigned char i = 0;5 i7 |' s( w5 t2 L
  548.         while(1)
    : d5 W( G* z5 x4 p
  549.     {
    9 F2 E3 |& X# ?+ f, h4 c
  550.                                 if(work_mode == 5)
      c$ I- b1 S  @2 ^' g+ J7 Z
  551.                                 {
    * b3 Z. g% c) [* l8 w7 M* b
  552.                                  distance = Get_HS_Length_Value();+ }; J6 b- T% h% x7 S# {, o
  553.                                  if(distance < Set_Dis)   //SSet_Dis 宏定义可自己更改数值0 _/ L: `! ~; Q7 L5 e  l# D; D
  554.                                  {
    ) g" O9 X0 b! l7 o( C2 ?( \
  555.                                          for(i = 0;i<5;i++)% x- f' }5 E' y3 ^0 |& a
  556.                                          {/ z: A' @+ n, T. e2 g7 X3 M9 b- F
  557.                                                  Buzzer_Voice();       //报警声响0 E6 V3 W6 Z) Y, S; @) r$ z
  558.                                          }                + ^9 w! [5 p# U- i  i' f: Y5 M9 e
  559.                                  }& O$ f- ~& b5 ^2 J  i  g
  560.                                  
    # C$ \$ S1 T3 h, f3 B. N
  561.                                  //处于开灯的范围6 H, c( p) K  `( t2 P3 s" D
  562.                                  if(distance < Dis)
    2 R+ g; O, [0 G
  563.                                  {8 m; ]1 I% {- T
  564.                                          current_duty = 100;
    ( q9 Q9 ~: g4 D& o% H% E
  565.                                         }$ _- a; T% D, r' j# b, X. H
  566.                                   printf("distance = %.2f\r\n",distance);  //进行串口调试的时候将其打开. E  }! ?% m. h  ^
  567.                                 }. e1 O/ h! J( \( Z+ \
  568.                                 vTaskDelay(80);: X/ ~- V1 Y0 U! G4 I
  569.     }* p: a- Q% O& {( i
  570. }   ' ]' S3 e3 Z) a- P8 U1 N# i. }
  571. #endif3 k. I7 i' D1 w9 d: l( s

  572. 6 c; \& E. ]  t7 Q+ M' c, O: N* y

  573. * ~: a  ]# K; y, J( Y
  574. #if USART_START
      a- @1 z+ _2 b) k2 g6 a

  575. ( d- I2 b* t' A  ?( `' o
  576. //串口功能接收函数
      l1 F( o! H0 U* K4 f$ N5 a

  577. / g; e1 j. U/ {$ b7 ]
  578. //注意下面 cmd_temp 后面的十六进制可根据自己的指令来更改
    4 P2 f1 r( f: s) [( S

  579. , h9 D2 P& W  F5 _! h  f. z
  580. void usart_task(void *pvParameters)
    6 h+ C* ]+ B9 q. S: ^5 H
  581. {
    , W: V8 d! Q8 c! |" v) y
  582.          unsigned char cmd_temp = 0;
    ' g! B& {/ n( b2 T- b/ @; A2 S2 \
  583.                 while(1)+ _8 e2 t2 Y6 v/ ~' i
  584.                 {7 u. z  T% g- i9 T" R8 v, Z
  585.                         //后面的命令有根据自己来进行调节最后写十六进制
    % ~! C$ U! V7 m# I# A& _; I
  586.                         cmd_temp = Usart1_cmd;
    ) _8 h$ U0 ~! z5 A& q! g! _
  587.                         Usart1_cmd = 0;   //清除* j- N% E% ^4 s  S/ h
  588.                 # f: O( M4 R( Z3 _- L
  589.                         if(cmd_temp == 0x01)   //板载LED PC13
    ' Z& e8 D" W( Y' y. r# {
  590.                         {
    & m; P; w# p9 x. s2 f* |
  591.                                 LED = 0;             //PC13 打开
    1 V1 F4 O/ i& A. i; j; F( E- W
  592.                         }  J/ R4 T% \& ^; G: v) W1 ?% o
  593.                         else if(cmd_temp == 0x02)
      J+ ^4 g# i& {5 _! \
  594.                         {0 B, n  q- W1 R8 b
  595.                                 LED = 1;             //PC13 关闭
      v& i2 H- W' _2 ~, y
  596.                                 
    + Q$ t& V$ x& |4 V. w2 N
  597.                         }               
    ; ^2 u0 ~! }9 e9 d8 ]+ D: }& Y
  598.                         
      H  K; h: v7 t2 k5 _% r
  599.                         /*==========================下面指令是控制我们用的LED (PWM控制)===========================*/# S, H! y( p3 `
  600.                         else if(cmd_temp == 0x03)     //直接打开 最亮 占空比百分百' [  c* r5 j4 k* K9 `: ~- k
  601.                         {
    $ e) K- g* T1 e2 y
  602.                                  current_duty = 100;# f1 t9 }( T$ p* @5 t3 s: a% o+ d
  603.                         }
    $ z, ?# z/ ]4 f5 a6 F- }: g
  604.                         else if(cmd_temp == 0x04)     //直接关闭 最暗  占空比最小 08 G' [6 ?- z! n; {
  605.                         {
    5 F% X/ h" I3 [- j3 y" i6 X
  606.                                  current_duty = 0;4 N$ O; j, e7 i
  607.                         }0 {" R! W% ?" w2 Q1 I* X3 W: W
  608.                         else if(cmd_temp == 0x05)    //占空比控制 加加
    : e* F- @' O/ w. S; e" E1 Q
  609.                         {
    , v5 h; R* [, }& e, ?
  610.                                  current_duty += 20;       //这里的数字可根据实际效果写大或者写小
    6 b: I( B5 B  ^
  611.                         }' R; q3 W( ^( B+ \9 o! O
  612.                         else if(cmd_temp == 0x06)     //占空比控制 --: `4 |! D4 P& ~2 v# X: s
  613.                         {
    1 H4 d' k& R- E7 x3 d: A: H+ o+ t
  614.                                 current_duty -= 20;        //这里的数字可根据实际效果写大或者写小: Z) W; ?7 F$ M
  615.                         }8 q" N2 _( A) J6 w2 h3 `
  616.                         
    " S: r+ L. X3 }. {- \# n" H) Y
  617.                         
    # `$ d$ H, k" ?; v& J) R5 N4 X2 l9 g- \
  618.                         //==========================模式切换命令============================
    2 E; C0 t- Z0 T- N9 w
  619.                         else if(cmd_temp == 0xea)
    ; f8 ]. b3 @/ H5 @* Y
  620.                         {1 l0 Y: g, J% K8 q3 ^( i
  621.                                  work_mode = 1;   //按键模式                8 `; K1 R6 j* D3 x
  622.                                  send_flag = 1;& m7 b6 ?; j5 w- W+ F, b
  623.                         }2 N/ y2 Q( p# W+ r' C
  624.                         else if(cmd_temp == 0xeb)4 M  W: u& J2 d
  625.                         {                        
    # g9 {# F0 D2 j8 n
  626.                                 work_mode = 2;   //光敏模式; |! z0 [/ s" f: L
  627.                                 send_flag = 2;
    1 v4 S( G& \& e  N5 }
  628.                         }
    3 l' x) c- t3 L& ?7 H* v
  629.                         //在时间设置模式下才能进行时间的修改
    6 o- o5 |' C9 K( q- o/ G2 q
  630.                         else if(cmd_temp == 0xec)
    - I( Q( }' v' d4 P1 a+ v$ n) B
  631.                         {
    0 ]) O9 G% Q* p* c) N0 E- U
  632.                                 work_mode = 3;4 y( P. y. S7 w5 g, q+ a
  633.                                 send_flag = 3;) }% q+ n& i( Q
  634.                                 clock_start = 1;// 开始计时3 g3 p5 Y: O- e, P$ ~/ X  R4 ?9 t6 K
  635.                                 hour = 0,min = 0,sec = 0;  //每次都从0开始
    , _* P& r+ n* R( e; c% u) r! H! a
  636.                                 //时间增加 每次加5s  可自己修改数值0 n: a+ u5 n* v- P
  637.                         }3 O5 F6 e! z+ V6 Y* N- N6 j9 p
  638.                         //红外
      ?- m! Z8 r( q3 N5 c& p
  639.                         else if(cmd_temp == 0xed)8 Q/ M! W3 m% f& F
  640.                         {
    ! }* h$ r: }; q; @& Z& f
  641.          work_mode = 4;
    $ `6 o( o( g$ x# M5 L
  642.                                  send_flag = 4;
    & `8 g( s( R2 ~8 G( N
  643.                                 7 \0 L! s3 |  B! z0 z
  644.                         }
    9 d8 z/ ?4 x8 w2 u3 `* Q
  645.                         //超声波
    ! A6 k2 B; E/ ~; l3 e1 ?  {
  646.                         else if(cmd_temp == 0xff)# P' Z- K/ G. c/ M7 W
  647.                         {. w0 R, C6 {1 O$ ?2 F6 i
  648.          work_mode = 5;7 S% G- y/ D6 U. v1 T* I( z
  649.                                  send_flag = 5;7 X! R/ r! Z* \
  650.                                 
    6 J2 L. \& o" G/ |* Y1 ?
  651.                         }" g" g7 U1 L. ?3 b

  652. + G. y* {( {/ r' J9 d% J7 I
  653.                         else if(cmd_temp == 0x07)     # Z5 z- m" r6 Q9 I+ \
  654.                         {3 F/ _- i' @; V1 c, C
  655.                                  set_time += 5;
    / N! t* g0 i. _# w# a, N
  656.                                 //        printf("set_time = %d\r\n",set_time);7 g* Z7 _, `& M; H9 R2 `
  657.                         }
    & Z( ?+ I8 H' [
  658.                                 
    $ Z! N- Z2 |0 U6 O) p# [
  659.                         //时间--每次-5s  可自己修改数值! [, A4 R  k7 ~% Z1 T( I
  660.                         else if(cmd_temp == 0x08)  / U& @- @; U/ e* T& t- a
  661.                         {* e9 p3 D. r6 ?$ s7 c$ @. ^8 y$ Q
  662.                                 set_time -= 5;
    5 g1 h3 \3 G' D! a+ M
  663.                         //        printf("set_time = %d\r\n",set_time);+ A( _5 Z, D* I' S7 C+ P% ?, ]( T
  664.                         }* d3 L& f  b6 u
  665.                         TIM_SetCompare2(TIM3,current_duty);, k: S/ N% S5 ^- T
  666.                         printf("current_duty = %d\r\n",current_duty);
    - U1 k, W/ z$ u' z. c
  667.                         vTaskDelay(120);" ^6 g% B) ]4 M' Z! }; O1 u
  668.         }1 K% ?$ Z8 W* R; X4 O) G: I
  669. }4 @8 f* q; k/ \" G
  670. #endif
    : D! b8 G8 S9 l/ m
  671. # x9 `' I: |+ ~1 D7 b
  672. #if CLOCK_START
    4 f$ t6 F/ w6 ?
  673. //定时任务函数 9 }% V+ y4 z! x0 |
  674. void clock_task(void *pvParameters)) z# X, g: P7 r: g6 K5 o
  675. {
    ; G8 P5 n2 m, n" g
  676.         unsigned char i = 0;+ }2 F5 \0 V9 W. G; I" W
  677.         while(1); V. Y$ Z, W" N5 Y( o$ s) D
  678.         {
    5 J/ P2 G/ f6 \5 K6 r
  679.         
    5 d! P$ i& u  n; g1 O
  680.                         //定时时间到了 灯自动熄灭 蜂鸣器给个提示音
    1 c* i) a+ f: S8 g$ ^& A
  681.                         if(clock_flag == 1)$ x& P; E1 Y' r9 S) O) _8 x/ U
  682.                         {1 u' F" k0 e$ x
  683.                                          //需要进行调试的时候可将其打开串口观察是否运行
    $ n) a2 t" Q* u
  684.                                         //printf("==================定时模式==================\r\n");
    ( K6 h' F! H" z. G
  685.                                         printf("==============时间到了==============\r\n");
    ' K  C& Q, S  N7 ?. k  w
  686.                                   USART_Send_String(USART2,"time over");
    6 M7 A& O' ?. l( @8 j5 a
  687.                                   clock_flag = 0;   //重新置0  等待下一次0 h% F! x7 A' Z- ]: z- A
  688.                                         current_duty = 0;% h: g+ x2 [0 [2 C8 `
  689.                                         for(i = 0;i< 5;i++)
    0 G7 N7 x, I& e; q. W
  690.                                         {
    # W4 |# Q$ i) S  j8 w8 @
  691.                                                 Buzzer_Voice(); ( g- {& F0 p3 Y8 M, c9 R! V! Q
  692.                                         }. a# D+ D9 [9 }; b6 N8 l6 [1 z9 p
  693.                                         5 |- @/ E1 i& m% B5 ?9 p
  694.                         }0 M7 h4 v  g# ~9 ?* W) m4 ]) a
  695.                          vTaskDelay(50);
    ) k1 g% t2 P. `9 ~  B
  696.     }6 j& T# ]7 y8 J
  697. }   
    6 I8 ^1 n2 V, x2 i7 c" k+ z% v: I
  698. , E- U% }# K2 B, y8 @
  699. #endif6 q, A3 q6 O1 O* i9 K; {

  700. 8 W! h+ j0 b, l. h; p5 O5 p. B1 r

  701. * L- x9 X4 y+ j
  702. #if INFRARED_START
    # a5 }; o$ I4 l# l4 r& s
  703. //红外人体感应功能测试
    ! X8 k7 g7 ~1 d6 X7 I
  704. //感应到人体输出高电平,离开感应区域输出低电平7 f( R3 l; m9 A$ S9 \. Q
  705. void infrared_task(void *pvParameters)
    , \% v! L' A4 S- G$ I! n4 Z
  706. {$ a. z! o# V/ w) ~
  707.         
    ! [3 W$ p3 E; v0 [) R7 P
  708.         while(1); `# m9 ^. v( x
  709.         {
    & {) A* U7 B. @3 Y( D, F
  710.                         //定时时间到了 灯自动熄灭 蜂鸣器给个提示音
    + p9 y/ r4 f( ~; N
  711.                         if(work_mode == 4)
    9 g8 L2 A1 r$ B
  712.                         {
    ; ~, N3 u& Z: w4 S
  713.                                  //需要进行调试的时候可将其打开串口观察是否运行5 G% D% U) E. ]% s7 r; [
  714.                                 //printf("==================红外模式==================\r\n"); ) X* j: k( p5 \5 X9 K
  715.                                 if(Read_STATE() == RESET)  //检测到人了 开灯
    8 }( H# c5 y) H: P2 m+ ^
  716.                                 {7 b( A" a% V! l# w9 F6 g/ y$ Q- m0 ]
  717.                                         current_duty = 100;
    8 w2 C2 ~, j7 _& s" O
  718.                                 }9 w4 V; e2 F. ^! s: Z+ H
  719.                                 else9 w! R  q$ O. @& _- k
  720.                                 {& h2 b1 l) F; F6 J
  721.                                         current_duty = 0;$ g& u2 P9 `# j% G4 u* R
  722.                                 }, E$ E+ C7 P3 z$ H' Y* _' D8 o5 j4 [
  723.                                 # B4 ]( P3 o& O8 w
  724.                         }
    4 p+ E' u. B! V* Z0 j8 R
  725.                         TIM_SetCompare2(TIM3,current_duty);        9 C9 q* t' u8 F7 M& j! _5 l
  726.                          vTaskDelay(50);7 ]4 B% ~' N' n- ]' F* |  W( W
  727.     }/ ?# K1 o% ~3 P8 A" r0 H! [7 C
  728. }
    % C! Q" e' \$ _- x  k# `

  729. ( z. f) H2 T- x  F. v1 K
  730. #endif8 k, C) V- q. t/ D& t  Z/ n' q9 ^2 @
  731. ! N3 {0 d: D; @  K
  732. - o+ H; c7 q, x2 k3 K
  733. #if INTERFACE_START
    : c" M! N2 N% e/ ^. l# K
  734. * H8 K2 B* g) ?2 B

  735. + g. n' @* |* `* D- R& i
  736. //下面发送到蓝牙放的数据可根据自己需求 也可以屏蔽掉
    9 q; P. w4 x7 H; }& q( Z
  737. void interface_task(void *pvParameters)$ @9 B- h7 }9 B* }9 i4 o, D
  738. {2 A) ^2 |0 j$ \  j$ R
  739.         static unsigned char temp_mode = 1;* m6 t( I" P" r
  740.         while(1)
    / z; e. ]( R6 v* n7 E8 g
  741.         {
    + }) U3 D4 ?" X6 D6 y! b
  742.                         if(temp_mode != work_mode); B) f, U; Y3 B
  743.                         {
    & j5 i) f3 h, e7 m
  744.                                 OLED_Clear(0);
    ! X0 N4 t1 c1 N
  745.                                 temp_mode = work_mode;
    9 V7 I+ n& p# O  y/ _: _. S" t
  746.                         }
    ; }, `+ r$ h* L4 @0 q% q
  747.                         if(work_mode == 1)5 L, O3 R/ A. q! j- @. k
  748.                         {4 d% K; z! O) \* `: s
  749.                                 //按键模式. ?) F) U& L: D! H( j7 ^9 _' c0 p
  750.                                 KEY_Display();! g8 S! |" K5 o# K: S6 n1 x) e
  751.                                 if(send_flag ==1)
    ) x# n/ q5 x- E
  752.                                 {" G2 E- M2 q/ i6 m$ n+ \
  753.                                         send_flag = 0; / Q4 N' l& b$ _9 U
  754.                                   USART_Send_String(USART2,"========按键模式=======\r\n");" ~' a+ K) X" e3 r4 ~) c
  755.                                 }4 `  r6 q# a8 E2 X* ?" i
  756.                         }
    - |' o' ]; E  a. S
  757.                         else if(work_mode == 2)
    4 I9 Q; \" U- K9 P6 s# j- ~
  758.                         {" q- e5 O0 T7 G! E
  759.                                  //光敏模式
    ' ?: i" ]7 j& M3 q& i' U' w$ P" B
  760.                                  LDR_Display();
    6 e6 l$ ^2 Q5 E- C: e, Z
  761.                                 if(send_flag == 2)
    ( P" O' R' B% \+ o# ^7 m
  762.                                 {( f8 C/ Z3 d  Y0 m  O( K
  763.                                         send_flag = 0;4 i9 V2 y# x6 O5 W9 D& N1 Y7 e& o1 U
  764.                                         USART_Send_String(USART2,"========光敏模式=======\r\n");( M' ?3 M0 k) Y  ?: G
  765.                                 }
    8 E7 T. N" f6 z' z9 e2 g; j3 P" ^
  766.                         }
    ( t5 I( L9 Q! l  K' O
  767.                         else if(work_mode == 3)
    * N: `4 f. h; D  M  K
  768.                         {/ {1 V% W9 B( m5 B/ h' `& {
  769.                                 //定时模式  T8 _( `* O; _- A4 Q
  770.                                 Time_Display();
    " i% Z+ b" ~4 Q" o) J* I  R
  771.                                 if(send_flag == 3)
    ) S! A$ k+ G3 M9 [% F$ \
  772.                                 {1 O) K* r% s7 {# p# V
  773.                                         send_flag = 0;
    & y2 y! _) i& l
  774.                                   USART_Send_String(USART2,"========定时模式=======\r\n");. v/ Z9 i* N9 Z
  775.                                 }2 J4 o& M! m3 n  O6 s
  776.                         }
    ( X8 y* ?; H! N' ~* Q
  777.                         else if(work_mode == 4)+ T1 |. _3 F/ r& S
  778.                         {9 m; A% b6 h3 W0 Y: U2 x
  779.                                 //红外模式
    : N5 p6 C1 C0 z+ Y4 b" v4 ]* ?' j
  780.                                 Infrared_Display();  u* f; ^( S' V9 G4 L
  781.                                 if(send_flag == 4)
    & f; I) Y! C4 b
  782.                                 {2 p' f( i% ?5 b" d1 x
  783.                                         send_flag = 0;9 z  M7 n- u8 t  o1 D
  784.                                         USART_Send_String(USART2,"========红外模式=======\r\n");
    " j! A/ `5 N, Z; r) Y8 _) Q1 G
  785.                                 }               
    % k2 I; \" h2 {* J
  786.                         }        
    9 v. u. A7 G0 B4 a
  787.                          vTaskDelay(200);
    / @/ p! R9 e) q1 W
  788.     }- t9 G) I9 V# r, J3 b" ^
  789. }: u" c" ^# T7 i: B

  790. ' j- u; {/ ^5 a: R0 q
  791. #endif
    7 j+ H' Q0 B3 B5 f2 U; \
  792. / g' t+ F& K2 w4 K6 }
  793. /*-------------------------------串口中断服务函数-------------------------*/
    8 |0 I- |) N& _& {
  794. //串口1接收  PA9 PA10   语音模块
    ( m+ _8 N. h, p- a+ Q. ~
  795. void USART1_IRQHandler(void)
    $ g( n9 h5 M! v& r0 U& e6 Y5 c
  796. {
    % v6 z) ~# h0 F4 b0 h* q
  797.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断6 i0 b8 F( v6 z9 A- C9 S
  798.         {9 o& @* n4 ]2 N6 }# o  y
  799.                 Usart1_cmd = USART_ReceiveData(USART1);8 X: `6 C) O7 g% @7 i  J
  800.                 USART_SendData(USART1,Usart1_cmd);! f9 i' Y! X) J! y$ }( o! B
  801.                 USART_ClearFlag(USART1, USART_FLAG_RXNE);  i' r7 d: j8 ?7 S
  802.         }
    9 Q8 P' h. Y1 f8 o
  803. }  H* H1 j# J, f( Y+ a; b
  804. 1 C: P# |0 r7 F+ U

  805. * X1 |8 [5 T. n3 I; ~
  806. //l蓝牙 RX-  PA2  TX-PA3
    ' {5 d0 _/ q  N9 f  I: _! v- p
  807. void USART2_IRQHandler(void)
    * A8 _- J: ?' Q$ ?' A% G
  808. {5 R) E* n  d5 r9 v9 \3 T
  809.     if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)
    8 v7 b$ O" V! r2 L+ `! \- y! C
  810.     {$ q! W7 x  b# _, D% T: X
  811.        Usart1_cmd = USART_ReceiveData(USART2);                                0 M: h9 ^( }! r1 ~
  812.                          USART_ClearFlag(USART2, USART_FLAG_RXNE);
    2 \$ u9 [8 C8 a3 p# B
  813.     }' c/ O5 w& s/ c* _4 D# h" |5 o
  814. }. g# p1 D; b. {. h# `- O

  815. 6 Z. y& `# w0 K6 P8 K/ Y+ O

  816. % S; Q% H6 p2 ^- O

  817. ! ^& _5 b" O) e; _  G9 V
  818. . x" I: J& l! Q8 b$ x

  819.   P0 r2 i  m5 H" l& G" O
  820. void TIM3_IRQHandler(void)   //TIM3中断+ Y2 h2 C+ D/ D6 x
  821. {
    6 y3 [$ ]* P; e% ~
  822.         static unsigned int volt_t = 0;          //控制电压检测时间 2s检测一下电压' M0 W  w) F4 b
  823.         char str_t[24];                          //发送时间到蓝牙, T- E' R9 Z3 n* f. x
  824.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
    ) z! E3 s6 [/ ?; P9 K$ [
  825.                 {
    1 |8 d9 j0 p4 Z
  826.                                 TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志  //10ms
    4 X5 W' ]4 f0 q, s0 X. h$ p
  827.                                 volt_t++;) N4 M" P$ P3 ?2 x- \, S
  828.                         if(volt_t == 200)
    6 k" k" J& a; G5 X5 {6 H! w
  829.                         {
    ( q5 P  K  C8 q; N# ]4 [
  830.                                 volt_t = 0;   //计数清零1 \7 I  {  ]3 }
  831.                                 voltage = Power_Get_VBAT();
    - ^" |& }( b, A9 i5 ]
  832.                                 sprintf(str,"volt:%.2f\r\n",voltage);1 j8 p. _6 _; m+ O
  833.                                 USART_Send_String(USART2,str);5 g. ]4 i7 L. l  o
  834.                                 //printf("voltage = %.2f\r\n",voltage);  //需要用串口进行观察时将其打开  A: E  _! `/ B. ?$ c
  835.                         }. J& ?# L+ u6 E1 o
  836.                           if(clock_start == 1)  //定时模式 开始进行计时) M; B4 G& o. D$ X( S% i& Q; ]
  837.                                 {
    4 f6 s3 Q; [% {; p. L
  838.                                         count++;6 A% a. |5 Z4 O! u. g' `0 o* A7 v( }
  839.                                         if(count == 100)% ]! R( m$ ~/ r! U/ o7 X, }* X  P$ x5 B
  840.                                         {( G: E- @0 R3 H- I
  841.                                                 count = 0;9 X4 x& V$ t, B; a: N8 E# f
  842.                                         0 V. R7 x0 B& Y5 l
  843.                                                 sec++;+ ~0 [( o, s/ N7 I9 h
  844.                                                 if(sec == 60)/ F+ {, M" I2 q6 j5 B! [
  845.                                                 {
    7 v# Y6 m& ^" T
  846.                                                         sec = 0;
    5 q/ P4 ]8 B6 u; i
  847.                                                         min++;/ n3 O; K1 A& |1 Q1 u
  848.                                                         if(min== 60)  ~: {. M0 V8 z, Y- G
  849.                                                         {
    , z0 X. `4 x. J4 c1 Y- e% W
  850.                                                                 min = 0;1 {# U. c% l8 X2 b* `
  851.                                                                 hour++;  C2 z( Q/ I7 T- v! I4 p( Q
  852.                                                                 if(hour == 24)
    ! \% l, U# \  ]7 s
  853.                                                                 {3 g1 W9 Y1 W; _/ w
  854.                                                                         hour = 0;
    7 O9 x: ]0 O4 \
  855.                                                                 }+ j: ~0 _4 g! z1 f5 B1 o' o4 k
  856.                                                         }) y& y5 ]. p, U; x4 }5 d4 F5 ^
  857.                                                 }
    + `% b& Z$ l0 C5 r5 N8 f& V
  858.                                         sprintf(str_t,"%02d:%02d:%02d\r\n",hour,min,sec);4 ^8 V, |# C& r3 I9 ~6 w: Y
  859.                                         USART_Send_String(USART2,str_t);
    0 J. @" S: g- T) [  l0 a
  860.                                         //        printf("%2d:%2d:%2d\r\n",hour,min,sec);5 |' |& p. A) ^; x
  861.                                         }3 [* J( ?! [# ~) Q7 S. L
  862.                                         time[0] = hour/10; //获取小时的十位
      u% y2 N* T3 m7 E
  863.                                         time[1] = hour%10;//获取小时的个位
    $ p: J5 V( X$ |8 q7 ]) l
  864.                                         time[2] = min/10; //获取分钟的十位
    + C% v" w+ a  C' B1 N" i
  865.                                         time[3] = min%10;//获取分钟的个位
    : }) K* ^! V  D. A
  866.                                         time[4] = sec/10; //获取秒的十位
    ' h" o2 |3 v7 ~8 l3 h( c6 ?9 z) ^2 ?
  867.                                         time[5] = sec%10; //获取秒的个位
    & X# X+ ^. i* B+ D7 ?% R
  868.                                         if(hour *24 + min *60 + sec == set_time)   //计时时间与我们设定的时间相等
    8 i+ B! L, F# @9 X7 B8 t
  869.                                         {
    + d9 I6 }! {6 r# {& _9 U
  870.                                                  clock_flag = 1;           //标志置1
    2 q* E& w: w0 `
  871.                                                   clock_start = 0;          //停止计时                                
    % \+ e" T& Z& [# j0 O$ W9 w( K
  872.                                         }        & F/ Y. D: p. v" f" _' C: z7 s
  873.                                        
    2 Z( D7 E* H5 _5 K8 f! {
  874.                                 }) h$ D1 F! p( v5 n
  875.                         }  I! {. h, x/ H: @- P! Z3 A
  876. }
复制代码
0 Z# a% o" m# o

: N! X0 Q. o) i9 E- n9 ?# X8 q————————————————
8 {3 k3 r* `; y, S: j) [. R版权声明:@slow-walker
; v4 {" u) C2 _6 o/ D( h

' a$ i; Y* Y* |" W3 ~
收藏 评论0 发布时间:2022-12-7 16:03

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版