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