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

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

  [复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码
" e7 S( B: g& @7 t( {; W' A. Z3 Z) |( N' _2 b- [8 T. S" Y
8 @1 L6 t* g- {( S* Q2 t
仿真原理图如下
9 D. w. E8 ~4 l# d2 J7 a( j
1 q  D" J+ j: E/ f. }) |% J# J9 F7 D. w
按button1可以切换模式
+ r. Q( @3 \9 T# h% x- \4 \模式0 只显示温度' T' ~1 h9 Q# S/ U6 }- ], J
模式1 只显示湿度9 B9 _8 ~! W# S& }, P$ y8 o
模式2 动态显示温度和湿度,每5s切换一次
3 s* u. ^0 A) l5 S/ g% j8 p0 y7 v/ \) r& T2 U. ^. D: }* b$ `

0 C4 T8 A' B+ s3 t4 U6 w实物如下3 o5 z. }1 u$ w( x* J6 x* o
温度显示5 b9 D: ~9 ]/ n" y! c8 Y
! i3 k7 p) Q; h8 I$ L
湿度显示  小数# c6 Q" d6 q& ~: }' f8 H

$ ^6 R1 [! d, m
. a! q0 `2 a3 |' s & v( S2 X' x$ i2 w
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。
8 r9 ?' P! r" w: p
! P9 @! Z* U; }4 ]+ F单片机源程序如下:

/ S5 q/ q+ E$ y+ \8 \- ?. Z#include<reg51.h>
0 [. M' t8 f1 s% {5 K$ O, [+ H! F1 J1 s/ n9 P+ k% P. H2 p4 ?# r$ w

2 f% t" y1 U% D9 D) ybit DHT_Start();" G) y. x  l( O$ c3 e7 {0 ^  k
bit DHT_ByteRead(unsigned char *dat);
: w) S* O! e# O$ W- gvoid ConfigTimer0(unsigned int ms);
* t% {% r. \# ~5 t( \void Display_hum(unsigned char *num);5 |7 ^5 j$ ~: L/ N6 y( l7 ^9 V2 o
void Display_temp(unsigned char *num);4 r8 u: ]0 S. I% \* o- a2 T

0 P; ], o& N+ J2 R

% G$ Z! X& M4 h  g3 x
6 B, l* y$ y' j6 c0 V, d8 _
" ]# J$ Z' c# S" m4 D4 |! a0 @  E
unsigned char T0RH = 0;  //T0重载值的高字节8 ^7 @! l( f; Y& c2 q/ z+ p5 d
unsigned char T0RL = 0;  //T0重载值的低字节
; p/ V0 N4 Y5 {0 punsigned char str=88;
4 Q8 P3 O! h- p) Tunsigned char DHT[5];
2 f& F1 N% A8 d3 L% z1 W; ?: n* ]* P7 O( E6 O  Q  n- _. k8 t

( B- V9 l4 Q" `$ Eunsigned int tmr1s = 0;* j( a0 d! X2 ?4 G! I- t& p) i
unsigned int tmr10ms = 0;# u, R, G8 W" w
unsigned char st=0;1 q0 Y7 t/ Y- M3 D- I
unsigned int sdd=0;
4 f% d; g! }. N" q/ J9 L3 C1 ~unsigned char td=0;
& f& ^- b/ o  r) qunsigned char mode=0;. {# ?0 I. w7 b) B& o2 x
6 y* O. J* p% s8 {' z  U

* J5 }' Q5 {: m3 _" p& n; [bit flag1s = 0;8 y$ H( Y% }" }! k0 W
bit flag10ms = 0; ( a9 _" b, ^/ f+ ]! h
int x;
+ |2 J" ]& d- o6 E8 J            
5 u9 E0 f% g7 v! Rsbit button1=P0^0;
+ N1 `6 W! C: Fsbit dot=P1^3;   //数码管小数点$ X; [0 U- d5 R4 B
9 j3 p3 u7 g3 G# a: @
4 x; R2 [) F+ O$ a9 O: X" e
9 _) t7 z1 L% ^. R; u

7 F* g  N8 _3 |* o4 f+ S6 M9 Nvoid delay(unsigned char x)   //延时ms
4 T& c; h: n8 D% k8 f{" x1 q- A* j2 [) t5 O
    unsigned char a,b,c;
0 c+ T/ p/ N+ i# m5 ^* h* ^        for(c=x;c>0;c--)
& [5 D; O9 @# N) V3 r9 K4 x    {% e% z. K! b6 M: H1 B; X5 m6 @
                for(b=102;b>0;b--)
, i3 p) h  n; x        for(a=3;a>0;a--);
+ K% v0 |& L1 {! Z5 ~) r        }* E& |4 f6 U+ D7 x
}3 z6 H9 @8 M9 y3 U8 X& h6 R- L) F$ Z
void main()          / @, ]5 L7 n9 W6 _8 a3 w+ z
{                 : ~2 P' z/ M0 U

! N* a: r. I( H" C1 I1 c
; ^0 B2 D3 j! b6 G" x
    bit tmp;1 Y+ B+ _/ n& g5 d" H4 Y9 G
        dot=0;4 z2 U3 e+ u9 a: f
    EA = 1;            //开总中断3 g: V( p: d3 k4 J7 _
    ConfigTimer0(10);  //T0定时10ms
9 Z0 Q6 e# u, q8 _7 d" Q% q2 n//        M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;
1 `3 l* v# Y! s: e3 X9 ^& s3 S$ a* ?# m) k    DHT_Start();1 ?6 q- v8 v& U! C  F% _9 P0 J; C
    delay(5);# k7 c/ z8 k0 g
, o) {, L/ y1 e

1 B2 T! x* v4 E" f" F    while (1)
6 V" Z# B3 Q' A" I$ B! |& v1 c9 T    {
  F* N) l' q; `4 Z, ~
7 D$ J& M+ v1 |$ {# `

7 d8 L; H7 D! o6 C$ [; `1 S& O; |
. a1 s. N. r- x5 I) c" Z4 F" C
  h6 C7 S0 ?: z( b% v
        if(flag10ms)  //数码管刷新频率% G7 J* O. U, O- M; {2 b
                {& D4 p* i  n0 j- f# c
                   if(st==0){
4 ?9 J2 _! N% ?* w# P( {  d                                Display_temp(&str);
; v$ G# D" n& }+ D4 z' j* v1 B0 L                                flag10ms=0;
, `* X1 d2 k/ r6 N8 ]% S$ P                        }6 u4 k1 w( y5 x+ W9 B
                   else if(st==1)
& g8 P) o+ U- K- g5 x2 O7 J8 }! v& ]* o                   {
) l- e( y6 m; u! h                      Display_hum(&str);
" a1 n$ H0 S' l6 G  g                          flag10ms=0;' D; @- n+ Q+ H; Z# q
                        }
2 Z. G( U; g9 Y) B# G0 \" V  }! T4 v. i

* a% t8 L# \& B) E7 E                   , r& E* n$ a( Y
                   5 l6 h8 ^/ e3 J4 q3 G. T
                }" w3 G( ~0 ]0 U/ E2 W
                else if (flag1s)  //每秒更新一次温度、湿度
/ N2 p. z, j& w        {
' a4 t! j5 L& z; g% j" P) E5 Q8 y                DHT_Start();4 @$ t; L) q* u/ V  B
                   tmp=DHT_ByteRead(&DHT);
9 j: p$ w$ X, H7 l8 ^. X                   if(tmp==1)/ Z. @" g' I& U
                   {
, o* q  H& x6 l7 n$ E" V6 f0 x! I7 |

: ]8 Y  ]7 c0 B                          if(st==0)
8 }. M  m4 b. a3 b                          {' f- b- {# H- n& Q4 Y$ i$ t3 n
                             str = DHT[2] ;             //温度
& ?) X. S  e- g$ h                                Display_temp(&str);                     
! D& K, v! ^; c' F. Q+ p$ B% C                            flag1s =0;         //标志位清零1 U* B) F" D  }6 W9 J
                          }
: ^+ I4 E5 v* e                          else if(st==1){+ O4 `. {. r: S! J
' h3 E- t# x% B! ^! _6 g! x, Z

- K4 c7 h1 K2 X                          str = DHT[0] ;  //湿度' ~. U. g( y. ~% P1 F! t
                  Display_hum(&str); 3 G* \# E4 v. `$ h
                                  flag1s =0;         //标志位清零
8 p5 H( D7 O+ h* x+ S/ d                          }& v" ~" m' Z( _! h

6 H. n3 ^6 Q8 ?' C0 w
% @* J$ b5 W0 N4 T  r& u' w+ W3 ]
                          
' A8 [- W/ a5 ~% a0 ?3 y
, u1 j4 C$ ^) ?) d) L2 J5 U, U3 `$ r

# g. h8 q1 V3 D: O/ D! [, K9 R7 \                   }7 ~: _: j( H) Z0 z: d
        }
) Y9 M* I1 C4 l) k0 K) k                if(button1==0)/ `0 a! \+ O! [/ o3 z, v2 Q/ p
                {
3 x2 A- |* ]& ]- f% _                   delay(2);
; J4 m7 e1 D3 w1 Y7 M: P                  
7 Q5 w7 |' l. T" v. x7 ~: M  b( j                   if(button1==0)
/ |3 f: n" z2 q) `4 m% J+ M$ p                   {! [. i. i: {: x0 B' [) Y+ V* q
                     
  f, D# {5 k5 Y. H                                mode++;3 q5 ?6 c& D7 t1 _  `
                                switch(mode)& N+ L/ f- [# k9 A3 S
                                {( d4 V1 `" S2 \# ^' S: Q) n' I# x
                                  case 0:  st=0;      break;: q( X7 T9 w4 Q/ H+ U
                                  case 1:  st=1;      break;
; Y# Z$ K0 a" s; _$ ]                                  case 2:  td=1;      break;  T! ]( k8 _7 B9 A+ K) a0 F5 Y/ T
                                  default:     break;# G' P+ ]8 B6 v' {' L/ n9 B
                                }; Y6 K; O( a" {8 {
                                if(mode>=3): v" f2 ?4 s$ A
                                {
/ V9 Q4 d: r  S5 Q. m                                  td=0;
! H. ^1 p0 s1 {2 F                                  mode=0;
) C' A4 M1 d4 W& p                                }
2 U2 C# `! _3 k8 }+ L) T- e                                while(button1==0)
' y! U1 X* _& O                                {$ V: `& V+ G; s, r: `( o* G
                                }
. ~. a2 m7 r5 x
5 l# M# H( a0 \' u& A

2 x: I/ ^0 G, B& O! u, g/ f1 b3 N- E
6 U2 \7 V7 V6 G5 {
                   }% l& X- _0 `" g1 y, D6 G* X

) b* K$ w2 H) [# i; u0 e

9 P- s; C" C) X) b) M                }
  d) r+ E% E- ~" p! r
+ f, e/ R- l+ {6 B

9 G' U/ M6 v1 b! m' F$ v4 Y1 C  W  u8 X( h- p2 z2 G

7 \6 c" j+ I% Z+ f( w6 H+ b4 P5 F% \1 X3 m* C" h. E. B

# @  B0 z, ]" r1 S3 T, l         }- l# [+ H( N( g& \
}7 m' L; m6 j2 x0 D0 K( G9 ?
) w: Z. C( W( |0 \7 X
; G7 Q2 l  C4 F4 }  f

& b& X9 N4 c( m

- u' [1 X( i# ~8 r& M0 y/* 配置并启动T0,ms-T0定时时间 */
+ i0 G1 }" ~+ R$ K3 `void ConfigTimer0(unsigned int ms)2 g) T! ?  N& a0 {
{
- a$ D( K: O- D& Q3 @" [, t# j    unsigned long tmp;  //临时变量
% \1 g4 g9 C* a* N. }: Q; i    1 D! f' |! b4 v
    tmp = 11059200 / 12;      //定时器计数频率
' o- R& H2 D( M) P& X6 s7 R    tmp = (tmp * ms) / 1000;  //计算所需的计数值+ r  }1 m8 E6 R. ^% \( e- a5 n
    tmp = 65536 - tmp;        //计算定时器重载值
2 M( A9 i' b, p) t& ^    tmp = tmp + 12;           //补偿中断响应延时造成的误差
+ ]1 x. B" p+ N" l    T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节
% X1 g; n6 ^5 E" [4 a  U) _    T0RL = (unsigned char)tmp;% a2 X8 w" `. ]( V, y
    TMOD &= 0xF0;   //清零T0的控制位! m% {! j5 R8 v( I
    TMOD |= 0x01;   //配置T0为模式1
# B" t/ ]. b; O8 N5 Q    TH0 = T0RH;     //加载T0重载值
6 |( Y/ B; i. ^    TL0 = T0RL;/ ~, I! d+ W' A) V5 C
    ET0 = 1;        //使能T0中断, W$ h) T5 _: n% K
    TR0 = 1;        //启动T09 c4 x; r- m; h  e( ^! ~5 Y
}) d+ {6 Q1 H# A8 w8 X
/* T0中断服务函数,完成1秒定时 */3 m' K, {- f: h" B/ ?
void InterruptTimer0() interrupt 1
4 u5 A( d) r! |, I5 d! }, p{9 t; i, c9 B6 g" P1 h% {
. [* u! K$ _! Q7 I2 E

; d& |" U- S3 k( M+ p  i) q: S    TH0 = T0RH;  //重新加载重载值9 [5 n2 ~3 g1 }. m% ~( J
    TL0 = T0RL;
* c' h/ H5 y3 Z- j* Q6 ~' i' s    tmr1s++;. ?$ o  h5 v& q, D9 ?
        sdd++;
9 s" W0 U# l$ G' v# m5 b        tmr10ms++;% j+ w7 D5 U! }) N% P$ c! Y2 F

, T) |1 M2 i& |) d
9 F* P& Z3 V% o; W; Z5 w
        if(tmr10ms>=1)           //  数码管刷新频率
0 m  P& y# o' }8 {" I        {% v: ]5 d0 k2 y6 I
                  tmr10ms=0;( D9 T/ O' O7 W+ n9 K
                flag10ms = 1;
: g) C. d0 a, K9 H" C4 F7 Z0 N, S        }
/ q) y: h' n5 Q0 D        if(td==1)
; F5 h: Y- W8 }( @/ g        {4 u2 x( C9 ]: ]2 |0 i& x
          if(sdd>=500)           //温度显示5s        、湿度显示5s
- H1 Q- A& I0 ]3 H2 R0 ^/ _          {' W7 p/ }% @; E3 h% F( Y& h9 \
             sdd=0;
. k# q7 t6 ?7 Q/ F1 B             if(st==0)+ z9 I2 B; h& @. y2 [
             {! U5 M8 E' F* r
               st=1;' U0 D/ \& s( W* g4 v9 \- K
                 }
1 O4 a9 i: E( {6 U, Q  K% v                 else st=0;/ P' r& t- P( C* P7 t) B4 C0 o
          }
! ^" A' L6 i" F: n2 R- n0 O        }
& ~7 ~' h) C, g9 h0 s) ?( }    if (tmr1s >= 200)  //1s 数据更新频率: w3 E0 Y; j+ e% G7 a' [8 ?2 e) @
    {( J* f# ?1 j' e) d; G  ?
        tmr1s = 0;$ T2 u. P8 M! z5 U, Z
        flag1s = 1;
- C$ [2 q/ j; Y" I+ Z% K) h1 q        }
( W% `/ E9 |( O7 }# a* `
: y1 u$ o- |7 z* K2 c8 D# S

# G1 r' w( F, Z; P. \    9 X, S; Y2 Q9 Z) A4 S9 C( c
}, g" S+ |7 v, K2 R
7 F) ]0 A% i" g8 U( ]1 z! T) h9 k

5 X/ j% x# q. ]3 i% @下载:
3 K: ^- v& H' i
游客,如果您要查看本帖隐藏内容请回复
+ O. X% L& q' ?2 v" G

" R- [( i0 h" u: A; p' F8 @8 }

该用户从未签到

推荐
发表于 2020-6-28 22:55 | 只看该作者
&#129310;&#129310;&#129310;&#129310;
/ i* ?! Y/ m# c( V! e

该用户从未签到

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

该用户从未签到

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

该用户从未签到

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

“来自电巢APP”

该用户从未签到

11#
发表于 2020-3-7 11:55 | 只看该作者
谢谢楼主分享
0 [) f1 f- U" ^$ T: |9 y* Y

该用户从未签到

12#
发表于 2020-4-20 22:21 | 只看该作者
11111111111
2 T+ i) {/ _4 c+ R1 {

该用户从未签到

13#
发表于 2020-5-8 14:47 | 只看该作者
收藏了啦啦啦啦啦
2 _! F  `4 Y9 Q0 v7 L6 Q
! i7 X: S2 x! p: c' q: x1 B5 ?

该用户从未签到

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-10-6 05:16 , Processed in 0.156250 second(s), 28 queries , Gzip On.

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

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

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