|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码! m+ {( P: j5 A9 v! e7 r/ D
# ^% |. o9 G2 d; U
2 Y9 p" v' l5 c6 q& X( t仿真原理图如下9 W. a3 Y9 K) f4 n/ ^
6 ]4 I4 i3 Y! M
7 j' p1 ^. J- \
按button1可以切换模式
, s |* H$ d% n2 c9 T5 O模式0 只显示温度
8 G9 s' A8 Y& o- R模式1 只显示湿度
2 _7 `$ T/ W- A1 I/ t模式2 动态显示温度和湿度,每5s切换一次
0 ^* o1 u! L/ M) u- v: N8 M) k: D, K6 d
! L" c1 E$ h# g" C实物如下
, n9 w/ d# ~! {) p( [; T$ ~* H. `温度显示# e: s* s* R' \6 X* ]% i1 q, d2 W
& d1 c* i' X1 R* I
湿度显示 小数
. y+ n3 a! L- r; c
& f6 P9 ]% g0 R) @& j# p% a: z, x( S! t
1 c. s, P, T7 a% U+ P$ T1 W9 |
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。
/ A, D1 h4 [) u4 a5 w) k* h+ q3 f
单片机源程序如下:
1 K! N; y6 G0 a5 t1 a, k1 Y3 ^6 X#include<reg51.h>' x0 Z7 f# O9 ^: Q4 W+ b$ v
* j: R8 ~$ N* v! w- D4 H( E) [
) `) z m" z* ?/ j, D
bit DHT_Start();
" E1 P$ U7 a: ~7 f3 B6 bbit DHT_ByteRead(unsigned char *dat);8 @, I2 R' k- R! n' O6 t" q4 E4 J) V# e2 Y
void ConfigTimer0(unsigned int ms);
8 l! j1 b7 i0 i" ?1 R* Fvoid Display_hum(unsigned char *num);
( u1 t8 J5 A' ^! S' B7 Q1 [2 Tvoid Display_temp(unsigned char *num);
/ {5 f& z8 t z+ }3 l
+ C/ T( x- [1 [+ x& d& [+ N2 a ^% y
2 R: m- g& E. K" W9 z- z( H; r; N) U5 W+ |
( E8 b. b- P+ A3 {3 m
unsigned char T0RH = 0; //T0重载值的高字节1 }, Z* p& l3 X+ O% k H' B
unsigned char T0RL = 0; //T0重载值的低字节 ( o' E7 Q6 f6 s9 v9 f# b
unsigned char str=88;: [( f# n C8 `4 X1 U# o3 F
unsigned char DHT[5];
# C- ^( t& f+ |9 ~8 a! F
9 f; L! |4 y5 S2 a3 Y3 N6 L6 U( J$ g' X7 T- s7 v3 H4 |: h
unsigned int tmr1s = 0;7 r! O( l$ k+ O E+ U1 M
unsigned int tmr10ms = 0;
E* Q5 x& A; zunsigned char st=0;
1 H) e( k* P* ~2 w. wunsigned int sdd=0;
# k3 O; O6 h7 o1 e+ K, Q5 E- h dunsigned char td=0;$ O. |0 [. r4 s) ~) Q7 \# W1 p& B, C
unsigned char mode=0;
- i. c; |& m# _+ _9 e6 C4 b! F$ {( `& { {
/ h6 W" u9 A" O& N% _3 y" @0 p
bit flag1s = 0;
- n' B6 L: {- m/ c' Vbit flag10ms = 0;
o( @( r# ]+ v0 c- qint x;6 a* u; f+ V- p" V0 c2 X
7 j b8 d7 L/ ~% w1 Hsbit button1=P0^0;
9 B( x) t5 a& u) rsbit dot=P1^3; //数码管小数点" N7 k8 V$ \3 y; o/ H6 C
' p! k! V+ v- p
! S' T7 D( p4 H6 g a V& P1 b) |
1 F9 y% ~! S, n% e( k! k/ c
+ D( a1 Y* n5 Z( jvoid delay(unsigned char x) //延时ms
% ? L5 q3 S+ Q{4 U1 g) |( x, u! {0 k4 s
unsigned char a,b,c;' n: ?) @, ]* `) N9 y+ K) m
for(c=x;c>0;c--)2 Y: J3 u0 r" @; s9 x* S8 d% i
{
$ k: K. a& p& E, a& l for(b=102;b>0;b--)5 ?1 k8 X" F$ O9 j. p
for(a=3;a>0;a--);9 x, E8 ]( E6 W& C7 H( }& G
}
) g, N8 h, J0 O7 d# c}
4 y0 S! C8 ^0 t) Tvoid main() . o! }. G& m2 I$ d1 b4 m
{ . z, H( |0 L# ^% r; O
* _7 K8 s8 I7 O1 c, B( e7 W' S
: v5 y+ u* x( ]: R bit tmp;
1 b- D$ }5 b) F; }2 z dot=0;
7 X! N4 ]" P2 n* e% s: I EA = 1; //开总中断
+ O ` g X. J* N" g ConfigTimer0(10); //T0定时10ms# O/ y! [1 s# {' k& t$ P# J0 L- _
// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;
4 q* h" c. Y! C5 j3 z5 j DHT_Start();1 m6 b, D2 S% R F; k+ i' I6 W' _
delay(5);/ g7 _) Z( v4 ]) c) }
, y O, w/ g/ Z/ A6 k9 V! P
: q, z1 D3 U- P, X2 m ~+ [, Z while (1)
8 k( L- Z+ r8 [; E# d4 z. z W {/ ~9 D* J- H( N2 e$ Y' G5 [
" V* i' W: b2 G) b7 G" a. U4 O3 G, V; Z
$ s3 N: r$ J" N3 d! W
3 X& N/ h% \7 y8 h; O3 K
if(flag10ms) //数码管刷新频率
: B. j: Q3 y& Z f' l/ Z1 {' \ {9 W3 s" e# X# @) E( P3 K+ G' ^
if(st==0){
. W: |' Y# `3 A: N( t Display_temp(&str);
, {0 y9 }" B6 U/ z) R% K flag10ms=0;
+ R" r; N& p1 X) `! s( r; ~: b }. c) i! F: e& {, N- s$ m7 a& j/ g
else if(st==1)! W/ R, T6 h7 d5 J* p2 V. Y
{5 x' L" e+ O; o4 i
Display_hum(&str);2 F' X* A/ A, x _% V
flag10ms=0;
2 V# I- O" J6 {% x }2 c9 y4 R# H M) M/ ` U
; i$ F9 ~$ N6 A, a
( r" m0 B; w3 K1 d( T5 q. `( F
" U. m- f& ?; {+ f6 {) Z: H
9 X0 O4 K1 M' P4 _, Z }3 y6 X5 W9 u8 M
else if (flag1s) //每秒更新一次温度、湿度9 |4 ]1 A2 N( I# D( e7 x
{
% z3 k. I G) q* k6 j3 b9 r DHT_Start();, e7 Z0 q: w6 ?
tmp=DHT_ByteRead(&DHT);
% r% o8 Q& B9 n if(tmp==1)
. F7 |4 v. v& F5 t9 ^ {
, c" V' e2 N+ B1 P$ f, @
' _- U3 M2 W2 D% n
5 n% ]1 a. s0 R) U" r y G if(st==0)
" Q3 \( V" L7 ^; r {3 [/ V8 q0 e8 ?
str = DHT[2] ; //温度 l8 e. l$ P1 G* X
Display_temp(&str);
" y) E5 W' i9 U; L5 N: G8 \2 y- L5 _# B flag1s =0; //标志位清零
6 u: }$ J" P1 g1 U. r. I- `0 [# x }1 K0 q4 j0 D, z" I4 z2 ~5 c
else if(st==1){
$ M i7 ]: ~, I! V7 _
. T* D6 D( o/ o3 o5 C4 i
6 E: F3 ]# }$ V" L0 p1 S str = DHT[0] ; //湿度7 A$ p" Q: ^- d8 O& v1 {2 F
Display_hum(&str); % G$ K) ^: J1 K3 W2 ~% {3 {
flag1s =0; //标志位清零
+ l7 r; y/ N0 ^: h6 H/ V* I }
2 [) L- j( [7 |$ K; x1 A+ W7 G! C0 @
! O y5 a5 d5 p
6 i( e/ ]' Q8 c' b( j; p
" f7 x# m: p, n/ m( M
' |( R5 U; t9 }. s
) k" W! ]3 r2 s( L }
. U* N" _, V' l4 v9 Y' ~8 Q2 A9 N# a }
6 G& t- J- U. _5 H0 W1 L) d6 l if(button1==0)/ n0 |( ~; x$ |2 k! X
{5 u+ f8 E( K% C5 P1 i2 V
delay(2);
/ m* y3 \* t; v$ E& r: V
, B$ h) v: Q- R if(button1==0)
: y- W: {# o' g; n$ t7 b { k3 z9 z$ ^/ Y0 |, j% r+ i& S
/ i ~# \: `+ ^. H) n* a
mode++;
: ?% G9 U$ @& b4 a; o5 ^7 Z( M switch(mode)* Y: R7 a) W& G$ Q _+ B- l
{
% A% m$ R6 i% I) m case 0: st=0; break;: z# E5 i' G- X* s6 y
case 1: st=1; break;+ f |. O0 g% x5 f+ W/ H
case 2: td=1; break;
. X/ H V+ f7 H G default: break;
6 @4 X9 |7 C' i5 N }" B9 V' c7 p8 Z1 C- |! N2 Q. z
if(mode>=3)
- g* c! }5 k& t+ W% m% _% N {
! F; t3 S4 g3 y8 b H/ K td=0;9 [" B. E7 N1 J6 N% G2 C; B+ o
mode=0;: N/ u# U4 z( ?: ?& I1 X9 ^
}
! \3 h e) ^5 X while(button1==0)
0 ^3 n% Z' i! @1 w/ H$ W {, t. P4 X, H2 l- v
}
: C8 P4 }) Y/ p) r: _. ?; Z- U
4 z! C5 o% f: ~
' f; |& k9 x3 C1 V" z! H
+ K C' k% S9 q4 n/ u9 z! {4 f* |$ m5 i" w5 J4 K' c
}
- E6 u. ]$ l$ K6 T) [1 b
. p& [$ G8 s" N$ d# W! ~2 P) U$ Q4 z, ~; U* s8 o
}
$ d% a; f. M u) s7 N; ?* H5 s
; |9 ? x4 w% h6 n. p* r" r
8 U8 b- n$ K" `1 m, B- \
: V$ C4 |5 ]+ S, f: c. r+ |+ u% `- \. \/ b- i
- ]+ I5 B; Q2 o# a' t* R& O2 O$ x/ o( U* K( ~
}
& f( d4 H, N: N* Y}
7 ~. A4 c1 {( g8 f* l) j4 O, K) p
5 N7 ~" v) x; G( n' `! x ~. L5 w; T4 b- v. Z
, M, |* {8 m5 r# q: @
/* 配置并启动T0,ms-T0定时时间 */; O6 m2 h1 c; C- |
void ConfigTimer0(unsigned int ms); m1 y1 v$ Z( h$ L
{7 d# x; T: e Y9 m8 u' C4 @
unsigned long tmp; //临时变量0 X. Y0 ?4 H7 r1 K, |; Q
# N. n. c5 B8 B! u3 k tmp = 11059200 / 12; //定时器计数频率
& C, e1 F' I( z# i4 w tmp = (tmp * ms) / 1000; //计算所需的计数值% q- U3 F4 N& H! o' [& W: E
tmp = 65536 - tmp; //计算定时器重载值
0 e" I7 h% J5 i2 e$ B tmp = tmp + 12; //补偿中断响应延时造成的误差* O1 |* D: I2 w [
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
) ]5 b( `( Y! z8 K- G2 v T0RL = (unsigned char)tmp;8 V, N2 C1 P) o9 j
TMOD &= 0xF0; //清零T0的控制位* q+ l; _" x1 S' Q5 c) ^8 v
TMOD |= 0x01; //配置T0为模式1
) k+ T9 @7 [* v9 f6 x TH0 = T0RH; //加载T0重载值
5 a0 V$ S2 E% k3 v' M; I1 q& B TL0 = T0RL;
8 {. \2 h( s% y; @( u1 y ET0 = 1; //使能T0中断* y9 W' ~! P: \. u) I
TR0 = 1; //启动T0+ v2 N' o* ?7 G7 q8 ?0 T
}8 x f" T7 A& x* v
/* T0中断服务函数,完成1秒定时 */
# | n; p$ |8 g8 G& qvoid InterruptTimer0() interrupt 1
3 P6 Z6 V. D3 O% i$ p{- [% q! G: `7 N% O0 z0 y
: q5 C% f3 h$ F* C( P; h
; e. F0 K o. D/ B/ ^
TH0 = T0RH; //重新加载重载值
) s Z& q0 P8 K" S, Q6 q) | TL0 = T0RL;
$ ] ]( n9 |$ d# I7 J tmr1s++;7 g, U4 d( B& W* u% j
sdd++;3 v5 r1 N% O" }
tmr10ms++;+ s$ P0 O, b. {) z, X+ ], q$ X) j
5 B1 N6 O0 b0 |. c& L
) z3 m- f. L& G- W5 Q; H- L if(tmr10ms>=1) // 数码管刷新频率
/ G* m' Q% v( C/ N9 u- f {
( ]7 K- r1 J q, W tmr10ms=0;
6 X$ m$ ?& C6 Z9 O& J flag10ms = 1;: V% _1 }# K( L
}
. S0 s$ Y; | z) d6 | if(td==1)! l* |4 j" {( x: `- ?
{
& i; \( G& W" t& d3 k+ H if(sdd>=500) //温度显示5s 、湿度显示5s
" J: Y8 d1 S4 z0 L) L7 T0 Z {
J# H+ a |7 a6 k. n5 J; e0 k sdd=0;' g3 M5 d1 `/ g2 p* [& ^$ V
if(st==0)+ z1 m% ]5 a: H) ?# E0 r
{$ w' r h& G& T& G) q
st=1;
/ }6 y9 f0 P7 i C4 b3 d }# n# ^. O) S: W
else st=0;. a7 W, W) f R" ^
}7 C* M( }6 v6 i# F% {" M
}6 ^8 A9 s0 {- c
if (tmr1s >= 200) //1s 数据更新频率
7 I& v Z) w0 l( a* @. q3 J {
, |* [) ?- |2 N" ^ tmr1s = 0;$ y- k; m- T! i
flag1s = 1;
; P/ Q3 u1 D: y% E- U }
, [, j$ _0 T; \: l$ Q. M
, w3 c9 l: p7 n* |2 B" ~
: w9 w- f3 z9 [- v8 w
5 x; E0 g6 [' U+ I# X4 B* S& r}
1 j9 T4 l. I) e! Z9 Z' B( u9 u
3 F! d" r3 I7 q% H, h
: @7 e6 G2 e( F( I4 M, Z4 I/ ~% p {下载:7 x7 X" }1 ~9 `0 @
" x& o, z1 |# y$ G# i1 ^' b4 Y6 u7 v3 B R
|
|