|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码$ `/ V3 X6 |' c& o [: z0 Y
- N0 j# O3 h0 d; K* K( Q2 c
, K& m& `- ^2 G% C+ z仿真原理图如下
: }6 Y- ^+ y$ T- Q0 j- [7 v& s ( |: w, v# v0 m! x2 K
! u) n7 S) K0 z Z3 [3 _4 G2 o
按button1可以切换模式/ R# Y, b) e2 z! o/ H& `0 x7 v
模式0 只显示温度' B* l* }! A4 t+ j. b
模式1 只显示湿度, L' v2 `4 x& ~; a% s7 K( I
模式2 动态显示温度和湿度,每5s切换一次# Q9 T, }# a4 u, t, H" G% |7 a0 W
: K( j( @2 S" [2 ]2 u8 O$ I1 E& X5 o! ]# o0 k
实物如下
! D: @* v# o0 `9 q, \: O温度显示. V6 ^( Q, u% d! q, H! Q
+ O/ l9 C7 k6 _" |
湿度显示 小数
0 y( j3 L6 R8 S z% t& n" S m
$ m/ W4 l2 f. q2 B8 M' ^$ E5 |+ v( _. F% l
6 q8 @7 v2 m" p3 @! H. D F) j模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。
" n9 S3 D+ C$ V
8 j2 o! u7 P2 n8 O$ G7 ^! y4 @单片机源程序如下:$ ^. Q* R/ m( \2 ]) r& ~# w
#include<reg51.h># s# I' h" C$ F: p' Q
. J# R0 ^, \7 |7 z6 n; ^. P4 S
6 p! I" Z# p: W9 J/ V$ f# e! A) O3 Jbit DHT_Start();
7 r- z" i: f' r0 ^bit DHT_ByteRead(unsigned char *dat);
+ p0 {( g7 x7 M; Y) ?) @/ |0 X- Pvoid ConfigTimer0(unsigned int ms);4 x( a5 Z* r0 y/ W$ A( q
void Display_hum(unsigned char *num);3 Q/ }5 w: s L7 Q
void Display_temp(unsigned char *num);0 B2 v$ e) D' ?6 t7 d+ q
+ ~/ D" M5 _" Z7 k8 u! A
K3 Z! V, W4 }/ a# b2 N
$ d1 n/ e3 p2 W5 k p# N1 _3 r+ ]% b$ m% Q' d9 F9 Y9 _ V
unsigned char T0RH = 0; //T0重载值的高字节/ q" `1 [3 ]" h6 j
unsigned char T0RL = 0; //T0重载值的低字节
: v; Y- }3 u$ @5 s2 p. `unsigned char str=88;
5 S8 ^( ^9 ]! D+ v8 i; j4 f& Munsigned char DHT[5];
0 Y$ K# V! A7 Y% |) k2 X8 l" G& ^ T: G/ E
" Q$ R) O3 e4 eunsigned int tmr1s = 0;9 ?' I7 g( Q5 T- k, m4 D
unsigned int tmr10ms = 0;
: O' b c% a, }( Q" Dunsigned char st=0;
8 z! M9 p5 }( c o3 ~unsigned int sdd=0;4 U+ f# B7 _/ G( B" O9 O+ `
unsigned char td=0;, ^7 C7 h P3 v+ |2 _
unsigned char mode=0;
4 y( Q, }$ w+ I4 j* D+ m
, ^ \% k% ^! D; d7 m5 C2 H: E. S* Z: B p. ~( ?& V
bit flag1s = 0;: G1 O& [3 b4 z) Y8 u( j
bit flag10ms = 0; # r2 ]# f, W+ g. \
int x;6 `5 K' b. d' B4 ?# L, Y
4 X8 |8 g+ Z; @2 f, j
sbit button1=P0^0;" H/ `8 U3 C% A3 A* c
sbit dot=P1^3; //数码管小数点3 ^* B( V/ G7 }- F
( S- P9 r, N2 [1 V$ V) L
: P/ ~/ I. w2 i. C2 K$ M
' B% [2 G1 m$ H, ?% Q- ]
1 \0 i7 U/ O. r6 A' e8 O7 jvoid delay(unsigned char x) //延时ms0 j9 U2 m- h8 c$ T
{. Y- V# v7 c) E2 g! Q4 w5 l4 ~
unsigned char a,b,c;$ l. r1 |. {% P* I; A/ ]; {0 g
for(c=x;c>0;c--)$ b) t& P1 n0 y# `) d4 R
{
" C8 P* N9 ?8 Y" y3 c9 J, g for(b=102;b>0;b--)7 H! l2 j K4 S
for(a=3;a>0;a--);
5 w7 I1 }3 B( k/ j% z, ?6 ^9 J8 N }
# R! x5 G) @, _' N}/ n) f% _* I6 S+ _! k5 R' A
void main()
4 h6 M9 H3 Q* y' E# ^, e& Q{
+ |3 C+ u1 W# L6 A" O" I- g" Q
4 a0 `0 j' B1 d2 F3 Y1 o' ]# V+ O$ _& Y4 m! Y
bit tmp;( j$ l# T+ A' a& }9 h4 b* J
dot=0;( T K3 S6 E6 ~8 a% w
EA = 1; //开总中断
( ^% }* a9 I) M1 r& s9 h2 o ConfigTimer0(10); //T0定时10ms4 x( _) o: i6 V; h
// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;7 O+ j, S: |. H: `+ |3 d
DHT_Start();
- U7 v5 [0 v' `: @ delay(5);8 y$ {) k2 n: T% i5 \+ V! E
' w$ D5 M* i, O8 P. z& _. `
6 B- B0 @3 |' h3 L: l4 w
while (1). \. J8 Q, ]8 f
{
+ S n3 w& h$ y8 Y0 o R, Q
* f5 z# c) U# g7 K. U
. H$ w$ D& p& O0 L' a J1 x' x
+ J* W# Q8 C! d0 }
2 K% q4 S# F! A* J" j; ] f: O) ~ if(flag10ms) //数码管刷新频率
' k, B/ ~+ H5 Q$ m7 r4 v K {1 u4 o7 B+ u' X- \/ x
if(st==0){: k$ F! K' g: O8 l) c
Display_temp(&str);5 a0 @5 _, X' O8 Y6 `, d
flag10ms=0;) | r, ~ U1 e; Z! q
}' \. O' M+ G1 P l
else if(st==1)
, W; m, w1 w& ?1 T {) R% L' ~) `, w2 L' B
Display_hum(&str);
+ ?$ t2 _9 f& |0 d( M! s3 ? flag10ms=0;3 q+ u2 N: `( u# L6 Q, A# n5 a
}
$ p0 h' u! \& H
( W# \9 R" u6 i& c. }. t% X, B% P- V8 }8 F/ F) e z3 |/ D8 i' @1 E
% B6 H4 E [9 D% Q' |" k% c
! U7 R2 \2 O) y. @- [* u# \
}- p% r w2 N9 j5 q
else if (flag1s) //每秒更新一次温度、湿度
" K. P* t, {0 n; s) B. B {6 N/ l' ~9 c" F6 Q1 n4 n: T4 |
DHT_Start();
3 h2 }! h3 B5 e+ i$ n" q1 I tmp=DHT_ByteRead(&DHT);
# e6 w& i2 [" L; |* h4 g7 C if(tmp==1)$ d- {& m2 m& Q; M" o- T
{+ z1 V* v$ K ] k; r8 X
9 A$ W+ j+ }/ ]: K6 ]
1 ?. o/ N- [. D5 u8 t
if(st==0)
, O0 _# l5 v! v {- i. s3 t3 e; A- X6 r
str = DHT[2] ; //温度
7 c, v( ]8 I# v; a Display_temp(&str); ' |5 p* J) H9 P; @( }$ W
flag1s =0; //标志位清零
& [) |0 y5 r+ P. ?$ H }
5 ~3 R+ p& J8 g2 r, B else if(st==1){
- [! l% j& l [2 z, W5 l4 u U5 T+ e7 `% o: Y; j1 O- {' V" h8 G
. D9 E% Q g2 i9 D2 d8 V6 c str = DHT[0] ; //湿度
' H8 m r, d# E Display_hum(&str);
( x% X# O3 l% F! O+ ^* Q" d flag1s =0; //标志位清零
- L u( L% H5 f0 a }( ^8 e- B1 o& t# s3 A
6 R* L: f' [) H, F- |6 O% z
9 {( S9 j7 I! {0 o R2 B
4 c+ B- W* T4 a6 @" y9 v& E1 ^" u- z+ u. f$ ?" q1 h( F
2 c& |* ^, b; n l0 _$ e3 G
}
" u3 A3 Y6 R0 G8 b }
' ~- ^8 Q6 P3 A if(button1==0)" P+ q Y8 T8 m* Z
{) ^; @) s( J' @+ S! F
delay(2);
; r, O5 G+ ]$ Y
9 R1 h8 L$ F4 F; w if(button1==0)
$ ]% @2 e1 c, X V {* [0 x: A h0 o( s6 Q
# ~5 ~% }' ~: Q* p# J* Z mode++;- c5 V3 S9 n: J/ H7 \% p! C
switch(mode)+ i R$ C! N. B3 ]% y" B
{4 |! b, \$ B# O/ h6 y! y0 p9 R
case 0: st=0; break;1 a) @; `; ], j5 ]
case 1: st=1; break;
9 `+ j4 h- g3 V) }! M case 2: td=1; break;
: U* w* N4 @" I. K) g: a default: break;
- v: R% }. }" e }
" y0 X% e9 c. ~4 \: L I9 P$ X8 \ if(mode>=3)6 F: Z7 Z2 c4 q" ~
{9 n8 T! A/ l& R" Z9 Z( Q, l
td=0;
! _1 p! B0 ]4 N5 Q: R& s+ x mode=0;
. F% i/ ^- }/ V' ?% ^2 X. n }+ O; B0 i1 _% f( E
while(button1==0)! }1 @" R- R; U/ m
{
3 L$ D- r) _5 S- P+ m4 G# ~+ \ }
0 n. ^1 R3 _& H9 |. d
F6 _. ^. j' x1 I% L
# W3 Q/ }5 t& b3 d [3 a, y R0 _# ~2 t) c
, y( `, k' o( O0 A# d
}. ~, D' W. B5 T8 ], X( q' U
5 z, E5 y0 c8 v* c! f2 n
0 i1 z" ], [- f
}6 N |* e4 S8 {2 m2 p: ]7 e
* \' Z2 B6 a: Y7 {! [" |$ [0 E
0 H" @* M D" b% y
5 S+ T" @2 ]. y" ~' ?# q7 M
6 G5 [% m1 X8 w8 e8 v2 f2 [# @3 t6 o! X, Y: B
7 C. b1 Y! A2 t' X5 d8 I }$ Y% I2 G+ L% W3 y
}$ l! \5 p, S6 h; R
! ^5 H7 o2 i/ S7 b* H7 G0 n
3 _% h3 C8 u6 Z2 T. S
& Z- W3 T" g% y9 K) a) ~% q8 z( C
6 W g0 e% w+ X3 x1 T- [/* 配置并启动T0,ms-T0定时时间 */
: z% [: K/ D( u# Nvoid ConfigTimer0(unsigned int ms)
+ g) @( j! r4 v/ \2 ]2 H+ M. y! `" O' Z{7 Y, A. c+ h8 Q$ Q* B! m
unsigned long tmp; //临时变量
' L# t0 W1 w: q. t 8 J/ z+ x* Z% V, m. R/ s9 U* ~
tmp = 11059200 / 12; //定时器计数频率0 a6 [! S6 ?% M _" m
tmp = (tmp * ms) / 1000; //计算所需的计数值
4 b* M- A5 U+ x# L i tmp = 65536 - tmp; //计算定时器重载值
2 P4 g# Q- y* D* h tmp = tmp + 12; //补偿中断响应延时造成的误差( @/ @- Y6 L1 X% K
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
' h( }* m) D! ?3 U9 i$ e T0RL = (unsigned char)tmp;
# d/ z9 j: @1 Y- a" V TMOD &= 0xF0; //清零T0的控制位+ g& ]7 X0 ^& ~- U
TMOD |= 0x01; //配置T0为模式1/ T, Y6 U: e5 X/ o1 {: @
TH0 = T0RH; //加载T0重载值
8 ^& u% B/ d) }& K" G7 y. I* b TL0 = T0RL;
. X' d: t; L+ T- j) z ET0 = 1; //使能T0中断
! I6 z7 L4 {: s4 `) |2 L+ S TR0 = 1; //启动T0
9 |7 j5 s! Q4 t6 K}
) O6 [% V" C8 ?7 b/* T0中断服务函数,完成1秒定时 */
) W H; E7 a1 {5 v( r, U/ tvoid InterruptTimer0() interrupt 13 z, b: y+ a" v& v# a" u
{
+ @/ r* i- w- }$ ]: R3 y
Z9 G8 ~% b& M2 }5 S, U( x9 n- w# I1 l% Y) ]
TH0 = T0RH; //重新加载重载值4 Z$ p4 |2 |/ G) W/ M
TL0 = T0RL;
$ h$ v4 M# o+ N8 A$ r) ` tmr1s++;
8 {3 ?5 r" Q8 I0 s sdd++;
* V$ e, [, n% h: z$ W& ^: b tmr10ms++;% n ~% ]- M6 O% e
3 [! _3 q; q; \+ G* W) N* {. Z1 B
6 D5 f, x# D1 }$ H1 B4 w! f" m. L0 Q if(tmr10ms>=1) // 数码管刷新频率) s$ V) x ?# n
{
* x# z! ]0 | n& O" E tmr10ms=0;/ k& `3 W$ H- @9 y% k5 i
flag10ms = 1;
. o+ n3 w1 n" l- T }8 Q3 \; V- Q. p4 B- x% Z% g
if(td==1)
. M9 R* B% Z, \& e1 L {. F4 t6 z9 R8 c! N, b# c
if(sdd>=500) //温度显示5s 、湿度显示5s" o! s7 v4 T1 Q3 L) f/ o
{* Q, x) E* t9 ?4 V* B! ]) h
sdd=0;
# B' U* ]. Z3 W, p if(st==0)
! W" K/ s5 X/ I {
. c3 E* i( P' K% z% p$ _ st=1;
G0 o) w, n' U }
& h* F+ R7 `; |& x! E else st=0;
5 P, {* g7 k$ G: y' E) H8 g: |7 F }% ~; ] I/ l- r
}
9 C: C1 s. s+ [8 H0 i if (tmr1s >= 200) //1s 数据更新频率0 q* T" [3 ~9 q, V, L1 J# T, }
{+ ^0 G) L7 J! D+ _+ r2 _9 s' W
tmr1s = 0;$ {7 e; W3 x4 G# S, D
flag1s = 1;- F. H H& o5 [* V- N, P
}
" T3 ~+ \8 X9 x% S& B3 z- g7 K" e: w8 ]
) C& @- S1 {7 T |7 N . C$ o, N$ p0 |
}: F/ @, c7 R: O
% `, G2 z# V' G7 U
, _: P' e% x. M3 t& a; p下载:4 `( n) h' p% `4 O, C' }- K1 A
8 ?$ S7 x; _ }4 K& {* E, M s! g# _
|
|