|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码
% E) |3 p. t) B; J
( e. v) \! ~8 Y4 j& |3 P8 F4 X2 f/ l" u& J# z. S! c$ s
仿真原理图如下
5 N1 `6 f. x o$ I. [5 C
1 l, C5 K3 t: O9 m1 O+ x5 _ }) N* ]1 Q% U0 B. [, `1 n
按button1可以切换模式/ m$ z) l& F9 M ]+ ?* m( A
模式0 只显示温度
8 z' p4 v: b) N3 p模式1 只显示湿度! A) O; C. m) D% s
模式2 动态显示温度和湿度,每5s切换一次
2 |+ |# O4 U4 ]+ R: r, q$ X( t/ t3 [9 J6 P& P& f A' O
. I$ }9 e) F0 [- u
实物如下. g/ y* }! O% Y& P/ c. I
温度显示
- h3 |3 C+ \1 P E ! p9 R+ i' X+ {
湿度显示 小数
% j# K! y+ d! L / W$ Q' K+ B+ |$ _8 k' R2 w7 ~6 v
s3 W: F/ S3 P4 Z
+ Z4 W5 t5 a- R$ `6 Y8 Z. a4 u模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。: J* Z4 L- \; a& s9 G3 h# D
9 p; `3 }0 S2 L/ ?$ t! q+ P; j单片机源程序如下:5 l4 r4 K5 r4 o6 L9 i
#include<reg51.h>
$ @1 m8 b+ H `' B8 p
2 M" c- j; S1 _& b5 p$ E( n
; |' F; {8 J: D4 ubit DHT_Start();
* X* {2 n/ ~; N. y( R5 l# ^bit DHT_ByteRead(unsigned char *dat);
! R0 H& `3 A5 ^& @void ConfigTimer0(unsigned int ms);, s& H+ |2 u9 C1 {, J; i" B; G
void Display_hum(unsigned char *num);
' _1 J- w/ V0 M: k7 k' j Hvoid Display_temp(unsigned char *num);
' ^% A$ l1 k, N2 j3 Q" P; G& n4 v( F- ]8 G6 ^
; F i! N b% f5 O3 k! }' j s
* Y8 ?! { T1 L/ I/ t- ]/ r; b( W u3 S2 u K
unsigned char T0RH = 0; //T0重载值的高字节
" U6 d3 f) ?0 h! Gunsigned char T0RL = 0; //T0重载值的低字节 + y2 }4 R/ i+ V8 Q/ l
unsigned char str=88;9 g( o9 z) f# `) H: J$ K
unsigned char DHT[5];0 F8 O% @; D( @) _
4 ^0 L! f& c) y. A. z8 H
- ]4 x. R4 M& w& [unsigned int tmr1s = 0;
4 Z$ o$ S+ P" C' u, runsigned int tmr10ms = 0;
/ F( ~) q% y! junsigned char st=0;( a8 a( T7 r; e- L) H# C+ I
unsigned int sdd=0;& D3 A; o" l2 W* @6 A2 E1 g
unsigned char td=0;7 l3 t. F6 p6 v9 O5 J! }& Y
unsigned char mode=0;
2 }: c* W2 ]' t3 m7 Z. q3 o" _# ]3 V6 A9 T% Y/ q* K
) k% v# @: ~! v3 W" o9 d! E. ]
bit flag1s = 0;
8 f. w' x, \$ v- r0 _- F* {bit flag10ms = 0; 5 J, J+ B. E6 c: `( O
int x;
, G6 M: k$ j# x8 c+ v& Q+ D
! w8 Y; [3 M* v5 h3 N/ _" vsbit button1=P0^0;
9 c% F7 w. M$ nsbit dot=P1^3; //数码管小数点
4 V4 M- F& r4 s! u# K3 [$ Y
B6 {% z5 I4 t
3 D# e) @5 ` \7 T$ _ S
. R" k+ S1 p6 X7 E% H. d! a- Z# M- \4 W/ x6 H3 x
void delay(unsigned char x) //延时ms) ?6 w# B1 [3 ^9 A# t, C# x$ \
{
, x {: V5 P% A" } unsigned char a,b,c;: Q1 ~0 o. \" M6 x
for(c=x;c>0;c--)4 x* s" E6 A3 c1 b% [1 F x& q
{& Y [+ q+ ~4 r6 A- l0 Q3 x* j
for(b=102;b>0;b--)" J& f; u# s4 H: X- T( [/ O& {! x
for(a=3;a>0;a--);
. u# O# H1 f# Y5 x4 c }5 E; {4 ^% S+ k7 b [+ a' f
}
8 C! F" E @0 L) ~3 z8 b+ r8 Ovoid main() * j) i" E: b1 [* L
{ 0 j# {$ m! I3 r* E
; a7 R1 O& r+ r$ C! ]
4 e1 |: F G/ h
bit tmp;0 h5 |. a/ O% U G
dot=0;1 }$ @4 y5 [1 W: S" y; e3 o2 c" ?
EA = 1; //开总中断
_8 }6 m7 r+ w: v3 s8 L, z7 X- a ConfigTimer0(10); //T0定时10ms
& F# {: k% j4 m5 ]- v0 h// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;2 H( K1 ^( |/ Q2 l
DHT_Start();
2 C2 R% g9 i$ ^) K delay(5);6 p3 s# H3 W+ g: j) N( M
$ o. Z# c/ [# F; L
6 O: L- p8 D6 Z while (1), Z0 _8 Q) a. h i
{
" o; O- O1 o0 ]! V& B) z: ]+ Q0 ^ i! \; B/ e6 z$ Y
4 p& q2 Z) V; i( v0 Y- n
1 H ?/ h8 ?) D+ x3 q+ L6 r6 l) x. U0 P
if(flag10ms) //数码管刷新频率
( d; r+ U$ A3 ]' | {& A0 X, o# I. \3 S ^" T1 E
if(st==0){8 S4 H& I! y$ \0 a
Display_temp(&str);6 w& ?1 |. v$ C0 J7 \6 b" W
flag10ms=0;, X4 @, r4 x+ \, l" y/ ~' e8 ~9 D/ N
}% M% M0 n: ~& r( Z/ b
else if(st==1), r i$ @2 \ Z" ~
{9 T2 \) Q5 H+ ~6 X! ?
Display_hum(&str);
) ?% |# |. G3 z# [$ u$ { flag10ms=0;
# p" c7 n; @5 x8 H }! m1 Q) F1 u) D3 X
! l7 z! m+ W; c0 H6 F6 |6 s' r# Z: H
8 g& N5 `- K% Z& T- p ) b/ b% u, `7 T8 L7 s% ?
6 u/ D$ g* e# j" ]5 @& m6 ~
}, y0 j W; r4 U, [' V! }9 Q
else if (flag1s) //每秒更新一次温度、湿度
6 t0 i' V4 [; k {6 @6 z; Q, b8 H
DHT_Start();
! s7 ?8 g! r% }+ Y1 ~9 I+ Z/ G( ]- S tmp=DHT_ByteRead(&DHT);3 z9 A6 }; k4 p# t
if(tmp==1)
7 G: [3 t( B8 _ u# } W {3 C3 P, u e6 e3 G2 g/ q$ L
* g3 C# C, m4 t' {" B+ Y0 v
) n% V F7 V% ^! _" A, R
if(st==0)
) ]& y4 A( ~2 T6 {6 ]7 ] {
2 V4 P! ~* y, G( N# @* I! k str = DHT[2] ; //温度/ r+ \$ W6 J2 c; o4 q
Display_temp(&str); " c# u K9 p$ L* }
flag1s =0; //标志位清零; A; {, r) j8 `0 g( ~. T
}
3 T( b. {5 O8 Q1 t: d0 R- \ else if(st==1){
, x# I' D* V) n# C Z$ c4 |7 A
$ H, N7 w9 y j* Q4 p0 R
; J& `: q0 u6 r2 j str = DHT[0] ; //湿度
/ ^9 d4 I. k$ H( a |: ]' V! ] Display_hum(&str);
( Y A1 H! U' x j& a% L1 v flag1s =0; //标志位清零
H! z1 h& I5 a0 x* R5 X }
( a. F1 t( n# l e# e9 g) B5 x$ z) y
7 ~* [0 t! D Z! i & [1 v& q2 w. O( Z
9 Z6 z9 W: [: t3 } H! a$ G& O9 x \+ k2 Y! n# n4 t0 O) D
}0 C1 ^1 S6 _; X- g2 ^4 ?3 H. n
}
# ~! ^3 e) A) k, w7 I" P6 @$ W5 \ if(button1==0)
. X6 u: |+ j3 t1 t( ]# q {
7 |6 V# L- w* @% ? delay(2);
! P1 f i" d, s% x + _6 T: k0 |+ f6 P! v4 y3 L% q
if(button1==0)
1 \3 ?& x; Y5 x! P0 y9 f {! O; B3 l* }' q Q4 Z0 w
e/ X( J3 P4 x& H3 Y7 W: E
mode++;
3 ?& a7 @$ m( J1 K3 u" c, ]+ A switch(mode)
6 I3 M$ l! Y/ H+ @2 Z# I {8 v4 u* a% D( w: _& E7 i
case 0: st=0; break;9 Y: A5 t" x! G, x" T
case 1: st=1; break;: z x" y9 e2 N/ P0 T2 y& g" n
case 2: td=1; break;
$ m7 s8 |/ D) |7 d: X default: break;+ F7 j' b: V2 U3 m7 a( z+ Z0 m; b
}' F8 G7 R& u1 i' \, G/ I# w
if(mode>=3)
% v$ G3 G2 I/ k5 h+ t- C L {0 f+ a! z0 ?' e5 ?' f# l
td=0;
1 R; T# g/ ~9 e7 ^2 L4 @; X mode=0;, m* i6 Q2 r e Z/ B* p; B
}( T" o* T& N7 J# Y$ I
while(button1==0), {/ l2 W4 C5 H, u. [% \( e' n
{% m1 m V9 C: N3 O2 q& J& q+ u( T4 m
}3 v; n9 W! L+ \6 k: p9 |
: m: ?/ p: x$ o1 ]' u/ }8 o) Z1 I; B. m; p
) q c. C3 O& y# R" M
# F/ _2 t9 g& S+ y) C }2 Q' W0 }& }9 f1 ~" Z7 M
2 w7 p' v6 }6 y' I$ w5 K; O [; C3 f8 ]# ~- U
}2 ?/ n! a/ _& J4 A
) c+ s+ {* x3 L3 h1 l" e
8 k. [1 m" a. L' W+ u
. v0 O6 ^7 y1 `7 A! G4 R ~0 ` B- X" h) @7 m5 J
7 Z0 d z1 f: |& z- v8 A, q1 @# Y. v9 n5 t
}
) G6 L& M" \3 K* m6 I- r) X}, u) i1 Q3 o$ Y8 A1 A- w7 ]
! i5 h/ o' b! T& z G) P8 {: y. N
; V+ `* D7 Y; x5 v( r' j% A
, a( f; j( u6 |# ~ n7 K, M
; D3 F. q4 j, I* S/* 配置并启动T0,ms-T0定时时间 */
3 J' J) O$ ?1 X% O+ lvoid ConfigTimer0(unsigned int ms)
C/ q2 g& j- r% w0 h6 p{
* |. X! C$ f L% B# m" { unsigned long tmp; //临时变量
0 T$ A, T/ L- S; R- B4 N + e/ n8 b- T m# u/ w+ g/ s. `& Q
tmp = 11059200 / 12; //定时器计数频率
: r; j7 P: A: R tmp = (tmp * ms) / 1000; //计算所需的计数值
( v1 z# F. m3 R; b7 J6 o tmp = 65536 - tmp; //计算定时器重载值
# M5 l$ M3 s" n! n ? r/ w tmp = tmp + 12; //补偿中断响应延时造成的误差 E6 a1 S) `- N2 h5 g: \6 g
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节& z0 A) A9 d3 [4 @3 v9 Z3 L
T0RL = (unsigned char)tmp;' T6 J5 m3 {8 U( ^4 X: d* M
TMOD &= 0xF0; //清零T0的控制位
4 V$ t, j2 m2 Y+ |2 i [. ?$ o* D TMOD |= 0x01; //配置T0为模式1
0 m2 Y6 a7 {+ H$ B TH0 = T0RH; //加载T0重载值
& p+ a+ s. R9 e& m6 S6 s TL0 = T0RL;2 X }5 q7 [* v8 E* v7 e
ET0 = 1; //使能T0中断1 h9 C( y" X, F1 x
TR0 = 1; //启动T0
9 P# H! y4 Y: b" M8 q}; F( y5 d+ ?$ A) u7 L
/* T0中断服务函数,完成1秒定时 */
) z# S' [8 u5 _0 [0 T! Fvoid InterruptTimer0() interrupt 1, D! Q# H" I5 Q+ w6 s
{4 [# m" `# o8 z) j: F
: [1 c- o0 E/ k+ J* o5 }' @
% `0 g3 k- z _0 [ TH0 = T0RH; //重新加载重载值
+ R4 J# l, b! [ TL0 = T0RL;
' D0 M! M% u. G3 @+ ~ tmr1s++;
a) X# V- W6 ~8 @ sdd++;3 m% ]! q0 r+ B1 T( |
tmr10ms++;/ k8 T, v/ h+ F5 T
! }$ w2 }. b' ^
& @/ O, @5 k) r- `$ y) R
if(tmr10ms>=1) // 数码管刷新频率
; f, X# _$ m. L7 a6 p {
$ x4 [, P/ M" z0 x tmr10ms=0;
% l( u1 I7 E% B9 A' s- m flag10ms = 1;! l& d1 { B7 N6 N6 E$ r
}
. ?% T; y: H/ o* k; v if(td==1)
8 p- ?& J/ b! | {# L$ r! o, h5 K% m: G1 }/ a# u* W
if(sdd>=500) //温度显示5s 、湿度显示5s4 X5 K3 j6 Y) U, S
{( R% K5 g8 T( V) Q5 Q/ M
sdd=0;- ^: K3 b/ @9 |5 T, @' l1 S
if(st==0)
, f. d' K$ k* S# J" E& w {- u I; V) e$ R9 D! [
st=1;
2 x1 q$ }& k5 p/ s; J4 S }
2 H4 \' W% X2 P+ W0 y else st=0;9 G' X; r" G3 v
}& k& i; ?+ h+ `& Q
}, k! }6 K" N3 ]: G
if (tmr1s >= 200) //1s 数据更新频率2 D% [! f) r0 o. ~0 D
{% }. q- q9 J" i* j5 i
tmr1s = 0;8 |% p; J% P. l4 H& G. M
flag1s = 1;) d) f; D3 W# H) ^
}
`( i% h- C1 `
+ h* V8 i% A. y' v# F
+ ?* R4 Q( d5 q, c. ^
3 t3 M8 |7 N/ Y1 j) [+ o) F7 p! p}
: t: J" D. G; O# n1 U9 A: w% O7 [* j- ^2 K# U
: S8 \7 q; s; j& Y
下载:
7 b# v. B& f2 m9 M; ]% J) k
G, }8 e$ u4 x/ n, ? n$ s9 a, J* J* U* d
|
|