| 
 | 
	
    
 
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册  
 
x
 
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码 
2 b. W0 @! Q& J* d& K- j$ |7 y8 R9 R& R* Y3 p9 T6 i 
$ E2 k9 O/ p0 b% Z2 m) s 
仿真原理图如下 
7 |, E* D  }" t( b7 B' W   
9 }1 a* E" S; j/ C. t5 Z: R" v) G- v& W- J6 Y" Q 
按button1可以切换模式4 k6 b$ W3 H# I 
模式0 只显示温度 
: |& Q0 S' z, o+ a# ^* o/ b  p模式1 只显示湿度 
, B: \' L. w* i1 g- e模式2 动态显示温度和湿度,每5s切换一次+ ]; E1 C; z7 g  d) `+ ^0 b/ S+ g 
 
# r( v4 N! u: r3 U. w' `/ F. Z, {$ O& v/ K9 W 
实物如下 
+ T8 W4 M9 S1 X* |温度显示 
. M/ a; M$ [. |  ( o: o9 n  Y/ U7 y. P  t 
湿度显示  小数3 X+ u; F& |( B" y/ F5 m 
  # G# j) k0 s! w9 }* s 
 
& ?/ ?. {2 w' A   
+ v) F* w6 {/ ]. T) b+ t模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。 
& ~- S8 V3 E. \6 N7 J, t 
6 _, z# W' ^) E; q单片机源程序如下:% J! D" ~6 `; T0 u, j3 v 
#include<reg51.h> 
: E0 w2 s% h5 h7 U 
, H4 A9 _, [2 J& k% v& o  ^4 z7 G2 u: C3 N- z 
bit DHT_Start();5 J" i' V! _; f  ^ 
bit DHT_ByteRead(unsigned char *dat);; W8 `! e( z& z, O8 \0 Z 
void ConfigTimer0(unsigned int ms); 
) f! F. v) W+ v% G/ dvoid Display_hum(unsigned char *num);$ k1 A* x' K. l0 Z7 C 
void Display_temp(unsigned char *num);" {3 S& _6 n1 @1 ` 
 
4 q* q1 M! h# C# C' f 
1 \# s& e- `6 ]3 D7 N3 i 
( G# ]! s6 n: L( w0 `  s% F# c0 q 
" [( S5 V7 S6 _* ?" junsigned char T0RH = 0;  //T0重载值的高字节; X- B/ M0 W/ N+ X 
unsigned char T0RL = 0;  //T0重载值的低字节  
/ D; r% C/ U% Sunsigned char str=88; 
6 ~6 w. a$ Z# c4 E9 i% kunsigned char DHT[5]; 
% W  X! G) W: i% c6 Q+ g0 h) [ 
) N; R$ f, \7 p! t( K; ?! U: u* F& b4 Y8 @' G: b4 S' A 
unsigned int tmr1s = 0; 
0 j. o& @  B- u. v  eunsigned int tmr10ms = 0;# Y; z- Y( `  O8 ]6 q+ P0 g; q  Y# q 
unsigned char st=0; 
' u( v, E" E& v; h: n% }- Uunsigned int sdd=0;1 I% ^( v( [, _5 I 
unsigned char td=0; 
, ]- i: ~4 v5 |unsigned char mode=0;% Y) F$ s) t/ j: I6 V8 c5 A 
2 J8 B( v5 Q. e2 h 
 
. \- I9 ^% M( R- D# P9 cbit flag1s = 0; 
7 G  }+ E" c. b4 o1 Sbit flag10ms = 0;  
" P- M: R( p$ Dint x;- A9 V( D1 b' R8 @, V 
             % p: H/ L5 A9 H: t 
sbit button1=P0^0; 
- V6 n! K" S6 `) J/ I! [+ jsbit dot=P1^3;   //数码管小数点8 {6 c7 l) Q2 {$ P! S* w 
 
9 b" F+ f" i8 z$ L5 r  _: c" ?% S* p6 ?. v' S% i+ i9 F8 @3 T+ N6 T4 k 
 
6 O& @8 W7 s' v& \ 
* C& [/ @( E! O. C& @- uvoid delay(unsigned char x)   //延时ms 
/ }- ^9 H% g, p0 ~' ?{" ^4 c2 O: G4 M( z 
    unsigned char a,b,c;8 Y$ F. s$ ^6 x 
        for(c=x;c>0;c--)( P. j( K. N; Y+ A& X4 n* m4 r* j% H1 Y 
    { 
3 ?/ H2 r( x3 i5 A) M, ?                for(b=102;b>0;b--) 
0 y, q( [- P# D% T& t7 k        for(a=3;a>0;a--); 
+ q, e  y8 x. o3 D        }4 _( s7 k1 J$ |. c 
} 
9 g: y- D# J% C1 `void main()           
  ^* g) q& \9 E{                  
5 W( x1 W' T+ c8 v" i4 n7 Z; j. _  E. o7 z 
% K6 f0 t  Z0 e/ C1 z- l 
    bit tmp; 
. T) F* S6 D+ n& x  f( ]" e' S8 V% Q, n        dot=0;. o  X5 U) `+ l% Q+ C" G9 {/ D* Q, d 
    EA = 1;            //开总中断# X! p' h' X7 l, U 
    ConfigTimer0(10);  //T0定时10ms 
/ U# n% p1 [& s; F/ a# X//        M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;0 w+ c4 @' }# E/ K7 u) _ 
    DHT_Start();' \4 U$ j/ l; X' X* ~ 
    delay(5); 
+ B" e2 Y+ F9 g2 I- L7 o8 p8 R# o# L, [ 
$ m2 Y1 A5 v5 u$ E8 K1 I 
    while (1)8 q2 @/ o3 ?+ A. B* J, y 
    { 
% W: Z0 c( P; B" I& T6 x- s2 A% A0 X1 ?5 p! ?) m 
 
# n* Z# [: M4 L% I, m# b; T8 i! m0 I 
 
7 b2 ^- x- H) @- T2 I7 n& D6 E        if(flag10ms)  //数码管刷新频率 
( D% F2 ]! r( M" |                {3 z9 J% l7 ?' R9 _, N! n: f0 B' n- i 
                   if(st==0){( ^; F& n, Y, ~; E9 ]' @ 
                                Display_temp(&str);; Z; X+ |) L# M! u' |2 Z1 q- U 
                                flag10ms=0; 
6 b! _$ r2 q# p2 u9 a, C6 a                        } 
6 E( k& X9 T& ~                   else if(st==1) 
4 [7 R& f$ M* B$ K                   {9 i! b6 o! \$ b. y, U8 o! o 
                      Display_hum(&str); 
0 D- t2 b4 ^3 I8 h, U& m0 g' h; t                          flag10ms=0;1 q6 @  ]6 ^- r; l  b/ ? 
                        } 
& V. U9 ]9 R9 V* m: E7 B; \7 x; s 
; B0 O/ |2 \" y! Y/ ^ 
2 [% ]/ S' U: ]6 _  {                   8 g" C* b/ N- t( V/ [, p% I9 K) M 
                   8 z' Y. L3 {3 y5 o% H$ ^9 b 
                }: ]& a0 X! s" _0 u; R; o1 ^! f. ^ 
                else if (flag1s)  //每秒更新一次温度、湿度 
  l( o% d, z/ L6 i        {+ L& v$ R5 E3 T' a 
                DHT_Start(); 
( n- ~% h* K% H2 g                   tmp=DHT_ByteRead(&DHT);) b6 o" e. L' G! P 
                   if(tmp==1)7 V# Q" ^. z$ |( d9 J) P 
                   {0 H1 [# J! o( Z8 o7 F- O' X% ] 
- s6 f5 L% @7 _ 
 
; j. Q$ u4 r4 I7 d                          if(st==0) 
9 @5 d4 T) ?; x6 m7 I! r                          { 
, S6 _  b2 ]9 w# r; Z* S                             str = DHT[2] ;             //温度 
; F1 `: T9 W2 j# B% Q9 r9 B, V9 i" X                                Display_temp(&str);                      
1 S& O, |! a0 N# ^. E' ~3 r                            flag1s =0;         //标志位清零4 b3 P, @7 }9 r* _0 R- r5 x 
                          } 
( z9 L, F! W9 y" i3 k. d                          else if(st==1){ 
( i! i7 `, ?2 j1 H/ E; \0 o) X 
9 L. |! w3 p- o$ J, j3 O( \2 @7 h$ V) Z& k) ?$ t 
                          str = DHT[0] ;  //湿度6 X! N+ ?" d; d5 K 
                  Display_hum(&str);  
8 r) ?5 M- Y* z                                  flag1s =0;         //标志位清零 
+ [! O2 f( X% L- N5 w8 Y5 `. j                          } 
+ G- D; I( K' O$ I: [. ], b. i 
5 |) r$ i, G. W6 W% { 
% M6 t5 g" A( Y/ H% n7 j                          6 d  [+ X7 l7 P7 D8 A 
 
, R& d% y8 z0 c: q# K8 s, J- Y* P5 z, b% }; i, y 
                   } 
* ~- e& ?2 p0 B0 e' A9 d4 @        }; }. l5 R* ?2 ^$ s 
                if(button1==0)  R3 L  V( g; I3 f 
                {/ D. B6 R. ?9 k% R 
                   delay(2);! j8 Q3 H6 a: r 
                   9 f9 `7 |) c# Z& L& C 
                   if(button1==0)1 o/ Q( G% |# B) s7 q6 H 
                   {7 L" C' P( C) Y" B: _( @' M1 y 
                       
; F8 ^& V+ Q8 o4 u0 @" m                                mode++;! R+ }  S- x& [3 s0 {4 }. [5 B 
                                switch(mode) 
: A. H0 Z5 ]0 M, k1 r& q                                {2 F- ~6 y" _9 \2 w; i$ ~ 
                                  case 0:  st=0;      break; 
* g6 d/ f$ l! B8 N4 y                                  case 1:  st=1;      break; 
7 G! t% y2 Z, K' E) U. @' [                                  case 2:  td=1;      break; 
: W% d% l# h* X/ h; A                                  default:     break; 
& e1 H: A. D! i: m                                }0 M8 u5 L" g3 d5 y* i 
                                if(mode>=3)# \6 S. @9 g9 O1 N- r 
                                { 
7 [/ U- }3 A* c7 G: y9 ?                                  td=0; 
! F7 T5 o7 U/ ^" o8 _* _                                  mode=0; 
, o! @& N2 l" V" J! F                                }* N8 Y3 U, n; z/ r6 {, c9 G# B 
                                while(button1==0)" n9 S0 Q1 q1 g3 J1 F 
                                { 
, X! I4 C" f: P4 y' c                                } 
7 \# ]  G, N$ p: R' a' N2 o3 R2 W& f3 a/ X! @ 
( U  k6 R6 }  K: L7 x5 d7 V 
 
" Q- F. }) }1 f) T( F/ ?- j" S 
  O1 A7 `$ G$ Q                   } 
: q7 r( {6 I2 H  m( K 
; A) M* l8 v4 H' y! b% p 
" g( |+ `# l) E                } 
8 p$ E7 }; N' K- L3 S 
- N/ j( ?. ?) h 
+ P2 ~3 n& |  Y7 o6 G) B( K) p" u8 ]& [+ x  J* V 
 
6 m- w3 c5 n3 a* a3 c 
4 ?' t- m3 P  M- O% V 
9 R. h$ j1 _1 t& Z         } 
& p' @! ~2 w0 X7 H3 R: _4 R}  Y# R1 R" b- T0 g* O5 `2 v$ ?/ A% ^1 I 
 
3 x: x/ d8 X  l5 @* x/ H2 v5 D. D* h, l# Z: l 
 
# s' T0 n% Q; H+ o& d% Q! {6 i" [, m2 c6 x# _" y  m1 I8 W 
/* 配置并启动T0,ms-T0定时时间 */ 
7 d$ ^8 n5 c9 `! e$ D* H) Qvoid ConfigTimer0(unsigned int ms)3 j) I  Y! F$ Z3 R 
{ 
5 {- a% g& \; ~7 C    unsigned long tmp;  //临时变量 
/ O4 Q0 @7 y8 o* c% C2 {: v. }' z& `* r    ( T1 Z3 p- |2 Q9 W1 b- u4 n0 v, R 
    tmp = 11059200 / 12;      //定时器计数频率7 p% w  }# p( _ 
    tmp = (tmp * ms) / 1000;  //计算所需的计数值 
# E2 @$ o) r8 p" F3 |+ }% p4 m    tmp = 65536 - tmp;        //计算定时器重载值 
4 o% a, v3 G, Z& k    tmp = tmp + 12;           //补偿中断响应延时造成的误差. \0 S8 L, }+ A6 l& Y1 z 
    T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节 
! M6 q/ V  y& o: }. \    T0RL = (unsigned char)tmp; 
$ L1 j5 T( s3 c$ j) S- x    TMOD &= 0xF0;   //清零T0的控制位 
6 E  M  B" x5 W  S/ A    TMOD |= 0x01;   //配置T0为模式1! o. z# t9 B! V2 s 
    TH0 = T0RH;     //加载T0重载值 
  t1 R- X& |' X( C" X; L    TL0 = T0RL;' h$ u/ j* G& Q1 X! J 
    ET0 = 1;        //使能T0中断- T- P% ?" n3 K; P1 y8 w8 c: |; C% G 
    TR0 = 1;        //启动T0 
  j9 p: p% C/ k. O  W} 
; B: p( t5 T( D0 f$ y0 Q7 c- r/* T0中断服务函数,完成1秒定时 */ 
% j! R% w5 {/ K) ~% a; m% Evoid InterruptTimer0() interrupt 1' X% H% f6 q( l( u0 [! t 
{ 
4 i* Q  R5 y7 C8 m8 f5 c 
5 Q' k; r6 T/ W& O: q# L" m7 B( |" `& f1 w8 E( ?& K5 _ 
    TH0 = T0RH;  //重新加载重载值: e8 K0 B% d2 \* A) I' u$ J 
    TL0 = T0RL; 
  u) F/ [( T$ N3 p    tmr1s++; 
+ J3 x2 _6 U4 R( w5 Z4 v( [        sdd++;" p4 J! S8 p% q, J: U 
        tmr10ms++;& V& n9 t6 v# B 
0 l2 L" ]$ J# }8 ]' P! F 
! L6 V9 u6 f& I3 i3 e  ]5 B 
        if(tmr10ms>=1)           //  数码管刷新频率 
+ M! ?5 \2 X$ {1 [: N        { 
" }& J  b: F$ ]  ]8 k+ l                  tmr10ms=0;, @6 z+ i$ X& g9 x% x! l 
                flag10ms = 1; 
  f# X' i) \) V; m* o2 D: a9 J8 `( q        } 
5 Y) V# l  B- S; t% Z1 ^; }0 C        if(td==1)4 V% }% z6 w. N$ Z. | 
        { 
: e+ s+ w0 Z$ F0 W          if(sdd>=500)           //温度显示5s        、湿度显示5s 
( }: n+ J+ n- q7 s9 y+ v: d. O( @          {0 q* B. K* F, b% B6 P4 V 
             sdd=0;% a4 Z+ I$ H, N5 [3 |) y; @ 
             if(st==0) 
( z5 g) Y; ^1 |; M" ~3 g: P5 m             { 
" \8 o& ?/ E8 p5 l! [               st=1; 
: u9 M. m6 {5 x0 {                 } 
) d. `. G0 V" G( `                 else st=0;7 j0 C6 ~3 f7 b) {, x5 ^7 J 
          } 
8 L0 {' K) i* {# P' Z( n8 ]# I        }7 y+ b. f4 A  t7 H  I4 M 
    if (tmr1s >= 200)  //1s 数据更新频率 
" ~/ B5 z# S6 v3 L# V1 L) T3 B    {  ?% V" x+ d* `" T: \) @ 
        tmr1s = 0; 
# ^1 W* `# A. P, o2 F        flag1s = 1; 
1 w1 @. w  |, }! V* Z        } 
$ n  X9 i* C) I. t- w: }* n9 ?3 w8 X3 U  G 
 
- Y- i2 @; V, h2 z7 j" \     
  |  J; K$ U2 m, ]3 O- L7 Q}+ r9 Q* s* |! u3 m1 W 
; j( \' {; ^9 `( K. d0 }9 T$ w 
 
- G: k7 a% Q( b% U& Z下载:* D) _, Z2 U( K- f 
 
/ A( G$ B  m0 z9 V% B4 l4 b# U( R/ o: D1 w8 P+ W' w4 o7 ] 
 |   
 
 
 
 |