找回密码
 注册
关于网站域名变更的通知
查看: 6553|回复: 34
打印 上一主题 下一主题

基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码

  [复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-22 13:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码
% E) |3 p. t) B; J
( e. v) \! ~8 Y4 j& |
3 P8 F4 X2 f/ l" u& J# z. S! c$ s
仿真原理图如下
5 N1 `6 f. x  o$ I. [5 C
1 l, C5 K3 t: O9 m1 O+ x5 _  }) N* ]1 Q% U0 B. [, `1 n
按button1可以切换模式/ m$ z) l& F9 M  ]+ ?* m( A
模式0 只显示温度
8 z' p4 v: b) N3 p模式1 只显示湿度! A) O; C. m) D% s
模式2 动态显示温度和湿度,每5s切换一次
2 |+ |# O4 U4 ]+ R: r, q$ X( t/ t3 [9 J6 P& P& f  A' O
. I$ }9 e) F0 [- u
实物如下. g/ y* }! O% Y& P/ c. I
温度显示
- h3 |3 C+ \1 P  E ! p9 R+ i' X+ {
湿度显示  小数
% j# K! y+ d! L / W$ Q' K+ B+ |$ _8 k' R2 w7 ~6 v
  s3 W: F/ S3 P4 Z

+ Z4 W5 t5 a- R$ `6 Y8 Z. a4 u模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。: J* Z4 L- \; a& s9 G3 h# D

9 p; `3 }0 S2 L/ ?$ t! q+ P; j单片机源程序如下:
5 l4 r4 K5 r4 o6 L9 i
#include<reg51.h>
$ @1 m8 b+ H  `' B8 p
2 M" c- j; S1 _& b5 p$ E( n

; |' F; {8 J: D4 ubit DHT_Start();
* X* {2 n/ ~; N. y( R5 l# ^bit DHT_ByteRead(unsigned char *dat);
! R0 H& `3 A5 ^& @void ConfigTimer0(unsigned int ms);, s& H+ |2 u9 C1 {, J; i" B; G
void Display_hum(unsigned char *num);
' _1 J- w/ V0 M: k7 k' j  Hvoid Display_temp(unsigned char *num);
' ^% A$ l1 k, N2 j3 Q" P; G& n4 v( F- ]8 G6 ^

; F  i! N  b% f5 O3 k! }' j  s
* Y8 ?! {  T1 L/ I
/ t- ]/ r; b( W  u3 S2 u  K
unsigned char T0RH = 0;  //T0重载值的高字节
" U6 d3 f) ?0 h! Gunsigned char T0RL = 0;  //T0重载值的低字节 + y2 }4 R/ i+ V8 Q/ l
unsigned char str=88;9 g( o9 z) f# `) H: J$ K
unsigned char DHT[5];0 F8 O% @; D( @) _

4 ^0 L! f& c) y. A. z8 H

- ]4 x. R4 M& w& [unsigned int tmr1s = 0;
4 Z$ o$ S+ P" C' u, runsigned int tmr10ms = 0;
/ F( ~) q% y! junsigned char st=0;( a8 a( T7 r; e- L) H# C+ I
unsigned int sdd=0;& D3 A; o" l2 W* @6 A2 E1 g
unsigned char td=0;7 l3 t. F6 p6 v9 O5 J! }& Y
unsigned char mode=0;
2 }: c* W2 ]' t3 m7 Z. q3 o" _# ]3 V6 A9 T% Y/ q* K
) k% v# @: ~! v3 W" o9 d! E. ]
bit flag1s = 0;
8 f. w' x, \$ v- r0 _- F* {bit flag10ms = 0; 5 J, J+ B. E6 c: `( O
int x;
, G6 M: k$ j# x8 c+ v& Q+ D            
! w8 Y; [3 M* v5 h3 N/ _" vsbit button1=P0^0;
9 c% F7 w. M$ nsbit dot=P1^3;   //数码管小数点
4 V4 M- F& r4 s! u# K3 [$ Y
  B6 {% z5 I4 t

3 D# e) @5 `  \7 T$ _  S
. R" k+ S1 p6 X7 E% H. d! a
- Z# M- \4 W/ x6 H3 x
void delay(unsigned char x)   //延时ms) ?6 w# B1 [3 ^9 A# t, C# x$ \
{
, x  {: V5 P% A" }    unsigned char a,b,c;: Q1 ~0 o. \" M6 x
        for(c=x;c>0;c--)4 x* s" E6 A3 c1 b% [1 F  x& q
    {& Y  [+ q+ ~4 r6 A- l0 Q3 x* j
                for(b=102;b>0;b--)" J& f; u# s4 H: X- T( [/ O& {! x
        for(a=3;a>0;a--);
. u# O# H1 f# Y5 x4 c        }5 E; {4 ^% S+ k7 b  [+ a' f
}
8 C! F" E  @0 L) ~3 z8 b+ r8 Ovoid main()          * j) i" E: b1 [* L
{                 0 j# {$ m! I3 r* E
; a7 R1 O& r+ r$ C! ]
4 e1 |: F  G/ h
    bit tmp;0 h5 |. a/ O% U  G
        dot=0;1 }$ @4 y5 [1 W: S" y; e3 o2 c" ?
    EA = 1;            //开总中断
  _8 }6 m7 r+ w: v3 s8 L, z7 X- a    ConfigTimer0(10);  //T0定时10ms
& F# {: k% j4 m5 ]- v0 h//        M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;2 H( K1 ^( |/ Q2 l
    DHT_Start();
2 C2 R% g9 i$ ^) K    delay(5);6 p3 s# H3 W+ g: j) N( M
$ o. Z# c/ [# F; L

6 O: L- p8 D6 Z    while (1), Z0 _8 Q) a. h  i
    {
" o; O- O1 o0 ]! V& B) z: ]+ Q0 ^  i! \; B/ e6 z$ Y
4 p& q2 Z) V; i( v0 Y- n

1 H  ?/ h8 ?) D
+ x3 q+ L6 r6 l) x. U0 P
        if(flag10ms)  //数码管刷新频率
( d; r+ U$ A3 ]' |                {& A0 X, o# I. \3 S  ^" T1 E
                   if(st==0){8 S4 H& I! y$ \0 a
                                Display_temp(&str);6 w& ?1 |. v$ C0 J7 \6 b" W
                                flag10ms=0;, X4 @, r4 x+ \, l" y/ ~' e8 ~9 D/ N
                        }% M% M0 n: ~& r( Z/ b
                   else if(st==1), r  i$ @2 \  Z" ~
                   {9 T2 \) Q5 H+ ~6 X! ?
                      Display_hum(&str);
) ?% |# |. G3 z# [$ u$ {                          flag10ms=0;
# p" c7 n; @5 x8 H                        }! m1 Q) F1 u) D3 X
! l7 z! m+ W; c0 H6 F6 |6 s' r# Z: H

8 g& N5 `- K% Z& T- p                   ) b/ b% u, `7 T8 L7 s% ?
                   6 u/ D$ g* e# j" ]5 @& m6 ~
                }, y0 j  W; r4 U, [' V! }9 Q
                else if (flag1s)  //每秒更新一次温度、湿度
6 t0 i' V4 [; k        {6 @6 z; Q, b8 H
                DHT_Start();
! s7 ?8 g! r% }+ Y1 ~9 I+ Z/ G( ]- S                   tmp=DHT_ByteRead(&DHT);3 z9 A6 }; k4 p# t
                   if(tmp==1)
7 G: [3 t( B8 _  u# }  W                   {3 C3 P, u  e6 e3 G2 g/ q$ L
* g3 C# C, m4 t' {" B+ Y0 v
) n% V  F7 V% ^! _" A, R
                          if(st==0)
) ]& y4 A( ~2 T6 {6 ]7 ]                          {
2 V4 P! ~* y, G( N# @* I! k                             str = DHT[2] ;             //温度/ r+ \$ W6 J2 c; o4 q
                                Display_temp(&str);                     " c# u  K9 p$ L* }
                            flag1s =0;         //标志位清零; A; {, r) j8 `0 g( ~. T
                          }
3 T( b. {5 O8 Q1 t: d0 R- \                          else if(st==1){
, x# I' D* V) n# C  Z$ c4 |7 A
$ H, N7 w9 y  j* Q4 p0 R

; J& `: q0 u6 r2 j                          str = DHT[0] ;  //湿度
/ ^9 d4 I. k$ H( a  |: ]' V! ]                  Display_hum(&str);
( Y  A1 H! U' x  j& a% L1 v                                  flag1s =0;         //标志位清零
  H! z1 h& I5 a0 x* R5 X                          }
( a. F1 t( n# l  e# e9 g) B5 x$ z) y

7 ~* [0 t! D  Z! i                          & [1 v& q2 w. O( Z

9 Z6 z9 W: [: t3 }  H
! a$ G& O9 x  \+ k2 Y! n# n4 t0 O) D
                   }0 C1 ^1 S6 _; X- g2 ^4 ?3 H. n
        }
# ~! ^3 e) A) k, w7 I" P6 @$ W5 \                if(button1==0)
. X6 u: |+ j3 t1 t( ]# q                {
7 |6 V# L- w* @% ?                   delay(2);
! P1 f  i" d, s% x                   + _6 T: k0 |+ f6 P! v4 y3 L% q
                   if(button1==0)
1 \3 ?& x; Y5 x! P0 y9 f                   {! O; B3 l* }' q  Q4 Z0 w
                        e/ X( J3 P4 x& H3 Y7 W: E
                                mode++;
3 ?& a7 @$ m( J1 K3 u" c, ]+ A                                switch(mode)
6 I3 M$ l! Y/ H+ @2 Z# I                                {8 v4 u* a% D( w: _& E7 i
                                  case 0:  st=0;      break;9 Y: A5 t" x! G, x" T
                                  case 1:  st=1;      break;: z  x" y9 e2 N/ P0 T2 y& g" n
                                  case 2:  td=1;      break;
$ m7 s8 |/ D) |7 d: X                                  default:     break;+ F7 j' b: V2 U3 m7 a( z+ Z0 m; b
                                }' F8 G7 R& u1 i' \, G/ I# w
                                if(mode>=3)
% v$ G3 G2 I/ k5 h+ t- C  L                                {0 f+ a! z0 ?' e5 ?' f# l
                                  td=0;
1 R; T# g/ ~9 e7 ^2 L4 @; X                                  mode=0;, m* i6 Q2 r  e  Z/ B* p; B
                                }( T" o* T& N7 J# Y$ I
                                while(button1==0), {/ l2 W4 C5 H, u. [% \( e' n
                                {% m1 m  V9 C: N3 O2 q& J& q+ u( T4 m
                                }3 v; n9 W! L+ \6 k: p9 |

: m: ?/ p: x$ o1 ]' u/ }
8 o) Z1 I; B. m; p

) q  c. C3 O& y# R" M

# F/ _2 t9 g& S+ y) C                   }2 Q' W0 }& }9 f1 ~" Z7 M

2 w7 p' v6 }6 y
' I$ w5 K; O  [; C3 f8 ]# ~- U
                }2 ?/ n! a/ _& J4 A
) c+ s+ {* x3 L3 h1 l" e
8 k. [1 m" a. L' W+ u

. v0 O6 ^7 y1 `7 A! G
4 R  ~0 `  B- X" h) @7 m5 J

7 Z0 d  z1 f: |& z- v8 A
, q1 @# Y. v9 n5 t
         }
) G6 L& M" \3 K* m6 I- r) X}, u) i1 Q3 o$ Y8 A1 A- w7 ]

! i5 h/ o' b! T& z  G) P8 {: y. N

; V+ `* D7 Y; x5 v( r' j% A
, a( f; j( u6 |# ~  n7 K, M

; D3 F. q4 j, I* S/* 配置并启动T0,ms-T0定时时间 */
3 J' J) O$ ?1 X% O+ lvoid ConfigTimer0(unsigned int ms)
  C/ q2 g& j- r% w0 h6 p{
* |. X! C$ f  L% B# m" {    unsigned long tmp;  //临时变量
0 T$ A, T/ L- S; R- B4 N    + e/ n8 b- T  m# u/ w+ g/ s. `& Q
    tmp = 11059200 / 12;      //定时器计数频率
: r; j7 P: A: R    tmp = (tmp * ms) / 1000;  //计算所需的计数值
( v1 z# F. m3 R; b7 J6 o    tmp = 65536 - tmp;        //计算定时器重载值
# M5 l$ M3 s" n! n  ?  r/ w    tmp = tmp + 12;           //补偿中断响应延时造成的误差  E6 a1 S) `- N2 h5 g: \6 g
    T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节& z0 A) A9 d3 [4 @3 v9 Z3 L
    T0RL = (unsigned char)tmp;' T6 J5 m3 {8 U( ^4 X: d* M
    TMOD &= 0xF0;   //清零T0的控制位
4 V$ t, j2 m2 Y+ |2 i  [. ?$ o* D    TMOD |= 0x01;   //配置T0为模式1
0 m2 Y6 a7 {+ H$ B    TH0 = T0RH;     //加载T0重载值
& p+ a+ s. R9 e& m6 S6 s    TL0 = T0RL;2 X  }5 q7 [* v8 E* v7 e
    ET0 = 1;        //使能T0中断1 h9 C( y" X, F1 x
    TR0 = 1;        //启动T0
9 P# H! y4 Y: b" M8 q}; F( y5 d+ ?$ A) u7 L
/* T0中断服务函数,完成1秒定时 */
) z# S' [8 u5 _0 [0 T! Fvoid InterruptTimer0() interrupt 1, D! Q# H" I5 Q+ w6 s
{4 [# m" `# o8 z) j: F
: [1 c- o0 E/ k+ J* o5 }' @

% `0 g3 k- z  _0 [    TH0 = T0RH;  //重新加载重载值
+ R4 J# l, b! [    TL0 = T0RL;
' D0 M! M% u. G3 @+ ~    tmr1s++;
  a) X# V- W6 ~8 @        sdd++;3 m% ]! q0 r+ B1 T( |
        tmr10ms++;/ k8 T, v/ h+ F5 T
! }$ w2 }. b' ^
& @/ O, @5 k) r- `$ y) R
        if(tmr10ms>=1)           //  数码管刷新频率
; f, X# _$ m. L7 a6 p        {
$ x4 [, P/ M" z0 x                  tmr10ms=0;
% l( u1 I7 E% B9 A' s- m                flag10ms = 1;! l& d1 {  B7 N6 N6 E$ r
        }
. ?% T; y: H/ o* k; v        if(td==1)
8 p- ?& J/ b! |        {# L$ r! o, h5 K% m: G1 }/ a# u* W
          if(sdd>=500)           //温度显示5s        、湿度显示5s4 X5 K3 j6 Y) U, S
          {( R% K5 g8 T( V) Q5 Q/ M
             sdd=0;- ^: K3 b/ @9 |5 T, @' l1 S
             if(st==0)
, f. d' K$ k* S# J" E& w             {- u  I; V) e$ R9 D! [
               st=1;
2 x1 q$ }& k5 p/ s; J4 S                 }
2 H4 \' W% X2 P+ W0 y                 else st=0;9 G' X; r" G3 v
          }& k& i; ?+ h+ `& Q
        }, k! }6 K" N3 ]: G
    if (tmr1s >= 200)  //1s 数据更新频率2 D% [! f) r0 o. ~0 D
    {% }. q- q9 J" i* j5 i
        tmr1s = 0;8 |% p; J% P. l4 H& G. M
        flag1s = 1;) d) f; D3 W# H) ^
        }
  `( i% h- C1 `
+ h* V8 i% A. y' v# F

+ ?* R4 Q( d5 q, c. ^   
3 t3 M8 |7 N/ Y1 j) [+ o) F7 p! p}
: t: J" D. G; O# n1 U9 A: w% O7 [* j- ^2 K# U
: S8 \7 q; s; j& Y
下载:
7 b# v. B& f2 m9 M; ]% J) k
游客,如果您要查看本帖隐藏内容请回复

  G, }8 e$ u4 x/ n, ?  n
$ s9 a, J* J* U* d

该用户从未签到

推荐
发表于 2020-6-28 22:55 | 只看该作者
&#129310;&#129310;&#129310;&#129310;
2 }/ ]: h3 e: }* V; X

该用户从未签到

推荐
发表于 2021-1-13 10:45 | 只看该作者
感谢楼主分享,拿来学习学习

该用户从未签到

5#
发表于 2019-1-22 18:22 | 只看该作者
看看楼主的代码

该用户从未签到

9#
发表于 2019-12-6 11:02 | 只看该作者
试试能不能用

“来自电巢APP”

该用户从未签到

11#
发表于 2020-3-7 11:55 | 只看该作者
谢谢楼主分享. _$ j+ }+ W$ z  L

该用户从未签到

12#
发表于 2020-4-20 22:21 | 只看该作者
11111111111+ d4 I, |( i* I9 q% t

该用户从未签到

13#
发表于 2020-5-8 14:47 | 只看该作者
收藏了啦啦啦啦啦0 u3 ~  ?3 B1 ]- I
( P, W' J! q! I4 j% [

该用户从未签到

15#
发表于 2020-5-14 17:07 | 只看该作者
感谢楼主分享,拿来学习学习
  • TA的每日心情
    难过
    2020-5-17 15:30
  • 签到天数: 1 天

    [LV.1]初来乍到

    16#
    发表于 2020-5-17 15:32 | 只看该作者
    为什么出来之后有错误?

    “来自电巢APP”

  • TA的每日心情
    难过
    2020-5-17 15:30
  • 签到天数: 1 天

    [LV.1]初来乍到

    17#
    发表于 2020-5-17 15:41 | 只看该作者
    为什么打开是三个代码吗?求回答

    “来自电巢APP”

    该用户从未签到

    18#
    发表于 2020-5-20 17:08 | 只看该作者
    大佬康康

    “来自电巢APP”

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2026-4-18 20:26 , Processed in 0.140625 second(s), 28 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表