|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机智能温控风扇设计 带智能调速人体感应 毕业设计论文
, S3 W" T6 X+ m% c, K6 q2 a5 h) e" [2 }$ c; ^1 O% l
: X) p0 o$ X8 m$ G# }
51单片机做的温空风扇 数码管显示 带人体感应模块,实现智能调速,功能非常强大,这是一个本科的毕业设计,毕业论文 开题报告 源码 原理图 还有proteus仿真等等都是一应俱全. 还有答辩常见问题解答,焊接注意事项和调试讲解,以及详细的制作过程.
8 [( B* b/ {- D: H, v
# M! _- ^; {% `* n: o4 S5 ?温空风扇实物图:
' q! i9 H! j5 ~/ Z; x
' U6 Y( t/ ^, c# q" Z3 K. |0 ?$ K8 |
* Q x7 H7 e! I& D0 _
温空风扇仿真截图:
; ]6 Q7 m! j: v9 M
4 y, `1 I+ w' p* j; Q- E6 F
# _: w. u5 O% ] I: u, ~5 ]" A温空风扇的DXP格式 protel99格式 温控风扇原理图:
3 ~5 q+ r3 F9 F" t; k- H
& A& m8 z R: P% q& {* O Z
6 Z# ?) p2 F/ z j2 ]; ~$ pDXP格式用 altium designer Summer 软件打开 / L+ [" m/ Q6 ~+ J$ {/ B
protel99格式用 protel99SE 软件打开 R; J6 l- a: S1 a6 R1 [) C* o
PDF格式用 PDF 软件打开 ' P7 y4 p; @& J! r/ s' ?! Z) o
Word格式用 Word 或用WPS 软件打开
% f4 E- I( L" ^1 _% q) S6 r- E6 K$ r" G& g) ~
4种格式的原理图都内容是一样的 只是打开方式不同4 ?; ^. v) W; h5 @
5 l) d) E6 w0 R; X请看原理图焊接,不要看仿真图焊接。
l$ k: L- U' R- B& z- O
2 b$ \4 @! J3 Z& b: m6 awrod格式里面的原理图是复制出来的,有一点点变行变形,麻烦大家注意一下,尽量看其他三种格式的图焊接,
7 @" Y5 R& |' e; W2 Q3 A \: R9 e" i0 a' u. q7 Y& b
如果论文里面的原理图和原理图文件夹内的图不一样的话,请大家以原理图文件夹内的为准,原理图文件夹的图是和实物配套的,可以自己截图或复制,然后粘贴到论文里面去。# m0 {! h! q* n- u2 J
, H7 e2 n6 I* U) y' S( L
智能调速温控风扇的毕业论文截图:
1 C# Z% |, W5 G; F/ z: ?% A
, _+ e, L9 [. ?目 录
% R* D' G7 L3 f; S绪 论 4
p; K8 |$ F0 w/ l" h! p" J1 系统概述 5
) A" S* u, [0 R# N1.1 STC89C52单片机简介 57 h T6 B. i2 c
1. 2 本设计任务和主要内容 5. c. |$ c9 _5 |! m* Z7 H, z* a
2 方案论证 64 ]* l1 p% e: c- }& N
2.1 温度传感器的选用 6
3 |" Q) _0 W. V2.2 控制核心的选择 71 c$ e( ]; S4 a5 ^3 T' O; Z( H
2.3显示电路 7, |9 G4 U) \6 j. d
2.4调速方式 7
: |6 o; @) \$ N2.5控制执行部件 8# r/ D& z; c$ h2 r! _! F3 E" l
3 系统原理 8$ t3 S; R) m3 W8 T6 B
3.1 系统总体设计 8
" B$ a4 T* ^% {1 H9 i& D/ s" @- S" E3.2 控制装置原理 9
, ]4 U: D: O& W2 F9 K6 K3.3 温度检测和显示电路 9( ~7 h! p; |7 L* v% f
3.3.1 DS18B20的温度处理方法 9, F3 S: o) A6 ]2 r/ B- q1 U% i
3.3.2 温度传感器和显示电路组成 117 c" e; o4 W8 a# B: q( @" ]; R! z
3.4 电机调速电路 11
( n& N- u' P8 \ Z3 U& g2 M$ H3.4.1 电机调速原理 129 m5 E5 U6 L6 f4 s' x a/ [; ~" Q) s0 c) f
3.4.2 电机控制模块设计 13
, O4 U/ }4 Q3 K% {4 控制器软件设计 14
A+ s5 t, l. a1 |4.1 主程序 14
1 j5 a1 a2 h4 Z M2 m9 V) }- `4.2 数字温度传感器模块和显示子模块 15 P: @! [1 T3 @
4.3 电机调速与控制子模块 17
3 S% P- y+ v1 v8 r0 Z结 束 语 19
8 C5 a# ~* z; d. x参考文献 20
5 q! v& D* @3 f/ V8 y& K$ b附录一 21
) V& c! o( l/ u' O8 Q
8 G/ q; M* q6 X0 ~# \% M/ o1 q ^元件清单:6 w, Y& _" _& E0 k
' Z9 I1 y% j/ ?+ b
| Comment | Description | Designator | Quantity | | 10uF | 电容 | C1 | 1 | | 20 | 电容 | C2, C3 | 2 | | | 发光二极管 | D1 | 1 | | SMG04_1 | 数码管 | DS1 | 1 | | 红外热释电 | 人体感应传感器 | P1 | 1 | | Header 2 | 电源接口 | P2, P3 | 2 | | 9012 | 三极管 | Q1, Q2, Q3, Q4, Q5 | 5 | | 1K | 电阻 | R1, R2, R3, R8, R9, R10, R11, R12 | 8 | | 1K | 电阻 | R4, R5, R6, R7, R15 | 5 | | 1K | 电阻 | R13 | 1 | | 10K | 电阻 | R14, R16 | 2 | | SW-PB | 按键 | S1, S2, S3, S4 | 4 | | sw-灰色 | 电源开关 | SW1 | 1 | | 单片机 | 单片机 | U1 | 1 | | DS18B20 | 温度传感器 | U2 | 1 | | 12M | 晶振 | Y1 | 1 | h6 Y6 k: Q/ F6 ~: P) F
温空风扇程序:% V' s: K& G# b
如果没有装KEIL软件
; w; \ Q5 m8 p' x( S( t9 X找到 .c .h结尾的文件即为程序。打开方式选择记事本打开
5 Q0 |( |/ F# E或者到开发资料里安装KEIL软件. |9 @5 t$ G6 g3 h5 j1 n, ]% Z) @
2 ^# |1 W$ |! ]" }
9 U4 I5 ?7 T4 q! n4 F$ `# q+ F
/ K- s+ T+ k( I. L8 D$ I( p, ?9 `" s2 H0 S
2 m$ j( B1 t+ c( A0 x
; b) Y l7 N, a* a" u; i& `#include <reg52.h> //调用单片机头文件8 O* r( g! c" U
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~2553 {: u' G: K- q! @5 N6 e# x
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
2 w7 G5 |& ~) x0 K: G& P
! g. p6 x) q; g) ^/ T. s/ M& G
//数码管段选定义 0 1 2 3 4 5 6 7 8 9 5 N) j( v/ ^1 u2 I1 [" _- f1 {
uchar code smg_du[]={0x28,0xe4,0x42,0x72,0xe5,0xa8,0x41,0x77,0x20,0xa0,
. e0 Z* G* d' G' J6 Z 0x60,0x25,0x39,0x26,0x31,0x71,0xff}; //断码
- o: g# z" q1 E- n: Q//数码管位选定义
# _0 \6 v! p: M" ~! cuchar code smg_we[]={0xef,0xdf,0xbf,0x7f};
" s$ G: F* {+ y9 j7 d1 Vuchar dis_smg[8] = {0}; - ^; X6 w) s/ }" d- P
uchar smg_i = 3; //显示数码管的个位数' s7 C4 a0 O2 L, w4 m
sbit dq = P2^4; //18b20 IO口的定义
. b/ W3 P1 H) J' Y6 S" `, N8 Usbit hw = P2^5;$ D4 L4 ^; W& O& q: l7 Z
uchar miao = 30;
0 n" P9 m5 ?8 s* huchar flag_en;
. D3 o1 {% e; m( k) e) w
7 V' \" C6 H3 W% R
1 i0 F- j' m4 r5 a/ V" v: xbit flag_lj_en; //按键连加使能$ X6 X1 r5 p; T+ A7 t9 _
bit flag_lj_3_en; //按键连3次连加后使能 加的数就越大了
, j' k: u1 x5 |; U" Ruchar key_time,key_value; //用做连加的中间变量% U& s. `7 V. r/ w8 E' N
bit key_500ms ;
S( G0 `$ D0 E& A+ Csbit pwm = P2^3; ) }, a6 ^ w- y2 p Y8 W* O
uchar f_pwm_l ; //越小越慢0 O: W7 B8 x; o! R A& I
; i- X% J; j' J9 k$ D; p$ `
! y" ?5 E( ~/ P K9 Guint temperature ; //7 j! q( G8 n) R6 b
bit flag_200ms ;" i( t. }, C7 E4 }
uchar menu_1; //菜单设计的变量
- @8 T& E4 `1 F$ ]! wuint t_high = 200,t_low = 100; //温度上下限报警值 % q' o5 Q: a, C2 Q
5 g2 [( P3 B! A8 A j' s3 h! `6 a
/***********************1ms延时函数*****************************/
7 D5 e& J) W/ [0 o! Uvoid delay_1ms(uint q)
, z, u3 X! _0 k& g! s/ ^4 Q8 h0 ?{3 p/ m& Z" J8 k
uint i,j;
# V9 I* d" p6 J; o4 v for(i=0;i<q;i++)2 }5 ?% d$ U: j; y: X
for(j=0;j<120;j++);5 S9 f/ c4 p0 n5 l7 x+ n: ?1 `$ t1 Z
}
) H5 o* t& j; y. {- N( R
" u& }( n) o( j/ x
9 z0 ?* v- i+ X1 `/***********************小延时函数*****************************/
1 T0 k% C4 K$ ^5 m- u- Qvoid delay_uint(uint q): d7 u0 Y+ e; M9 S$ c% ^* Y* k
{
6 w% A E* L5 t2 g' R; t while(q--);
! G1 h; A& o. b9 {& u}
7 P5 O* j7 w( |' y o# b Y
! P8 D- c6 v2 M7 r( z0 H" j0 c8 ^4 Y
- e+ N5 _+ O! p, p+ z. a3 ]8 Y
( B3 Q2 u: l* c6 I% ]2 p8 r/***********************数码显示函数*****************************/* I z- g0 `- M
void display(): g( [$ |7 c" \ f) P# X
{
) K7 |* U* v3 l4 x/ b! I$ ^8 R+ T static uchar i; ; K! m3 B/ n1 h/ v F, @
i++;) O* Y( j- Q0 X1 v" Y0 D
if(i >= smg_i)' W0 \" J! p3 {: ^
i = 0;
. u* t& a! W" w u9 x; i P1 = 0xff; //消隐 0 m( m, V( @0 y: v4 Y( Q b
P3 = smg_we; //位选
! G5 q& M) I. P: z( i# o P1 = dis_smg; //段选 8 Q8 Y) k5 E2 c6 E `) p/ }
) V3 _$ c; q% b$ E
7 x9 ~2 \& ?" n; |6 l6 L6 P! Y! u
}
0 w9 r( @- _6 N0 c) Y5 u/ U$ L* c9 [+ Y1 { I) W9 W" s
; i1 @9 k2 _% \6 j. p0 R/ U
/***********************18b20初始化函数*****************************/
`- c4 Y$ T9 w0 K& J$ Mvoid init_18b20()
$ o% ^, J8 d; ~3 i2 |' P9 p{% R( p) o S# Z9 S
bit q;8 e' r3 Y1 P/ o6 T& z
dq = 1; //把总线拿高
7 s( O" n" S0 p4 ] delay_uint(1); //15us
: L7 r6 a0 I& u' }# Q dq = 0; //给复位脉冲3 N3 @5 N, e- Y) I
delay_uint(80); //750us
& x8 s D/ v- { dq = 1; //把总线拿高 等待4 b. u1 P; s f
delay_uint(10); //110us
" R1 E$ q% Y; G7 K q = dq; //读取18b20初始化信号3 J7 g+ _- g% X& y- L: T! K
delay_uint(20); //200us2 J3 n) ^# J6 q5 ]5 Q/ \8 t5 ]
dq = 1; //把总线拿高 释放总线
% I1 _, U1 d; U/ R* r}
1 i4 ?$ | r6 ?0 h
% E. c- U% H3 M" N T' p( \
; J2 b0 f, \0 k, y$ @/*************写18b20内的数据***************/
) r# H, `( O5 K0 X/ A cvoid write_18b20(uchar dat)
9 Q* |% x: P7 r1 \0 u3 L( A2 D{
6 R. X' v4 ^( B+ t ^ uchar i;
# \8 J: O7 |2 o- }& Z0 b) f for(i=0;i<8;i++)& X7 i8 e p, p$ `# V. I4 G
{ //写数据是低位开始" G2 D8 Y! g0 p8 M. ^/ u8 o
dq = 0; //把总线拿低写时间隙开始
! S, |# W) P8 d9 S( b2 m dq = dat & 0x01; //向18b20总线写数据了
; y @. E0 u6 l) [2 J- \ delay_uint(5); // 60us7 ^7 i, w# s# F
dq = 1; //释放总线
9 u% a# k R5 o' g dat >>= 1;
! a2 M. {! A1 h9 c8 e% `2 u$ A# m } . z- g) N1 E( C7 p5 P! L
}" Y( L' m9 J/ p& y
8 `4 i; ?* E+ N; p2 j
. o6 Y. v% @: ~% z0 Q" T
/*************读取18b20内的数据***************/
" F' @( O3 U) t0 _uchar read_18b20()+ @6 } O. ?$ B! p0 [
{
r" o* N5 i- A" e, g' `# o uchar i,value;
9 s6 K( m& m' ^+ A' V& V3 X3 J for(i=0;i<8;i++)
1 }* H1 m6 i* {8 F9 Y$ t {- u5 ]' C9 z! ]; K5 A2 Q0 u
dq = 0; //把总线拿低读时间隙开始
# x- F4 C, C' H3 X) g6 b value >>= 1; //读数据是低位开始" T' C7 P4 @* l; Z
dq = 1; //释放总线$ }) j) S, {3 [
if(dq == 1) //开始读写数据 + ?. p3 q9 }9 L( s; ]4 U3 \
value |= 0x80;
+ I2 g3 [0 m8 s6 W; D9 W) U- F delay_uint(5); //60us 读一个时间隙最少要保持60us的时间
5 C* U# E, o8 ~- O/ ~8 l% z" _ }
; ]* m3 f6 f% j* _4 b return value; //返回数据4 u7 N$ a- f) D+ M; k
}
1 t x! N. C: H5 ^8 P5 C; }. u- G
0 F$ e" ]- B: `$ P2 U4 s2 R0 j$ ^. x
/*************读取温度的值 读出来的是小数***************// b3 W- v5 R1 x# `
uint read_temp()
8 F) P* Q) P8 f" L! [* V' F' _# F+ ?1 S{& h( a; H& {) g# ?3 T0 b j- \
uint value;" r+ z# k* f; j+ r# A2 {0 T
uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序+ i, g- ?; L6 ~, ^* I/ c8 ]# i
init_18b20(); //初始化18b20: p. K/ D) a" @& {9 g% b4 y3 g' x
write_18b20(0xcc); //跳过64位ROM
- _+ @- e( [: V/ {7 j+ A; j; a write_18b20(0x44); //启动一次温度转换命令
j6 C( D' L, _5 i4 l0 v K0 c: o delay_uint(50); //500us; ?0 y' }/ C0 T) R* E& J" m+ P. m& l
: m& n# u; {) J1 c4 ^9 e
6 K' c9 q6 s; i3 L init_18b20(); //初始化18b20! F- W0 Y* C: Y" \ n" m, M" S
V8 G* n }" F" j& ^6 X k
write_18b20(0xcc); //跳过64位ROM
8 B+ Q3 r; Z' W2 R2 V; n write_18b20(0xbe); //发出读取暂存器命令
: ]2 L8 {9 Y4 l: Q" U
6 a! `7 x1 [" X2 [$ D3 V low = read_18b20(); //读温度低字节, p. a! R6 q! Q8 ^$ q
value = read_18b20(); //读温度高字节
: `: W1 k$ _* x4 [; g value <<= 8; //把温度的高位左移8位5 V! R3 I7 S* Z, l9 P v/ H
value |= low; //把读出的温度低位放到value的低八位中; H7 T) U/ v. K W6 u* b: P
value *= 0.625; //转换到温度值 小数) b- M7 r/ n9 m- j# g
return value; //返回读出的温度 带小数& R- l; Q1 z `5 R* I/ s+ q
}7 w/ I; j- p5 n+ M
4 A0 m: H" D0 ` i! |7 B' R% I- J
; K% k* c5 l; D9 O- F( `
/*************定时器0初始化程序***************/
, X: A5 ^2 t d# J% v9 o7 J3 vvoid time_init()
$ M( A" {# v& _ ^{% c% h4 E& X' \$ u
EA = 1; //开总中断
4 X1 ~9 i. v/ J9 [* E TMOD = 0X21; //定时器0、定时器1工作方式1
* D$ A, T2 y7 Y y0 b ET0 = 1; //开定时器0中断 - V% _5 b" `) k. K& d+ X
TR0 = 1; //允许定时器0定时5 F. ]4 K1 W! Q0 D
3 S. ^3 t: S4 X5 X& }. t4 {
4 E7 @$ R+ m4 N8 |' F# Y- F
ET1 = 1; //开定时器0中断
$ w. V* d: q- N( [: O9 w& }- @1 w6 a TR1 = 1; //允许定时器0定时4 ]+ N9 q5 l3 l5 m6 w4 D
}, q; F8 ]8 c9 }4 ?/ A; d
1 A- w5 v$ s+ F E% D" o
' b- d# L, ^8 ~" Z- G/ a9 j
/********************独立按键程序*****************/
6 k1 m6 { a7 g/ A- Suchar key_can; //按键值
( j$ Q8 H" E; S- w9 l$ V2 \* j! n! W* g9 m2 d5 Z1 X
# p& g6 ^% P- H9 H$ {
void key() //独立按键程序! Q" v) S. Y( d0 ?
{
* r1 |! P& G: R% ~' D3 h7 C: ~ static uchar key_new;
# ^4 ^/ G/ I' v' S0 h key_can = 20; //按键值还原. _" P. r6 g% a: p! U
P2 |= 0x07;3 u d* ]2 A3 V/ M
if((P2 & 0x07) != 0x07) //按键按下$ }3 A. g. R: Q! c; y4 P* E
{3 t1 _/ i( h9 V; J* i
if(key_500ms == 1) //连加
. A; |6 e+ `6 K' i3 R! k) M0 ^0 s {( v; n$ ?; g7 G' y/ \4 C4 O5 b
key_500ms = 0;
8 x2 {' ` X0 r/ u key_new = 1;% I3 Z% t9 z2 [* |
}
4 P0 o4 h, F- g' E! u& w delay_1ms(1); //按键消抖动9 B3 N& P. ^+ k8 M4 [! A6 ]
if(((P2 & 0x07) != 0x07) && (key_new == 1))
7 z- Z* m+ C& \8 C& a) { { //确认是按键按下
% i9 A% {! X& d key_new = 0;
5 u% l' A! S5 k* ^ switch(P2 & 0x07)
* V. G0 z' l. @" ] {$ ?( i; `# T& r7 j
case 0x06: key_can = 1; break; //得到k2键值. X A8 x$ D" J1 |$ [ C& m7 F2 f
case 0x04: key_can = 2; break; //得到k3键值
% `6 A# L' R& P case 0x02: key_can = 3; break; //得到k4键值
+ M E0 ^4 j: G }
: C! N+ {" ^8 @$ k2 h flag_lj_en = 1; //连加使能
8 h! v7 a* L6 y$ P1 s } & l, u; u6 }' ` o: s; u9 |
}
/ h3 P. i [ t: O8 f* q: u else
7 e& r1 |+ T; }, J {
( L& a* {4 N# a$ l if(key_new == 0)( t8 H* ^! z0 }$ ?5 X3 O7 A, X) j+ k/ `
{
5 f9 ]" ]# ]3 u key_new = 1;4 F2 _. `: o @9 Z
flag_lj_en = 0; //关闭连加使能( ]1 c0 p- O; F+ B6 @& K
flag_lj_3_en = 0; //关闭3秒后使能
( n2 O0 ? x9 I6 W key_value = 0; //清零
. X$ n6 @6 q3 f4 X& J( R key_time = 0;
3 b7 l/ \, t; C' }1 ] key_500ms = 0;& V# g" R5 `$ s7 s0 e. C7 a+ d1 Z
}
, u9 }8 c% j+ J3 Z# J: Q }
" a9 i8 o# D- m3 R: B% V}
2 c% Z+ H$ ?! D, _. K2 L) L9 S
# ~" L& Q# L* }4 P- z* \( L$ [! m2 M* _( A% _
/****************按键处理数码管显示函数***************/
8 P3 H1 _. o7 Yvoid key_with()0 X- p+ K+ A0 w0 r0 |
{
' \& H; r3 h% R5 b if(key_can == 1) //设置键9 b( d- ]0 f5 D
{
) T+ M) y" ~! E& [9 ~ f_pwm_l = 30;
) T, O# {+ ~4 `. D& ~" V menu_1 ++;
" v5 a% w- V* g9 ]; G W- L5 s, {5 p; Z if(menu_1 >= 3)
+ ?* h! {# S$ _ u5 w2 e$ ? {0 d3 k2 S6 \% B+ S# ]# |; p
menu_1 = 0;
8 L6 S9 }2 J2 v2 |8 M% Z# L7 U smg_i = 3; //数码管显示3位
) j* B, ], G4 R }% Q6 R6 Z z; z2 y" c
}' c8 Y& @: i S4 H" g: a7 q; r1 c# e
if(menu_1 == 1) //设置高温报警
' s" J. I. m+ @1 l+ T {
/ a% W+ `4 y V smg_i = 4; //数码管显示4位
+ d; C k6 {% Z0 B' ^ if(key_can == 2)2 a) b. l- U9 W$ a G( i6 r
{
9 L! G+ z# Y4 n8 c) F( L# f; s if(flag_lj_3_en == 0)
3 F' G' B' e. c t_high ++ ; //按键按下未松开自动加三次
) o+ J# b4 P( m# K/ e+ z else & k1 L) Z+ K5 H' D) q" N0 k
t_high += 10; //按键按下未松开自动加三次之后每次自动加10
; \, P: Y" ]! V if(t_high > 990)
N! Q. [2 o. |6 M: G8 p t_high = 990;
6 f {% `$ H& }' c/ l' p( W }, R2 l0 |9 n/ K3 n5 Z
if(key_can == 3)
, E; M. V5 z. s! @, k: _0 B {
' S, c) X/ P" D5 b/ L9 v B P2 q if(flag_lj_3_en == 0). P5 Y6 f S# Q, o6 B) m/ m7 L% u, C! X
t_high -- ; //按键按下未松开自动减三次 + E9 e6 q, }: s, g6 W
else
, G. t B! a1 O9 @1 v1 \* C0 i; ~ t_high -= 10; //按键按下未松开自动减三次之后每次自动减10
- S3 U+ e4 H5 ]( t& q if(t_high <= t_low)
- i! Q4 ^+ r5 y- w L, F t_high = t_low + 1;
3 ^. V, } L6 m; d6 J }$ C4 `: z1 b5 v
dis_smg[0] = smg_du[t_high % 10]; //取小数显示" w: q. x" e2 f
dis_smg[1] = smg_du[t_high / 10 % 10] & 0xdf; //取个位显示, y) d- }' ?3 D6 C/ D$ q8 B
dis_smg[2] = smg_du[t_high / 100 % 10] ; //取十位显示' j6 ^& {- I4 O# N
dis_smg[3] = 0x64; //H
' [: l( X; i$ d, B" @+ ]' o } 1 ~5 K+ h, f- [9 Y! j9 v- S
if(menu_1 == 2) //设置低温报警
3 ]. v0 a0 t6 T$ _ {2 J7 }) q& P% F
smg_i = 4; //数码管显示4位$ `, x7 ?: B' L5 e
if(key_can == 2)
- {( f8 l4 x* S0 }8 b {
" `5 a' ]1 t9 ?! |! p: S if(flag_lj_3_en == 0)
8 }/ t- d$ M8 s7 ~& B8 O t_low ++ ; //按键按下未松开自动加三次
- n+ b' I3 O Q else
3 a {; d& H2 E7 t, y- ^. U* A t_low += 10; //按键按下未松开自动加三次之后每次自动加107 z, G, B( X% z5 [2 u
if(t_low >= t_high)0 B% P/ f9 {# ~" H) [8 E1 G* l
t_low = t_high - 1;0 e, h* y6 ~: G& Y* K: g" [
}
1 O1 _/ `3 H6 M, v2 h if(key_can == 3)
6 C4 a$ Y4 A& \, d7 |, I {
" @, E- n' o" D1 R- b! Y7 E if(flag_lj_3_en == 0)6 @$ k0 ?0 m& b" Z2 p
t_low -- ; //按键按下未松开自动减三次
' H, J4 u3 F ]0 P: n else
2 G; a* \# q, Z+ A; W t_low -= 10; //按键按下未松开自动加三次之后每次自动加10
2 C5 p: H2 d4 y3 Z+ Z if(t_low <= 10)& v+ G- G D0 f9 J: K
t_low = 10;* m9 d. ^5 B* L& E& h; E) [$ L
}& M$ C" Q; _3 j! C+ i
dis_smg[0] = smg_du[t_low % 10]; //取小数显示
. \6 G2 ?* O$ M dis_smg[1] = smg_du[t_low / 10 % 10] & 0xdf; //取个位显示; b: d) B. O0 u+ @2 ]1 j7 a
dis_smg[2] = smg_du[t_low / 100 % 10] ; //取十位显示- W C1 z! y" d( c
dis_smg[3] = 0x3D; //L8 j4 o: K+ I# n6 ^! D5 }5 Q ^
}
6 }$ A" k5 q: E. O$ V$ n+ D9 v}
2 j7 m% @0 O, x
6 h0 B& ` T( g- v: P$ u5 I+ L8 t3 l" n
/****************风扇控制函数***************/
. w- a% r2 H2 l5 ^void fengshan_kz()
+ K5 B9 a+ \% i/ u0 s4 l{
+ U) [& j& a, t if(flag_en == 1)
8 i3 d# i2 Z* v" r+ Z {1 {/ B9 ^. T% ?$ E
if(temperature >= t_high) //风扇全开* v- i5 P* u& p+ x* S: A7 D v
{ 4 `5 v w) w8 x0 x' }9 Y
TR1 = 1;* f, g8 u% Z- g4 Q8 m
pwm = 0;$ b5 ^) r( @& j& K
}4 U4 t; \6 D% n2 e' a
else if((temperature < t_high) && (temperature >= t_low)) //风扇缓慢
+ r6 F4 C0 s- ^4 }+ O u {$ U7 l$ K) w8 ^3 W# e6 i- A
f_pwm_l = 60;
* F9 Y) x$ q8 F- {! }2 G+ W TR1 = 1;
3 }% m/ u' Z/ e }
# d D6 g% {2 G) @3 Q# B8 b else if(temperature < t_low) //关闭风扇1 N1 ^* } A K) q! K
{. h9 Q3 B+ g6 a$ ~2 N* H
TR1 = 0;
7 G* P3 m7 K: V6 r4 Y pwm = 1;- p* A! O6 Q; ]- O7 ?/ }" J# R4 G1 s
} $ I% \2 D: Q4 s, K' ^# s9 M
} % ]+ S# ?* g' w+ w$ O5 k0 w
}0 x' e+ }7 w& R2 D' @. t0 N% i# G
: q# H; ?" Z0 t
; h& N9 f$ u+ L0 j
, e/ x- H7 r; {+ u4 j/****************主函数***************/$ i6 g1 r4 W5 |. X7 i
void main()* ~: Y; Y$ N# N5 K4 g) p
{) ~* d7 _: r0 m
static uchar value;" p C" z! n! E/ |3 q5 Z0 I
time_init(); //初始化定时器
& T3 V1 K6 k2 j1 C$ _! J# O temperature = read_temp(); //先读出温度的值
$ y7 D/ p# \% W+ ? delay_1ms(650);
6 `9 [# n6 u' q/ y& Y' u# q temperature = read_temp(); //先读出温度的值* M G3 E4 v, Y, \1 n9 V$ M
dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示& h/ O2 x& Y0 o% e, i
dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取温度的个位显示
. |3 Y2 u3 {( y6 d% u, @3 c0 n# b dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示/ Y% S! U$ G9 O& \7 B& A' c
while(1)/ \* Y6 a, k' w- v- B: x2 v6 e( K
{
& S# i( D( D/ C& ~ key(); //按键程序0 \6 C) X! H" a5 i# @
if(key_can < 10)1 r; |4 c/ |3 q/ a Y1 v
{
; E2 A( c1 F! J8 b1 }9 u key_with(); //设置报警温度 : b q: G$ O: I7 [
}
- `6 n/ G0 ?0 x \! k if(flag_200ms == 1) //200ms 处理一次温度程序4 @4 U4 G0 W5 J% S5 \
{ : ?9 W$ m/ T/ h* { J
flag_200ms = 0; $ L6 X0 G6 v7 n
temperature = read_temp(); //先读出温度的值
4 ~, J( @1 K: K# F% s. q8 d if(menu_1 == 0)5 j; O8 P6 i4 h G3 O. ?
{
0 H9 h; ]9 D' D5 N smg_i = 3;' e7 K8 E. u. i) E" m- e: O S- k. d& f
dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示
: u8 m l: |3 k- o5 ^ dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取温度的个位显示7 a5 B' `: k$ L2 ^6 F( b+ j- a
dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示! j4 b6 v% ?& u3 K
}
6 G) _" q5 g/ g- d2 a fengshan_kz(); //风扇控制函数8 V' h$ O. D. f! C) I0 L4 @' J9 M
value ++;6 I6 N! V* O# z% W# w8 b. u
if(value >= 4)
& |' @: ?/ s5 N+ c1 W% E9 K; q* n {
0 [; o0 Y$ m8 m7 l, k value = 0;
4 i1 \5 U; ^3 h! P) x+ R if(miao != 0)
' C+ K8 m8 }4 ^5 V" q+ O* L2 | {
2 C u0 S. U2 m+ x$ D M miao --; //时间减1
! g' f% A/ p ]. Z/ o }
! @% e" ], u% K+ | h if(miao == 0)" D: H+ B$ Z% h% Z$ T
flag_en = 0;, T; h4 O" t1 t- o4 {5 k- f. |# C
// dis_smg[3] = smg_du[miao % 10] ;. e4 @& e" i7 D7 z$ B
}) d2 `& v7 j- W0 ?# V8 e
if(hw == 1) //感应到人
2 Z+ P7 E. V \; J {
: L. v9 e( A, e5 P9 _ miao = 30;9 ^# Q+ H2 q6 y& O7 b N
flag_en = 1;! [& W M" X: V4 z: @3 y2 l
}
. |' z6 R+ b5 S }( P9 E0 W, ]) z' Z: h1 L
8 i; C3 g! u/ V5 t7 Z
2 q2 I- s6 Y# |" s- `
display(); //数码管显示函数; N" P7 o) w" x/ I6 k; ~) K! I" M
}
; B& o5 `: [) O, x7 X0 K}
+ J, u2 r/ L+ C; c5 H
9 n' u' T# J+ H }: ?$ Z$ `; k2 y, b9 b
/*************定时器0中断服务程序***************/- k9 H' A- |& d; u. G7 H2 ~+ k
void time0_int() interrupt 1" e# Z4 \) z. E( C- Q% V, `$ e1 o
{ % E# g2 \; C2 n, |- R
static uchar value; //定时2ms中断一次
1 ?' \& R+ I* F+ _& ~, o TH0 = 0xf8;& P) Y* G! M) ` \) ?* o
TL0 = 0x30; //2ms; i$ R- L" o: i7 z$ U o
value++;
6 E( w7 |' q* { if(value >= 150)2 u4 }& Y! [" `8 [( H' V( W
{
/ Q/ J9 C4 H7 G4 M8 k6 a5 _0 y( k value = 0; 7 h9 F% A0 @) g7 B. r
flag_200ms = 1;
0 G$ L' b; w0 [3 J* m$ R; u }( ~9 R2 T. K9 ]7 R. _
if(flag_lj_en == 1) //按下按键使能; z6 G3 C4 F% Q) V" {; T( _
{7 V' C0 r4 T9 p( q. Y
key_time ++;
% {/ N9 ] R) `4 z6 e; Y7 ] if(key_time >= 250) //500ms
1 ~# @. P4 W+ D5 ^ {6 d. @ y% [, m" {3 o
key_time = 0;+ ?. P! z; Y/ |" {
key_500ms = 1; //500ms
9 w5 n/ e/ v& L" G. K# y" L7 h key_value ++; X3 s' H% e9 F3 U. E
if(key_value > 3)
) R5 P- t8 w5 [& X o; i. D, D+ K {% B7 r: L- n( K/ C6 S# ^3 A
key_value = 10;3 _. V- {* z0 A& L
flag_lj_3_en = 1; //3次后1.5秒连加大些: T R) Y; K7 [
} , _/ \; K$ B; _ `
}
% T7 j+ U0 R, }' T( R! Y1 H# F }
- h7 f$ I9 @3 f, ]- }$ l8 k}9 ]: ^2 g, A3 q1 ~* x8 n- I3 O
3 j: \) T1 g5 T( t( G0 l! y. |
' W9 q! R; x# h
: @+ b8 A Y+ O7 ] E8 _6 X( C4 G8 `; ~. K
/*******************定时器1用做单片机模拟PWM 调节***********************/
) B; j1 @5 A+ Vvoid Timer1() interrupt 3 //调用定时器1
8 S. }8 D& i+ L4 s3 M{# U& o" t0 y4 q! k
static uchar value_l;- D/ z/ g3 D: [ h6 F+ p( q
TH1=0xff; // 定时中断一次$ r9 {- |& i% R. i3 m
TL1=0xec; //1 M& f4 S' f& u! N# {( v& ^
J. v) E6 V F* E! m
; h7 R( |+ n; U; J$ p4 R {3 C
3 \2 G+ b% B& w* ?4 ^ |$ w5 j" I) v9 k% O. K- L" }2 _0 R' T
…………余下代码请下载附件…………
. R, V8 x8 D g7 ~
6 c% h2 V$ F# }% @6 b6 s& j# v, I( |* p* f$ G: B
下载:
6 Z2 ~2 C( T M6 s( @7 X' `8 D7 q0 M
0 A. n7 S4 c' V/ ?+ G% i |
|