|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码) N. D) x! v+ `: R
( k) ^6 x! d4 [) o6 I1 E1 }! p1 `8 [2 a9 ~
仿真原理图如下0 ]4 r; P1 u( W# z
: h/ U8 e! L" V1 s% Y% g8 l8 r F) _( V
按button1可以切换模式3 ~& h9 b) \' m3 C' B' m! q
模式0 只显示温度
; r6 c6 f- L1 H' q% B6 z+ `: S* A模式1 只显示湿度
5 U: k7 r- A% V1 s模式2 动态显示温度和湿度,每5s切换一次8 L/ V3 j# B0 B: o
6 j& I) d. v: ]0 L) Q: n0 n
' I* W; e u& C! z+ u实物如下
, p4 z r) t3 H. Y/ c/ c温度显示
9 O! R# ]% @& t ( t9 [9 n2 O# o% q( H% A
湿度显示 小数
* `! I9 V9 t$ N7 L, s ; a% G5 j% ?2 z) C
$ R9 `) |) c/ I+ R; x8 f- E) G
; R" ^% Q+ a9 a1 C模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。. |' v- b6 N5 d* \3 D& i
2 m9 U Y2 q" E
单片机源程序如下:" o ~: w I" U1 R/ ]# a/ V) d8 r
#include<reg51.h>0 X3 c$ m2 t, y
' G- {' V/ h7 a% u0 w% o0 Q
. B( F) ]+ K' N& x
bit DHT_Start();
- u: @6 X0 [& qbit DHT_ByteRead(unsigned char *dat);
' p4 y9 Z7 j( g- A5 k7 pvoid ConfigTimer0(unsigned int ms);: d0 f' z( K1 D6 J
void Display_hum(unsigned char *num);
+ y% w) \" J: E: k) T2 fvoid Display_temp(unsigned char *num);
+ @: ^% ]" |1 Q9 d; u
+ z* |( A- E3 k, u! D" j1 i" u4 D
+ E$ U. k) \* A' p/ o d I, k: F; k1 ?1 T% ^! y7 g+ B) z" c& d' T+ F
unsigned char T0RH = 0; //T0重载值的高字节% F! j+ ]4 G# B# n e
unsigned char T0RL = 0; //T0重载值的低字节 # H; J) D }; K* [% _% e0 u% o ~
unsigned char str=88;8 {/ Q5 R+ c F- Z+ G- Y4 y; r% T
unsigned char DHT[5];
$ Q) f- j4 I& C( ]. @1 \3 P, R5 C* u. r( U [
( A! [7 _ H# Q' `0 c9 [unsigned int tmr1s = 0;8 N" `6 ]3 \' n( q2 u' W3 _
unsigned int tmr10ms = 0;+ `! H% Y. l, r; H' J. f; J
unsigned char st=0;$ O9 e8 ~# H2 q2 Q+ c
unsigned int sdd=0;
( y6 |1 J4 A. Cunsigned char td=0;
; B) @) n8 ]& F) E, b8 munsigned char mode=0;
' X; I" {9 E2 u7 G% K
9 O. g$ {& ?) p/ U2 M$ X$ @' M o- j4 h) Q9 i; f
bit flag1s = 0;
$ P+ ]. m9 z: N8 E! p) n3 B, Ebit flag10ms = 0; 8 l4 T w6 N+ u2 X! \' `' S
int x; U+ g/ t6 Z) ]3 G2 U' e8 G
- N5 s# k3 t( u
sbit button1=P0^0;
. d2 c( L( y, ?2 H2 n+ nsbit dot=P1^3; //数码管小数点
# Q7 @. z- G( S) }- Z; ]+ n1 _5 |# \3 S' }( [! f3 R
# \; {4 H$ w/ Q; D) t
) l, ]3 i6 h$ G* @" T7 A3 N; W8 U
* H0 z" m( J" \1 P# P6 r4 j8 |void delay(unsigned char x) //延时ms9 M7 J1 X. Q; o/ z
{
* |; z A# M6 g unsigned char a,b,c;! b* T# V w" ~
for(c=x;c>0;c--)8 F% t: e4 R5 c: l
{
7 _2 v( F6 [5 M* T4 C# d! Z for(b=102;b>0;b--); C& v, d' ]1 W v' E- Q
for(a=3;a>0;a--);
* I1 B5 A: |8 \/ t }; b6 z3 n$ [8 k/ J Z
}8 l2 w8 S: I2 B0 W, p% n
void main()
) ~8 _$ n: {% W0 V- a* m$ b" ^3 Y{
8 \% x! X" J- w$ ]8 T3 S' E7 K: e
3 {( M1 ^6 U0 n0 N
5 e, ^9 y3 F+ m+ [2 A6 ?( d bit tmp;2 _9 b7 t6 C% K- }. r, G( c
dot=0;* {. I8 Q# v9 B2 P0 c1 e/ Z d T
EA = 1; //开总中断
2 _5 b2 ]/ `9 m/ h ConfigTimer0(10); //T0定时10ms6 r( _& U" W$ l( K) l. Q0 \ A
// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;
: Z% T9 R2 l6 o9 E8 ~$ O* e DHT_Start();
$ A1 y# G5 b& r5 c9 Q, a* B delay(5);
' B. s( | x" B- f, y6 E! j+ a1 p( W I* C0 z4 p
, N: x* F6 T6 V' ^7 W6 L! b3 o4 S; y while (1)# a! X4 X+ K- U5 @# d9 F: ]: ^2 K" Q
{/ Q( D* s0 a1 L8 L3 J
! `" ?- r& z7 I% B% K" N% B% z+ n1 O
2 h9 G- |+ `* F4 m: d; ?# V! [2 J- T( K5 Q3 R, I' t# R
if(flag10ms) //数码管刷新频率+ l) I3 L/ A/ Z! h" \3 R
{
; X+ _2 j! P- V; U3 p& H if(st==0){: g0 p7 s* D8 p% r
Display_temp(&str);
4 Y) ]& n; R3 y B4 B flag10ms=0;& Z8 T' }( S; Z; R# ~
}
+ e( j8 c( g' g1 R2 m else if(st==1)
3 `- T- a7 g! i {
5 s# J1 p% A# h) k6 o( r! J. g Display_hum(&str);$ S1 n+ l. O! s: e& i/ o
flag10ms=0;/ @7 C. t# o0 ]' B
}+ p7 y, }' z: `6 O! r
Y* f. O' |3 e, ~' i) O
( S. b4 R2 z. ]+ ]# h - q+ P+ E: V" F
3 | p' Y0 j9 k3 U9 I/ f+ U+ {
}
! X, s8 i' F* s; V, {# [: N0 x6 x* l else if (flag1s) //每秒更新一次温度、湿度6 Q7 J" T8 ?* z/ b8 U
{2 x, n& V3 H$ }+ y
DHT_Start();) i2 W0 G* `6 `. D* i" O7 r
tmp=DHT_ByteRead(&DHT);9 u: ^5 C9 [8 |& g) Z$ R
if(tmp==1)( M. a* Y: ]. p( t4 |+ U0 k
{
: B! g5 x! h! r/ ^7 c* }
7 K+ H4 L7 r! R2 D
, {7 u# {/ W: {1 ?9 w. W1 d if(st==0)4 |/ e. j1 \( \! v, f, R& ?$ U1 }
{) }2 |* q, g6 _( x3 p
str = DHT[2] ; //温度
& D6 Q( F% V* ]$ v6 S @$ ^ Display_temp(&str);
* O4 i, p# j0 g& d5 t' b3 b. P" {0 L flag1s =0; //标志位清零
+ {, i2 c& I* _8 H* u" M$ h, {1 t }6 h0 ?+ r/ o+ K6 G H5 p
else if(st==1){
* N* ]( `* A: R8 E9 a2 ^2 F, w0 e- c3 [8 |! B0 t- _5 D
' v0 T( n8 u: z4 i str = DHT[0] ; //湿度
2 U3 v% P% m+ j+ o4 D Display_hum(&str);
b6 q" Z) ~# E' f9 Y flag1s =0; //标志位清零" S" i7 x. I( Q: {
} I1 Z( K2 U) b' k' d6 j
( E5 n' |7 v- }7 X6 p% U
+ ^ u' v) _: R+ z P# m( p
, H1 a! p8 N$ d1 n2 h! Q+ b
! v7 g) T: y3 x& g
& h4 I7 Q# P. |+ ] [) f }( i" Y, Z; M2 }+ S2 r6 z
}2 b4 B1 Q1 d# v' U
if(button1==0)" E: O& h* q" a7 c# t+ Z
{% q$ j1 @7 \& m1 f- G5 t' f4 y
delay(2);
5 Y2 I" s5 \ h8 P4 B: ]! e. L, ^ % g# ?: J% c0 X
if(button1==0)
/ x0 }! ^4 V4 I2 K {! C" ^! ]0 C6 T5 }& M
- _" l' q4 l+ i
mode++;
" P4 ?- X& e5 m; `* e# Z switch(mode)
, m) h6 h7 y1 a# {" R T2 q {
" e% ?* o8 ~& T* J0 j9 }! z7 k case 0: st=0; break;0 m4 b& q% R$ e7 g
case 1: st=1; break;% M5 s1 {$ j: k" h* u1 Q5 \! W3 O
case 2: td=1; break;
0 ?- b) t: v1 q3 _ default: break;" R! _' W8 p+ S' J {
}
8 u+ k G! x. a( W( h/ e if(mode>=3)& S) f* }$ }; j- I8 L& L) n# }
{9 d8 O9 p+ A" W1 x
td=0;9 q q6 D1 E( S+ i7 ]2 c
mode=0;; k2 e V% N+ `/ L) ~
}; N2 c7 c& o7 ~4 D
while(button1==0)
: F, a; T8 e$ a( k0 V; D7 A {
2 W. Z: s9 q+ P0 A }
2 ~0 {8 F; }7 A4 F0 v
7 {1 R" W& v! _' Z' C1 B* A* ^( @- L2 J1 `9 e- {
$ Z1 B0 v! m8 U' R1 }2 E
" j" S$ Y6 p* V
}
8 Z3 o8 Q% ]1 A1 f' G: o4 r% T/ F9 a3 G6 y1 |
) T4 o4 k, f" O: ~ }+ n1 j# W& `/ o4 _. B4 p6 ]# X. Z
0 n" T- B. x, e L7 O5 X% b2 d6 J% b& _( p0 X
0 `" B" V5 ]/ n$ J% x! Z* t+ ^0 k
; I& v2 D1 Z! \! {) |6 o! d
$ O) I) _- \7 S, V. [8 P w
+ h9 c$ |! o( H. V+ U7 i3 v }; k+ x) @, I) {5 h' \6 i x! t4 T
}/ N- L9 t4 R' n- P+ k3 f2 C
* }# Y' J* s3 o8 L. H! |" q
7 E9 u, k& d! T6 u9 ^3 H" P9 ?! R3 Z# Q% Y! Q. }% H2 n$ ~
& N0 h$ l2 ^' J/ G' M8 A
/* 配置并启动T0,ms-T0定时时间 */
1 N6 l' j5 z7 U! D$ {* Ovoid ConfigTimer0(unsigned int ms)+ o9 V8 n v5 }
{
3 Y/ p9 Q; h2 _: P" i unsigned long tmp; //临时变量4 Z6 }6 p7 d O
8 F( {& r/ p- n o tmp = 11059200 / 12; //定时器计数频率
) L/ n& t" F7 O+ u tmp = (tmp * ms) / 1000; //计算所需的计数值" q+ C8 q' T5 M( P8 `9 G, R/ {
tmp = 65536 - tmp; //计算定时器重载值' i3 o2 l" B5 n8 d6 b# f f9 U2 G
tmp = tmp + 12; //补偿中断响应延时造成的误差+ T! e3 A- l2 N
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节0 d: P0 Y8 y: I6 c
T0RL = (unsigned char)tmp;( o$ [$ \/ T/ e
TMOD &= 0xF0; //清零T0的控制位5 [: O: S$ G4 R6 Y- a6 y5 @
TMOD |= 0x01; //配置T0为模式15 l& V, m3 f8 k
TH0 = T0RH; //加载T0重载值
" ~( B/ A9 }0 Y6 I TL0 = T0RL;
5 j: p: {# Z4 y" P ET0 = 1; //使能T0中断1 l, D9 d6 C4 K( e4 Y0 d
TR0 = 1; //启动T0 o' n: l# o3 j& z6 {
}
$ }4 t9 u; O8 r. X: x' O4 j( Z) X/* T0中断服务函数,完成1秒定时 */, G" T% f7 O5 H! ?: ~1 G9 Q
void InterruptTimer0() interrupt 1
% h7 w0 o) k: I8 k; ^% t6 m{
/ _) O; }5 {# R) J# |- o: W- Y4 ]% L) C: N+ a
8 o% ~3 ^! W% o" O t' F x TH0 = T0RH; //重新加载重载值
$ J+ @5 W" d! [! ~ TL0 = T0RL;
7 m6 ~- W( v! ^ [ tmr1s++;/ X1 I4 C* M3 ]/ F7 \- F
sdd++;
5 V9 p. k# M/ q5 m8 s tmr10ms++;
& ]/ ~& m- R6 F. I! c8 D6 A: R1 H
9 }9 k: G9 `! v# d8 W" w) R2 W3 V, s9 K# j3 R
if(tmr10ms>=1) // 数码管刷新频率
" ]& k$ V8 v% x5 s( ?& T3 C W {6 ?7 z9 {6 r1 ^7 ]
tmr10ms=0;/ A l( x" V- j( E. D# D7 @
flag10ms = 1;) E! N$ B# Z& g! K1 ~, G! c6 \
}' b& e$ U) }( ]" y( l; `$ U. Z4 `
if(td==1)* Y5 x7 B- n' d
{
" N3 S$ s" T5 [$ z5 X% N, c if(sdd>=500) //温度显示5s 、湿度显示5s
7 f- R" A |% g" [ {
3 ~. h; [' {0 z( u3 B. S3 H5 g; W' T/ E sdd=0;
$ I9 f( t# a! \8 s if(st==0)+ ]/ A" }- C; V7 M
{7 L5 M8 L% j6 {% Z* M) d
st=1;
& }- k+ `6 S* M5 v# R }9 G8 J: j# ?+ B' s: @) U6 `- N
else st=0;
& O! i' C% A$ U: h3 J" b }
' h) e0 W0 F. ^ J s }+ \ N6 l. X S9 J/ w4 Y5 ]# n) D
if (tmr1s >= 200) //1s 数据更新频率2 u4 s6 }( m s/ [( Y
{
* T1 \: U1 a/ T4 X tmr1s = 0;4 I9 Y; U$ B; [9 v, @
flag1s = 1;
3 {& A9 N5 F4 P }
8 ]. G4 r3 |( ?, n$ _% [* A
9 x' F _ X p3 \& h4 z0 R0 G0 Q& W% u" k
( i* l) h( u( Q& L/ j" D}& o# q! L7 I. Q6 [
1 x( o3 T& C5 i4 C3 j
& ]8 V; L3 ?" \下载:
1 v& L: P6 D$ z' l6 g- I
! e! o$ N1 E3 m! L( L. a$ y( t/ R4 S b" @2 y2 @' W5 J0 b2 e
|
|