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

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

  [复制链接]

该用户从未签到

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

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 P
0 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" f
6 `; [3 M( t: D1 j8 C0 Q" U: H

该用户从未签到

推荐
发表于 2020-6-28 22:55 | 只看该作者
&#129310;&#129310;&#129310;&#129310;
& I5 z4 U) h1 y! I1 Y( r

该用户从未签到

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

该用户从未签到

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

该用户从未签到

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

“来自电巢APP”

该用户从未签到

8#
发表于 2020-3-7 11:55 | 只看该作者
谢谢楼主分享5 ?4 k- q3 p+ @$ W9 ~5 Q

该用户从未签到

9#
发表于 2020-4-20 22:21 | 只看该作者
11111111111
6 q- L- v+ e9 ~( j( b/ e

该用户从未签到

10#
发表于 2020-5-8 14:47 | 只看该作者
收藏了啦啦啦啦啦  J3 f& ]7 G! S

* ^, t5 `' e1 g

该用户从未签到

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

    [LV.1]初来乍到

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

    “来自电巢APP”

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

    [LV.1]初来乍到

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

    “来自电巢APP”

    该用户从未签到

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

    “来自电巢APP”

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-10 14:51 , Processed in 0.171875 second(s), 28 queries , Gzip On.

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

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

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