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

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

  [复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码3 S& b- ^8 N8 c& ^' B7 g
( L2 C& W9 a) U# J* e3 v% q" N

" A0 Q3 e" \7 Y" \% x仿真原理图如下
* l5 W# J! l1 y! c0 q: u
0 v- v& s. B1 r2 a4 W+ z, k6 o  Q4 g
按button1可以切换模式9 S1 q" o( ^. K
模式0 只显示温度
* n5 e8 e6 G' |  X模式1 只显示湿度2 ?: C' u5 M  Z
模式2 动态显示温度和湿度,每5s切换一次' u( V) r' _! Z' }+ z% s, H

& @. ]0 F! l1 N9 ?
1 B$ B/ ^6 y  r
实物如下7 _' e1 P% g0 }' _* d' b
温度显示* [! M* q$ M5 S1 G4 ?4 t
4 n* u7 L& _+ c7 g
湿度显示  小数
7 y) _# h. h3 L* r& X, \ 9 u! G# U0 T' I7 w
0 U, H' M3 O0 ^$ S* w  y$ A

& \$ a; p. T! D模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。3 w4 v; w3 t. R6 g; z' Q/ v6 V
0 W; u: |/ B/ r" h: t/ S
单片机源程序如下:
# d/ \- [  }5 o
#include<reg51.h>2 I2 S/ A+ B6 \& w( b+ M, C$ w9 P

( p7 O: d5 B1 `
& _/ O2 A5 o' Z& I. [# Y; x$ F
bit DHT_Start();$ O- z. F) |  r7 ?1 a
bit DHT_ByteRead(unsigned char *dat);" a6 f. @0 b- b0 K) s
void ConfigTimer0(unsigned int ms);7 P$ d6 S. Q5 [# }- t4 W% i
void Display_hum(unsigned char *num);
0 p* b7 {) _5 K( c' f% Svoid Display_temp(unsigned char *num);" v# O, o% H3 r, @' w- t! p, J
- r- ^  ]% a+ w  T3 Q. |0 X% M

! \$ H! [! ]) I- G" M# u; q7 G2 o  U4 z% [* e) v' [) g$ |

" C+ s/ V2 g' |unsigned char T0RH = 0;  //T0重载值的高字节9 X1 [, U1 K# j% {6 G
unsigned char T0RL = 0;  //T0重载值的低字节
/ X# p2 ~4 k' S6 punsigned char str=88;6 h7 H7 Q5 L. N$ k3 m: g6 {( J6 W
unsigned char DHT[5];9 {3 m: m+ O1 {2 e% M& s
9 \) l! o! T6 Q! E& X" n. \

7 b1 Z% x/ T: q7 K5 x6 g" \3 sunsigned int tmr1s = 0;
  ~* N% k! a) b+ Q( T2 u# G/ j' Wunsigned int tmr10ms = 0;  t: K# U% x  Q  P8 t7 p# s
unsigned char st=0;9 C( K, |8 N+ v1 f! e4 j
unsigned int sdd=0;
/ a& A4 @6 T0 h6 e0 w* Yunsigned char td=0;
% `8 P6 w1 A+ w1 Hunsigned char mode=0;
% U' w# M- f) J: w. i! O. W: M; I; \0 j" R1 [4 J3 n2 j
2 W# i1 n8 {: ^- _+ \
bit flag1s = 0;5 e# n. k8 O5 S! V: @* o4 s3 u* g$ k
bit flag10ms = 0; / J& R) F% a: c4 [% C$ _
int x;4 H; \/ Y$ g1 a3 U# C
            
$ K1 c0 Y* q: ~. x8 E9 Asbit button1=P0^0;. q; X" A) F% w$ {& i; x
sbit dot=P1^3;   //数码管小数点6 h4 P4 z/ j& n+ }% H$ M

( N; y' d+ @: B1 F+ l; N
& l! ?% }& a- V- f* A: P/ f- W
) l/ Y8 K1 o5 G5 c2 T4 @6 T

4 z. S- G9 \* o# K  ^& ]( g2 Kvoid delay(unsigned char x)   //延时ms
2 `# g( j: `" V- z# t# W{
+ e/ `7 F/ C; J4 N. }3 c: a    unsigned char a,b,c;% A( {& [7 U7 |9 W- j
        for(c=x;c>0;c--)' ]) ]5 ^; z9 {0 T, |
    {! z" h% B6 O3 c# o
                for(b=102;b>0;b--)
' E* z  n, r; @$ B        for(a=3;a>0;a--);7 }% H5 B+ C6 A
        }
8 i1 G& T& p2 |}; N9 j1 x9 K& ?4 G
void main()          0 D3 q# H4 U3 e
{                 0 W" i6 @" O3 K# Z1 c- q
! p# x+ e# b$ k# z2 ~( m

6 c! `; j9 d  v$ m: i# ]/ {    bit tmp;' x$ G- _1 Q' d* l0 C" q
        dot=0;! i2 w$ \1 @% M) F& i- B- x  o
    EA = 1;            //开总中断
! @$ s" X- ~0 b" ?0 d' H    ConfigTimer0(10);  //T0定时10ms, L, p+ Q9 H% ^) U5 e. s% q* _
//        M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;$ v, P0 [6 u$ F! F
    DHT_Start();, n% @& F$ j8 B5 R4 M7 z
    delay(5);1 U  W$ u$ |) I- p* d

( [5 e  G+ E/ ~6 ?- Q5 S

! f  f8 m8 x! x( }1 d6 Q    while (1)
% e( z: r. n2 x( p1 q2 F    {
6 D* b/ z/ V2 W9 ], S7 |: z" `( ]/ b  K! j

! L5 O. p4 d$ [) v. x2 s8 R; f+ m/ N& A. m+ @
7 |0 C: {# a% g3 V$ F; I
        if(flag10ms)  //数码管刷新频率7 q1 p% n5 B  V- P, h8 i# j/ g# a; F
                {
7 o# O9 |+ o2 b) M- W6 m6 c                   if(st==0){7 X# z  G! S* D; q6 ~0 P9 K
                                Display_temp(&str);
/ A/ Y4 \) p# Q( v/ h9 l                                flag10ms=0;8 K1 ?" g( ^: d; u2 d+ ^
                        }
  t0 v- f: P& {/ [; Y! \                   else if(st==1)" `; A) j0 H( W! I
                   {
( E* {3 O# |; A                      Display_hum(&str);$ g& _# X( h! O
                          flag10ms=0;5 t  y% ?8 |% Y! C1 \: C8 f$ \: H$ W
                        }  g' m7 d. Z# d$ T

2 |, O" Q% Z4 p% m$ e1 e0 J

: {' O" T7 V% r$ t, `* m                  
* U+ N  U  Z. n* o6 s) X                  
3 k1 S. e* ], K5 q( s" g                }
" k* ?6 I! j3 E& e                else if (flag1s)  //每秒更新一次温度、湿度
  [" e# J$ P2 b% Z$ @4 \5 D        {
" s; P( Z+ g# w6 Q  [8 A; {                DHT_Start();
7 T' ~- ]9 j" {+ p4 O! x                   tmp=DHT_ByteRead(&DHT);
9 f0 e/ x5 b1 {$ F' y, q, q                   if(tmp==1)2 {8 f" i) \7 e8 b2 O
                   {
  V: h% @: @6 k  Y4 ^" Y/ Q' U9 c! N( W! Q' ]/ f% C

: ~1 B& U* j4 v: `8 G                          if(st==0)
1 d: ?; N0 H) j; G% y                          {
6 }8 @, o; V; y0 w1 p* l                             str = DHT[2] ;             //温度
" z8 `* [. u$ ~& i8 u3 d9 E, p                                Display_temp(&str);                     + `- Z7 R) B# Y8 W1 F
                            flag1s =0;         //标志位清零
- \; ~  B7 \+ o: k. o6 Q( s                          }
" x% ]; b( L+ Y8 w: T                          else if(st==1){$ L' \9 a  s8 N4 J$ q5 }) \

+ M8 E1 [; D* T" q) D  m2 }
2 U( m+ }2 {& l  p0 x, B, h+ _
                          str = DHT[0] ;  //湿度
, x! n! |* D- \0 n5 k( H9 {                  Display_hum(&str); % \5 L% c; y2 ]* q
                                  flag1s =0;         //标志位清零
* n0 ~3 R6 d! r1 D! `0 e                          }
3 C. I/ C% o6 R, \0 s: k% E( k
/ Y  {" h$ g3 v4 P" _4 z& a0 D

' j: v0 r5 D- J( m1 n9 X6 L# v' j                          
& W: \4 n. U0 V  D7 [) u% e" A7 P7 [) B4 k& Z9 b

. }0 P% o7 n# e4 l$ M- v                   }! d1 k6 h; N) U3 m2 s5 Q7 a
        }& b) o$ e! Q; w* R
                if(button1==0)3 q2 c! T+ k; N4 d4 B* X
                {' x+ {/ ~4 l) @
                   delay(2);/ I* k; B  d9 R* @8 }3 V
                   - y) A. w1 _0 h" c6 x# E8 _
                   if(button1==0)2 D! F, y8 o$ z" @4 V
                   {
. P' `' x5 @4 ~8 U# f7 R) t7 Z                     
. i/ U. R0 r- m+ d) o                                mode++;
2 m2 r( I  r" a" a" j                                switch(mode), D: ]3 h% X1 ?) l3 E+ Q0 X4 K, D
                                {
6 ]) o5 f  s: G/ o# w4 J. J% k                                  case 0:  st=0;      break;- |- r- I  n" o% X. A
                                  case 1:  st=1;      break;! i0 B3 |0 B6 k3 ]0 s
                                  case 2:  td=1;      break;
, ?: K9 p2 \8 D1 V$ K& Y# H* m                                  default:     break;
& `3 \2 d) U# \. I                                }
" F# _& q- [! W! C1 w  G                                if(mode>=3): d7 `* L8 L; H0 A3 q- Q) l
                                {
) x+ X0 S9 ~3 w8 t/ d  I9 ^' s                                  td=0;
; t4 u4 f9 z3 C  P9 A3 _                                  mode=0;
- P7 t# p! O9 A: P- ]0 R                                }$ _- @" H6 [; }% }, U
                                while(button1==0): A' j3 K: @3 K9 Q1 u
                                {6 e+ A: _8 z% V9 B
                                }
: n6 @* W( d: @& z8 y* ^5 m1 ^6 v5 n0 k% Q

7 [+ E% \# Y- i! N& x& c8 Z' y" N8 N

6 y  e( L2 F6 g2 e% [5 U7 T$ r7 j                   }6 \" }: k, I' o4 ^* B' o% M$ W
" u4 h3 e2 k4 G2 \

8 F- l( B( i8 l4 {! {9 W! M6 A                }1 W9 ~2 Z. ?% y6 z# i1 o/ s
6 E8 z& \: @% [. H+ a7 T7 l# O# n

* g4 y$ _- M8 T- m8 J1 n8 G2 s
' }8 q: o2 D7 C% k; y

+ Y8 D1 e0 v# s+ C2 n" i+ h
6 k9 E4 d2 a( {0 k* I

8 [8 \  B, s4 W         }; ?) z- g* p0 }; F7 z6 @
}4 ?1 g0 Y9 Q; U) Y1 O( H
1 n( K) j  ]$ E( V% O( }  y
: t# y% s$ K# O& q
2 e4 X9 L1 ^+ {& ~6 J
) }3 }$ r# \9 y/ ~' h' I
/* 配置并启动T0,ms-T0定时时间 */3 K- }  M6 F. L' Q$ a! ?) R
void ConfigTimer0(unsigned int ms)* J7 g2 i* l, ~1 K) @
{
$ U' R* x0 p: X- w% r    unsigned long tmp;  //临时变量+ U+ r  ?3 S" H  k- _) ]' W! ?6 _
   
( ]# r( G' @' k+ t5 Z    tmp = 11059200 / 12;      //定时器计数频率& ~8 S$ k8 K- {& t7 e0 @  J; a
    tmp = (tmp * ms) / 1000;  //计算所需的计数值
/ `) X2 j. \+ @) L& Q6 S9 R    tmp = 65536 - tmp;        //计算定时器重载值$ I" `  z2 _" k( t) r
    tmp = tmp + 12;           //补偿中断响应延时造成的误差
0 ?. F1 E7 X8 k  L    T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节9 R, n9 X7 {' T" N; g* `
    T0RL = (unsigned char)tmp;; g9 g. w0 r7 y/ p0 J
    TMOD &= 0xF0;   //清零T0的控制位1 m8 W5 `' a" D) M7 A3 Y
    TMOD |= 0x01;   //配置T0为模式16 T* H' d* V) i+ \
    TH0 = T0RH;     //加载T0重载值* u$ {% L% ?* H: p5 r- W
    TL0 = T0RL;  m2 A6 H5 J+ d; b3 r$ e
    ET0 = 1;        //使能T0中断
$ E. r" P. j  J+ ?' H    TR0 = 1;        //启动T0
+ U6 w, d; p3 ]! t}. M6 j* U9 K8 o4 p: R
/* T0中断服务函数,完成1秒定时 */
$ }2 w5 C. y  gvoid InterruptTimer0() interrupt 1
6 M  J$ W) r* s: Z7 v" G{/ F: d  F) q8 B# d, ]- i! O2 p. y

1 K0 s8 H9 T1 W

$ x* h: }2 a% Z    TH0 = T0RH;  //重新加载重载值. Z- q9 r& U) h$ X8 J3 ^# U: U2 J
    TL0 = T0RL;
, z' H. U4 q$ I# |. q& b    tmr1s++;
& Q  C# x( q" C6 |% W! h; p' ?: j        sdd++;) f1 q# l' k/ |+ Q, f$ F% k. c
        tmr10ms++;( G% u- C) _/ K9 J  A6 n7 j
! [* }0 {3 `4 [0 K9 O/ Z
8 `( W6 y- ^4 W( D5 L9 \6 R
        if(tmr10ms>=1)           //  数码管刷新频率" K% P1 E# H8 B) _. Q
        {
# i" U6 y! N2 v4 a3 U                  tmr10ms=0;; U, k. O0 t: D. G7 D
                flag10ms = 1;: W& B  ^' I; F) n) G6 D
        }
& e5 U8 L% ~$ }4 d+ C, a        if(td==1)
* u' ^  ^- ~& e8 c, z        {
9 L# ]. {5 E% p          if(sdd>=500)           //温度显示5s        、湿度显示5s
3 h$ q( e5 r5 k" Z% A2 q          {8 T, N* G8 p$ K
             sdd=0;: m) J4 [  m& O( }8 S
             if(st==0)
3 v& V5 Q, `. o1 W7 n             {+ i( s( h8 Q2 t7 I0 q0 Y9 o/ d
               st=1;2 c3 B* t2 ?9 Y3 {
                 }
8 ^( H) z- T8 c3 D: u( k                 else st=0;
- d% n9 i1 q% E6 r2 q          }8 k' R$ c! Z7 v" ]1 O' O9 S
        }
6 Q7 C* B" _8 Y% s! t/ V- A" K- H1 b; Y    if (tmr1s >= 200)  //1s 数据更新频率
7 L% G/ ]2 y2 z4 S  y    {
- ^3 X# u, i$ J; g        tmr1s = 0;
8 h1 Y9 t6 Z1 Q0 r, ~: w        flag1s = 1;
4 Z, i% }4 i' F2 F- {        }
1 ^5 W; M3 f% t0 x2 _  k
) I! v" h  k6 f; @8 @3 }
  p& h8 F) z" r
   
: a3 _6 v4 o9 z4 ^' p8 ^}% c/ \) |0 l1 A1 \. X# D

1 ]- {  [1 V7 Z4 @2 h
- H8 K  l# T/ B. g7 l" j, R$ r下载:: X* d. }+ B9 ^3 [) s" [" ?" K
游客,如果您要查看本帖隐藏内容请回复

) S; o7 X# D' K7 O( v
% \. C8 {, r9 z* V

该用户从未签到

推荐
发表于 2020-6-28 22:55 | 只看该作者
&#129310;&#129310;&#129310;&#129310;) `5 c6 s7 o' a

该用户从未签到

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

该用户从未签到

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

该用户从未签到

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

“来自电巢APP”

该用户从未签到

8#
发表于 2020-3-7 11:55 | 只看该作者
谢谢楼主分享
6 F" p7 `0 x7 x5 w  m# f

该用户从未签到

9#
发表于 2020-4-20 22:21 | 只看该作者
11111111111
" W. O' I1 r6 o( h

该用户从未签到

10#
发表于 2020-5-8 14:47 | 只看该作者
收藏了啦啦啦啦啦
9 B) x$ x& m3 Y3 r  F& f8 M/ a- e% u3 }$ l- }' U9 R

该用户从未签到

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-5-25 23:59 , Processed in 0.125000 second(s), 28 queries , Gzip On.

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

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

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