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