EDA365电子论坛网

标题: 基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码 [打印本页]

作者: wu68aq    时间: 2019-1-22 13:24
标题: 基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码+ m8 X& ?- I2 }* R$ P. f' F  g
9 S9 \4 ~+ |  |

* v3 g! D4 x, g! E9 [仿真原理图如下! g/ X4 Q$ ]: J) E  F/ z

; |0 f7 ?" m3 K) {3 I# m- s
) V& u% L7 ~  [; K1 {5 b按button1可以切换模式
; c" `! I; S3 ^$ ]1 C4 ^模式0 只显示温度- S1 Y& @: ~4 v
模式1 只显示湿度
1 i6 t$ O. t1 r8 `1 u模式2 动态显示温度和湿度,每5s切换一次
; X# F% y# L# j, J
3 R4 n; D' H! y

, D+ l3 c( E, g1 z! |实物如下5 x0 j! s2 ]0 [. n6 q
温度显示
. I" ^: I- `6 H" c$ r2 P6 `
) ~1 C9 A4 H: q) Z. Q. |) w湿度显示  小数
$ G  g2 p4 ?; T2 B2 x
; K  x; n0 C& N, l) `8 o6 ^, G: r$ O. j
& E7 J. z8 I8 `  H& i, s& O
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。
5 O0 H" n6 }7 t, ], s* O- n4 p1 ~- L# j: n. z# u9 z
单片机源程序如下:

+ P1 G! c5 w8 e( L# Y' h& Z+ l#include<reg51.h>
3 a# F" j. |, r+ t1 b- V3 G
9 [# `, d: r2 Z5 @

! F) d7 `. _1 s/ y5 abit DHT_Start();2 }" b+ Y; C! ~) ^/ u) X. h- x
bit DHT_ByteRead(unsigned char *dat);
2 k! u" _1 ?( q+ E# Svoid ConfigTimer0(unsigned int ms);
( R# p0 q/ K; v5 X; _$ C: h* E! h2 Zvoid Display_hum(unsigned char *num);
* f& x/ [! D2 _void Display_temp(unsigned char *num);
) c) s- U) }' j% n$ V$ k
; V" t! L) `4 b5 a6 Q
3 m+ J+ e+ y; |& Z3 b  g5 s
6 Y+ A! ?3 E* S. P) ?( S% l3 k7 t9 L

, v$ q: N# x1 }: M" sunsigned char T0RH = 0;  //T0重载值的高字节
5 D& X5 s; G9 B4 M  ounsigned char T0RL = 0;  //T0重载值的低字节
: \' e* f: ?4 Aunsigned char str=88;
, u* Y7 ]5 G/ }' R7 `* o1 Nunsigned char DHT[5];
" w; y1 M7 U+ q3 `+ M( n, c
5 F3 O3 m5 p% f. U8 L6 s1 h

& P1 x1 [  O: U/ I; ounsigned int tmr1s = 0;
- B/ A, p1 M3 G0 S1 `unsigned int tmr10ms = 0;
3 b$ f  a% i5 j- Y; ]1 Ounsigned char st=0;
2 r5 g) N7 |4 A; bunsigned int sdd=0;) J2 M6 ]. ?; e3 U3 d+ X
unsigned char td=0;
5 m9 U8 v% P& i$ Q' d! S# ounsigned char mode=0;9 N" h: V+ t% |4 A2 R

/ ?, A  \5 l8 ~  N: H
, f" R. F' o- W4 X
bit flag1s = 0;/ {6 K$ a6 {- ?  z
bit flag10ms = 0;
6 D& ?/ {6 G- N3 ?( o8 f4 Aint x;
! V! ^8 ?( j, G2 h" {) U            
5 W2 @+ f9 J! K! }sbit button1=P0^0;1 H7 W; G$ }! f+ R' o% t
sbit dot=P1^3;   //数码管小数点
$ Z  N* u" S/ ]7 a; w5 A# [3 N3 v. p9 _1 h( I' t: Y4 O
. K  H5 \, Q7 V
  }  s1 f/ D8 R" G7 ]
+ Q% T* e% L" @- {
void delay(unsigned char x)   //延时ms
$ v, g4 T$ C1 ?. }2 l3 B1 b; B, a{5 s. r+ x8 F9 D( c2 n) r8 v& F
    unsigned char a,b,c;0 u# q# Y3 `+ m% f, C* m: l
        for(c=x;c>0;c--)
$ R! g# F) Y1 u5 ]  A; k- a    {
% z4 g( d9 y( k$ Q" v2 W0 u                for(b=102;b>0;b--)
$ \$ y! X& g1 D3 w: l2 t  g        for(a=3;a>0;a--);
1 n  k  v! X1 o; V. S% ?8 B        }3 H* W( o% M( n
}
) K9 h" }. T; ^8 u( A' G- Hvoid main()          6 T9 N) U1 O8 ?) h
{                 
% P$ A9 I* P) y, c, g3 @! }/ }8 }* \) B/ v- E3 _8 c# |8 G5 O; N" J+ {
  n- r5 D# z9 S# t$ A# O1 _
    bit tmp;9 M0 b, s: a/ {/ t! v( p# ?# ]
        dot=0;
% F7 j" Z/ q' v  i9 a0 Y    EA = 1;            //开总中断
. D4 h5 {; C6 ~& E$ m' n    ConfigTimer0(10);  //T0定时10ms
- c  v# n. H; d" C//        M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;1 ^, A2 Z, }+ W$ p) P1 `
    DHT_Start();- r# {3 y% |/ ?, @
    delay(5);
( w7 T  q7 d# F& ?! v8 N- m' V/ p: K0 J
+ s  H. E# n" B
    while (1). }# A) Q. _5 u8 r- i- O
    {( U( q  M2 ^  v7 i

  o8 D( I% @; O% W' J  w) w( \  D4 c
8 Q; N7 q' x+ d! z6 A# Z1 y5 ]

# b! n9 r" i. s1 R* C2 M3 ?3 ^% Q
# m- p7 j+ o' `+ K+ o
        if(flag10ms)  //数码管刷新频率3 J- ?6 B9 s8 G/ b& n5 f! `
                {
0 x$ u4 w( C& [$ V- l' Z( _                   if(st==0){+ \5 F) u% p5 d4 M. X' e1 r1 p
                                Display_temp(&str);
' B4 Y6 d7 M6 n9 f1 L                                flag10ms=0;
+ o( m( l% l; u                        }$ w, i3 \. F6 H2 L1 [& l
                   else if(st==1)5 q! E. `4 w0 {% N: b
                   {* ~8 W) K( j2 z% S
                      Display_hum(&str);: Z. |8 Y  h# o8 C& L, ]
                          flag10ms=0;
( ~$ E% h9 ~3 d' a2 Z  y0 J2 v                        }7 @1 p* |+ Y+ D( L

6 U4 K3 M+ ~) g
* w4 w" r* S* }, v
                  
. [" z: \, C: H                  
4 x( Y6 e' w( x/ I/ u4 x7 t                }( [! o- J" E3 A
                else if (flag1s)  //每秒更新一次温度、湿度
3 t' ]; V2 h5 Q        {
' {( H0 t* d4 I1 p/ f4 `- D                DHT_Start();$ M2 k& u9 @/ G
                   tmp=DHT_ByteRead(&DHT);
- X; [1 r' @7 `5 n6 k& I                   if(tmp==1)
  F3 J' [, T( O2 p4 D4 s6 {                   {
+ V  C& n; }/ T+ l6 D
0 B( a2 i# @0 `. q) D+ e( y
. \7 W7 ]5 Q6 t$ r+ t! X, A5 R- P
                          if(st==0)
# z& b6 O( X6 W; y3 E                          {. |4 r1 H( D2 C* f& ], y
                             str = DHT[2] ;             //温度
% B- B7 H- o8 [* }1 p- V$ M9 o                                Display_temp(&str);                     
/ |0 y5 U% p3 R* h) ?9 k                            flag1s =0;         //标志位清零
3 Y! _8 C: s2 ?0 J- u/ I* Y                          }8 p6 ]" X0 X; ~: c4 C# H& ~( Q  E. \
                          else if(st==1){. r! S0 S4 j# g$ w8 ^4 C. j
$ K& Q0 o. L( v, E; ?7 A
* i- r1 V+ [( r1 [9 V) X4 Z  X8 o
                          str = DHT[0] ;  //湿度
4 o( Z! l  ^- H8 A9 J" ~                  Display_hum(&str); & y1 o7 R- n  P# l
                                  flag1s =0;         //标志位清零) v# @9 B1 l" R! e. B
                          }
( z* K9 L$ p+ S% M
; [, N% k) U' e( p! l

4 E' n# w; b- g$ L  {. i                          $ b' k8 p3 H6 i* h# M: [
. a% @2 H- }# _2 A
$ S: d# h/ h5 T: F/ G8 W
                   }
$ k1 _; ~; H7 F5 P, ~% r        }' o" r8 x6 j' V% c
                if(button1==0)
. F$ J, r) u9 G                {! K- a) N. d/ K1 ?8 H
                   delay(2);7 _$ L4 Y; {9 C* K8 z* Q' Y
                   5 p- C; A9 \+ O
                   if(button1==0)" [. R, I) T" k# ~; M9 G6 C
                   {+ }, J: X8 Z" U+ S
                     
# Y/ P% C3 b( L6 Z5 C* Z* ]# c" L8 Q                                mode++;; u; g- Y+ z1 t+ R9 G# Z2 N
                                switch(mode)
# o; b+ g8 ?0 m                                {
/ t" h: M, S3 b( f% E                                  case 0:  st=0;      break;! @0 C+ g' ]" Y5 G9 l
                                  case 1:  st=1;      break;( W. m* M: q9 _/ g. C. d( R
                                  case 2:  td=1;      break;' p4 U# `7 n& T  Z8 R2 j  {
                                  default:     break;  G8 {/ p! M" @
                                }7 P1 s, z! L  u4 l- G, b0 N5 M
                                if(mode>=3)6 g; o5 ]/ ]' Y0 \' F2 C
                                {5 x; ?0 [5 e- U) p: I! ?; r
                                  td=0;
8 W0 i7 O) D8 H: A+ l9 p                                  mode=0;2 `7 n; J$ o: v" o) `
                                }% }3 [) c5 r) U5 k0 c0 ?* K) S
                                while(button1==0)$ r% A5 O% X+ X, B1 ~- n' |
                                {/ ^- N5 J+ W8 `3 a4 Y7 x5 I
                                }& A! k* p3 u# L" K% b7 B
0 i/ _' n/ [0 ]: x  g2 v% x7 t8 g5 t
. D0 A5 T7 C3 h6 E% O- l3 \; P) {
7 T. l. i- [$ q
  V9 }: X: ]$ _# Z( \8 z" n+ d9 B
                   }* a2 a7 J1 s* S/ d. h& a
' c9 c4 Q* G6 S7 y5 ]- U  a

0 H$ v3 P& [4 N& T) C4 c; z1 K9 D                }9 {! K" M: D! z1 j

- e$ O- E/ A# @4 t" R9 B9 ]
& n; `0 G+ x# e& G  z) n7 K. t
7 b: H' u) K' e- p- x7 v0 |$ r5 N
" Q0 W' d. n1 Z: t2 v3 Z5 e5 \$ c- H
" `. r, }& N9 C  I( M
7 H/ C. s7 B) n* K* [/ Y
         }; E$ D/ y4 }  }1 v
}
9 ]6 @% X+ o7 ]7 b8 h) g4 F# v: N! c) R/ W. |
* [8 n$ }& I- ~

7 g% a9 W  r7 h5 @9 E

9 P: J  J) ~; j) a/* 配置并启动T0,ms-T0定时时间 */
) o9 ~9 v/ [  L; d2 @7 evoid ConfigTimer0(unsigned int ms)
& y, d. Z8 g- P$ o" r/ k1 `{
* i" D1 p; s* t    unsigned long tmp;  //临时变量
7 m- P4 ~+ G  P7 g   
9 T! e! V2 L3 {5 b9 |$ G8 u    tmp = 11059200 / 12;      //定时器计数频率* ]& Q# U" w( U- \! h5 O
    tmp = (tmp * ms) / 1000;  //计算所需的计数值
8 ~' d+ r+ p6 F: n6 G    tmp = 65536 - tmp;        //计算定时器重载值, o* N1 ~" S/ z' _+ _0 d1 n' w; F
    tmp = tmp + 12;           //补偿中断响应延时造成的误差
3 s9 N$ [/ W1 _/ R+ e! [( V    T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节
, r5 M+ }- B7 U    T0RL = (unsigned char)tmp;
5 I. o, Y+ G& C" U0 n  o3 ?: t6 G    TMOD &= 0xF0;   //清零T0的控制位
2 H- B" S1 S8 F9 e  h& O" a    TMOD |= 0x01;   //配置T0为模式16 t- n* v  y6 H) Q! d, J
    TH0 = T0RH;     //加载T0重载值
" N: E* X( M: s2 Q4 C4 _7 g' o( r( U    TL0 = T0RL;
4 j- I( {" u3 Z    ET0 = 1;        //使能T0中断. C+ l" L6 }( A- t
    TR0 = 1;        //启动T07 W- G# L" P# R( ^- Z0 r
}
: n( E* U8 w5 x, r; N/* T0中断服务函数,完成1秒定时 */
4 ^; }5 F* M6 pvoid InterruptTimer0() interrupt 1/ P. j" W0 g+ i3 X/ n1 `
{
9 z4 W& `- R% m, S  J6 y9 c! y! i  c* b& m- f6 a1 `

8 s0 d+ d: i! ~) c9 x: \; k& W    TH0 = T0RH;  //重新加载重载值& |( H! W# y, H$ U
    TL0 = T0RL;
! R" n* a. e7 [1 r1 c$ a    tmr1s++;# {6 }2 U  ]7 w: p- |) O4 d
        sdd++;. c& D/ X1 y  Q) k) ^
        tmr10ms++;4 f+ ~+ X/ p8 Q* h% L* I5 H: }, Y7 p
' ?2 t5 {, D3 v& r
1 q! C$ S: Q" G' a5 f. t3 y* l
        if(tmr10ms>=1)           //  数码管刷新频率* [; K7 \, R+ I4 k& p1 u1 J
        {1 b- u) P( R0 K' o! g
                  tmr10ms=0;% P5 z; a' d  R" N( ^9 {! d
                flag10ms = 1;
; J9 a: s8 z+ p4 U0 N$ i6 c        }- Q7 p& k8 M7 f( p, j  r: H7 G2 c
        if(td==1)
- Y& V  g4 ?1 l/ f        {
3 h# Z. h2 J8 ]% {' x( s          if(sdd>=500)           //温度显示5s        、湿度显示5s
, }1 x  P  T9 l' `          {& t/ ]3 _. F4 b* J
             sdd=0;" V3 p) |7 c& T. R
             if(st==0)* B) N2 z- o1 k& @7 I
             {
/ y* S9 M- B; v% @, H* j: H               st=1;
1 Q; `( J2 v( X9 z                 }: e5 y! F+ c. V. U9 S
                 else st=0;* }7 f3 ?8 Z( M* s
          }
0 H0 a- s! n. I/ R: T  E* p        }
* r8 V7 B2 i' `    if (tmr1s >= 200)  //1s 数据更新频率$ L  G' g& w  u. I
    {0 t8 k( r2 Z7 L
        tmr1s = 0;
5 t: c- Y2 K) C        flag1s = 1;4 [, {7 `, v6 k' ?
        }
2 j7 q# @' v% W  N1 j/ n4 y2 I( N' _; j
/ z0 `2 h: ^% `0 G- v0 \2 j; ?
1 f& h$ }7 l% [6 v0 @
      \' o. `1 O! F1 t: C
}
3 i' g& y' ^; K; p6 W* S1 }/ C) `; }) X- {2 Z5 g7 f" w) [! E" O
# _" R* R# N1 I
下载:
) Y! P4 @: l5 t! }: t7 w
  ^& g7 ^- h7 u) y7 a$ h

0 B0 N1 m6 |4 w6 h- W
作者: sunygd    时间: 2019-1-22 18:22
看看楼主的代码
作者: 1057982547    时间: 2019-3-26 16:34

! |! _6 e" M/ f  M, {7 `
作者: ORGKFL    时间: 2019-6-11 15:22
- g7 X; v# @2 Q1 e4 o$ y

作者: zhuzhiwei    时间: 2019-9-8 16:40
好好学习
作者: 1998928hQ    时间: 2019-12-6 11:02
试试能不能用
作者: chencol    时间: 2019-12-10 23:03
谢谢分享
作者: satomi    时间: 2020-3-7 11:55
谢谢楼主分享" [9 L  `7 p, P& Z: u; ~

作者: leyuchen    时间: 2020-4-20 22:21
11111111111
, a3 t: {+ @- F
作者: 15463957    时间: 2020-5-8 14:47
收藏了啦啦啦啦啦. O/ Y: s" F  C  U4 x9 C

( ]3 r# ?8 ~1 E
作者: deam_zhang    时间: 2020-5-9 01:02
我来看看, L+ b2 e1 o/ ~" ]1 ^5 R. X2 d: J/ k

6 q! n# t$ {; \8 C
作者: 氵水冰水氵    时间: 2020-5-14 17:07
感谢楼主分享,拿来学习学习
作者: trw    时间: 2020-5-17 15:32
为什么出来之后有错误?
作者: trw    时间: 2020-5-17 15:41
为什么打开是三个代码吗?求回答
作者: 963079388    时间: 2020-5-20 17:08
大佬康康
作者: CafeNokia    时间: 2020-5-22 17:06
看看看 借鉴一下 谢谢楼主
2 ]* C# N* @) K' J4 J' l. j" S4 U) ?$ `" W& ~' h

作者: 18181383535    时间: 2020-5-31 12:38
感谢楼主分享8 R2 k  H4 h* a3 x2 C; f

作者: 好了咯    时间: 2020-6-2 09:10
隐藏内容
作者: SSTIAN    时间: 2020-6-27 16:49
拿来,学习
作者: xiaofenga    时间: 2020-6-28 22:55
&#129310;&#129310;&#129310;&#129310;( X" x. N' @7 ^. h

作者: due425    时间: 2020-6-30 23:32
感谢
作者: 帝王迪亚波罗    时间: 2020-7-1 11:01
让我看看怎么样,谢谢分享  M  `/ M9 y" ^1 _; g3 A; k6 e2 f

作者: djdbbdjns    时间: 2020-7-7 10:48
学习学习感谢分享
作者: a837698047    时间: 2020-7-7 13:10
感谢分享。
作者: djdbbdjns    时间: 2020-7-7 15:08
看看啊啊啊啊啊啊啊; }7 e; d7 a( t

作者: user_EDA    时间: 2020-11-23 21:18
多谢楼主分享!
3 ?# L) F$ o, U% _
作者: lipeng007    时间: 2020-11-28 11:21
测试一下,谢谢
作者: yijiya    时间: 2020-12-8 19:15
特地前来学习学习
6 b5 y$ g7 B# m1 H" M
作者: user_EDA    时间: 2020-12-19 08:38
多谢楼主分享,学习了!
作者: zhang24654    时间: 2021-1-13 10:45
感谢楼主分享,拿来学习学习
作者: Joayer    时间: 2021-4-19 20:51
感谢分享!
作者: 2720895144    时间: 2021-12-21 15:15
大佬看看
作者: 2720895144    时间: 2021-12-21 15:18
大佬看看
作者: wang5825    时间: 2023-2-6 09:40
学习学习感谢分享
作者: xuebj    时间: 2024-12-8 11:48
看看楼主的代码




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2