一.硬件方案
* ~& V) C8 S" S* Q# p! \7 z* d. [$ s本次设计采用STM32单片机做主控芯片,通过DS18B20采集温度,将温度显示在 LCD1602上。通过人体传感器检测周围是否有人存在,并根据温度的不同,利用STM32对风扇进行调速。4 J1 Q/ r6 Y% i5 {/ f# E) B
主要由STM32单片机+LCD1602液晶显示+DS18B20温度采集+按键设置电路+PWM风扇+人体红外检测;如图:! D( o( E4 O( s+ [% `1 y* b
( S+ L+ S0 ^! A1 `
. \! s' Y4 |/ @% y/ X0 Z4 A% a) D; I5 H- L# L- t8 J! m
二.设计功能 G2 U4 {/ f( F
(1)LCD1602液晶显示当前温度,风扇等级,自动手动模式。
2 z( z) o- g- l3 H; z4 n$ ?(2)按键可以设置自动和手动2种模式切换,按键设置温度上限。6 j9 E/ u4 v! k: }) [
(3)手动模式下可以自由开启风扇,调整档位等级。4 U7 X5 {6 |& U" w: b( D0 u
(4)自动模式下,人体红外检测到人并且当前温度大于我们设置温度上限值风扇开启。
+ [, @* Y, E/ g+ d! G) V(5)每大于一度风扇档位pwm加一,最大上限为10档。
5 y+ ~$ p* y& k0 F) W6 \" |# o) \. J7 G* {
三.设计原理图
$ v4 W# O. u# m" U* X' P5 [9 T g+ c(1)原理图主要采用AD软件进行设计,如图:
9 x; I% R3 h2 [, [$ G
* I3 i( d% S }& k: S2 {3 ^ q
# S% S+ l0 `9 L- i
, z, V2 ~/ W2 H6 A4 W
(2)PCB图如下:
. B& e& F0 v! V. `! G, {% u3 N3 P1 K4 u+ T
& Y6 P7 h' m g- V2 E5 g) m
, _6 P9 d) M) T( m3 g* t2 }# d! ?
四.软件设计
# y& C5 w, @/ e2 I- c2 V(1)程序流程图
( c: ~8 u; `0 r. |* G3 _3 m' w# u v) b' G; G* A+ V
9 z, X1 K: r' F2 P3 f9 V
* k3 \" n) l7 h' _' x5 k$ ]
(2)主程序源码
) k7 X8 b% e, g7 W7 E
8 Y# H" G! ?3 J3 K# f, W/ R- int main(void)
, m F7 X9 q I; |; _ - {
' C; ]2 M$ P0 G- [ - u8 count = 0;
' l2 b3 l# I; j, d -
4 M4 j! P' n$ h, K$ ~8 ` - Motor = 0;' H- _5 L) L, q4 J0 {% `" F( G8 m
- delay_init(); //延时函数初始化 0 r z. I( t! t# L3 x8 c
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级, X4 W' j3 h8 P$ T8 t
- delay_ms(500);
6 q6 P- s" X9 T& K+ d - LCD_Init();//1602初始化( s" F8 `, J [1 Y# f
- KEY_Init();//按键初始化
. j: _& @# V. `; x0 M7 Y7 ^; v5 ~ - while(DS18B20_Init())//温度初始化
: w/ T; ~9 ]$ w0 R, G9 U: J, n - {& p5 b- I* J4 Q- F! i0 v$ x: y
- LCD_Write_String(0,0," DS18B20 Erro ");3 e; G. Q5 W# N& f8 w, r }- N2 M, |
- LCD_Write_String(0,1," ");" [: S9 G: p* C4 t8 \+ w5 d U
- }
* b+ Y; |+ \6 n- w- [! P4 ` A9 { - DS18B20_Get_Temp();//温度初始化- ~9 k5 I* K9 p- v; v. S
- LCD_Write_String(0,0," DS18B20 Init...");+ X, M& \9 K" E( i% @/ P) B' {0 f
- delay_ms(1000);4 ~. C4 ^4 P! [; h& _
- LCD_Write_String(0,0,"Temp: C M: C");# g. `; ^- D! Y
- LCD_Write_String(0,1,"Auto: Gear: ");
2 H- K% V; V8 [) x# J - TIM3_Int_Init(1,7199);//10kh频率计数,定时100us# s" J+ J% U9 G: F( W6 X- S' A! Z
- if(Auto_flag == 1)
" I$ x( k/ t. p* ~( d2 y; b - LCD_Write_String(5,1,"on ");/ g6 n! f! R: Y
- else
- \5 Z9 c) W1 K1 r8 i: Z - LCD_Write_String(5,1,"off");
1 f9 ]0 g: q8 g- i# I, F( t - display_Max(); x: _% W. {# t) f3 j* r6 A- j
- ( w; {# {7 Q- C0 G' z
- while(1)
2 y( u, Z) L$ V1 U3 s8 F - {
2 v& ]# O7 y/ b2 d3 j5 u: y - keyscan();//按键扫描
/ F( I$ ^4 g& o! S - if(count++ >= 200)//延时一段时间读取温度
# z6 T; ?6 e I - {" ~, Y. F5 k& h- X, v, ]
- count = 0;
3 D4 r2 x. \/ L7 f& ^5 h; ]4 X - temperature = DS18B20_Get_Temp();//获取温度
- m0 ? @. R2 m; x& j - if(temperature<0)
. [9 z+ `( x; i6 D9 m: u) l - {
6 `& K- m6 m4 z - LCD_Write_Char(5,0,'-'); //显示负号
( p, y9 v8 j5 V2 ~% d" a( v9 q - temperature=-temperature; //转为正数
+ `/ t; v; w: o, E - }else LCD_Write_Char(5,0,' '); //去掉负号' _, I4 \( `2 q6 v0 s
-
- q% f* U5 e9 o, g0 s. v - //显示温度
; [% T" L; ~. ~! I. {7 H - LCD_Write_Char(6,0,temperature/100+'0');
0 B! i" n+ a% m% r - LCD_Write_Char(7,0,temperature%100/10+'0');# `2 t3 Y* ^0 ]0 _5 o: O) P, q
- / f6 c5 l4 G) m# U" `
- if(Auto_flag == 1)//在开启模式下,感应到有人,并且温度超过上限开启风扇& V) b& t: j6 t {# z n% I# d
- {
2 `; v6 V* l! }! E - if(RTHW == 1)//感应到有人
' _: \4 T( D% \: Q# m - {! g6 b9 b1 [; S
- temp_dispose(temperature/10);//根据温度进行pwm调节
@; V6 R5 t3 o: o) H2 `# _5 n - }9 x: H6 L. T1 C
- else//没感应到有人,关闭风扇, e' U4 V8 z6 ?
- {8 j- a8 D* n3 i9 Y2 x
- PWM_Val = 100;
( _: Z3 ]" _. S3 |' E5 p - Motor = 0;
* \. w, k8 R, V. P5 t* e - LCD_Write_String(14,1,"--");
, r& [% A D9 R- Z/ [% z - }
1 Y: \* c8 D; B; D5 E - }
- ?: p3 N' g" t - else//关闭风扇8 [3 O; U1 Q- ]: x' s
- {
& s6 E& B! N) V4 Q6 u# t - PWM_Val = 100;
4 Z% O. I1 o/ M% C# E6 ] [# Q4 `8 ^ - Motor = 0;2 ]+ ^7 `7 s4 P8 m
- LCD_Write_String(14,1,"--");6 T6 y4 u6 N" U! y4 K
- }
3 T4 L, w5 O. @* u! }! @0 J3 p - }+ v' j- Z3 o' T1 r% c$ I6 l
- delay_ms(1);$ R8 n8 @3 Q h, M: i2 I
- }
& {! F5 S( w; U) k - }
复制代码 5 a" c2 N2 w: `! [2 m
( o4 v( P; o! c' E2 \ f& m, M" T* q7 D2 v" F& u( f
|