|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码
. |3 p0 Q, ~9 S2 u- _1 U& n. }+ l) [% K
; n7 P. ?( U: D* e
仿真原理图如下
1 M3 M3 {2 w' i- \
$ v P- o, ?2 i- B9 g0 V! ^7 U& p J8 X1 e d
按button1可以切换模式
3 u% U+ j4 j. s模式0 只显示温度
* i1 o. z0 Y) }. f1 W6 Z0 r" J模式1 只显示湿度% c; `) o2 f7 g% s- L0 p! l
模式2 动态显示温度和湿度,每5s切换一次
- Q( ~) {. @3 ]' A/ X. y7 V* t. F& T/ e7 x' t
. c% H, ~0 U* K$ t
实物如下( R* l1 m2 F0 T8 e1 s0 w
温度显示
9 U- n2 S# i7 s o! Y" G: \
3 N9 [: j* |0 c0 Y/ Q) ` ?湿度显示 小数
) v3 d" ]% e4 W
2 ]/ P4 t% F N/ i: L, M: \$ k
2 g3 o3 {: M- n, Q5 y( f " W' I' h1 {$ g3 ~. k: b' s
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。
* b- _9 ]4 [, t+ ]
7 n! v5 _2 U$ V- s) T* A$ p单片机源程序如下:. v0 l: [2 R% g; \1 J3 L
#include<reg51.h>
; E' X/ k# r! U; Y9 Z# S) P! X& [% `7 p; O7 r& L2 [: Y% c, j
% G# I. n! g& o X# C
bit DHT_Start();
5 ? @' T# X9 B6 [bit DHT_ByteRead(unsigned char *dat);" s5 o1 p+ z% _% g
void ConfigTimer0(unsigned int ms);2 c; k- [: r- A6 i5 l3 d
void Display_hum(unsigned char *num);/ R1 N+ V/ g1 c0 l2 ^5 h
void Display_temp(unsigned char *num);2 m. x7 ~9 q2 Z6 l
" n" n# B! O& ~2 T+ x" S- D( ~% P( w% ~3 _0 f
1 F% h4 @& J) e8 I6 D2 T
! R) Y6 o5 _5 b t8 J) O& sunsigned char T0RH = 0; //T0重载值的高字节
' N8 D A) s" _( [unsigned char T0RL = 0; //T0重载值的低字节 - j2 w+ j% g8 \- x( `$ m& x# C
unsigned char str=88;$ c" d& P+ y1 ~8 F R, P
unsigned char DHT[5];
6 t( _/ o \( w/ d" E# X6 _9 W9 i' U# i8 x* Q
I7 C- y5 A5 }/ S" F' \
unsigned int tmr1s = 0;
. Q, g4 Y8 S& W2 N. L6 d! W2 eunsigned int tmr10ms = 0;' Y2 }: E+ G S5 h, a( m# g
unsigned char st=0;
4 F5 t4 d/ j* F2 ` Z, K2 ]7 b: Junsigned int sdd=0;! F( l6 y; E6 Z0 B) ^& z
unsigned char td=0;
8 A5 E3 e: Q1 V) E$ M1 ?0 B4 O2 i8 dunsigned char mode=0;
- `3 @/ B# K0 P7 \
! L/ i5 V8 ]6 c7 H% w% I1 _
5 _7 o C, ^1 K$ |bit flag1s = 0;8 }- k- {% m0 w5 C
bit flag10ms = 0; 6 I* K8 P2 m- O, @& {, ~
int x;
$ H" _1 ?1 I9 |1 E, H5 i) c+ p
- B2 L$ l: q- ~1 j6 o& osbit button1=P0^0;) w9 B! W& E0 d' L& p) c
sbit dot=P1^3; //数码管小数点, V% i6 J/ A% C6 G q
0 R4 Q% |" E7 Q
7 F' s! c& F4 a M
( w3 @" J1 c( w( r$ S4 ~
: F" c2 q8 T0 z1 ~& ]/ P( Y0 D( Bvoid delay(unsigned char x) //延时ms
( C7 S- e$ x7 {$ ]6 D9 h5 X( h8 _{1 z+ b1 i) f: s
unsigned char a,b,c;
3 a* M5 q+ e$ _3 Y+ l for(c=x;c>0;c--)& I9 u$ k- H$ [0 f
{
2 m7 y0 O% f+ b6 r- G, _+ P0 f$ ~6 N for(b=102;b>0;b--)8 o. C6 x3 q' M) R T& v
for(a=3;a>0;a--);* K4 A7 m7 `0 O E- a
}
( E$ z3 K2 N4 T6 m- |, x$ Z( U}. Y1 B3 m; b- Q b1 r/ W
void main()
$ R3 G# l8 t) L- j* T2 |; O. x{ . T" @. J6 Y# _4 [* v- ~
* f1 L) R" H, u1 S# j% M' \
* q# f- j0 g l- V- C6 R8 f bit tmp;9 S' C& o3 r. }% D0 s+ A# i
dot=0;7 A" n1 k8 I0 ~3 S
EA = 1; //开总中断
' ^: A1 \- s k: k ConfigTimer0(10); //T0定时10ms
5 s' [( y7 n3 Y# ~7 W" O6 ~: R. }" s// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;
t+ i* y& o, w DHT_Start();1 ~1 q- x, z% `
delay(5);
2 N, [1 Y1 t% E8 F8 g4 t( Y9 y) B! Z1 P5 h; O* k+ n; ?: R
& H$ m8 x7 [, k! p8 L while (1)! K s+ \* B8 e2 `/ j: V
{" ^. a+ O& I$ x$ L
. _) C# u. M8 G/ B6 [# k% W8 _$ R2 H( C; j2 a" B% C: f
6 b$ n. k: _# s, Z/ T2 }) ]
3 ]& W4 J% g" R) Z: c& h0 b if(flag10ms) //数码管刷新频率
) }/ U6 k5 F% ]- P* ]: E& W" ] {
2 z" ~5 r$ I) q6 h1 Q w if(st==0){* N( K4 Q, s+ G% ~8 `) p
Display_temp(&str);
$ y# Z, ^8 }1 P8 I8 h) i flag10ms=0;7 _; ~3 ]. d& U: W3 k) s
}
* F7 |) g$ j' g( R) n5 @! s else if(st==1)
v/ ]6 ~2 }" r, w: Y/ w7 F& h {
+ X( ?, D1 V: T* S& u+ I& D Display_hum(&str);
* [* c' f1 [. h& N5 w flag10ms=0;) |9 C. A" s0 O1 D5 g4 T( V" ]& ~
}
* }5 ^: h( n: h1 Z9 g: U9 u# u( o f3 r& C6 l/ b, _! J) L+ r
8 U# X* }5 m+ C7 f
& @; [9 {0 N0 T( r! E) i
$ \3 Q; z* p# m% j! m! c9 e }
3 A+ B0 M( E0 X else if (flag1s) //每秒更新一次温度、湿度
* x; U) k$ J; Z8 _& N {( o' D8 t' |0 o+ X1 D' r- u, V
DHT_Start();" Q% G0 j! n8 j" B$ a
tmp=DHT_ByteRead(&DHT);
- F# Y% j5 \5 n, D1 ? if(tmp==1)# m. R4 M5 R+ O+ ?0 W j
{
- @# b6 p& U/ V1 S: g" a: u& N1 h( g, c5 h2 M4 q
6 x' z$ E' K/ x1 j+ w0 y if(st==0)) n4 j6 ~/ Q. G/ l* ?2 J$ \
{$ F. ~: r4 G7 ^
str = DHT[2] ; //温度
. a* D( f9 ^9 c* Q# w Display_temp(&str); : ^/ Y4 ^+ C3 N& m3 ~: Q$ E
flag1s =0; //标志位清零
6 i+ {# i3 V+ f3 n6 t# @2 L- K }. }. p, O( p( H: W C
else if(st==1){; @0 P9 X* D3 F6 i; n( B
6 ?- l3 Z2 e3 w+ [# B+ C
, D$ F$ E9 V+ _: t& s* \, V str = DHT[0] ; //湿度# l Y0 d# j5 A$ z1 U9 J
Display_hum(&str);
4 ^# _" S( ?) y# t flag1s =0; //标志位清零
9 t8 i4 v" ^4 k$ M! @ }! p; ~* G2 L$ ~: F2 ?
) g+ e2 J& E/ j! b& T
* H2 b2 z2 @; c* }; G+ e% X* ]. a $ [* r: O, g, q! D3 K: m
/ @% Q2 C" }3 b9 ~3 @- v1 ^9 Y8 v. K
}! Y6 O% ^% U9 S. D# [
}& ]! `/ B0 x+ J8 \' m: K6 m
if(button1==0)
, a% {9 M& U: A {9 T( t. t6 q/ A7 g m7 m
delay(2);0 Z' g1 z1 r0 `2 A6 M
/ E5 X: e* a$ n' P" U: G
if(button1==0)
5 Y1 O7 T& b7 Q: J {# |% z9 C {3 _! m6 X; z/ a$ Y8 x( R
[ v: @# m+ G4 {6 j mode++;
5 |6 g& I5 s* Y* [ switch(mode)
' T; R% P& o# T, w; P o {
& q6 r' K# Y0 j5 W$ m8 h. u case 0: st=0; break;
9 l" _; E* h* M% R( U case 1: st=1; break;
8 E; `7 j% u1 ~1 O case 2: td=1; break;8 ~0 b# D: `! b" B( l+ I9 n
default: break; x }3 m- k# h7 ?2 O7 H
} O3 `1 G! I0 J1 q
if(mode>=3)
+ T1 s" [' N7 u+ H {1 a8 A2 F( k( N/ H- r) S
td=0;
+ ^7 m S) R- J; `! r mode=0;: x: C0 _- g( N+ j4 x8 J
}
& ]5 B/ F2 x4 Q# _ while(button1==0), C- K# ?* {5 s# U
{
$ y2 M4 R+ w1 T. ?4 |9 [ }
; W! A. S5 C( g; X! D4 \7 ], h2 d ~
2 V0 O6 q0 o0 r" F' T: n/ Z+ c/ J& }/ X0 c
) D D6 L0 g( r6 a- M
}
# T3 B( c) c5 n) {* {/ `0 l2 E& t
4 |) h8 \9 Y. a
7 i- D; b3 @4 y' `2 j- x! Z } t& `, [8 Y/ G& x6 O5 i
4 `8 Z% _- K2 Q( g4 P0 G, e" }- |0 _. |- ~% ]: m
( x: X* J7 g7 C
" f: K* ~$ _% X$ h+ f# d- e" e7 T- }1 c9 ~5 }* `& H$ C% H! ?4 ?
7 L3 W4 n: d2 U6 a
}
. |5 a; u M+ Y7 M, O}
* Y3 P* @* M' i2 a Z+ ?! M( U$ P+ @! m" ]
2 s$ h N$ K0 a: E
& G; E8 I& y1 A& C/ s& n
! z: b) t: ^6 @5 D' W/* 配置并启动T0,ms-T0定时时间 */
6 M$ f, c5 H2 N1 m: vvoid ConfigTimer0(unsigned int ms)
$ `6 l- n- f/ [2 ^5 o{
0 l+ L* ?; P" }# k0 h unsigned long tmp; //临时变量
' ]* G( X( _3 f4 q
! [4 v3 \) k, O( }; a- |9 P; q& [ tmp = 11059200 / 12; //定时器计数频率
3 A# q6 E. \: M8 b1 J6 V: M tmp = (tmp * ms) / 1000; //计算所需的计数值
* E) P a- D6 f7 \/ p+ c0 n" q tmp = 65536 - tmp; //计算定时器重载值
* ~- x7 I3 Y4 A s& i" P( A/ U: Q tmp = tmp + 12; //补偿中断响应延时造成的误差& D* Y0 z/ y& C; C! s5 _
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
. D2 M* R' M, W" y T0RL = (unsigned char)tmp;9 _1 F% e7 X# S i t. h
TMOD &= 0xF0; //清零T0的控制位$ c" ~. t* Y3 O/ Q8 z( d" b
TMOD |= 0x01; //配置T0为模式1; F( X$ P- ^. g6 _
TH0 = T0RH; //加载T0重载值
+ b' @- c/ {7 b TL0 = T0RL;
$ B. K4 a" m2 r8 ?. Y ET0 = 1; //使能T0中断$ x) w' `( U( D8 b0 [) f
TR0 = 1; //启动T00 H3 J: T6 w G7 s' ]
}
: N/ P% T3 j3 w' R) b/* T0中断服务函数,完成1秒定时 */
3 @6 N7 Y- ]$ \. c( Y+ Kvoid InterruptTimer0() interrupt 1
5 R& v8 Q8 C2 ]& N- J7 K2 z0 |{
c) q @. Y S5 { E
: g3 D3 K4 x) ^9 B+ m) d0 R. }( [6 E; t% ?% ^
TH0 = T0RH; //重新加载重载值8 p$ p6 s/ a# g4 _
TL0 = T0RL;
2 f/ N) w, p- K0 }, E tmr1s++;
" a6 o8 f+ i% H sdd++;
0 J1 |8 z) e& K c1 V+ w/ D- q tmr10ms++;& t5 i5 w) e% x/ T
# U6 N+ e: V7 f# a/ u
2 L4 w- {2 j, v ?2 q1 z0 Z: B
if(tmr10ms>=1) // 数码管刷新频率
% |+ c( C. S5 Q$ |7 q8 M {9 k$ f+ q5 p5 t
tmr10ms=0;
) ^& N( X- b; `% L0 C/ q$ q8 V flag10ms = 1;" M$ p7 @0 N- _+ J5 {6 t5 ?
}
$ @: A& X( s' D' I if(td==1)
! j4 j6 V E0 S) W. P& {2 g {
! g" p% N- P3 c( [ if(sdd>=500) //温度显示5s 、湿度显示5s
+ }+ J2 g l' l {6 ^0 c! g& f# S8 b1 o x6 `
sdd=0; V3 f4 b2 n2 d2 I
if(st==0)9 S: E% V8 i2 c1 K8 }) r
{" T8 [6 ?+ r9 d* Y
st=1;
$ O) y6 r: i# L' ?4 Q. E9 G7 f2 ] }& \* Z! G, Y, {9 b V2 g
else st=0;/ m/ E$ X5 G& z: ^2 h# j
}/ @8 u- D* t; ?
}
, K% t$ z, i2 Z( h* Z3 @% `+ X if (tmr1s >= 200) //1s 数据更新频率- {1 [2 X, k( T
{, L1 H% Y+ b, m- X, j
tmr1s = 0;& v4 G8 l! B% Y6 T) f* Y! }& W
flag1s = 1;, _5 c8 M9 p% l7 }* I
}
# V' L4 a3 ]* A k E- K; X8 a: t3 R
% y8 `% k+ @! ^6 @% D; h0 Z6 ] 8 y* w; Q' H* _" b2 E
}
, b& @# M/ B' w( y( x7 P$ r
) a! V, l' \; |6 z% H/ ~0 Q0 N4 j+ r- K, R9 h9 l$ b' g& f( D
下载:* I9 m( r/ J- J! e
+ y) |4 w* f; s5 ^' O. E" f6 `; [3 M( t: D1 j8 C0 Q" U: H
|
|