|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码* u6 p5 p; }$ i6 s8 q
; b6 _; O/ g, P X7 A5 A) J
! U* C6 E& D0 _# P, B
仿真原理图如下& p z( A6 V% w% J9 I+ d( Y
; ^' b) Z3 r; n& y
& _) |9 X5 ~0 W按button1可以切换模式4 N- R' Z+ @, [" p# T* G* k
模式0 只显示温度7 @/ b. x9 C$ a4 h) C/ ~
模式1 只显示湿度* q D, t |0 P- P& `
模式2 动态显示温度和湿度,每5s切换一次
) w& T/ k& C S# O0 G3 V X; j, c
( h; @; y {5 i6 J! u( T" O8 C( b" i4 r
实物如下) N6 ?) E7 { \, H+ S; W
温度显示
: p: M p; x: `/ n% M( E
* c* e6 p' ]% c( i# b. M. i湿度显示 小数2 u. C3 [2 b0 Q- [
% g9 [9 y N5 S0 V
5 E3 x! r6 g: U6 s0 ? - Y7 \6 q. e& g
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。
) Y8 K5 I1 `3 D/ U3 n0 u1 |- S! x$ }4 r) t# ]/ i
单片机源程序如下:3 L5 B, E$ z4 t! K
#include<reg51.h>" c+ b3 ^0 d: ]9 b" _0 c
2 M7 o- V, o$ S: \0 Q2 e
6 W E! B* n8 I& U# }bit DHT_Start();
# m+ B$ ?! B" E i% t5 abit DHT_ByteRead(unsigned char *dat);
% Y2 d+ ^* m8 Y( Z8 ?8 ]void ConfigTimer0(unsigned int ms);
. @2 q2 _& r5 e2 N, g3 Tvoid Display_hum(unsigned char *num);4 a; H4 H1 n" a
void Display_temp(unsigned char *num);
5 ]- P' j- H3 f7 R1 z
0 l" B- @* E) s9 N3 l+ S& S
9 z$ L/ i4 Z1 F' X% W' \
% P5 Y3 z8 y% [
* R; f6 r, }8 e8 R) E }unsigned char T0RH = 0; //T0重载值的高字节
2 B9 C( P7 T- Z( }7 Ounsigned char T0RL = 0; //T0重载值的低字节 g; A' R5 D/ A9 c& N( r6 T
unsigned char str=88;) a8 k$ s, [2 q
unsigned char DHT[5];
! ~) J9 T0 H3 I- t; q
5 ]2 l. }1 ]; u' p" y) y
8 B$ W4 W# h y6 W' _unsigned int tmr1s = 0; ]/ e7 Z1 h- j& d6 L) L. d7 ?% o3 g
unsigned int tmr10ms = 0;
9 y0 f! Q; R$ S# {+ _! |$ ounsigned char st=0;
* E2 m8 t1 E3 t" k) funsigned int sdd=0;4 a5 c* c& l, m' e
unsigned char td=0;5 m9 ]6 F: F4 }) j; F- ^8 \
unsigned char mode=0;
; I$ J/ d4 y% M5 r. [. C% P4 V9 s$ |. s6 y. W
- z& K! S! E3 W0 S3 V- X) Bbit flag1s = 0;
* M4 g+ X- P8 g, a3 F9 rbit flag10ms = 0; - w6 S' c; _; ~: @: y/ K
int x;- P3 \0 ]: n& @/ l1 ]4 J" m
# N0 v9 L; L, g' B5 g, `sbit button1=P0^0;6 m6 w2 w' k7 v" V5 E j4 V0 c
sbit dot=P1^3; //数码管小数点
d# T# j/ \2 }! D* q/ Q4 Z6 A! ?2 Z/ J( w- `* }( a1 s
8 I* E5 o' j. ^8 }) f4 a2 D8 G% E3 ^: U$ h5 e, t) F0 W5 H8 C% g
% d4 C% u) @6 u% o
void delay(unsigned char x) //延时ms0 [; _! V9 }$ z( h6 \+ g$ j
{
1 } B! k I; K. V9 d) ]* W C3 E unsigned char a,b,c;' p ^2 d; y( E% @* v
for(c=x;c>0;c--)
- Z7 k* n. J4 H; W- T$ x {
$ I5 f) r; ~ c4 i9 P' C x for(b=102;b>0;b--)5 Y5 O+ b. f, C) m! B. l0 y# p
for(a=3;a>0;a--);
% Q3 A ]* m2 ?. Q/ Y9 P' T }! A5 V. M+ P9 J7 Z% `/ k
}
( Q+ g9 I+ q4 U2 A% Rvoid main() 9 ?0 x; P/ T3 x- d9 Y
{ " d/ u2 ~" B* |7 _' {* O3 P( j2 M
0 v* ^0 f% m# H
& }7 I8 ]1 ~8 ?2 R/ t, R bit tmp;! l+ p3 t- n1 w- Z
dot=0;9 v8 a2 i0 j2 J/ p
EA = 1; //开总中断: I& b$ J& g8 A* L" P8 I
ConfigTimer0(10); //T0定时10ms S$ |3 r" Q7 a/ V* e
// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;
& v7 @9 T, E+ r; `5 Z" ^; u DHT_Start();- R8 I/ g2 M7 R
delay(5);/ z5 j* O `" a% P: c: p1 _: u
8 G) P: _" z O3 l. X! e, e- ?6 o3 W! T8 q0 R9 W! s O
while (1)
j3 T4 H2 t( Q- n2 Z. v. q {
4 l+ M- j- v/ U; C: e% r m! H) L; F, t. i4 Y3 `
4 ]- k; Y" S x! @2 `; h m' _
, e; X6 D" H, T9 \8 ~% z6 o* V; G. u4 S( N4 [' g6 R7 c2 v
if(flag10ms) //数码管刷新频率* B: B2 }. L9 s+ h
{9 d3 U- l, P# M1 M6 V& u5 R0 F
if(st==0){- s- n3 l ]* L, q
Display_temp(&str);
" k* F6 w) R9 v( h8 i flag10ms=0;6 d% w; N1 q, x' M' L- u
}
1 ~5 {% K6 E9 v. {# ~3 a R1 w else if(st==1)
5 m1 ^2 R- H( s( M0 M$ X5 t {
+ V6 \# u3 n: \ Display_hum(&str);
5 y, h+ D% [2 C7 H2 n1 [ flag10ms=0;
# s& U9 ^/ n" |7 g$ p. J }! j. p* h7 H6 M( ^ O
! F8 I/ a3 Z. j
; ~5 k. @) w+ B+ X, u# } / P8 c# ^% f( k' Z+ V" ~* p. P
8 i. ^* R% _: G6 Q7 P# E
}; h" t5 ?/ a ]( _ I7 v4 n
else if (flag1s) //每秒更新一次温度、湿度
$ P0 \% |5 f4 c! Q! i+ K' G% M {
4 \9 J7 n. U/ v2 x. e) N DHT_Start();
0 D: _; A/ C2 Y- Y tmp=DHT_ByteRead(&DHT);: P3 G0 R5 U/ Q( U6 v
if(tmp==1)/ h- y3 r+ {5 A! ~& e& j+ g9 M
{- ~* N. v. }+ \5 v3 o6 i
, V# C' O; U; s3 M% S$ t
) w% x. p" q# q+ |- ^( g if(st==0)8 t; k) g( Z# d
{. a' H g' }! | g. H
str = DHT[2] ; //温度6 M4 M; P4 c5 Z: ~& B
Display_temp(&str); 2 t' K- R+ E* k
flag1s =0; //标志位清零/ L9 N$ k+ D5 L! b# ~% T; K
}
( _' P( W; V1 W& j else if(st==1){
; O9 N5 o* H, w6 W7 ]' z& y3 [) K' l. h! H, ?
( I1 `% w) C7 a' l# `$ O5 @ str = DHT[0] ; //湿度
& ~; T- W1 P( C7 u# v Display_hum(&str); 5 N. b+ x/ M2 O0 Y
flag1s =0; //标志位清零
5 O! S0 x1 Q5 j- Z$ O' K* Q1 y2 C } W7 M2 d, `# v2 w
" B9 ]- _0 q! Z$ f! `, `) {5 g; B
: M; k" p- M' `0 k; {
) E3 i9 Q9 E9 l2 N' d# R$ t
, |2 ?7 }6 r# D& X# G" y
}, I3 `+ k# p6 T8 r3 ^7 p
}
" a& h; [7 {* i" G+ T if(button1==0), |) t5 i, I3 m/ d- p( S( T' x
{
6 w# N6 S' k- {& B( X delay(2);0 \2 u4 K, \7 X/ f
& ~, x1 n1 a( u5 g( P3 x4 W4 `
if(button1==0)2 j7 K5 j' Z* \8 A- P+ I
{
; x: G* r" A" \ / M5 ~3 ~4 \" a. p
mode++;
6 E9 d* k3 G, |( _* s switch(mode)% _8 u2 \, K6 h2 _
{9 `* a# c" m# s
case 0: st=0; break;
: h8 P8 K# {% i5 K' G o3 c% Y case 1: st=1; break;* k. D8 R7 g5 o! }4 i9 n
case 2: td=1; break;
. Q w7 j5 ^, ?) f default: break;
, E8 ] U' l( b" J1 s* p* m0 s }
+ K2 o9 i' o5 c. E$ k if(mode>=3)6 {6 T4 v+ d) V: A8 T+ t8 m: H# S5 }
{
# s) {8 J% c' g: T" |) M% G td=0;
% Y/ w9 _1 s+ F7 D6 B mode=0;
1 e$ i7 y( \3 H! U$ B! U$ P* ` }( _8 \. W6 P! g- J8 C5 m
while(button1==0)4 \; ?; A5 G t, L; `# `
{1 d8 D3 w0 F0 \6 A+ z3 j0 v
}
5 b4 l; ~% e0 D/ a% n
8 G0 m) O/ X, E# I- s7 q$ A- [5 Z v$ R0 [8 G7 s! w% E5 k
7 H \5 [ g/ s2 U! M5 E
& F q( N9 v* |. j. P9 c! }& v9 ]
}" H, ?7 S9 `5 ~6 @ \) Y
: Z' U2 c. h% D: W* S9 |! R; v: F! a/ e0 D) ]0 l$ Z
}' i4 i. }: k4 B K2 j: p0 Q
) A: x* V9 B- O
8 Z( y: ^0 U4 O
/ Z. M& G( B4 }6 a; I S9 {8 w7 s! v9 d6 V
5 x$ M) c9 R" ^6 ~, D% l5 K# \
; J$ Q3 h0 P: M8 F2 d
}6 k4 v6 J* \( `: X# b% v7 b# I$ y
}9 c, M% J( ^) `% N( R; E6 \
! m4 _! H4 c- }& ?1 ]* Y+ ^, P" O1 X: h
9 |( a$ d$ z; E
T) }- ~9 ]# z( A* k; G$ R/* 配置并启动T0,ms-T0定时时间 */
; V$ c( U8 U2 Q1 U7 V& lvoid ConfigTimer0(unsigned int ms)# q2 ~# h* N/ L/ |9 m c
{, n3 }- |% B3 `. ^$ G6 V' G
unsigned long tmp; //临时变量2 X: P0 W V9 {$ P/ u" |
& ^* v: D4 }8 Z. Z$ h3 }
tmp = 11059200 / 12; //定时器计数频率7 A* _- M$ ]' N; Z4 ^2 W
tmp = (tmp * ms) / 1000; //计算所需的计数值2 R M, r. G# Z9 g
tmp = 65536 - tmp; //计算定时器重载值
# Y% D% N- E/ a8 Y! R tmp = tmp + 12; //补偿中断响应延时造成的误差0 Z/ _( A: F- M6 i
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节3 P3 O P- n3 v$ Y
T0RL = (unsigned char)tmp;
5 x* r0 s! R& v* ^ TMOD &= 0xF0; //清零T0的控制位
, E; g7 S* X' B: d TMOD |= 0x01; //配置T0为模式1
9 t- A0 p8 Y& \3 g& j TH0 = T0RH; //加载T0重载值
% c/ K5 j6 {' X3 `3 {9 \" i5 B TL0 = T0RL;
/ \6 H2 P: R3 T! ~; j ET0 = 1; //使能T0中断% }# \; ]$ Q8 G g, Z* Y0 n
TR0 = 1; //启动T0
3 w& r6 I7 T! r2 U5 F' ~}
& f- A* o) A3 s$ r! G* y; v/* T0中断服务函数,完成1秒定时 */
* l( O( N8 a/ k4 c1 [6 K! l i1 `3 I8 Mvoid InterruptTimer0() interrupt 1
' ]6 j0 R+ s7 w& f: b! d7 m, @{
- y. ^8 }. V5 h; v6 z- T; M" q$ ^, v. O" v. B$ ~: O6 S
D9 x: X& a3 Z$ k
TH0 = T0RH; //重新加载重载值
9 r3 Y$ [: {$ e/ `6 u, {+ U8 a: e TL0 = T0RL;
8 T$ H8 t/ O. ?' K G4 b tmr1s++;* Z/ r, I- f& y0 o. p* f0 V6 A
sdd++;
1 ?& b; ~& m M tmr10ms++;1 W C: p; H$ P& i" [( {+ E
( \' c# Z$ o; A8 a3 V
8 U( d2 a6 x) H* Y+ t. z& `" n if(tmr10ms>=1) // 数码管刷新频率, ^. U; C$ R) Z# L# p: K
{8 l7 @% x; R7 @. a |
tmr10ms=0;" Z% T( u; `+ i) ^% }6 b* I; V
flag10ms = 1;" |3 Y/ O4 T' K; k* \* V
}0 ^" U1 ]: }7 T
if(td==1)+ n; c/ E1 l3 x* }- x7 A9 K
{7 Y! E! Q; I' a! b
if(sdd>=500) //温度显示5s 、湿度显示5s& B) \# F8 e4 d8 R
{
4 Q9 g4 G3 |, o j sdd=0;
2 V1 Y, s! @0 @. D if(st==0)# H1 O! H& z; e5 x5 S
{
+ Z% T* ~8 B3 c6 ^5 X st=1;
+ \0 t1 |$ p. G }
7 k; X* c, X1 i4 G6 r4 ]! x$ \ else st=0;
; R5 g: a1 }$ v! o# }; M }
0 ~: q: R% V7 Q3 q6 ^0 Y, s }, V. W0 e; z, Y; B* \3 i8 T
if (tmr1s >= 200) //1s 数据更新频率 U# T1 G& n2 }+ A, D5 e8 R& R
{; n0 m$ w! w7 V% Y
tmr1s = 0;; u; ?4 Z2 @) e* ]6 D7 `; ?; H7 y
flag1s = 1;& T/ W. i+ a/ @. w# t
}2 K4 G8 i* |! O, f! l
% Q' E ?; @9 O2 v! K I* m
% e) \, Y& C$ b( W/ E: J+ U
7 K9 _, f/ _8 M4 X' w# c
}
! n I6 B( v" E9 }. f, } P& f+ J
9 ~& L P& N- I% {0 ] n1 `, W9 `+ @3 ] \" Z7 |7 }) u
下载:
% g' v* I1 F$ p# Y* e
9 M2 |) F( s# g! L1 p
( d% @" A$ M' j) Z; c7 x |
|