|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码1 d ^! U( m. s0 o; E8 D
9 R$ ]- I$ B+ [5 z' B% E6 g8 D5 G* z6 ?
仿真原理图如下
5 Z' k2 ?9 T+ R ) V+ [: O2 l$ C6 ~ I$ `9 X) T0 x9 X
8 Z7 M* T3 q/ G# H l7 S按button1可以切换模式
5 f9 d) F+ L1 Q$ ?% ~! J模式0 只显示温度: R6 ^8 a9 G% D0 F# \
模式1 只显示湿度: f [4 u' ?0 }( G0 O
模式2 动态显示温度和湿度,每5s切换一次9 ~- a F2 ~2 o/ Q# u: {& d" F
4 @. K# Y( J: i$ W2 T' s
[" k7 k& s8 O实物如下& `/ A* }/ ?8 J5 u! Y& A" {
温度显示
& ?" t9 J/ S+ x/ g: y+ e6 b' _
# R, Q1 V" s# ]5 x湿度显示 小数
! x/ l p1 \* c$ Y 7 X1 d. s |( J. @' z U
% V( j" g* w' j0 Z9 M
- {; v& ?9 L& q9 y模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。4 f* n: H1 X/ U. d2 A) R0 M5 p
) x' R% g! \. r单片机源程序如下:0 E, w- l) E' G+ G
#include<reg51.h>
( h. A; Z5 W- } a
' ]+ g, a4 ~( I+ k' H6 J0 v* g- _; R) Q) M8 J' T
bit DHT_Start();2 j c. O' D9 I
bit DHT_ByteRead(unsigned char *dat);# j) B5 E' c8 |9 Z- V
void ConfigTimer0(unsigned int ms);
3 E+ v' c) t) x1 B9 E3 L7 u* xvoid Display_hum(unsigned char *num);
7 G2 Y2 b/ F( c. I. [; O3 f/ Uvoid Display_temp(unsigned char *num);/ @9 f: Q4 g" x' [* H, L# E R
/ `8 a+ D9 L6 Y
" y( g* ~7 Z: {
: A! d/ Z4 |3 Q& q5 Z/ Q
8 w$ W( d; {* |unsigned char T0RH = 0; //T0重载值的高字节
4 K; R6 k" B: w/ g$ b" l5 w: T" junsigned char T0RL = 0; //T0重载值的低字节 ! c0 j! F0 n: p5 f# h7 M* f8 L
unsigned char str=88;& \ F7 }; y, n; K7 o6 S$ l
unsigned char DHT[5];9 ]' F# a8 Q7 V1 D5 v
: _6 U, W5 I5 M# l1 }: {
1 K5 E! Y0 [( Punsigned int tmr1s = 0;8 W1 b6 M) C9 q b" C; f" n% x
unsigned int tmr10ms = 0;
3 O" n, ~. b n7 K- eunsigned char st=0;1 C3 e; b m9 h1 @* g+ }; K% k# w
unsigned int sdd=0;
2 O, g p4 L$ x I" z4 ?% Bunsigned char td=0;
/ c9 R5 M v7 K3 iunsigned char mode=0;- M' B _1 Z. O7 a
, @9 C; i% o1 O F8 C# l- s. r/ c# j5 p4 ~' D- Q8 _! s3 [- x" C- a
bit flag1s = 0;
0 s7 L7 f- y4 }: W9 b, Abit flag10ms = 0; ' ?0 F6 M8 ?# b# H, o c7 G
int x;) a9 @' J* I4 T, ^6 k5 ]- O7 a
9 R0 d, c4 v% ?sbit button1=P0^0;4 V% [' u1 v) A" T$ E
sbit dot=P1^3; //数码管小数点
; m( n8 x2 S* o" p; ]* K
% C" y: k/ _# @) ~# V, e
- p; i( j. w2 b7 X4 P; j" C. l* m- ^8 k4 x% J+ R! v2 t
! J9 _' ^6 C# K5 A# a# d; i, mvoid delay(unsigned char x) //延时ms
! v- q" y0 Q" E, x$ t{$ I# L2 i" Y8 _: o' ]( ?% K
unsigned char a,b,c;
+ N/ S" E5 y4 |/ d- x9 L for(c=x;c>0;c--) C. b7 b1 n7 G* B2 {% M9 b
{, Z- x; j V* {' W" X l$ Y- D
for(b=102;b>0;b--)) P/ ]# j6 V/ ?+ s5 V( i' ?6 ~
for(a=3;a>0;a--);
2 y: r0 @4 g+ ~' j+ w/ p8 f$ _ }
2 e2 R/ x. k" w, b$ m6 T" m}, `" \! ]- W& w0 J
void main() : I/ K! Z4 s0 @1 O0 ^
{
( k$ z% H( e' \6 J7 F+ M) A2 d2 v0 `; N, b$ m0 N$ Z3 {
! B/ P7 t3 w0 P0 e" x) a4 k+ F
bit tmp;
- c0 p* q# V# k: `, N* @ dot=0;
) d0 u2 f' ?2 T# p EA = 1; //开总中断8 g8 z6 o' M' Y6 M5 T
ConfigTimer0(10); //T0定时10ms" Y& d& ]6 h/ x1 F0 E: c0 H
// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;) r8 `% S( p( P$ r$ j% n! [; Y
DHT_Start();
& m) _' [: ^, Z delay(5);7 G) I' F1 a* j/ T
" S0 n$ D1 z! B$ o
) F" Q- i$ \3 `4 s while (1)9 y2 s* H* ~" A( P
{ e; l' v( _1 w% k' i7 t, v; @. h
# a6 W }/ K% Q% ^) X
2 G. I$ ]" [% F+ Q5 v( y) L7 E9 m9 w; L4 Z( D# R$ W% p5 g! r
U& J; \* O- {* i3 d1 T if(flag10ms) //数码管刷新频率% Q5 L/ G: C* W7 K- r* ~0 P- ]
{
( W' Q1 Q, o- A5 i8 _* N) Q if(st==0){. ~2 g5 f, }0 r/ J' q
Display_temp(&str);( z/ R2 F% {: d4 l( o/ W- J3 q
flag10ms=0;
2 _" c) T5 A' Y% ^4 j- a) b7 H }4 N" Q( Z; L# P2 S1 I5 M
else if(st==1)7 Y. n" x% p: S* _ ^8 D1 q+ }
{8 B, g+ k! ~4 m# E3 _# H
Display_hum(&str);
6 T* H; W0 W9 d) f flag10ms=0;
9 k- ^3 a3 v3 `) F; E& z% F }
$ Z3 H3 G+ U8 N& y3 i3 l
1 b! Y* i" Z& V# U# l1 R8 P
9 R2 m$ |, t$ q* U6 S
3 V |# Z. z- k ) X6 E% X/ I$ \: \" U4 i) Y
}/ U& o4 }, C9 x* @. |" t
else if (flag1s) //每秒更新一次温度、湿度0 A- F9 |2 {7 W5 B* Q) L
{
/ [! A- _6 e& |3 D. ~5 W6 z9 Z DHT_Start();( i8 `4 K; W& ]9 c
tmp=DHT_ByteRead(&DHT);
+ N+ F% T1 g7 ` if(tmp==1)! v: a" F6 ]+ w* _1 N
{
7 X4 a1 q I; r4 u6 d1 Q' |6 b5 W3 u& S n
7 n1 b: J4 M4 b0 M
if(st==0)
. X& x( v/ a& L3 C g {
* B! y9 Z; b! K9 p4 f str = DHT[2] ; //温度; `$ U$ z/ S" w$ ~
Display_temp(&str);
- o6 V3 _8 e. K' X flag1s =0; //标志位清零) ^6 @) A* z$ C6 e( p0 g
}
0 B1 ?7 m! @3 [; C. g, m8 f" N* G8 L else if(st==1){+ C, P5 W" E9 z' N; Q
* h/ o! [, Q) e( T* y4 Q
& m" J' Y* l' }% R8 i. }$ j# g- \3 C3 c str = DHT[0] ; //湿度
& I7 v/ O( D0 Y- \- H Display_hum(&str);
; m6 b) x9 b3 E flag1s =0; //标志位清零) r3 j0 l. ~, e
}
# P/ x8 t5 o* c8 x5 j; x! G: C3 T3 z+ L: p/ M5 {$ ^+ b. M# N# _# V
, P% C# x6 W: q9 B! h1 i
) M* ^9 Y8 Z% T
3 V1 [0 ~6 ^3 d# ~3 ~- H6 H0 W W) X1 N' c
}4 |- `- b3 {, a2 N- X
}' o8 a5 Z& m7 ? W6 h
if(button1==0)
9 d/ M, u/ \, }2 p {
4 F' W4 G" O+ d4 ]3 c" t } delay(2);
H8 u( {) P- w: w 7 e |, Z; ~. G* a0 x4 W
if(button1==0)
2 K C4 s1 o2 _2 g! ~ {' I) S! }% ?. Q! l: |, I" }. L
' H9 ?% ~" \6 V# ` mode++;4 j2 k P) H$ s7 z8 d) q0 n: e
switch(mode)9 F, V3 c# }5 x, z# s8 n: c8 x
{
# j( _- g7 U) n8 Y! `1 P case 0: st=0; break;
) t/ G; a; \% i1 V5 u& }. U case 1: st=1; break;
" C+ G1 N. r0 o& w* P case 2: td=1; break;9 v, e; F; W4 ] n! ^& D
default: break;3 R, |$ f$ C* u. e8 g9 {
}
) ~& I$ Q' e% C. [7 _ f, ^ if(mode>=3)
9 d/ g! S& ?. X {0 p0 B) ]# O9 D) a# U" v0 J
td=0;- v6 L/ L; m- L
mode=0; v0 x F# F1 H; n
}
9 d0 `: S; q" ^" e7 O( K while(button1==0) E* R: ~" Z. Z
{
" c8 a/ a2 ]: k- ]! N' H, u }) Y/ T( C1 _5 E
& K4 S, m: `) c( D7 t6 [/ }& j- v0 S/ [: C! p+ X% s
m2 L! R) r) v# c+ {- W/ K) z4 D0 ~$ K. o' l
}
. M0 q, U: ?8 o% u; K$ t
- |- }; ~+ q( w) Y. g }7 p
$ u" o: c8 z) g# v }: {* C/ B3 S- K
+ c9 m% x: Q5 ?9 @0 t8 Z0 ?
0 v' K. y& ~' n# D! x1 W* l) c* D, I! ?
, M. b: q5 Q* b0 a) r
/ r' Q/ R/ W9 I( H# t: s
( {% u( a3 e- t! }/ f; K! U7 Q
}# Z- J# y9 Z% `( s$ i n1 N
}6 }0 j6 D. X1 y3 M( W' e2 w
7 A! S" V7 K; R) @
7 F$ A: I# b2 K/ `& |8 j% @3 f! b# M) B% M/ y1 p( M
7 h$ q& d+ A( D3 Y% M4 y/* 配置并启动T0,ms-T0定时时间 */
* f/ Z, d, ]0 L9 [. p( s4 G Mvoid ConfigTimer0(unsigned int ms)' b' c7 X @% B3 B0 k
{
+ b9 J& ?% p8 a5 w. F unsigned long tmp; //临时变量
- z1 D* |; y4 Z! Z: U . o: f* q* [- P3 A6 i! K
tmp = 11059200 / 12; //定时器计数频率
0 s2 J3 C) ]& k2 c% o/ Z6 Q2 f tmp = (tmp * ms) / 1000; //计算所需的计数值
' y0 {" z: Z8 e' k5 l. ^8 @ tmp = 65536 - tmp; //计算定时器重载值. [% o' X) H3 K$ Q4 x+ ~. B
tmp = tmp + 12; //补偿中断响应延时造成的误差3 F' `" M$ \9 M1 R8 P# ^" Q4 R
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节. Z4 s* z) t3 L3 Q/ m! G
T0RL = (unsigned char)tmp;
% b+ C* G! i3 l0 D TMOD &= 0xF0; //清零T0的控制位
, }7 g& B; @. K5 ?( }* J* j TMOD |= 0x01; //配置T0为模式1
4 i" p5 _) ~5 l* x" { TH0 = T0RH; //加载T0重载值
5 _6 U. ]( a" _/ y. G5 ], } TL0 = T0RL;
8 i# z7 T+ k3 I2 s ET0 = 1; //使能T0中断9 h+ d8 W% f. k0 F' S: ?
TR0 = 1; //启动T0: t$ S3 N- x2 } W# m$ x
}7 h8 @9 i" o) t n% g5 B1 d+ f
/* T0中断服务函数,完成1秒定时 */ g& Z7 Z0 `' _" M: r( s. F" ^
void InterruptTimer0() interrupt 16 n8 P3 v' P; s. W5 v: t- V4 D
{
" ]2 f: ]0 }' \) r% f
6 B9 a o- ~; m+ y( a; k @. g3 h
TH0 = T0RH; //重新加载重载值- N# v6 J; T6 _4 x* Z2 U
TL0 = T0RL;5 m4 ^% }3 _: `' q/ |
tmr1s++;
/ N6 _ b5 Y- O& g5 { sdd++;1 D6 ~/ f2 U; _: q) n, h' K4 |
tmr10ms++;- a9 J" r- [- i i; J& z) G1 m
/ o7 `, Z$ s5 K0 R
/ f* m! T9 N. A0 J
if(tmr10ms>=1) // 数码管刷新频率* D: G# `# w2 U+ \: y
{8 e2 Q, b! C7 [: c
tmr10ms=0;
! T- k# s' q, d2 r U: H flag10ms = 1;# \- I9 n# V9 n# _! n3 k4 a$ P
}2 S% P7 n) ?( l/ _7 G& l
if(td==1)
) n( T2 ]7 M- p- U; X% {! M# v X, n# | {
+ M, Q+ X8 |7 u( X, C$ F% C1 X: n; i if(sdd>=500) //温度显示5s 、湿度显示5s
6 F3 J( U. s. X4 J$ R( w {
; F/ b& f2 c! U sdd=0;2 J" h( t3 l0 V- l5 c- Z
if(st==0)% e6 l* p3 g5 m! {
{
7 |+ h( n" O) q st=1;
6 _3 Z: M% R5 y5 O% J }1 Y: n+ i0 A+ U
else st=0;0 r& A& z8 p- |8 m& v5 }1 C
}
2 E6 |+ d* [, ]; E }
0 {4 X9 ^6 Y' ]" h! ]+ r: E! F2 X! {' K" d if (tmr1s >= 200) //1s 数据更新频率
9 M7 w9 n7 ?4 D0 W6 P {% r4 `* D9 ~+ O8 P3 v
tmr1s = 0;( v# J$ @; p! L" U j: l+ c2 S
flag1s = 1;
# E* z" z' H4 Z- P% U) b% p4 n }8 i W* a4 m2 ]# P: E& @$ K
$ X) z! B9 Z7 o
, z! x: D" J' R- Z6 a % ^- y% p6 k6 D- u+ P* J
}
' m! l, }3 n$ _$ q
% [- m3 @' X$ B4 }( n
5 x# ~2 K8 [2 e+ `下载:0 x" Z8 u Y H# ?. x ?" ~9 u
) [* k1 G( j4 X5 D% k q) [" y! W- S2 U
|
|