|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码3 S& b- ^8 N8 c& ^' B7 g
( L2 C& W9 a) U# J* e3 v% q" N
" A0 Q3 e" \7 Y" \% x仿真原理图如下
* l5 W# J! l1 y! c0 q: u
0 v- v& s. B1 r2 a4 W+ z, k6 o Q4 g
按button1可以切换模式9 S1 q" o( ^. K
模式0 只显示温度
* n5 e8 e6 G' | X模式1 只显示湿度2 ?: C' u5 M Z
模式2 动态显示温度和湿度,每5s切换一次' u( V) r' _! Z' }+ z% s, H
& @. ]0 F! l1 N9 ?1 B$ B/ ^6 y r
实物如下7 _' e1 P% g0 }' _* d' b
温度显示* [! M* q$ M5 S1 G4 ?4 t
4 n* u7 L& _+ c7 g
湿度显示 小数
7 y) _# h. h3 L* r& X, \ 9 u! G# U0 T' I7 w
0 U, H' M3 O0 ^$ S* w y$ A
& \$ a; p. T! D模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。3 w4 v; w3 t. R6 g; z' Q/ v6 V
0 W; u: |/ B/ r" h: t/ S
单片机源程序如下:# d/ \- [ }5 o
#include<reg51.h>2 I2 S/ A+ B6 \& w( b+ M, C$ w9 P
( p7 O: d5 B1 `& _/ O2 A5 o' Z& I. [# Y; x$ F
bit DHT_Start();$ O- z. F) | r7 ?1 a
bit DHT_ByteRead(unsigned char *dat);" a6 f. @0 b- b0 K) s
void ConfigTimer0(unsigned int ms);7 P$ d6 S. Q5 [# }- t4 W% i
void Display_hum(unsigned char *num);
0 p* b7 {) _5 K( c' f% Svoid Display_temp(unsigned char *num);" v# O, o% H3 r, @' w- t! p, J
- r- ^ ]% a+ w T3 Q. |0 X% M
! \$ H! [! ]) I- G" M# u; q7 G2 o U4 z% [* e) v' [) g$ |
" C+ s/ V2 g' |unsigned char T0RH = 0; //T0重载值的高字节9 X1 [, U1 K# j% {6 G
unsigned char T0RL = 0; //T0重载值的低字节
/ X# p2 ~4 k' S6 punsigned char str=88;6 h7 H7 Q5 L. N$ k3 m: g6 {( J6 W
unsigned char DHT[5];9 {3 m: m+ O1 {2 e% M& s
9 \) l! o! T6 Q! E& X" n. \
7 b1 Z% x/ T: q7 K5 x6 g" \3 sunsigned int tmr1s = 0;
~* N% k! a) b+ Q( T2 u# G/ j' Wunsigned int tmr10ms = 0; t: K# U% x Q P8 t7 p# s
unsigned char st=0;9 C( K, |8 N+ v1 f! e4 j
unsigned int sdd=0;
/ a& A4 @6 T0 h6 e0 w* Yunsigned char td=0;
% `8 P6 w1 A+ w1 Hunsigned char mode=0;
% U' w# M- f) J: w. i! O. W: M; I; \0 j" R1 [4 J3 n2 j
2 W# i1 n8 {: ^- _+ \
bit flag1s = 0;5 e# n. k8 O5 S! V: @* o4 s3 u* g$ k
bit flag10ms = 0; / J& R) F% a: c4 [% C$ _
int x;4 H; \/ Y$ g1 a3 U# C
$ K1 c0 Y* q: ~. x8 E9 Asbit button1=P0^0;. q; X" A) F% w$ {& i; x
sbit dot=P1^3; //数码管小数点6 h4 P4 z/ j& n+ }% H$ M
( N; y' d+ @: B1 F+ l; N& l! ?% }& a- V- f* A: P/ f- W
) l/ Y8 K1 o5 G5 c2 T4 @6 T
4 z. S- G9 \* o# K ^& ]( g2 Kvoid delay(unsigned char x) //延时ms
2 `# g( j: `" V- z# t# W{
+ e/ `7 F/ C; J4 N. }3 c: a unsigned char a,b,c;% A( {& [7 U7 |9 W- j
for(c=x;c>0;c--)' ]) ]5 ^; z9 {0 T, |
{! z" h% B6 O3 c# o
for(b=102;b>0;b--)
' E* z n, r; @$ B for(a=3;a>0;a--);7 }% H5 B+ C6 A
}
8 i1 G& T& p2 |}; N9 j1 x9 K& ?4 G
void main() 0 D3 q# H4 U3 e
{ 0 W" i6 @" O3 K# Z1 c- q
! p# x+ e# b$ k# z2 ~( m
6 c! `; j9 d v$ m: i# ]/ { bit tmp;' x$ G- _1 Q' d* l0 C" q
dot=0;! i2 w$ \1 @% M) F& i- B- x o
EA = 1; //开总中断
! @$ s" X- ~0 b" ?0 d' H ConfigTimer0(10); //T0定时10ms, L, p+ Q9 H% ^) U5 e. s% q* _
// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;$ v, P0 [6 u$ F! F
DHT_Start();, n% @& F$ j8 B5 R4 M7 z
delay(5);1 U W$ u$ |) I- p* d
( [5 e G+ E/ ~6 ?- Q5 S
! f f8 m8 x! x( }1 d6 Q while (1)
% e( z: r. n2 x( p1 q2 F {
6 D* b/ z/ V2 W9 ], S7 |: z" `( ]/ b K! j
! L5 O. p4 d$ [) v. x2 s8 R; f+ m/ N& A. m+ @
7 |0 C: {# a% g3 V$ F; I
if(flag10ms) //数码管刷新频率7 q1 p% n5 B V- P, h8 i# j/ g# a; F
{
7 o# O9 |+ o2 b) M- W6 m6 c if(st==0){7 X# z G! S* D; q6 ~0 P9 K
Display_temp(&str);
/ A/ Y4 \) p# Q( v/ h9 l flag10ms=0;8 K1 ?" g( ^: d; u2 d+ ^
}
t0 v- f: P& {/ [; Y! \ else if(st==1)" `; A) j0 H( W! I
{
( E* {3 O# |; A Display_hum(&str);$ g& _# X( h! O
flag10ms=0;5 t y% ?8 |% Y! C1 \: C8 f$ \: H$ W
} g' m7 d. Z# d$ T
2 |, O" Q% Z4 p% m$ e1 e0 J
: {' O" T7 V% r$ t, `* m
* U+ N U Z. n* o6 s) X
3 k1 S. e* ], K5 q( s" g }
" k* ?6 I! j3 E& e else if (flag1s) //每秒更新一次温度、湿度
[" e# J$ P2 b% Z$ @4 \5 D {
" s; P( Z+ g# w6 Q [8 A; { DHT_Start();
7 T' ~- ]9 j" {+ p4 O! x tmp=DHT_ByteRead(&DHT);
9 f0 e/ x5 b1 {$ F' y, q, q if(tmp==1)2 {8 f" i) \7 e8 b2 O
{
V: h% @: @6 k Y4 ^" Y/ Q' U9 c! N( W! Q' ]/ f% C
: ~1 B& U* j4 v: `8 G if(st==0)
1 d: ?; N0 H) j; G% y {
6 }8 @, o; V; y0 w1 p* l str = DHT[2] ; //温度
" z8 `* [. u$ ~& i8 u3 d9 E, p Display_temp(&str); + `- Z7 R) B# Y8 W1 F
flag1s =0; //标志位清零
- \; ~ B7 \+ o: k. o6 Q( s }
" x% ]; b( L+ Y8 w: T else if(st==1){$ L' \9 a s8 N4 J$ q5 }) \
+ M8 E1 [; D* T" q) D m2 }2 U( m+ }2 {& l p0 x, B, h+ _
str = DHT[0] ; //湿度
, x! n! |* D- \0 n5 k( H9 { Display_hum(&str); % \5 L% c; y2 ]* q
flag1s =0; //标志位清零
* n0 ~3 R6 d! r1 D! `0 e }
3 C. I/ C% o6 R, \0 s: k% E( k
/ Y {" h$ g3 v4 P" _4 z& a0 D
' j: v0 r5 D- J( m1 n9 X6 L# v' j
& W: \4 n. U0 V D7 [) u% e" A7 P7 [) B4 k& Z9 b
. }0 P% o7 n# e4 l$ M- v }! d1 k6 h; N) U3 m2 s5 Q7 a
}& b) o$ e! Q; w* R
if(button1==0)3 q2 c! T+ k; N4 d4 B* X
{' x+ {/ ~4 l) @
delay(2);/ I* k; B d9 R* @8 }3 V
- y) A. w1 _0 h" c6 x# E8 _
if(button1==0)2 D! F, y8 o$ z" @4 V
{
. P' `' x5 @4 ~8 U# f7 R) t7 Z
. i/ U. R0 r- m+ d) o mode++;
2 m2 r( I r" a" a" j switch(mode), D: ]3 h% X1 ?) l3 E+ Q0 X4 K, D
{
6 ]) o5 f s: G/ o# w4 J. J% k case 0: st=0; break;- |- r- I n" o% X. A
case 1: st=1; break;! i0 B3 |0 B6 k3 ]0 s
case 2: td=1; break;
, ?: K9 p2 \8 D1 V$ K& Y# H* m default: break;
& `3 \2 d) U# \. I }
" F# _& q- [! W! C1 w G if(mode>=3): d7 `* L8 L; H0 A3 q- Q) l
{
) x+ X0 S9 ~3 w8 t/ d I9 ^' s td=0;
; t4 u4 f9 z3 C P9 A3 _ mode=0;
- P7 t# p! O9 A: P- ]0 R }$ _- @" H6 [; }% }, U
while(button1==0): A' j3 K: @3 K9 Q1 u
{6 e+ A: _8 z% V9 B
}
: n6 @* W( d: @& z8 y* ^5 m1 ^6 v5 n0 k% Q
7 [+ E% \# Y- i! N& x& c8 Z' y" N8 N
6 y e( L2 F6 g2 e% [5 U7 T$ r7 j }6 \" }: k, I' o4 ^* B' o% M$ W
" u4 h3 e2 k4 G2 \
8 F- l( B( i8 l4 {! {9 W! M6 A }1 W9 ~2 Z. ?% y6 z# i1 o/ s
6 E8 z& \: @% [. H+ a7 T7 l# O# n
* g4 y$ _- M8 T- m8 J1 n8 G2 s
' }8 q: o2 D7 C% k; y
+ Y8 D1 e0 v# s+ C2 n" i+ h
6 k9 E4 d2 a( {0 k* I
8 [8 \ B, s4 W }; ?) z- g* p0 }; F7 z6 @
}4 ?1 g0 Y9 Q; U) Y1 O( H
1 n( K) j ]$ E( V% O( } y
: t# y% s$ K# O& q
2 e4 X9 L1 ^+ {& ~6 J
) }3 }$ r# \9 y/ ~' h' I
/* 配置并启动T0,ms-T0定时时间 */3 K- } M6 F. L' Q$ a! ?) R
void ConfigTimer0(unsigned int ms)* J7 g2 i* l, ~1 K) @
{
$ U' R* x0 p: X- w% r unsigned long tmp; //临时变量+ U+ r ?3 S" H k- _) ]' W! ?6 _
( ]# r( G' @' k+ t5 Z tmp = 11059200 / 12; //定时器计数频率& ~8 S$ k8 K- {& t7 e0 @ J; a
tmp = (tmp * ms) / 1000; //计算所需的计数值
/ `) X2 j. \+ @) L& Q6 S9 R tmp = 65536 - tmp; //计算定时器重载值$ I" ` z2 _" k( t) r
tmp = tmp + 12; //补偿中断响应延时造成的误差
0 ?. F1 E7 X8 k L T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节9 R, n9 X7 {' T" N; g* `
T0RL = (unsigned char)tmp;; g9 g. w0 r7 y/ p0 J
TMOD &= 0xF0; //清零T0的控制位1 m8 W5 `' a" D) M7 A3 Y
TMOD |= 0x01; //配置T0为模式16 T* H' d* V) i+ \
TH0 = T0RH; //加载T0重载值* u$ {% L% ?* H: p5 r- W
TL0 = T0RL; m2 A6 H5 J+ d; b3 r$ e
ET0 = 1; //使能T0中断
$ E. r" P. j J+ ?' H TR0 = 1; //启动T0
+ U6 w, d; p3 ]! t}. M6 j* U9 K8 o4 p: R
/* T0中断服务函数,完成1秒定时 */
$ }2 w5 C. y gvoid InterruptTimer0() interrupt 1
6 M J$ W) r* s: Z7 v" G{/ F: d F) q8 B# d, ]- i! O2 p. y
1 K0 s8 H9 T1 W
$ x* h: }2 a% Z TH0 = T0RH; //重新加载重载值. Z- q9 r& U) h$ X8 J3 ^# U: U2 J
TL0 = T0RL;
, z' H. U4 q$ I# |. q& b tmr1s++;
& Q C# x( q" C6 |% W! h; p' ?: j sdd++;) f1 q# l' k/ |+ Q, f$ F% k. c
tmr10ms++;( G% u- C) _/ K9 J A6 n7 j
! [* }0 {3 `4 [0 K9 O/ Z
8 `( W6 y- ^4 W( D5 L9 \6 R
if(tmr10ms>=1) // 数码管刷新频率" K% P1 E# H8 B) _. Q
{
# i" U6 y! N2 v4 a3 U tmr10ms=0;; U, k. O0 t: D. G7 D
flag10ms = 1;: W& B ^' I; F) n) G6 D
}
& e5 U8 L% ~$ }4 d+ C, a if(td==1)
* u' ^ ^- ~& e8 c, z {
9 L# ]. {5 E% p if(sdd>=500) //温度显示5s 、湿度显示5s
3 h$ q( e5 r5 k" Z% A2 q {8 T, N* G8 p$ K
sdd=0;: m) J4 [ m& O( }8 S
if(st==0)
3 v& V5 Q, `. o1 W7 n {+ i( s( h8 Q2 t7 I0 q0 Y9 o/ d
st=1;2 c3 B* t2 ?9 Y3 {
}
8 ^( H) z- T8 c3 D: u( k else st=0;
- d% n9 i1 q% E6 r2 q }8 k' R$ c! Z7 v" ]1 O' O9 S
}
6 Q7 C* B" _8 Y% s! t/ V- A" K- H1 b; Y if (tmr1s >= 200) //1s 数据更新频率
7 L% G/ ]2 y2 z4 S y {
- ^3 X# u, i$ J; g tmr1s = 0;
8 h1 Y9 t6 Z1 Q0 r, ~: w flag1s = 1;
4 Z, i% }4 i' F2 F- { }
1 ^5 W; M3 f% t0 x2 _ k
) I! v" h k6 f; @8 @3 } p& h8 F) z" r
: a3 _6 v4 o9 z4 ^' p8 ^}% c/ \) |0 l1 A1 \. X# D
1 ]- { [1 V7 Z4 @2 h
- H8 K l# T/ B. g7 l" j, R$ r下载:: X* d. }+ B9 ^3 [) s" [" ?" K
) S; o7 X# D' K7 O( v% \. C8 {, r9 z* V
|
|