|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码
" e7 S( B: g& @7 t( {; W' A. Z3 Z) |( N' _2 b- [8 T. S" Y
8 @1 L6 t* g- {( S* Q2 t
仿真原理图如下
9 D. w. E8 ~4 l# d2 J7 a( j
1 q D" J+ j: E/ f. }) |% J# J9 F7 D. w
按button1可以切换模式
+ r. Q( @3 \9 T# h% x- \4 \模式0 只显示温度' T' ~1 h9 Q# S/ U6 }- ], J
模式1 只显示湿度9 B9 _8 ~! W# S& }, P$ y8 o
模式2 动态显示温度和湿度,每5s切换一次
3 s* u. ^0 A) l5 S/ g% j8 p0 y7 v/ \) r& T2 U. ^. D: }* b$ `
0 C4 T8 A' B+ s3 t4 U6 w实物如下3 o5 z. }1 u$ w( x* J6 x* o
温度显示5 b9 D: ~9 ]/ n" y! c8 Y
! i3 k7 p) Q; h8 I$ L
湿度显示 小数# c6 Q" d6 q& ~: }' f8 H
$ ^6 R1 [! d, m
. a! q0 `2 a3 |' s & v( S2 X' x$ i2 w
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。
8 r9 ?' P! r" w: p
! P9 @! Z* U; }4 ]+ F单片机源程序如下:
/ S5 q/ q+ E$ y+ \8 \- ?. Z#include<reg51.h>
0 [. M' t8 f1 s% {5 K$ O, [+ H! F1 J1 s/ n9 P+ k% P. H2 p4 ?# r$ w
2 f% t" y1 U% D9 D) ybit DHT_Start();" G) y. x l( O$ c3 e7 {0 ^ k
bit DHT_ByteRead(unsigned char *dat);
: w) S* O! e# O$ W- gvoid ConfigTimer0(unsigned int ms);
* t% {% r. \# ~5 t( \void Display_hum(unsigned char *num);5 |7 ^5 j$ ~: L/ N6 y( l7 ^9 V2 o
void Display_temp(unsigned char *num);4 r8 u: ]0 S. I% \* o- a2 T
0 P; ], o& N+ J2 R
% G$ Z! X& M4 h g3 x
6 B, l* y$ y' j6 c0 V, d8 _" ]# J$ Z' c# S" m4 D4 |! a0 @ E
unsigned char T0RH = 0; //T0重载值的高字节8 ^7 @! l( f; Y& c2 q/ z+ p5 d
unsigned char T0RL = 0; //T0重载值的低字节
; p/ V0 N4 Y5 {0 punsigned char str=88;
4 Q8 P3 O! h- p) Tunsigned char DHT[5];
2 f& F1 N% A8 d3 L% z1 W; ?: n* ]* P7 O( E6 O Q n- _. k8 t
( B- V9 l4 Q" `$ Eunsigned int tmr1s = 0;* j( a0 d! X2 ?4 G! I- t& p) i
unsigned int tmr10ms = 0;# u, R, G8 W" w
unsigned char st=0;1 q0 Y7 t/ Y- M3 D- I
unsigned int sdd=0;
4 f% d; g! }. N" q/ J9 L3 C1 ~unsigned char td=0;
& f& ^- b/ o r) qunsigned char mode=0;. {# ?0 I. w7 b) B& o2 x
6 y* O. J* p% s8 {' z U
* J5 }' Q5 {: m3 _" p& n; [bit flag1s = 0;8 y$ H( Y% }" }! k0 W
bit flag10ms = 0; ( a9 _" b, ^/ f+ ]! h
int x;
+ |2 J" ]& d- o6 E8 J
5 u9 E0 f% g7 v! Rsbit button1=P0^0;
+ N1 `6 W! C: Fsbit dot=P1^3; //数码管小数点$ X; [0 U- d5 R4 B
9 j3 p3 u7 g3 G# a: @
4 x; R2 [) F+ O$ a9 O: X" e
9 _) t7 z1 L% ^. R; u
7 F* g N8 _3 |* o4 f+ S6 M9 Nvoid delay(unsigned char x) //延时ms
4 T& c; h: n8 D% k8 f{" x1 q- A* j2 [) t5 O
unsigned char a,b,c;
0 c+ T/ p/ N+ i# m5 ^* h* ^ for(c=x;c>0;c--)
& [5 D; O9 @# N) V3 r9 K4 x {% e% z. K! b6 M: H1 B; X5 m6 @
for(b=102;b>0;b--)
, i3 p) h n; x for(a=3;a>0;a--);
+ K% v0 |& L1 {! Z5 ~) r }* E& |4 f6 U+ D7 x
}3 z6 H9 @8 M9 y3 U8 X& h6 R- L) F$ Z
void main() / @, ]5 L7 n9 W6 _8 a3 w+ z
{ : ~2 P' z/ M0 U
! N* a: r. I( H" C1 I1 c; ^0 B2 D3 j! b6 G" x
bit tmp;1 Y+ B+ _/ n& g5 d" H4 Y9 G
dot=0;4 z2 U3 e+ u9 a: f
EA = 1; //开总中断3 g: V( p: d3 k4 J7 _
ConfigTimer0(10); //T0定时10ms
9 Z0 Q6 e# u, q8 _7 d" Q% q2 n// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;
1 `3 l* v# Y! s: e3 X9 ^& s3 S$ a* ?# m) k DHT_Start();1 ?6 q- v8 v& U! C F% _9 P0 J; C
delay(5);# k7 c/ z8 k0 g
, o) {, L/ y1 e
1 B2 T! x* v4 E" f" F while (1)
6 V" Z# B3 Q' A" I$ B! |& v1 c9 T {
F* N) l' q; `4 Z, ~
7 D$ J& M+ v1 |$ {# `
7 d8 L; H7 D! o6 C$ [; `1 S& O; |
. a1 s. N. r- x5 I) c" Z4 F" C h6 C7 S0 ?: z( b% v
if(flag10ms) //数码管刷新频率% G7 J* O. U, O- M; {2 b
{& D4 p* i n0 j- f# c
if(st==0){
4 ?9 J2 _! N% ?* w# P( { d Display_temp(&str);
; v$ G# D" n& }+ D4 z' j* v1 B0 L flag10ms=0;
, `* X1 d2 k/ r6 N8 ]% S$ P }6 u4 k1 w( y5 x+ W9 B
else if(st==1)
& g8 P) o+ U- K- g5 x2 O7 J8 }! v& ]* o {
) l- e( y6 m; u! h Display_hum(&str);
" a1 n$ H0 S' l6 G g flag10ms=0;' D; @- n+ Q+ H; Z# q
}
2 Z. G( U; g9 Y) B# G0 \" V }! T4 v. i
* a% t8 L# \& B) E7 E , r& E* n$ a( Y
5 l6 h8 ^/ e3 J4 q3 G. T
}" w3 G( ~0 ]0 U/ E2 W
else if (flag1s) //每秒更新一次温度、湿度
/ N2 p. z, j& w {
' a4 t! j5 L& z; g% j" P) E5 Q8 y DHT_Start();4 @$ t; L) q* u/ V B
tmp=DHT_ByteRead(&DHT);
9 j: p$ w$ X, H7 l8 ^. X if(tmp==1)/ Z. @" g' I& U
{
, o* q H& x6 l7 n$ E" V6 f0 x! I7 |
: ]8 Y ]7 c0 B if(st==0)
8 }. M m4 b. a3 b {' f- b- {# H- n& Q4 Y$ i$ t3 n
str = DHT[2] ; //温度
& ?) X. S e- g$ h Display_temp(&str);
! D& K, v! ^; c' F. Q+ p$ B% C flag1s =0; //标志位清零1 U* B) F" D }6 W9 J
}
: ^+ I4 E5 v* e else if(st==1){+ O4 `. {. r: S! J
' h3 E- t# x% B! ^! _6 g! x, Z
- K4 c7 h1 K2 X str = DHT[0] ; //湿度' ~. U. g( y. ~% P1 F! t
Display_hum(&str); 3 G* \# E4 v. `$ h
flag1s =0; //标志位清零
8 p5 H( D7 O+ h* x+ S/ d }& v" ~" m' Z( _! h
6 H. n3 ^6 Q8 ?' C0 w% @* J$ b5 W0 N4 T r& u' w+ W3 ]
' A8 [- W/ a5 ~% a0 ?3 y
, u1 j4 C$ ^) ?) d) L2 J5 U, U3 `$ r
# g. h8 q1 V3 D: O/ D! [, K9 R7 \ }7 ~: _: j( H) Z0 z: d
}
) Y9 M* I1 C4 l) k0 K) k if(button1==0)/ `0 a! \+ O! [/ o3 z, v2 Q/ p
{
3 x2 A- |* ]& ]- f% _ delay(2);
; J4 m7 e1 D3 w1 Y7 M: P
7 Q5 w7 |' l. T" v. x7 ~: M b( j if(button1==0)
/ |3 f: n" z2 q) `4 m% J+ M$ p {! [. i. i: {: x0 B' [) Y+ V* q
f, D# {5 k5 Y. H mode++;3 q5 ?6 c& D7 t1 _ `
switch(mode)& N+ L/ f- [# k9 A3 S
{( d4 V1 `" S2 \# ^' S: Q) n' I# x
case 0: st=0; break;: q( X7 T9 w4 Q/ H+ U
case 1: st=1; break;
; Y# Z$ K0 a" s; _$ ] case 2: td=1; break; T! ]( k8 _7 B9 A+ K) a0 F5 Y/ T
default: break;# G' P+ ]8 B6 v' {' L/ n9 B
}; Y6 K; O( a" {8 {
if(mode>=3): v" f2 ?4 s$ A
{
/ V9 Q4 d: r S5 Q. m td=0;
! H. ^1 p0 s1 {2 F mode=0;
) C' A4 M1 d4 W& p }
2 U2 C# `! _3 k8 }+ L) T- e while(button1==0)
' y! U1 X* _& O {$ V: `& V+ G; s, r: `( o* G
}
. ~. a2 m7 r5 x
5 l# M# H( a0 \' u& A
2 x: I/ ^0 G, B& O! u, g/ f1 b3 N- E
6 U2 \7 V7 V6 G5 {
}% l& X- _0 `" g1 y, D6 G* X
) b* K$ w2 H) [# i; u0 e
9 P- s; C" C) X) b) M }
d) r+ E% E- ~" p! r
+ f, e/ R- l+ {6 B
9 G' U/ M6 v1 b! m' F$ v4 Y1 C W u8 X( h- p2 z2 G
7 \6 c" j+ I% Z+ f( w6 H+ b4 P5 F% \1 X3 m* C" h. E. B
# @ B0 z, ]" r1 S3 T, l }- l# [+ H( N( g& \
}7 m' L; m6 j2 x0 D0 K( G9 ?
) w: Z. C( W( |0 \7 X
; G7 Q2 l C4 F4 } f
& b& X9 N4 c( m
- u' [1 X( i# ~8 r& M0 y/* 配置并启动T0,ms-T0定时时间 */
+ i0 G1 }" ~+ R$ K3 `void ConfigTimer0(unsigned int ms)2 g) T! ? N& a0 {
{
- a$ D( K: O- D& Q3 @" [, t# j unsigned long tmp; //临时变量
% \1 g4 g9 C* a* N. }: Q; i 1 D! f' |! b4 v
tmp = 11059200 / 12; //定时器计数频率
' o- R& H2 D( M) P& X6 s7 R tmp = (tmp * ms) / 1000; //计算所需的计数值+ r }1 m8 E6 R. ^% \( e- a5 n
tmp = 65536 - tmp; //计算定时器重载值
2 M( A9 i' b, p) t& ^ tmp = tmp + 12; //补偿中断响应延时造成的误差
+ ]1 x. B" p+ N" l T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
% X1 g; n6 ^5 E" [4 a U) _ T0RL = (unsigned char)tmp;% a2 X8 w" `. ]( V, y
TMOD &= 0xF0; //清零T0的控制位! m% {! j5 R8 v( I
TMOD |= 0x01; //配置T0为模式1
# B" t/ ]. b; O8 N5 Q TH0 = T0RH; //加载T0重载值
6 |( Y/ B; i. ^ TL0 = T0RL;/ ~, I! d+ W' A) V5 C
ET0 = 1; //使能T0中断, W$ h) T5 _: n% K
TR0 = 1; //启动T09 c4 x; r- m; h e( ^! ~5 Y
}) d+ {6 Q1 H# A8 w8 X
/* T0中断服务函数,完成1秒定时 */3 m' K, {- f: h" B/ ?
void InterruptTimer0() interrupt 1
4 u5 A( d) r! |, I5 d! }, p{9 t; i, c9 B6 g" P1 h% {
. [* u! K$ _! Q7 I2 E
; d& |" U- S3 k( M+ p i) q: S TH0 = T0RH; //重新加载重载值9 [5 n2 ~3 g1 }. m% ~( J
TL0 = T0RL;
* c' h/ H5 y3 Z- j* Q6 ~' i' s tmr1s++;. ?$ o h5 v& q, D9 ?
sdd++;
9 s" W0 U# l$ G' v# m5 b tmr10ms++;% j+ w7 D5 U! }) N% P$ c! Y2 F
, T) |1 M2 i& |) d9 F* P& Z3 V% o; W; Z5 w
if(tmr10ms>=1) // 数码管刷新频率
0 m P& y# o' }8 {" I {% v: ]5 d0 k2 y6 I
tmr10ms=0;( D9 T/ O' O7 W+ n9 K
flag10ms = 1;
: g) C. d0 a, K9 H" C4 F7 Z0 N, S }
/ q) y: h' n5 Q0 D if(td==1)
; F5 h: Y- W8 }( @/ g {4 u2 x( C9 ]: ]2 |0 i& x
if(sdd>=500) //温度显示5s 、湿度显示5s
- H1 Q- A& I0 ]3 H2 R0 ^/ _ {' W7 p/ }% @; E3 h% F( Y& h9 \
sdd=0;
. k# q7 t6 ?7 Q/ F1 B if(st==0)+ z9 I2 B; h& @. y2 [
{! U5 M8 E' F* r
st=1;' U0 D/ \& s( W* g4 v9 \- K
}
1 O4 a9 i: E( {6 U, Q K% v else st=0;/ P' r& t- P( C* P7 t) B4 C0 o
}
! ^" A' L6 i" F: n2 R- n0 O }
& ~7 ~' h) C, g9 h0 s) ?( } if (tmr1s >= 200) //1s 数据更新频率: w3 E0 Y; j+ e% G7 a' [8 ?2 e) @
{( J* f# ?1 j' e) d; G ?
tmr1s = 0;$ T2 u. P8 M! z5 U, Z
flag1s = 1;
- C$ [2 q/ j; Y" I+ Z% K) h1 q }
( W% `/ E9 |( O7 }# a* `
: y1 u$ o- |7 z* K2 c8 D# S
# G1 r' w( F, Z; P. \ 9 X, S; Y2 Q9 Z) A4 S9 C( c
}, g" S+ |7 v, K2 R
7 F) ]0 A% i" g8 U( ]1 z! T) h9 k
5 X/ j% x# q. ]3 i% @下载:
3 K: ^- v& H' i+ O. X% L& q' ?2 v" G
" R- [( i0 h" u: A; p' F8 @8 } |
|