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

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

  [复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码1 S! L  i4 `$ }; w

- Y; k9 r* L; W  U
( ~. H9 f# h5 l/ b$ U% L; z
仿真原理图如下
1 @  ^6 {, m3 ^6 L; C . _/ J' v8 X8 r% v

9 |! [4 v" g5 m0 }+ Z' I按button1可以切换模式
9 y, r- j: S* k8 d' p, Z模式0 只显示温度0 O8 v+ P; J4 l7 e, C
模式1 只显示湿度8 U& H- B8 |7 Y4 `8 T; d% g
模式2 动态显示温度和湿度,每5s切换一次
1 w1 [6 I& m+ f) x9 @# p& a7 }9 n8 f7 v7 }0 g& c
7 Q$ B6 d, U! d7 D. e' s7 i; l7 d
实物如下+ o; m( D; B0 q9 b( S$ @
温度显示
* M4 K. P2 f% F- E  I  I4 Q8 T ( s2 d, D: K, W1 c% H2 n0 @! @# {
湿度显示  小数
% l( _* f  u( ~: |
% a: L  @( i* |9 w. s6 A% k( a0 R: b! \; e) }6 h# @9 t7 {* p# M

! g- a' `5 p) h3 s3 X模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。
; K' b. c$ v) {
. l: N- J- ^/ \! t" q3 _单片机源程序如下:
$ \3 g! T# v3 r: L+ |" Z  a  y
#include<reg51.h>. W: M: D# ^3 V7 f3 Z! i- n/ {
. p& F) ]. h$ p
1 `) Y, @' ]5 h& C4 I& k# @  e
bit DHT_Start();
  b' N; X$ F* k4 hbit DHT_ByteRead(unsigned char *dat);
/ Q! o* C' V. E, [' ivoid ConfigTimer0(unsigned int ms);# G) U/ O8 `- U+ A4 e5 F. L' R6 d
void Display_hum(unsigned char *num);
3 N& f* u& v' L* R+ H' R8 Pvoid Display_temp(unsigned char *num);
: ?2 ]0 j2 s/ C+ J" m' N* T
! f2 a6 N- P! V
. g& Y% q+ w0 \: g" h

% b# d+ [4 h& o7 G- Y5 T( L- s  E2 U

  f. M0 t" w5 M5 j! hunsigned char T0RH = 0;  //T0重载值的高字节5 {4 b( Y4 B3 _- H9 n, I
unsigned char T0RL = 0;  //T0重载值的低字节
6 b( [( R0 @, E9 h2 [unsigned char str=88;
* i, g# I" x' G5 d+ c; Munsigned char DHT[5];
; r- \" q9 `1 W
. Z4 F( j+ ]( I5 o5 u* c9 _2 i8 L

* a5 P; d4 k1 ~# \, v+ Dunsigned int tmr1s = 0;4 T: F# L+ d4 b
unsigned int tmr10ms = 0;
9 h6 @2 H" f2 ]1 p  |! @  ]unsigned char st=0;' ?9 o( `. p) {# n0 F
unsigned int sdd=0;
3 y( M6 \( _2 R2 ~! tunsigned char td=0;$ o6 f9 w+ c% g3 F/ O. j/ m+ x
unsigned char mode=0;
; l# f" \; f4 f" r$ C( ]; P0 D& g. D. k- w9 i, ~* F8 a* Y

, |# d4 e# Y2 v  I8 |  Lbit flag1s = 0;2 y6 h$ n% @4 T) @7 q0 u
bit flag10ms = 0; * ?. y) r; k2 w1 K& S) n
int x;
& a% U, K, z0 n- N. l' `2 ^            
8 J/ {/ n5 `* u' V! ~. q/ Gsbit button1=P0^0;5 G7 i) A" u# P- w
sbit dot=P1^3;   //数码管小数点9 f8 k$ c9 K, I+ n6 H' Z

7 M) W+ Q5 T( b: D) L
' t' {3 ^( P) V3 k! Y
0 G. y. s: j: J, K3 x: t. e5 }
1 [3 Q2 C' P- ]* s
void delay(unsigned char x)   //延时ms
) Q6 t" I% V/ B4 q# Z( o" l{
( ^( h4 t: v* Q/ m7 y1 f    unsigned char a,b,c;3 H7 [# n$ ]  }% O' ~4 ^
        for(c=x;c>0;c--)
/ n7 D! Y2 J/ F9 w$ u2 T$ B0 f    {
; b7 i- ~2 O4 D1 z  r. O; F                for(b=102;b>0;b--)
8 V5 S  X* H* P& r        for(a=3;a>0;a--);& A! X7 D2 y, z# S- p
        }
$ k* ^1 {7 C7 y}
5 {9 s* V2 H% K* B2 uvoid main()         
* E: A2 L- c  M3 Y; y8 v0 j! g{                 3 [/ F' C6 q" Z% K" Y7 ~" ~

. G7 S, ~: X! b! f6 S

! `# I* i/ W2 q* D4 |& @4 K- {    bit tmp;7 `" L# C2 K4 W; b" ]3 ^
        dot=0;% X+ ~+ v6 h. _" r& F' r
    EA = 1;            //开总中断: B4 o( ?) E) W/ o3 d* u2 J
    ConfigTimer0(10);  //T0定时10ms& `$ v3 y" p5 l% S# W2 |# ]
//        M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;. x; ?* z. ^- K, g7 {
    DHT_Start();
0 g% c" a8 W0 G& Y  M8 J/ U: ^, e    delay(5);
. d0 X" i9 @1 W: Y/ {  ?9 C: y0 Y; s8 N2 E2 B. A% I
- t  }8 I& b" J5 t
    while (1), s" _8 ]- B+ O- q( Z5 P
    {+ Z+ A3 V; @! R4 ]
( Z! a0 m9 M+ G* ^! b* P. s) F: ~
8 F/ _7 k9 H, h" W6 W

: \  E! e* n! y. f1 u
6 y8 l! _& ?1 o1 r
        if(flag10ms)  //数码管刷新频率3 \' z, d: ]" {  J# a# T
                {
. J7 h  w; I2 [( C' _$ T4 r% k                   if(st==0){
! K* O) k9 g* W5 e; g) V5 q5 W                                Display_temp(&str);4 N; W5 ?4 d1 _- n
                                flag10ms=0;* Q) ^( B8 t8 |( h: I5 O
                        }9 Y/ p. n7 L2 j7 }
                   else if(st==1), w# b4 t: z8 m- s$ p
                   {
3 w& {- v5 c8 v7 J3 H  `% \: D                      Display_hum(&str);
0 g3 Y7 M4 B7 g' w8 ?! V' A) u/ V                          flag10ms=0;4 v, ^/ N$ n8 E% ~" m) l% P. T
                        }4 l' I- H5 T# H- D9 g6 Y  E

; ^2 B9 l) f' A% @6 K, S$ \3 _0 V& `
: Y0 V6 a' U1 J
                   9 n! T6 [: T6 m6 R% Z2 Q) p
                  
& H9 _6 U. S% x  r7 w                }4 I1 U  d9 z. L- K
                else if (flag1s)  //每秒更新一次温度、湿度0 i. |  \8 y) R6 |7 h4 J3 |) F9 N
        {* j& d$ c; @% t, \
                DHT_Start();! _' k2 |, Z) N; {( O" Z- O. J
                   tmp=DHT_ByteRead(&DHT);
* q4 j* A1 e! u! p                   if(tmp==1)  E" H: f% N* ~+ p5 b) t( E4 O1 N5 S
                   {
4 O( R' Z; r' u% t
6 [" h) w4 Q8 J  O2 T+ z: K

9 p9 w4 ~9 }5 x7 W, |                          if(st==0)
4 L+ Y: A6 m2 F- N                          {% e0 s/ W/ }% _" K. z# Z6 E. j
                             str = DHT[2] ;             //温度
6 n' m5 ]% T. S& r6 L% B                                Display_temp(&str);                     
0 @; F9 z) d8 u" ~& E. Z5 X                            flag1s =0;         //标志位清零. |* |- M* G; z; t% D5 Z: r( N
                          }) g4 g8 m2 L1 Z( M/ |6 ?! _% m
                          else if(st==1){& @; L/ V8 f0 `: C/ a1 s* U

, k& \( f0 J/ {) O
; n7 U: ^& e1 |, W+ u
                          str = DHT[0] ;  //湿度
1 \5 y! z/ c: n5 a. H( H                  Display_hum(&str);
1 B! o3 Q, L( {4 X0 y6 ]1 q3 l! T                                  flag1s =0;         //标志位清零4 q+ m* _1 V4 j/ ^
                          }
7 x" S" h& s4 ^% S4 @# e' q- g
1 \; a( n' @( v6 x% N* N7 O6 `
0 ~* \" x$ Z3 e- X! z
                          9 a- p/ Y0 R5 C5 c2 W

; p2 i+ ?2 ]: G1 V, L( @! I

" A# w7 ?+ `: N' n6 p                   }
, \& [2 k6 l( }( \2 X" O        }
' u! o; \' M# E* V( E, g                if(button1==0)
' b9 \  w! O. b2 j9 _5 S1 b9 `" J. U) j                {/ w( e& P$ F8 P# x1 v! f, P, d0 @# b
                   delay(2);
( _5 N' j6 @" w                  
. p. x! F$ w! V* E4 l) F                   if(button1==0), A. m1 ]( q0 Z; q2 }$ f( s1 H* d4 W
                   {
4 ^* q1 e! g' N: E# g3 {- b                      2 b' {( q$ u  p' Z
                                mode++;5 Q4 g& L4 O  E" n" D
                                switch(mode)% I& a- D" _( U; }: P$ P; S5 X
                                {
1 I. M" N3 X! e- {& R* R0 H  @                                  case 0:  st=0;      break;
0 D8 i9 X0 @, r. X                                  case 1:  st=1;      break;
$ O. a1 w# m1 z1 W                                  case 2:  td=1;      break;# K5 \2 B9 R, v* g' i0 a
                                  default:     break;( }# s5 m1 y1 ?$ S" ^
                                }3 M& n  L6 j* O
                                if(mode>=3): V( f' C8 X1 }7 K/ {
                                {
# s6 I; d$ f4 D) j0 E2 B                                  td=0;+ T9 [% q" Z  b9 ~! y
                                  mode=0;
( X! E' l2 q$ m/ J5 z6 f5 b                                }
* f; @/ U* y' {! d                                while(button1==0), S& F! y- e5 E3 ?  ]/ P- W
                                {: V, H8 }) y; M4 q& f
                                }8 L8 B7 M5 e/ }- e. K$ B
0 A: _! G" U9 J3 q

1 w5 }7 d0 l! u5 H* g4 L! C6 _3 Y, E
6 ]9 G/ A- W) g- ]8 o1 i. Z- {( o
" L6 p/ s9 d9 n/ J
                   }
2 S4 f7 O5 D  T) l5 e8 Z# G
, Q- ~  R  ~/ l3 N0 z% G/ m" w

5 Y1 ^: @1 C+ b2 W" w# s  S                }
3 T6 [5 v$ V" B9 `$ T& v) A' E
. d9 |: R2 a1 Q3 M

% p4 S3 y/ B- k! o5 G+ \6 c! P" I8 V
! Q) S/ v* u% j2 m1 |8 s
1 [5 p: J8 Z# {( _3 o
! y5 F3 |7 l9 n5 Z2 D" f
         }0 I/ @' v8 @+ u$ B0 ~
}- T- [3 C7 @, ?; G
/ [; Z% J: g0 Q( F0 ], c/ z# O

! ]% m+ _. N( M; q, ~- [, h( J1 f" F1 N5 ]% e3 v

5 H9 j/ `7 G- c- X7 [6 P; i/* 配置并启动T0,ms-T0定时时间 */6 k% f4 D4 K0 t2 p1 y9 G  b+ D
void ConfigTimer0(unsigned int ms)9 S$ H5 p# }9 T* N/ Z
{
1 I: [, Z0 U: t7 C- a( A( m    unsigned long tmp;  //临时变量
' p5 ~* U" z3 Q" Z3 o   
* n: d! l/ T& R$ F; ^6 t. g    tmp = 11059200 / 12;      //定时器计数频率
3 J6 c. e: m) B+ B    tmp = (tmp * ms) / 1000;  //计算所需的计数值
' t1 k3 b, c, c; ~    tmp = 65536 - tmp;        //计算定时器重载值
7 M# n9 S( F" t% l" b- Q% V    tmp = tmp + 12;           //补偿中断响应延时造成的误差
1 q4 N5 e7 k6 j% d    T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节2 b) [4 Q1 H6 X2 I- c' ^! ^
    T0RL = (unsigned char)tmp;& k; J/ I; @" T+ o% G/ y# t
    TMOD &= 0xF0;   //清零T0的控制位
" l/ X/ Z* z4 y, o6 w, w  Z    TMOD |= 0x01;   //配置T0为模式1  e4 E2 c6 Z9 I+ N* w
    TH0 = T0RH;     //加载T0重载值$ z' V, B& @4 z# Z( G
    TL0 = T0RL;
. u! g- O) j; }$ E+ A& t  O) F- `1 M    ET0 = 1;        //使能T0中断+ o) `4 J) L) F
    TR0 = 1;        //启动T0
2 l& A! L# T, Z; A; N( P$ W}
! [' N$ V* z0 `+ J- X4 u& a/* T0中断服务函数,完成1秒定时 */4 g0 q0 p' G7 d5 x9 h% u8 v5 {
void InterruptTimer0() interrupt 1
4 b0 X% e( a6 {' j9 x{. H4 R6 V4 `) i' F* r0 B* ?' f
3 O' R0 j+ R% G" m) T/ ]* w

5 N* z: Z7 G: R( J8 D. g6 A/ D    TH0 = T0RH;  //重新加载重载值/ P- E9 w( Z* C! T) A
    TL0 = T0RL;
  p, ^# t: M2 l( ]5 @    tmr1s++;
5 {$ E" y7 y: P  {: o+ d. x        sdd++;
% H& y' Q% l, Q0 h5 i' B- s        tmr10ms++;. h: T9 s, ~0 W# f+ H5 M

3 \3 P" I( E$ H
  K* L4 v1 c* l$ I
        if(tmr10ms>=1)           //  数码管刷新频率9 \" b% [  U1 A  V& S+ a
        {! F6 u9 ^, o2 W% e' D
                  tmr10ms=0;
! N1 k2 o8 i; ~$ t7 i$ A                flag10ms = 1;) N+ C- }" ?% J7 g
        }$ A. X4 Y( e/ f  w
        if(td==1)- a( d0 t# E3 Z- {  \
        {' v6 e% F% \' }0 P
          if(sdd>=500)           //温度显示5s        、湿度显示5s
- D! Q: t" f+ k# }8 \% d  `% Q3 [          {
$ Z% v- |" \. M5 @* {& H# C# {' j  |             sdd=0;5 H& u* G* h  Y6 X+ |( l  Z8 F
             if(st==0); E( k; x) l4 n* e- w& }
             {) K, I3 ^) R- l- r0 h3 a
               st=1;( H0 H: K* s1 u4 Y
                 }
. ^5 F0 {1 b+ ]1 u3 k6 _                 else st=0;1 U/ D: Q3 n+ ~( _1 u# \8 m
          }) q; K9 v: X+ A* z/ D, T0 b  u
        }& i( S+ q& m+ q0 T
    if (tmr1s >= 200)  //1s 数据更新频率
0 f9 L. `6 `8 N8 b    {# z' H! x7 m1 X" K3 j
        tmr1s = 0;
% ~) u# F0 c. U5 T; `" Q/ W) u        flag1s = 1;
5 C( z6 ~" d2 {        }% f' v5 m  E& V0 ]/ a
; g. z+ R$ q+ k5 d, j. ]

" t5 r, v& _; _- j. ]    1 V" s$ Q, ?4 s
}* \, h  A4 a4 s9 Y

, Y, R& Q0 h& O2 E- \$ j: F7 y( J+ n9 M4 E1 P7 f5 @9 }
下载:
& ]+ p& n  h, k% L* [7 o9 ?, G8 U$ h
游客,如果您要查看本帖隐藏内容请回复

, k8 T, q& R' u. S0 d' `- S) w3 c( D, ~
" q6 h; d9 U5 g/ W% Q

该用户从未签到

推荐
发表于 2020-6-28 22:55 | 只看该作者
&#129310;&#129310;&#129310;&#129310;9 Q2 P! K" a: A: Q  u; ?0 \! H

该用户从未签到

推荐
发表于 2021-1-13 10:45 | 只看该作者
感谢楼主分享,拿来学习学习
  • TA的每日心情
    开心
    2023-7-8 15:35
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    31#
    发表于 2024-12-8 11:48 | 只看该作者
    看看楼主的代码
  • TA的每日心情
    开心
    2024-8-29 15:29
  • 签到天数: 426 天

    [LV.9]以坛为家II

    30#
    发表于 2023-2-6 09:40 | 只看该作者
    学习学习感谢分享

    该用户从未签到

    27#
    发表于 2021-4-19 20:51 | 只看该作者
    感谢分享!

    “来自电巢APP”

  • TA的每日心情
    开心
    2020-12-4 15:56
  • 签到天数: 2 天

    [LV.1]初来乍到

    26#
    发表于 2020-12-19 08:38 | 只看该作者
    多谢楼主分享,学习了!

    该用户从未签到

    25#
    发表于 2020-12-8 19:15 | 只看该作者
    特地前来学习学习
    * |% K( d7 k! Q# a7 o

    该用户从未签到

    24#
    发表于 2020-11-28 11:21 | 只看该作者
    测试一下,谢谢
  • TA的每日心情
    开心
    2020-12-4 15:56
  • 签到天数: 2 天

    [LV.1]初来乍到

    23#
    发表于 2020-11-23 21:18 | 只看该作者
    多谢楼主分享!- D$ D( ]: V3 O6 A. e/ ~
  • TA的每日心情
    无聊
    2020-7-7 15:01
  • 签到天数: 1 天

    [LV.1]初来乍到

    22#
    发表于 2020-7-7 15:08 | 只看该作者
    看看啊啊啊啊啊啊啊+ F3 g' M* m. i# h
  • TA的每日心情
    无聊
    2020-7-7 15:01
  • 签到天数: 1 天

    [LV.1]初来乍到

    20#
    发表于 2020-7-7 10:48 | 只看该作者
    学习学习感谢分享

    该用户从未签到

    19#
    发表于 2020-7-1 11:01 | 只看该作者
    让我看看怎么样,谢谢分享
    4 i  T+ |  U2 ]3 b6 H( L7 e

    该用户从未签到

    18#
    发表于 2020-6-30 23:32 | 只看该作者
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-26 11:06 , Processed in 0.187500 second(s), 29 queries , Gzip On.

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

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

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