|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码2 K9 ]1 \9 \3 L/ k
% f6 @" ~) F( a
& o$ k0 H7 k u4 {. F9 ]仿真原理图如下
) ~& v7 v i: |) n9 D' `- K; {2 g
% N+ t" T0 ^9 K( {" y" e: j- Z. a, h2 I) t: l, u
按button1可以切换模式
5 T( A' \' k% M+ j2 ~% \2 o模式0 只显示温度
6 ?) G/ S/ S0 X; i' G模式1 只显示湿度
* U0 B3 O$ j- k/ B A1 b% b( h+ w模式2 动态显示温度和湿度,每5s切换一次2 {8 `* d/ M) ?
% ? x8 a* f! R/ m# G2 X0 m. O7 e) G, n- H% I6 A/ d
实物如下
/ @( X$ J, N$ Y4 h& P# [+ s+ |, F温度显示2 r }6 p/ L% z i/ y
! ^7 I- G9 ]2 e5 d& C/ e% ]湿度显示 小数' ?: X/ q( F: Y
$ W2 @ S/ R; Z' d* b8 i! p
6 u; T6 ~' K# _3 c- E7 J$ a4 J' x/ e7 y
( l- f. M, k+ ]& Y2 o9 {. x
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。
0 a/ V# G, p, N. y! e( y6 R! e7 G8 }+ Y$ U& M+ ]% W4 s$ k7 v
单片机源程序如下:
$ X4 {. s. a2 q6 x#include<reg51.h>
3 T+ ?/ I* _5 J3 X6 X/ [6 G, ^' Q7 w) z6 J; w; p
5 @6 o7 X1 A8 h6 rbit DHT_Start();+ G3 O' q x) y
bit DHT_ByteRead(unsigned char *dat);
$ [; b5 K, n9 _1 p* Y5 Jvoid ConfigTimer0(unsigned int ms);
9 ?3 o) b, C0 _; k8 V$ rvoid Display_hum(unsigned char *num);
, X" o( |8 C% B7 G/ evoid Display_temp(unsigned char *num);
+ ]+ \' z# g0 o* e1 _7 e7 M+ z; G, \# _5 `( I
4 d T& x# }' F" l
% v6 i c2 F# J) i
" Z3 o0 e# v6 G8 ?8 J3 punsigned char T0RH = 0; //T0重载值的高字节. ? u/ i5 x+ h9 B1 A
unsigned char T0RL = 0; //T0重载值的低字节
" R" t- a; O' K; S# ^unsigned char str=88;
5 b. Y% m ~3 c4 k) b. f! F. {& `5 R3 @unsigned char DHT[5];# r: ]4 @- e+ e3 w9 W2 z$ }6 I" g
6 o* n5 b/ N; R0 Q8 Z2 l
# A/ f# R" N0 V* T5 o' Sunsigned int tmr1s = 0;
4 H0 d( m0 H* {& Z2 w Sunsigned int tmr10ms = 0;9 W/ a0 H/ s/ G. F
unsigned char st=0;
9 p* |: e. L( T$ n$ Runsigned int sdd=0;
; W( J4 m. D4 N2 [7 I/ Lunsigned char td=0;5 S! x( K" w5 p$ |* B' k9 v$ a, T
unsigned char mode=0;8 z: _6 z; i X6 M: T7 e% N9 |
" c' x$ |8 I( p1 e' C
" ^3 L4 v1 e1 F- P$ h, w) F
bit flag1s = 0;: h) R8 h+ K$ [5 E. m9 T6 j6 _
bit flag10ms = 0; 6 P1 V1 p0 P& n4 X
int x;
8 n" S L0 L+ d6 U+ k2 x
6 F9 ~ n3 O/ c8 Ssbit button1=P0^0;
9 R' L6 P+ Y; n' x0 d4 Zsbit dot=P1^3; //数码管小数点- h x7 r- T( b1 P* S/ r' C8 N, s6 L4 D) [
; |$ e$ N+ N: Q( E' z
O0 n3 s3 }* F7 p/ [, m
, ~4 y* D4 u9 }" M+ K( i q
5 y# P6 Z K4 xvoid delay(unsigned char x) //延时ms0 L5 ~# j% j" L7 P$ G8 t, R
{
! ~2 E L9 U! I2 z6 [9 a# ^ unsigned char a,b,c;
. U t0 G, }- W% g/ M; e* ^ for(c=x;c>0;c--)9 ~5 l7 w$ ^0 I4 h: k' S+ k2 t
{% y6 b8 e' _5 v/ D- x& I
for(b=102;b>0;b--)
1 t8 z; b. ]" x( {. u* Z7 i for(a=3;a>0;a--);6 @# |( T- y: `# Z' g
}
# c$ B% I: f+ a$ ^& r}
$ n) H$ p0 _0 T+ x) ivoid main()
/ G4 |: d/ y3 D) ~) ]% `{ . P* `! N0 P3 G5 ~& E
: z7 O: G6 o7 c- J! ^* \) L8 w4 n9 | d; B
bit tmp;
: ^; N' L! V4 ]" {) m" P. c9 u dot=0;7 |( P" Y: B5 t# `( K
EA = 1; //开总中断1 v) w5 M* r N
ConfigTimer0(10); //T0定时10ms& y# U4 } t& |6 P
// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;
! n) t: V9 ?) z DHT_Start();" z1 S" n: ]( ?7 `! E; n
delay(5); K0 t% ^& `. i7 S
. [: A( ^# |; f6 R* X( U8 f' A" Y8 _1 V5 y! b
while (1)
1 N1 V: _% Q0 ~9 e0 ] {/ V7 J, c& O" U, j% m
. T7 D( V3 Q. S, e1 A% f
: M n# x9 x. L H" Z5 Y# g
1 W# j: K5 v3 G- [9 T
' _6 r' ^/ [9 j* B. a4 w: e" o
if(flag10ms) //数码管刷新频率3 h8 s1 k, |) U/ }1 A$ ^" g0 D! G$ n" S
{/ b/ z# N4 s; \. O) j( Y. J
if(st==0){! s3 s I5 p- }5 @6 ^9 Y4 `- n
Display_temp(&str);2 m5 i9 ~) D: P6 x! y
flag10ms=0;1 d+ v; ^' F9 W2 _
} h* J o! D) i1 m" M* V
else if(st==1)
: B& l7 \3 r; K8 G. e: ?8 H! z2 N3 } {
! V r1 Z$ f! [+ ?0 a7 | Display_hum(&str);
4 D+ ^/ G' X1 v$ S6 b flag10ms=0;
' n" M1 ^8 C, U; `3 C& R }
1 o" g$ s1 l K6 K) o+ N* s! X4 z' H/ A6 M( q
" G& D: A' m" W9 i4 n g ' i+ x" m. U9 ?$ m
, H! ], z2 [% f
}
8 G: ]* \4 ] y! r+ C8 t, G else if (flag1s) //每秒更新一次温度、湿度
$ n1 a8 I, U/ l. B2 K {6 n, D& ?5 W. K8 ]( Z$ E. Y
DHT_Start();
8 z2 A1 p' n: x* Z tmp=DHT_ByteRead(&DHT);" t6 Q, ]# T, T+ i3 R$ f0 ^
if(tmp==1)$ G. U H9 i% i! `; q" c9 Q
{
- F, Z2 B8 ^& { m/ R- K5 @: s6 K6 }3 L" i% X/ T% {* U
- h! u' F" c w% z# O" V3 ~ if(st==0)
% ]7 R/ y$ _! H9 [1 \0 a5 m& { {
& U+ M) K/ ?# V1 t, c6 o0 _$ Z str = DHT[2] ; //温度
4 X+ ^! R! J; y, V1 E0 M Display_temp(&str);
, ~7 ?8 k% o* U# B$ j% D/ k* f+ Z flag1s =0; //标志位清零
) `: L" B1 m1 H+ ~7 ?6 i }
2 }) t; K& y+ _& J5 D' i else if(st==1){% R2 A0 C" P) b7 z* K4 _
6 H" {. e+ Q. e4 A/ c) {/ c2 e- v/ B- W% u4 ^
str = DHT[0] ; //湿度
! m' m6 v. n; l' G2 @; f4 w Display_hum(&str);
0 l. Q" Q+ z: ~8 E; v flag1s =0; //标志位清零; L' }6 ]3 k, t# ? @) O
}
' T: E0 C7 t, y% e& U
% _1 @* Y; F$ ^; U( \' T6 F4 @1 N# X# o: t( h- u# }
+ z6 R* d$ A1 X M7 s
% U: k: y: s; H3 b3 H' e7 U: @) \6 @( n* y) B
}
, U1 `! h1 e9 |( H/ J }
, ]) V& ~! j$ Q/ t( ]. i if(button1==0)% E' x' W: G; u3 F: W4 P
{
7 M% X0 A5 Y; b) t delay(2);
+ e- p/ b/ S: S1 h; n. G+ e; f
8 V1 y3 |$ p1 O" p9 d8 a if(button1==0)
6 ]$ H: H V) t9 Y% J( V {% t7 x8 w; D( D0 ]! f: Z8 x$ l
4 ^9 A8 {5 W7 G( c) ?
mode++;
9 t( F3 q8 \. }* A6 ? switch(mode)
! m& P, R: P4 \$ n {
: g/ C+ u1 p5 @7 W case 0: st=0; break;' Q3 ]" j2 l ~1 h4 b
case 1: st=1; break;( d/ X5 g4 b7 ?- y* a) Y
case 2: td=1; break;
( O$ D+ q) ~3 } _0 m default: break;
6 K, F# l- O% l0 @# c }
- l. K$ N# U+ N: W' P if(mode>=3)
, T- z' _' g7 u" T1 l# [ { M8 X3 g" N+ j6 l) K
td=0;
6 h/ } Z) c$ r1 K! z2 g mode=0;
4 w& Q D" {) n# y }
5 k1 Z' `( g. }* l$ c while(button1==0)
0 m* H' v( k5 A- X3 n* t1 J4 I& c {2 q5 @& p& v1 [7 |+ m
}
5 Z& q9 b. f- a+ s
4 T* U3 l s7 s, X, z. s6 S% P
6 i, ^9 |; ]" T" T+ V1 L" w+ V) r" I3 Y* g( `
& o' N+ R/ [/ q) G. n
}; n; P/ g* |5 ?
# [) M1 W8 i8 n% ?1 Q2 H. _+ p3 l2 r
}- W/ [* D1 Y4 ?, m5 U# k
! @3 z9 x6 I, e3 D9 V
( v; Y0 x7 g% m; A) Q2 Q& a
* w- Y' p( Z9 z8 N( R6 I0 p, s7 Z) h/ t7 U5 c; L
. G- e; ^2 L Q
# m; d1 j3 o9 p2 t }3 i( L. b; }- X$ w" h: T( o
}5 x F; S: u& U0 T) z
" s, n' V) e" f5 u& L/ q
0 m! M! R8 A* v% a! _. O2 l" _/ S5 w w3 Y" Q8 j
, p7 C! @+ w3 X, e/* 配置并启动T0,ms-T0定时时间 */
; J6 T( Q" V3 q+ o2 pvoid ConfigTimer0(unsigned int ms)' b! L+ H' I2 @$ b! M" ~( d! r
{
: t# Q% M& c n! m6 E% @. b unsigned long tmp; //临时变量
$ N8 U1 d! D9 [% N ( K7 B, b$ D' x+ F4 d% K
tmp = 11059200 / 12; //定时器计数频率6 ^% ^7 ?5 J" l
tmp = (tmp * ms) / 1000; //计算所需的计数值0 | X* i# k: x0 Q/ p. X9 Q
tmp = 65536 - tmp; //计算定时器重载值
4 ]7 v5 R+ E* t" f% Y tmp = tmp + 12; //补偿中断响应延时造成的误差
. G! `% x: H# j1 H. V T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
: r1 X! t2 z! T; u5 u T0RL = (unsigned char)tmp;
3 A; h' }, \# D2 q TMOD &= 0xF0; //清零T0的控制位
+ M; Q- e' n) Y7 D6 K X @ TMOD |= 0x01; //配置T0为模式1" o" x8 B( f% P7 A8 G
TH0 = T0RH; //加载T0重载值
' r. k% a! Q* D5 O- f7 L( H) ~ TL0 = T0RL;
1 Z9 e$ [- l4 Y. J2 t ET0 = 1; //使能T0中断* p9 X0 i- z$ x# z2 Q
TR0 = 1; //启动T01 v3 {- N+ i1 v* M" p0 ]
}
6 `" _9 k l- B: D2 G/* T0中断服务函数,完成1秒定时 */1 [! C+ _- g' k9 w5 L; C9 M
void InterruptTimer0() interrupt 19 v' l2 u/ i2 x ^4 R+ w: B/ k
{
5 f- e3 s/ C* |: s8 N. E" |( m# _' |% W" o
6 C! b3 r8 i Z. Y: e/ O. J1 }* O TH0 = T0RH; //重新加载重载值) L8 t8 {% \0 U0 ?% y: S: \5 K
TL0 = T0RL;
) G/ h( F- x* k. c% s tmr1s++;
% |* N# Q' y. E2 ]1 E8 [ sdd++;7 q! U% E) G0 O$ e, l
tmr10ms++;# H* b7 l' i9 E4 t
* A. S; [2 m9 p; s8 W: M
% l( d7 f ^) [, @7 l if(tmr10ms>=1) // 数码管刷新频率; U, V5 v0 H" K- G* f, x! x1 D
{
4 h8 {9 I4 F ]3 W tmr10ms=0;) u" U; I- p+ }% S, m* |$ A
flag10ms = 1;
" }" G3 b' N0 S5 T1 j6 z }
; ^0 p% q4 ?6 G2 f9 ~1 V( u, q9 l if(td==1)
2 B! ^0 Z; T; y# Z1 G3 ~" u {4 p# |: M6 o7 W T v5 w; V4 x: _
if(sdd>=500) //温度显示5s 、湿度显示5s
" }# s0 @ m) Z- Z {
1 t) H& E5 _' t( Q) k4 B: K/ _ sdd=0;
) y' c' j, O& J: U) E& {3 u) F$ l if(st==0)8 n% ^3 H3 c. {* S6 j
{
N1 E: {, G9 A- s' D st=1;
; m2 M( f& X* o; M' V) {5 N } i% P# E; g4 ^6 p! I& ?" W, g
else st=0;
/ T, \- ~- }! v% C }
_9 a( `8 i2 x: n }, i2 V1 ?1 l+ ]3 @, a
if (tmr1s >= 200) //1s 数据更新频率0 M9 S, b" \$ D; P3 E( v9 E
{
, ~$ l7 P: Y$ _3 N' m; Y+ D7 c tmr1s = 0;7 ~8 f' o* j! R$ |% q: K* m
flag1s = 1;
- J6 h7 o3 g1 t }( E/ K0 C2 Y; P
6 H, Z0 i1 k# \9 V
3 L6 |, r) _& F+ ]( {! F 3 d+ ^3 b" K! E& o7 H- ?8 j
}+ ~* C8 }1 \& N" R2 R" Y
' ]7 Y0 S ~' R$ [3 n
# n! o1 P9 A( t
下载:+ [& y3 z1 t8 M6 E
2 W! h. w5 P% i- D, `$ e" u) v2 d3 M1 k. u9 A6 V' d8 r8 {5 v
|
|