找回密码
 注册
查看: 5653|回复: 34
打印 上一主题 下一主题

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

  [复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码! m+ {( P: j5 A9 v! e7 r/ D
# ^% |. o9 G2 d; U

2 Y9 p" v' l5 c6 q& X( t仿真原理图如下9 W. a3 Y9 K) f4 n/ ^
6 ]4 I4 i3 Y! M
7 j' p1 ^. J- \
按button1可以切换模式
, s  |* H$ d% n2 c9 T5 O模式0 只显示温度
8 G9 s' A8 Y& o- R模式1 只显示湿度
2 _7 `$ T/ W- A1 I/ t模式2 动态显示温度和湿度,每5s切换一次
0 ^* o1 u! L/ M) u- v: N8 M) k: D, K6 d

! L" c1 E$ h# g" C实物如下
, n9 w/ d# ~! {) p( [; T$ ~* H. `温度显示# e: s* s* R' \6 X* ]% i1 q, d2 W
& d1 c* i' X1 R* I
湿度显示  小数
. y+ n3 a! L- r; c
& f6 P9 ]% g0 R) @& j# p% a: z, x( S! t
1 c. s, P, T7 a% U+ P$ T1 W9 |
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。
/ A, D1 h4 [) u4 a5 w) k* h+ q3 f
单片机源程序如下:

1 K! N; y6 G0 a5 t1 a, k1 Y3 ^6 X#include<reg51.h>' x0 Z7 f# O9 ^: Q4 W+ b$ v
* j: R8 ~$ N* v! w- D4 H( E) [
) `) z  m" z* ?/ j, D
bit DHT_Start();
" E1 P$ U7 a: ~7 f3 B6 bbit DHT_ByteRead(unsigned char *dat);8 @, I2 R' k- R! n' O6 t" q4 E4 J) V# e2 Y
void ConfigTimer0(unsigned int ms);
8 l! j1 b7 i0 i" ?1 R* Fvoid Display_hum(unsigned char *num);
( u1 t8 J5 A' ^! S' B7 Q1 [2 Tvoid Display_temp(unsigned char *num);
/ {5 f& z8 t  z+ }3 l
+ C/ T( x- [1 [+ x& d& [+ N2 a  ^% y

2 R: m- g& E. K" W9 z- z( H; r; N) U5 W+ |
( E8 b. b- P+ A3 {3 m
unsigned char T0RH = 0;  //T0重载值的高字节1 }, Z* p& l3 X+ O% k  H' B
unsigned char T0RL = 0;  //T0重载值的低字节 ( o' E7 Q6 f6 s9 v9 f# b
unsigned char str=88;: [( f# n  C8 `4 X1 U# o3 F
unsigned char DHT[5];
# C- ^( t& f+ |9 ~8 a! F
9 f; L! |4 y5 S2 a3 Y3 N6 L
6 U( J$ g' X7 T- s7 v3 H4 |: h
unsigned int tmr1s = 0;7 r! O( l$ k+ O  E+ U1 M
unsigned int tmr10ms = 0;
  E* Q5 x& A; zunsigned char st=0;
1 H) e( k* P* ~2 w. wunsigned int sdd=0;
# k3 O; O6 h7 o1 e+ K, Q5 E- h  dunsigned char td=0;$ O. |0 [. r4 s) ~) Q7 \# W1 p& B, C
unsigned char mode=0;
- i. c; |& m# _+ _9 e6 C4 b! F$ {( `& {  {
/ h6 W" u9 A" O& N% _3 y" @0 p
bit flag1s = 0;
- n' B6 L: {- m/ c' Vbit flag10ms = 0;
  o( @( r# ]+ v0 c- qint x;6 a* u; f+ V- p" V0 c2 X
            
7 j  b8 d7 L/ ~% w1 Hsbit button1=P0^0;
9 B( x) t5 a& u) rsbit dot=P1^3;   //数码管小数点" N7 k8 V$ \3 y; o/ H6 C
' p! k! V+ v- p
! S' T7 D( p4 H6 g  a  V& P1 b) |

1 F9 y% ~! S, n% e( k! k/ c

+ D( a1 Y* n5 Z( jvoid delay(unsigned char x)   //延时ms
% ?  L5 q3 S+ Q{4 U1 g) |( x, u! {0 k4 s
    unsigned char a,b,c;' n: ?) @, ]* `) N9 y+ K) m
        for(c=x;c>0;c--)2 Y: J3 u0 r" @; s9 x* S8 d% i
    {
$ k: K. a& p& E, a& l                for(b=102;b>0;b--)5 ?1 k8 X" F$ O9 j. p
        for(a=3;a>0;a--);9 x, E8 ]( E6 W& C7 H( }& G
        }
) g, N8 h, J0 O7 d# c}
4 y0 S! C8 ^0 t) Tvoid main()          . o! }. G& m2 I$ d1 b4 m
{                 . z, H( |0 L# ^% r; O
* _7 K8 s8 I7 O1 c, B( e7 W' S

: v5 y+ u* x( ]: R    bit tmp;
1 b- D$ }5 b) F; }2 z        dot=0;
7 X! N4 ]" P2 n* e% s: I    EA = 1;            //开总中断
+ O  `  g  X. J* N" g    ConfigTimer0(10);  //T0定时10ms# O/ y! [1 s# {' k& t$ P# J0 L- _
//        M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;
4 q* h" c. Y! C5 j3 z5 j    DHT_Start();1 m6 b, D2 S% R  F; k+ i' I6 W' _
    delay(5);/ g7 _) Z( v4 ]) c) }
, y  O, w/ g/ Z/ A6 k9 V! P

: q, z1 D3 U- P, X2 m  ~+ [, Z    while (1)
8 k( L- Z+ r8 [; E# d4 z. z  W    {/ ~9 D* J- H( N2 e$ Y' G5 [

" V* i' W: b2 G
) b7 G" a. U4 O3 G, V; Z
$ s3 N: r$ J" N3 d! W
3 X& N/ h% \7 y8 h; O3 K
        if(flag10ms)  //数码管刷新频率
: B. j: Q3 y& Z  f' l/ Z1 {' \                {9 W3 s" e# X# @) E( P3 K+ G' ^
                   if(st==0){
. W: |' Y# `3 A: N( t                                Display_temp(&str);
, {0 y9 }" B6 U/ z) R% K                                flag10ms=0;
+ R" r; N& p1 X) `! s( r; ~: b                        }. c) i! F: e& {, N- s$ m7 a& j/ g
                   else if(st==1)! W/ R, T6 h7 d5 J* p2 V. Y
                   {5 x' L" e+ O; o4 i
                      Display_hum(&str);2 F' X* A/ A, x  _% V
                          flag10ms=0;
2 V# I- O" J6 {% x                        }2 c9 y4 R# H  M) M/ `  U
; i$ F9 ~$ N6 A, a

( r" m0 B; w3 K1 d( T5 q. `( F                  
" U. m- f& ?; {+ f6 {) Z: H                  
9 X0 O4 K1 M' P4 _, Z                }3 y6 X5 W9 u8 M
                else if (flag1s)  //每秒更新一次温度、湿度9 |4 ]1 A2 N( I# D( e7 x
        {
% z3 k. I  G) q* k6 j3 b9 r                DHT_Start();, e7 Z0 q: w6 ?
                   tmp=DHT_ByteRead(&DHT);
% r% o8 Q& B9 n                   if(tmp==1)
. F7 |4 v. v& F5 t9 ^                   {
, c" V' e2 N+ B1 P$ f, @
' _- U3 M2 W2 D% n

5 n% ]1 a. s0 R) U" r  y  G                          if(st==0)
" Q3 \( V" L7 ^; r                          {3 [/ V8 q0 e8 ?
                             str = DHT[2] ;             //温度  l8 e. l$ P1 G* X
                                Display_temp(&str);                     
" y) E5 W' i9 U; L5 N: G8 \2 y- L5 _# B                            flag1s =0;         //标志位清零
6 u: }$ J" P1 g1 U. r. I- `0 [# x                          }1 K0 q4 j0 D, z" I4 z2 ~5 c
                          else if(st==1){
$ M  i7 ]: ~, I! V7 _
. T* D6 D( o/ o3 o5 C4 i

6 E: F3 ]# }$ V" L0 p1 S                          str = DHT[0] ;  //湿度7 A$ p" Q: ^- d8 O& v1 {2 F
                  Display_hum(&str); % G$ K) ^: J1 K3 W2 ~% {3 {
                                  flag1s =0;         //标志位清零
+ l7 r; y/ N0 ^: h6 H/ V* I                          }
2 [) L- j( [7 |$ K; x1 A+ W7 G! C0 @
! O  y5 a5 d5 p

6 i( e/ ]' Q8 c' b( j; p                          
" f7 x# m: p, n/ m( M
' |( R5 U; t9 }. s

) k" W! ]3 r2 s( L                   }
. U* N" _, V' l4 v9 Y' ~8 Q2 A9 N# a        }
6 G& t- J- U. _5 H0 W1 L) d6 l                if(button1==0)/ n0 |( ~; x$ |2 k! X
                {5 u+ f8 E( K% C5 P1 i2 V
                   delay(2);
/ m* y3 \* t; v$ E& r: V                  
, B$ h) v: Q- R                   if(button1==0)
: y- W: {# o' g; n$ t7 b                   {  k3 z9 z$ ^/ Y0 |, j% r+ i& S
                      / i  ~# \: `+ ^. H) n* a
                                mode++;
: ?% G9 U$ @& b4 a; o5 ^7 Z( M                                switch(mode)* Y: R7 a) W& G$ Q  _+ B- l
                                {
% A% m$ R6 i% I) m                                  case 0:  st=0;      break;: z# E5 i' G- X* s6 y
                                  case 1:  st=1;      break;+ f  |. O0 g% x5 f+ W/ H
                                  case 2:  td=1;      break;
. X/ H  V+ f7 H  G                                  default:     break;
6 @4 X9 |7 C' i5 N                                }" B9 V' c7 p8 Z1 C- |! N2 Q. z
                                if(mode>=3)
- g* c! }5 k& t+ W% m% _% N                                {
! F; t3 S4 g3 y8 b  H/ K                                  td=0;9 [" B. E7 N1 J6 N% G2 C; B+ o
                                  mode=0;: N/ u# U4 z( ?: ?& I1 X9 ^
                                }
! \3 h  e) ^5 X                                while(button1==0)
0 ^3 n% Z' i! @1 w/ H$ W                                {, t. P4 X, H2 l- v
                                }
: C8 P4 }) Y/ p) r: _. ?; Z- U
4 z! C5 o% f: ~

' f; |& k9 x3 C1 V" z! H
+ K  C' k% S9 q4 n/ u9 z
! {4 f* |$ m5 i" w5 J4 K' c
                   }
- E6 u. ]$ l$ K6 T) [1 b
. p& [$ G8 s" N$ d# W! ~2 P) U$ Q
4 z, ~; U* s8 o
                }
$ d% a; f. M  u) s7 N; ?* H5 s
; |9 ?  x4 w% h6 n. p* r" r

8 U8 b- n$ K" `1 m, B- \
: V$ C4 |5 ]+ S
, f: c. r+ |+ u% `- \. \/ b- i

- ]+ I5 B; Q2 o# a
' t* R& O2 O$ x/ o( U* K( ~
         }
& f( d4 H, N: N* Y}
7 ~. A4 c1 {( g8 f* l) j4 O, K) p

5 N7 ~" v) x; G( n' `! x  ~. L5 w; T4 b- v. Z
, M, |* {8 m5 r# q: @
/* 配置并启动T0,ms-T0定时时间 */; O6 m2 h1 c; C- |
void ConfigTimer0(unsigned int ms); m1 y1 v$ Z( h$ L
{7 d# x; T: e  Y9 m8 u' C4 @
    unsigned long tmp;  //临时变量0 X. Y0 ?4 H7 r1 K, |; Q
   
# N. n. c5 B8 B! u3 k    tmp = 11059200 / 12;      //定时器计数频率
& C, e1 F' I( z# i4 w    tmp = (tmp * ms) / 1000;  //计算所需的计数值% q- U3 F4 N& H! o' [& W: E
    tmp = 65536 - tmp;        //计算定时器重载值
0 e" I7 h% J5 i2 e$ B    tmp = tmp + 12;           //补偿中断响应延时造成的误差* O1 |* D: I2 w  [
    T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节
) ]5 b( `( Y! z8 K- G2 v    T0RL = (unsigned char)tmp;8 V, N2 C1 P) o9 j
    TMOD &= 0xF0;   //清零T0的控制位* q+ l; _" x1 S' Q5 c) ^8 v
    TMOD |= 0x01;   //配置T0为模式1
) k+ T9 @7 [* v9 f6 x    TH0 = T0RH;     //加载T0重载值
5 a0 V$ S2 E% k3 v' M; I1 q& B    TL0 = T0RL;
8 {. \2 h( s% y; @( u1 y    ET0 = 1;        //使能T0中断* y9 W' ~! P: \. u) I
    TR0 = 1;        //启动T0+ v2 N' o* ?7 G7 q8 ?0 T
}8 x  f" T7 A& x* v
/* T0中断服务函数,完成1秒定时 */
# |  n; p$ |8 g8 G& qvoid InterruptTimer0() interrupt 1
3 P6 Z6 V. D3 O% i$ p{- [% q! G: `7 N% O0 z0 y
: q5 C% f3 h$ F* C( P; h
; e. F0 K  o. D/ B/ ^
    TH0 = T0RH;  //重新加载重载值
) s  Z& q0 P8 K" S, Q6 q) |    TL0 = T0RL;
$ ]  ]( n9 |$ d# I7 J    tmr1s++;7 g, U4 d( B& W* u% j
        sdd++;3 v5 r1 N% O" }
        tmr10ms++;+ s$ P0 O, b. {) z, X+ ], q$ X) j

5 B1 N6 O0 b0 |. c& L

) z3 m- f. L& G- W5 Q; H- L        if(tmr10ms>=1)           //  数码管刷新频率
/ G* m' Q% v( C/ N9 u- f        {
( ]7 K- r1 J  q, W                  tmr10ms=0;
6 X$ m$ ?& C6 Z9 O& J                flag10ms = 1;: V% _1 }# K( L
        }
. S0 s$ Y; |  z) d6 |        if(td==1)! l* |4 j" {( x: `- ?
        {
& i; \( G& W" t& d3 k+ H          if(sdd>=500)           //温度显示5s        、湿度显示5s
" J: Y8 d1 S4 z0 L) L7 T0 Z          {
  J# H+ a  |7 a6 k. n5 J; e0 k             sdd=0;' g3 M5 d1 `/ g2 p* [& ^$ V
             if(st==0)+ z1 m% ]5 a: H) ?# E0 r
             {$ w' r  h& G& T& G) q
               st=1;
/ }6 y9 f0 P7 i  C4 b3 d                 }# n# ^. O) S: W
                 else st=0;. a7 W, W) f  R" ^
          }7 C* M( }6 v6 i# F% {" M
        }6 ^8 A9 s0 {- c
    if (tmr1s >= 200)  //1s 数据更新频率
7 I& v  Z) w0 l( a* @. q3 J    {
, |* [) ?- |2 N" ^        tmr1s = 0;$ y- k; m- T! i
        flag1s = 1;
; P/ Q3 u1 D: y% E- U        }
, [, j$ _0 T; \: l$ Q. M
, w3 c9 l: p7 n* |2 B" ~

: w9 w- f3 z9 [- v8 w   
5 x; E0 g6 [' U+ I# X4 B* S& r}
1 j9 T4 l. I) e! Z9 Z' B( u9 u
3 F! d" r3 I7 q% H, h
: @7 e6 G2 e( F( I4 M, Z4 I/ ~% p  {下载:7 x7 X" }1 ~9 `0 @
游客,如果您要查看本帖隐藏内容请回复

" x& o, z1 |# y
$ G# i1 ^' b4 Y6 u7 v3 B  R

该用户从未签到

推荐
发表于 2020-6-28 22:55 | 只看该作者
&#129310;&#129310;&#129310;&#129310;
$ T3 o; M  b3 w) A# O

该用户从未签到

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

该用户从未签到

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

该用户从未签到

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

“来自电巢APP”

该用户从未签到

11#
发表于 2020-3-7 11:55 | 只看该作者
谢谢楼主分享
+ q' _2 i* s# _. [3 m/ E# O  b. }

该用户从未签到

12#
发表于 2020-4-20 22:21 | 只看该作者
11111111111( s) l7 g: z9 a# P

该用户从未签到

13#
发表于 2020-5-8 14:47 | 只看该作者
收藏了啦啦啦啦啦7 Q6 F% y6 t1 B( J
1 f. ]  S$ K) d1 a% d/ y

该用户从未签到

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, 2025-6-2 00:17 , Processed in 0.125000 second(s), 28 queries , Gzip On.

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

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

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