|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机智能温控风扇设计 带智能调速人体感应 毕业设计论文
# e7 ]. {8 q# h- j9 K
l3 L7 O6 Y0 X9 _) v. V, B2 z. D/ O) L& B$ P z7 B) n" E/ y$ `
51单片机做的温空风扇 数码管显示 带人体感应模块,实现智能调速,功能非常强大,这是一个本科的毕业设计,毕业论文 开题报告 源码 原理图 还有proteus仿真等等都是一应俱全. 还有答辩常见问题解答,焊接注意事项和调试讲解,以及详细的制作过程.
8 D! c+ h- v8 ^8 Y( {+ e( P* K7 l5 g' A5 j
温空风扇实物图:# L* |3 U" f }4 M& F. K& g7 r
: G1 }4 `7 P! y5 T$ M r) y4 }6 e4 G
\1 ] a# ]2 q$ l z; g Z温空风扇仿真截图:$ t$ O( k. N" f# f. q; j5 _7 u ?
2 z4 V& u% D# @. r0 K
( s% M2 Z/ l: w$ ?: X3 x
温空风扇的DXP格式 protel99格式 温控风扇原理图:8 V% k/ I, @& Z3 ]1 }, L
: f4 \! ?" X) e* ^! t
8 R6 d/ {$ @1 d
DXP格式用 altium designer Summer 软件打开
' ?% N4 T4 N" zprotel99格式用 protel99SE 软件打开 " T$ `0 {' ~. R' G& p* A# y) C
PDF格式用 PDF 软件打开 $ @* W3 n4 x# `. D) m
Word格式用 Word 或用WPS 软件打开
1 _: F+ J3 [7 o5 `9 s3 M" W5 q
4 l/ c9 y/ a* o9 |4种格式的原理图都内容是一样的 只是打开方式不同( V8 ]/ [3 y; @" o
* Y3 ]5 j K! ^9 Q9 m
请看原理图焊接,不要看仿真图焊接。/ E' B: ^* B. h8 k( h
2 X6 j5 O- B3 D- b# ]wrod格式里面的原理图是复制出来的,有一点点变行变形,麻烦大家注意一下,尽量看其他三种格式的图焊接,
; M: ?" H4 x5 N7 U6 R/ r1 Z+ K0 q3 X W' b: K! V% f# K& B/ F! v
如果论文里面的原理图和原理图文件夹内的图不一样的话,请大家以原理图文件夹内的为准,原理图文件夹的图是和实物配套的,可以自己截图或复制,然后粘贴到论文里面去。1 B f, h0 b9 I
4 [1 y* @% J+ u, n0 A5 v智能调速温控风扇的毕业论文截图:3 {. m% G8 U5 ]' G1 M0 t
! S" W; M0 Z0 \/ ]3 v0 }2 z
目 录
, H/ E: G. f- H( v P6 Y! Y绪 论 4( J7 U- b" q8 L7 b; g
1 系统概述 5
* r" u a" A% K4 g: H1.1 STC89C52单片机简介 5% e' E- f2 M( N6 S( u; {% o
1. 2 本设计任务和主要内容 5
) b1 r5 _! Q8 \3 ~2 方案论证 6
& C4 b' i' w0 V2.1 温度传感器的选用 6' _* }) U& Y# I0 b( i
2.2 控制核心的选择 7
/ E1 u5 B% W7 S1 X G" x2.3显示电路 79 @8 E6 X% I$ Q
2.4调速方式 7
6 {) X5 W5 B0 M2.5控制执行部件 8
' [! n, |( \4 ?6 n. T* e3 系统原理 8
. Y- Y4 [( F+ f' r7 D) A6 p3.1 系统总体设计 8
. {! c4 [* U3 G4 H# e3.2 控制装置原理 9
) y( E6 o0 X, h( v& g3.3 温度检测和显示电路 90 Q8 U6 Q7 P0 ]& k, @7 x
3.3.1 DS18B20的温度处理方法 9
: k( o+ }. _- ^) {8 Q `3 ?3.3.2 温度传感器和显示电路组成 11
& i5 P: y! Z) L$ s6 O8 {, W) p3.4 电机调速电路 11
( Z6 ^2 I6 N" i, }4 ?3.4.1 电机调速原理 124 `5 _( l, M( r+ u6 r% U2 A$ A4 h
3.4.2 电机控制模块设计 13
' D: X! e3 f3 R; s8 y4 控制器软件设计 14
+ R, k- Y. }. ~" r: A, d* O4.1 主程序 143 e3 r8 Z8 Z/ X* J, ]
4.2 数字温度传感器模块和显示子模块 15
- _( F1 R& x. Y3 q* @4.3 电机调速与控制子模块 171 E: ~2 H8 b) Q; z; O1 j9 ?$ o, b
结 束 语 190 \1 a& C$ d2 `! W# J. q! z
参考文献 20+ Q6 S4 t) f: u9 S1 m' K7 Z; K
附录一 21
' n# J5 o& }$ ~# M+ h. }8 `. D% {$ _% e% B& {
元件清单:
4 q' V( G$ L# B' {
' P4 }& i( L! A/ Y: p6 E' T8 n| 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 | ' ]4 \6 \! w+ d" }" x, r% ^3 k
温空风扇程序:6 P' E" b9 D# o) w& [& ]6 z
如果没有装KEIL软件3 c% A- _2 E" J) T
找到 .c .h结尾的文件即为程序。打开方式选择记事本打开+ d2 u6 Y* ~' [9 {! [
或者到开发资料里安装KEIL软件
Z( B1 p9 o+ D' d% q9 {7 ?( {5 `: Q
; G4 [$ Z9 e. ?$ _9 ^, @& e2 U
! v( P9 b3 ? P: z( [, i; L+ s) {
! Y4 f: q. B; u
Q; f u6 T7 ^; N6 G o#include <reg52.h> //调用单片机头文件1 V% t4 t. u; |2 z
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
; _- M) j' V- M5 v, G5 n#define uint unsigned int //无符号整型 宏定义 变量范围0~65535, f! D% h/ N0 v
+ M, b0 ~% T# J4 f5 o* z) D
; q' s0 l& |. Z) L9 A
//数码管段选定义 0 1 2 3 4 5 6 7 8 9
9 O9 n2 @9 i, w0 nuchar code smg_du[]={0x28,0xe4,0x42,0x72,0xe5,0xa8,0x41,0x77,0x20,0xa0,( E% ~- i% Q" T' ]8 g( o, i K
0x60,0x25,0x39,0x26,0x31,0x71,0xff}; //断码8 t/ J- |7 E, W$ g
//数码管位选定义- O! n( z. A& I; }( M$ x
uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};9 }; p/ Z$ P! E9 p7 G6 O( @% |
uchar dis_smg[8] = {0}; 8 d+ A q" h' r' m. ^* a
uchar smg_i = 3; //显示数码管的个位数
; g# m/ z8 N0 Y; R9 Fsbit dq = P2^4; //18b20 IO口的定义6 I7 T6 ^/ D, a, ?* c% g; y' R% l
sbit hw = P2^5;( e u6 c: T d+ ^# c" d1 C
uchar miao = 30;' l1 k& U6 Z0 ?: _
uchar flag_en;
1 T" I6 ~9 n+ z+ ~. U" j1 a. n; t' T
; O; F* B+ I$ _! {. n* Y
bit flag_lj_en; //按键连加使能
& Q# Z' B% w1 c$ [2 ~bit flag_lj_3_en; //按键连3次连加后使能 加的数就越大了
8 f& G4 [/ ~' F: S& Puchar key_time,key_value; //用做连加的中间变量
' |+ _& N2 f4 ^! F( Y9 abit key_500ms ;* t1 o8 ?/ l% ^: d* w
sbit pwm = P2^3; * C2 J; x0 T# Z3 b) Y G
uchar f_pwm_l ; //越小越慢5 X6 C7 x' v. m9 h8 s
, G4 X7 w6 u# v9 D
/ W& e/ I' V9 u o; G
uint temperature ; //
3 P* \- B* v' v2 u2 Kbit flag_200ms ;
$ t# c3 s3 p% b- B( I& } F% vuchar menu_1; //菜单设计的变量
" ~4 w5 g- w, r/ Juint t_high = 200,t_low = 100; //温度上下限报警值
+ h2 d7 [5 r. \# }7 t
( j7 C$ z, y) H) k9 O7 l
8 c3 b* @3 j% ^8 Y/***********************1ms延时函数*****************************/# w/ S, P% ?- `' q& V
void delay_1ms(uint q) x+ o/ [7 v' q( _3 `7 E$ Q
{
" h' q( D' v; Y6 Y& h uint i,j;
- ]0 G' E+ ^8 G# n+ `6 ]& }' f for(i=0;i<q;i++)
& y: [1 r2 }0 P3 k4 U for(j=0;j<120;j++);
" r" M/ O5 R+ D( f6 }( U9 `5 J7 Z}5 t& Y9 k9 n0 @( m' r; N
) J* T. h% V& Z3 X4 j+ G3 o; X
6 u% @5 |0 v5 J k. W1 z5 R/***********************小延时函数*****************************/4 z8 J) Q1 O0 G) ?2 X0 p
void delay_uint(uint q)
8 K- H4 v# p, s6 A G5 l% M% ~{: L5 D5 L; U9 D% b% d- ?
while(q--);
0 A; D R% X4 X% c" J% Y* a}
% |( x* q; W# i/ X! D' R9 ?1 f0 y* q* d: j# Z+ a
1 D; t; p9 B& I: x" S+ |) a
/ {& W* x$ |- D. U) {, z
2 ?: D8 h# t) j$ s" K
/***********************数码显示函数*****************************/3 Z" T8 z! I# G& E; k" b8 D- w
void display()
v3 V# k2 d# ~, m{+ [# ^& |( o& b- p x
static uchar i;
& a6 N) R1 O$ u2 {4 ^* S6 c i++;4 {6 j7 t8 K0 ~* v' F0 d- b1 r' I
if(i >= smg_i)5 M4 X6 f1 B/ A4 d+ A
i = 0;
% O2 e; \0 Q8 P& J/ o9 \; v2 O; l P1 = 0xff; //消隐 $ y) |9 u/ t$ p( d
P3 = smg_we; //位选
) N. B u4 Y9 g# |5 {$ N3 ~4 f P1 = dis_smg; //段选
0 W; B `6 b$ Z/ R# `9 _- c7 N# J7 _
- s' ]9 Y3 _1 E$ W
}0 [( v3 P( N! I/ U
. |# a+ f: Z$ z& U
6 ^, s3 g3 _6 k; M- O2 c
/***********************18b20初始化函数*****************************/
) W* h, |$ d; h% y! N, m3 [$ svoid init_18b20()
' p3 K% L9 ~ }3 f& p" I6 b{( j: k) U7 X/ @+ Z; H
bit q;, Q& ~4 [+ _8 l
dq = 1; //把总线拿高 C3 T8 c% C3 {8 S& I2 p: c
delay_uint(1); //15us
! A1 I* x/ E# _4 I) g) E dq = 0; //给复位脉冲
5 H3 }( o, I0 k# N delay_uint(80); //750us
c3 U) W! z; X! Q7 P dq = 1; //把总线拿高 等待# h' ~7 }3 e$ q3 l6 V7 r
delay_uint(10); //110us
. t* V; Z% e; ^/ O6 J: [- m0 }0 W; O q = dq; //读取18b20初始化信号* }; w! k5 q r k' l
delay_uint(20); //200us
8 T$ m5 m3 I9 G0 i9 V% S2 | dq = 1; //把总线拿高 释放总线
2 ?# ]' i: Z! d" a6 g9 X}$ x0 Q3 U! m7 ~- ~+ |0 s/ k$ @
/ X! A; U `9 P, n* [( ?
3 ]! Y, I/ n2 {( q. w( q, d/*************写18b20内的数据***************/+ ^1 D' B- y% T# ]6 m" ^% K
void write_18b20(uchar dat)
8 i2 W8 h& g$ P% M) u{
% S3 [' L+ m7 c4 F7 s# [ uchar i; N4 o& Y; P) p; ~
for(i=0;i<8;i++)4 n- U; l7 p2 L
{ //写数据是低位开始
1 E8 b; x$ V4 z1 _$ L dq = 0; //把总线拿低写时间隙开始 4 [4 ^: V- j1 u: a" `
dq = dat & 0x01; //向18b20总线写数据了. z- Y" d8 u5 ^" d3 r
delay_uint(5); // 60us4 n' o$ W. m" K7 j; C
dq = 1; //释放总线
; `5 m0 m/ }% z: [ dat >>= 1;" r" x' N- e) g! }
} 2 o' V4 _- _# T: z
}; _+ D7 P0 {9 T) e$ W; _$ y
7 c& F& X( p" k. G7 i& m0 i! y) [0 H$ M, Z" r* H
/*************读取18b20内的数据***************/. |' n. n9 X/ T9 ~. I4 p( W$ h: P1 \
uchar read_18b20()
* _7 P6 b2 f$ e8 Z! C D" p{
0 j' Z* V, y' j n uchar i,value;. n) L3 a2 G+ n" k6 d+ g. d* }
for(i=0;i<8;i++)
2 f% I6 d& n# |+ R( m {
" z( P# o: l1 b# S0 ], X# b dq = 0; //把总线拿低读时间隙开始 u& ]3 s$ z, | ], d7 r r
value >>= 1; //读数据是低位开始1 N* e) v' d1 {2 C' q, l
dq = 1; //释放总线
% U$ k) `6 W* u- y$ w1 B+ W N if(dq == 1) //开始读写数据 ' `# R2 d: p5 Q( N: d/ ^1 j
value |= 0x80;
8 o( [0 N0 b$ m* M/ b* O& `+ i4 R delay_uint(5); //60us 读一个时间隙最少要保持60us的时间
$ Y* c. ~. I" ~6 d& \+ e1 D }
6 u* Z$ \ S+ q& Z return value; //返回数据
$ w* Q$ ^# Q$ V( N! L; l}# u% ]$ w' g2 l1 V$ ^3 `2 |9 A
# t& B5 U2 f" j% K+ H0 `$ _1 _ w: U) C$ H5 ?3 {& l: `
/*************读取温度的值 读出来的是小数***************/2 z3 W; W2 W4 X5 j- q- q3 S
uint read_temp()$ `- i8 u2 |$ C/ a8 I t6 }3 }1 M
{/ L3 k/ U3 G5 u
uint value;
- g/ d, U' g# M4 L uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序
; d) ?* v. _+ G$ P) ] init_18b20(); //初始化18b20
/ H" F7 P( e, H, L* w# e. O$ y write_18b20(0xcc); //跳过64位ROM
2 h* o4 F$ c. @/ C) M b write_18b20(0x44); //启动一次温度转换命令2 k+ T: I' [4 Z+ A7 x
delay_uint(50); //500us
' Q7 r% N) i H4 h1 k* C1 S8 \% ~ j3 y0 ?' R/ C
2 [" s7 q0 K" V: ^
init_18b20(); //初始化18b20& \0 I w, ?! e; K6 M, ^
' I6 S1 b( E& {5 h
write_18b20(0xcc); //跳过64位ROM
4 l7 v% Z& T, K+ s [ write_18b20(0xbe); //发出读取暂存器命令! f1 C. X9 j7 e8 Y9 F# W; R, z2 k! S
+ Y/ E8 U" \; v
low = read_18b20(); //读温度低字节7 F+ u2 a+ J; @7 J
value = read_18b20(); //读温度高字节
/ ]9 [- i( m9 b7 p: L. V value <<= 8; //把温度的高位左移8位9 F4 q' x3 n- a4 R, y
value |= low; //把读出的温度低位放到value的低八位中8 ^4 z: A# l2 K' Z
value *= 0.625; //转换到温度值 小数- k( ~9 I7 Z5 H, k- R% b. C
return value; //返回读出的温度 带小数9 y* ?4 W+ v1 r8 _3 Y6 j5 [9 K
}
% \2 N3 q; {+ k- z4 W8 l$ \$ r* C* G1 ]# L7 ]" T5 W4 v5 y' s/ ?
# i6 B( W/ Z7 I" \: t
/*************定时器0初始化程序***************// s) v3 f4 L. C- H& q- p4 g+ |" U
void time_init()
* H5 n1 r1 f9 ] O. I{
& i9 G2 J' S5 |. [' z& t# T EA = 1; //开总中断
3 l, L/ G- g, ?0 w. ~% j TMOD = 0X21; //定时器0、定时器1工作方式18 n" U+ j/ ]7 ]2 R2 ]
ET0 = 1; //开定时器0中断 2 l/ ^2 Y+ |( N U5 P
TR0 = 1; //允许定时器0定时
4 z8 ]" G R3 W! o! a3 e, U% N4 [+ ?
# M/ A' R8 c4 x/ }
ET1 = 1; //开定时器0中断
+ I# E; h9 C9 O$ Z. E- a( \1 p/ l# f TR1 = 1; //允许定时器0定时
, P: a! e' e! ^}4 P7 i7 V1 Z% [' _
/ @6 ^5 ^6 V8 ~& B4 U" l3 R& }# M2 P# k$ `
/********************独立按键程序*****************/8 Z# Q% ]0 m' _; C9 I6 ?' n) f, ?( \
uchar key_can; //按键值# |' |4 M; N% B+ P* t: u* K
5 |/ V7 ]3 s& W. e' T. n' `
0 ]( |$ ^3 V& e7 D
void key() //独立按键程序
5 D/ x9 S$ _. Q2 C{! v, u" k0 i/ G: F E
static uchar key_new;
3 @" b0 q* \. i8 v" y( R key_can = 20; //按键值还原
( [! t% I. R( w4 J P2 |= 0x07;, P# H3 {% W( Y, ?
if((P2 & 0x07) != 0x07) //按键按下6 m3 C+ E# u6 z. B l! ~
{7 z+ y& S* k M6 I9 {/ X
if(key_500ms == 1) //连加% K( x, \& j8 x* g" m
{1 P: z/ V0 F) C
key_500ms = 0;+ X9 l! B( u3 h0 p- L) |
key_new = 1;
% w1 `- I7 Y* Y( I5 T2 p }
- o2 q- S7 {; k5 J6 U; t5 ] delay_1ms(1); //按键消抖动; ?' X. I. _; [8 @8 K+ [
if(((P2 & 0x07) != 0x07) && (key_new == 1))
$ @) R3 m, z& X: D5 Q* P/ Q. a { //确认是按键按下
- { z' V$ b# [+ H key_new = 0;
7 l) L6 |9 j8 Y8 j8 a! X4 V. q P8 ~ switch(P2 & 0x07) ]3 Y/ C1 H" X; J+ i# g
{# _- `% E0 |% {- I0 N4 A$ x
case 0x06: key_can = 1; break; //得到k2键值
. {3 Z& N1 w9 \6 V3 @ case 0x04: key_can = 2; break; //得到k3键值1 m! {7 R4 E$ ` h9 a, G% O
case 0x02: key_can = 3; break; //得到k4键值
( p: C; Q' p* s) p; S6 Y }3 H3 y U# P2 L; u! ]3 h* y
flag_lj_en = 1; //连加使能- c# o7 h4 D' S! {$ \) z3 V% R2 |
} 6 c. ` ?0 k. u- m
}
2 ?8 F6 j9 ~4 j0 ?6 j8 L! N else ' ?/ v# j) J+ D+ n$ F, S4 U# F
{
7 A% C9 L0 k9 d" v& G# ^ if(key_new == 0)& d7 s% }8 W% x8 N
{
) _$ {$ S- w3 h% A# ], l% A key_new = 1;9 X& Z- F. K6 u& g0 g7 G9 Q
flag_lj_en = 0; //关闭连加使能- l. l1 `# A8 _% g0 Q9 W2 N
flag_lj_3_en = 0; //关闭3秒后使能
- z9 `% k' t0 x! O key_value = 0; //清零% w0 e1 R1 o* t- z- l9 ?) r
key_time = 0;; B r7 D$ W& J7 b
key_500ms = 0;
Q- }; y1 D* J, @. ^! {, l% z$ F }
* n/ U W! |. {7 ^) m0 |: t }
8 N9 T8 Z& r" H" C8 W}
$ m, c( ]! Z6 [+ y, V' q
) O6 J0 X3 z) y$ S& O4 e" I5 `1 `- Z7 [" u* h' F
/****************按键处理数码管显示函数***************/ h$ N% R/ |& }+ V: ^6 c6 z \
void key_with()8 z" B0 y1 w/ |; g+ \
{
- K: Q9 ]' W m' D- e if(key_can == 1) //设置键2 L: w, H7 p6 Q; j* A% a
{
# e3 w: n' S" Q: v9 n- U' I/ j f_pwm_l = 30;
0 ?6 `! l* o8 \# K menu_1 ++;
2 d9 s8 |" s4 x- B f if(menu_1 >= 3), Q4 O; a( t+ r5 p$ [* ~
{# J8 }$ b6 ^ r! G) e) T& v' S l4 K
menu_1 = 0;
9 s; u6 a4 h: J7 q9 {7 N/ o smg_i = 3; //数码管显示3位3 N9 x+ y3 z0 j4 I' C
}
% e9 [! `2 f3 f O }
. u, M' X" j# P1 s( h0 i% \ if(menu_1 == 1) //设置高温报警1 t( @: Y- I; v
{
/ \& W: Y5 X9 H [ smg_i = 4; //数码管显示4位
8 f( z) K7 L! S$ }2 D3 y if(key_can == 2)% i7 E! }& ]' `$ k
{: o" J0 z- Y3 B$ L3 k
if(flag_lj_3_en == 0)
4 y7 n7 [5 ^# y0 }- g2 V. f4 b t_high ++ ; //按键按下未松开自动加三次 4 W* @$ L3 `+ E N
else ) ~- m0 L D6 ]9 y; E0 f+ k! ~
t_high += 10; //按键按下未松开自动加三次之后每次自动加10
' }$ p. B1 N9 ]2 W4 P' M if(t_high > 990)
( P) K8 F. M" l9 F t_high = 990;
' j9 v9 a7 v3 B, _0 A) M" A1 ` }$ ~# Q7 J- W) \( r' C: N
if(key_can == 3)) [/ \, X- V, C
{
8 |% \7 ]4 A, z8 \, j if(flag_lj_3_en == 0)
+ q, p4 Z/ Y" O4 N# a t_high -- ; //按键按下未松开自动减三次 5 G* {& @" y( n* T! {" m4 y" X
else
) M5 j. s4 I8 _5 N7 ~! x t_high -= 10; //按键按下未松开自动减三次之后每次自动减10) X. D* f) @" u! K9 @2 h& @2 H
if(t_high <= t_low)) g5 r& }+ ~7 b: `' d! L
t_high = t_low + 1;
* r. _, b# I! d3 }6 T2 \1 E }
5 B& E& o& P) U) e dis_smg[0] = smg_du[t_high % 10]; //取小数显示7 O" m" a3 C3 X) a& d
dis_smg[1] = smg_du[t_high / 10 % 10] & 0xdf; //取个位显示+ _% k; h# s7 C' x5 @1 D6 J- C
dis_smg[2] = smg_du[t_high / 100 % 10] ; //取十位显示, F w- N, h7 ?+ `
dis_smg[3] = 0x64; //H; n* X, F4 t% K _* W/ t8 z! H
}
; R0 x/ @/ A# @! P if(menu_1 == 2) //设置低温报警5 \% Y+ X9 ~. G: @! K
{+ Q" m. F/ c4 C7 N( E. s( Q
smg_i = 4; //数码管显示4位
/ |5 A" h1 H6 T if(key_can == 2)
9 R6 l$ N9 z/ _0 L {/ g. V; Y( @" B3 x) Z/ Z
if(flag_lj_3_en == 0)
+ X- Z8 ~2 ~1 ^6 O0 `- _ t_low ++ ; //按键按下未松开自动加三次 - l$ b" k) O9 c3 z8 [' X3 f
else
& Z: I. i$ ]5 }0 u+ a! y t_low += 10; //按键按下未松开自动加三次之后每次自动加10
- k/ o- I, D/ h- b& P if(t_low >= t_high)
3 O& e0 @+ I9 C- F8 t- \$ w t_low = t_high - 1;
6 p1 m. B# b2 F }
9 E0 G, f# ?: m- m if(key_can == 3)( p- N/ h# g2 o/ W) F T
{( K/ z8 s7 }6 ^' M. v' |
if(flag_lj_3_en == 0)$ g. L/ o/ s# Y
t_low -- ; //按键按下未松开自动减三次
1 A( Z4 s, {5 c3 q4 w4 e5 ~ else
+ j2 ~$ g$ @- C t_low -= 10; //按键按下未松开自动加三次之后每次自动加10. I8 Y" ]( q% Q9 C
if(t_low <= 10)
" N* ^/ Q5 ]4 _1 q3 O. w0 [8 a t_low = 10;- }- {, U& u4 c& z% c `
}( ?9 A& {0 _1 s/ F! ^
dis_smg[0] = smg_du[t_low % 10]; //取小数显示( o! _$ ~- K* \+ j4 ~; F7 S
dis_smg[1] = smg_du[t_low / 10 % 10] & 0xdf; //取个位显示+ l4 ~! D% g2 Y) t# g& O* U
dis_smg[2] = smg_du[t_low / 100 % 10] ; //取十位显示* s$ T4 k O. H3 B3 ]- ]# f
dis_smg[3] = 0x3D; //L: z( n7 B. D7 `4 n( \1 i
} . g& Q/ r# J* ^% ]( \" H4 a# [
} 6 Q4 e: ^( @! z; G! v
9 O( T E. v0 c) ?0 W
' Q. n! T6 p6 G, I0 B/****************风扇控制函数***************/' ]1 f( `* W; X6 f8 D
void fengshan_kz()
P5 ]' e4 c. ]6 f7 c* \" X4 _{
- m2 T3 N2 E/ c$ N" G4 d3 ~/ E if(flag_en == 1), f9 v- P$ z+ ~, `( x- r/ X0 A: j
{
9 z% E3 M& o6 {- \ if(temperature >= t_high) //风扇全开/ h* X2 E4 q( ^8 X
{ $ Q! ^. ~' A. ]
TR1 = 1;
) \8 r" x, l, |$ a% V2 X pwm = 0;5 _" s6 e& R* F
}
9 j; P: {9 B1 O, Q3 @ else if((temperature < t_high) && (temperature >= t_low)) //风扇缓慢) w( M7 s; `9 Z5 H" x
{- `" E, z9 X+ A! Q' a, D
f_pwm_l = 60;
/ R" C$ ~9 @6 B( D/ s. i TR1 = 1;
0 z! N. H1 H. n }
- W5 r* s! M y/ B* e else if(temperature < t_low) //关闭风扇
" x9 A4 }* x% h% [: t0 Y! k {
" y' k/ z- X1 ~* e& @. S# u+ V TR1 = 0;
) Q f, \/ e9 n; X* @- A+ j' j3 d0 @ pwm = 1;+ W; ~* N A' v# [ E7 ~
}
) D/ L. e2 o, J0 d) M1 U } 2 L0 _$ }1 w1 f1 L& o! |
}
: h" C b, q9 O5 b4 l' z
0 T1 v, |4 t# J
% a5 s7 r; ~ |5 k$ v1 C( [) C2 N$ X. @7 S6 _- f2 E! H
/****************主函数***************/
# B) l* Y! x- b, t( Z" S gvoid main()5 K3 Q6 `: q! x1 r% V: W+ c. z
{
6 D: H$ E9 f2 o' n static uchar value;
! p- J! G5 m/ t/ u5 |3 o) J/ v time_init(); //初始化定时器 1 C. `8 _* W* `- N5 ]4 ~, l
temperature = read_temp(); //先读出温度的值 ) }- C" V9 N6 o- x3 A8 S
delay_1ms(650); . y6 G" w# O8 t7 h- D' r
temperature = read_temp(); //先读出温度的值
) E3 r& }* j; F3 R( C0 [1 M dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示1 S) e1 }+ L5 q$ e
dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取温度的个位显示
0 h4 `- U9 X( `- {" e2 g6 y$ \ dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示
7 ?3 G3 Q) W" s; l n, r while(1)6 I9 a& W* O+ N% _2 m8 @0 X
{ & B: ?% O9 L& b9 x/ o7 g
key(); //按键程序9 X: n5 S) R0 n. I! c. o
if(key_can < 10)7 h+ @- d3 n# u3 c" f/ _
{5 u( J' }6 A. p3 L- i0 ]# w. w
key_with(); //设置报警温度
9 O% M! ^3 F# U3 g5 u }, p+ x3 z+ n8 m/ {
if(flag_200ms == 1) //200ms 处理一次温度程序7 n1 O# O7 k# I$ q
{
) \ _. ]/ `+ l1 \" p1 Z flag_200ms = 0;
# _* V% \0 u& Q8 `) z. L0 X w* V5 h/ B temperature = read_temp(); //先读出温度的值
9 h" g9 f' T+ i- A; v% r! U1 A if(menu_1 == 0)
- u1 L" K- k c { 7 S9 ~$ a' m! `- X9 ~* B
smg_i = 3;
( X! I' Z C6 b# f( b& ^" p& G dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示
6 }. n# a# @4 Q dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取温度的个位显示1 {) R, f. |* I
dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示
) e! P. b3 h* q3 F }9 `- C7 ^3 x7 k( b, O
fengshan_kz(); //风扇控制函数
' {0 n; E0 H0 d: Z# M value ++;
8 M$ g& S, B6 C3 e0 o1 F, n if(value >= 4)
* p. R3 f$ ^5 @3 U {' U0 k% I% |( j' V# m6 m
value = 0;9 W" K& i* n/ B5 J/ r
if(miao != 0)
. I2 j( R+ \+ w- V- `, S8 ` {$ m0 ~/ ~; O; I* G! D& k6 E
miao --; //时间减1
E- N9 i q: q' W7 S7 ?. O( K2 D }
4 c) i9 ^. y, f8 Y6 R1 \ d if(miao == 0)
- D& n* t7 w |; X flag_en = 0;( U6 ^5 Y: E# J2 b" M3 X
// dis_smg[3] = smg_du[miao % 10] ; ]. H. f5 t- |/ m, |7 b
}5 c S) g9 I& k3 H
if(hw == 1) //感应到人, l/ m, f( Q: T6 z
{
! N+ @; t2 c8 B3 _ miao = 30;
5 I* Z6 Y1 U4 G* q" ]( K0 c flag_en = 1;( }5 Q) n1 I. n
}2 M) _! r* _* D( `; {) @# Y
}8 W- ]1 d; f0 W i2 [- C! Y
+ i9 i. n, V1 ^3 R0 \. W* x A
# g( J" W T; j& {' n H display(); //数码管显示函数
4 x9 b) D j( L; A1 ~& }: O& t }; s, W, z/ c4 A; V
}
# ~; F; d G- }, u3 o9 r) X3 c
* [) t, y2 z. r
; H2 {# B% l F% F/*************定时器0中断服务程序***************/
+ o/ q4 R& D3 x/ w6 lvoid time0_int() interrupt 10 |3 I3 k( i0 J6 n1 C8 x1 d
{ 9 m! q* J2 S h
static uchar value; //定时2ms中断一次
4 C( H6 R* I) b! j TH0 = 0xf8;7 T" E8 @1 ^7 {' K3 p
TL0 = 0x30; //2ms# {& {' b& R7 }6 x) J
value++;
x: H8 }0 u$ Y, w# t8 C if(value >= 150)5 g7 q9 }! u+ F5 }) z" g% X% T* [
{
8 ^" ?0 ^, ~; X3 ?4 t7 K value = 0;
1 b/ ]; ^( l$ ~5 G, ?8 A flag_200ms = 1;
5 q0 |9 I* F. U! Q }
( s9 D( Q6 U# l9 o9 G5 F if(flag_lj_en == 1) //按下按键使能6 E. b0 Z8 l# C. F8 j' P; [
{
. j& N! q# A8 I A) Q key_time ++;5 n) o2 i; Q% @( {
if(key_time >= 250) //500ms
, ~9 n; Q- M: j2 D$ z {
& h' B1 l5 Y: W+ f$ W- f1 Q7 n key_time = 0;
, @% E% G7 A" m key_500ms = 1; //500ms. n% d* D! n' m/ Y& s- w) f' x
key_value ++;
( C/ X# u0 R+ Z$ B- o$ d if(key_value > 3) D: r. [% o5 ?1 s! p5 s1 ~
{
6 m5 Q8 v( o0 {6 B key_value = 10;
R( k/ Z _- ^& F$ P flag_lj_3_en = 1; //3次后1.5秒连加大些
' M' [5 H. G% B! V" [6 t8 i S* C } 9 m- ~. V) ^; G. q) T' i
}
3 ?. }/ n; B, Q9 A }! X: s# L* t7 \2 N
}
4 ]$ a) d" n7 \% I, F5 e2 G/ }9 J1 Z) w; R. P* U' ]
* J S$ v* ?7 Z# o% @
0 Q0 T. @3 b* C. k b) w# h
0 d4 m y/ F) z8 X$ g& q4 q
/*******************定时器1用做单片机模拟PWM 调节***********************/; i, P2 D9 v) o% p; P7 ~9 a
void Timer1() interrupt 3 //调用定时器1- V+ q6 v- O- c2 g- Q1 a
{" d% L& T5 R! k4 H
static uchar value_l;( C# Z/ K" T5 P. T- V# X' E2 f
TH1=0xff; // 定时中断一次
1 T( X$ J" e s% ` TL1=0xec; //& B( C- M0 C3 C4 o
. Q2 o2 N9 n d+ l, G4 s3 H9 H
' E" b0 B5 z- R% @3 i9 U
n3 k( _! ]; H3 e+ b! @! q C- D: i
…………余下代码请下载附件…………; G5 S5 }. }, J1 Z
1 P5 e7 h% ^! w& h7 }3 B
. q9 W" }% O6 b& J& M5 D' O下载:' q9 }- i9 A) S: H0 E5 r8 g0 O
% [; G( h2 l1 u2 u* S& L: Z) O/ L. {
9 G2 A' M& \+ z+ K; Y! }8 c |
|