|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码" T6 R+ R! e$ r) y
6 e- @! R( k5 b3 p# U
; R" T+ R4 G2 j( N6 e
仿真原理图如下
$ T. U- Q2 r' P( r- w, G6 A
3 m* n( x3 `$ P4 q" c' p/ X
* |: `6 z: q. m, e. o$ {: P按button1可以切换模式( D: c8 s( p/ F* O J. ]) m
模式0 只显示温度
; L5 {& g1 F" w6 U: w" Q模式1 只显示湿度
) J* q" x# H4 a模式2 动态显示温度和湿度,每5s切换一次
) T8 u5 R# ?, G" p! j/ o5 j# [+ Q: I) W0 i9 k: F3 b
# X& b; j! T ]2 G实物如下6 C* `; F+ F: \! t
温度显示9 A4 n k) p2 p" _! u$ M) P
9 I8 d+ J: w% X, s% J* @( j
湿度显示 小数
" G0 O, {6 H& x ) t% o7 D6 n5 I
; T: h8 P$ @+ E$ s
3 v, {6 d5 ^: S& C
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。% t' a7 y# B ^# I% k7 H
# E) }2 J5 \3 w1 I6 R
单片机源程序如下:
' i. [+ V4 `4 C- h P#include<reg51.h>
6 V6 j3 f0 }- O- ^6 p0 X6 K5 x: F& Q3 F8 i
1 l) E% {3 Y' w
bit DHT_Start();
1 J! a* u3 \2 g- E7 K8 I8 R+ Kbit DHT_ByteRead(unsigned char *dat);' G7 z+ Z9 Z% ?) G6 E
void ConfigTimer0(unsigned int ms);; n4 `' H. x% }8 K/ ]6 t
void Display_hum(unsigned char *num);
) q3 A3 h' l9 F/ N- \4 f, j/ ^" fvoid Display_temp(unsigned char *num);8 }. h8 }3 n& f
$ ]% j- q: @0 J
& T* u; O( _6 {& z. v- l( J( Q+ _3 n p6 n
@4 F+ o. M7 y0 s# d, \1 Qunsigned char T0RH = 0; //T0重载值的高字节0 f, q0 L1 y" W, \/ @) t! L
unsigned char T0RL = 0; //T0重载值的低字节 2 }' E Q5 p; f2 n. J, v
unsigned char str=88;; Q1 L, |3 R+ ~" U' C5 ?- k+ G! M
unsigned char DHT[5];
% A8 w, z( a" x3 `
' e1 X2 n9 v. { l6 y Y0 g* V: l$ p' | ?0 D' F6 Y B! I8 h6 Q7 [
unsigned int tmr1s = 0;
, V% l+ h0 u" v; J; u5 [; Yunsigned int tmr10ms = 0;
/ |4 @ X- q- X& n) a: s* Cunsigned char st=0;
8 S- ~! j0 M! C2 h, W8 sunsigned int sdd=0;
1 U6 c" j/ Q% ]6 H9 ounsigned char td=0;
7 R% L. Y5 D; {1 K4 punsigned char mode=0;( V; ^: \% P* v/ a' P. h8 l
, q( O! `6 T( J/ c. l& w# m3 F9 M# U% P( j5 v3 {
bit flag1s = 0;8 u* E# @. g& H/ \" y" Y2 ~
bit flag10ms = 0;
, N. |8 M% a/ k4 e# Gint x;
7 y1 k4 d) P0 ?6 v6 Z2 ~+ R- j 2 h- r1 G: Z u5 ?7 ~
sbit button1=P0^0;$ k4 I7 ~# t! ~* E4 E
sbit dot=P1^3; //数码管小数点* C: V+ e( Q; Z3 C9 Y/ K
8 V9 v3 G Z2 h7 M/ G+ y% R& N
7 v& V. o) c( K" v2 w5 v( j! B- O1 l S
X; g3 X% Y t. s+ [/ R$ k( Y# d
void delay(unsigned char x) //延时ms, p9 \% C1 J' N0 H
{
. S- S, Y: v4 s2 C0 P unsigned char a,b,c;: Z4 w, ~) }6 Z3 v0 S: G$ C4 p
for(c=x;c>0;c--)2 @& z& f e# g- X4 w6 b; p
{/ \$ ] v7 x; q6 Z( T1 l5 z
for(b=102;b>0;b--)
6 b- r$ s( P- v3 d for(a=3;a>0;a--);$ L) Y2 ^# ^; }7 T' F) C
}
* c1 K) \* D7 R2 I6 J! h}; I' c! N- J( X3 S7 E6 L
void main() % F3 S" W7 X* O9 o0 `
{
0 m8 b4 V9 t0 k# S* b2 s/ D6 D4 o1 s. d Q+ e
3 O5 g8 l6 D* v6 w% u: h! z
bit tmp;
/ B" Q: B# b9 R" G) J# t3 u9 y7 A dot=0;8 R/ y/ H* o$ S
EA = 1; //开总中断
; y/ o/ w2 ~5 k/ I3 O ConfigTimer0(10); //T0定时10ms1 Y1 q9 O- H* K% [8 C
// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;
: s" D# S- B& s( d! v. u& m5 ? DHT_Start();
r- t) l5 q- E: B9 o! h delay(5);5 a/ T; P. c" `: C' w3 s L
0 P/ z1 \* a T/ I1 w) z4 \6 z
/ U: U9 B, I9 C: |' ^/ Y2 { while (1)
& T9 U3 d" D7 R2 V6 F5 [ {
7 c1 w% R+ c& ?$ b+ r+ a$ q3 m( |2 z* Z; X( J" l5 n
, \/ x3 f$ K6 D% G5 U* L
7 m3 @+ [( p% F. a+ _
7 A. {4 S, i6 Q! E- h4 G% G7 t
if(flag10ms) //数码管刷新频率
: ~* d# i% \; F% A {
+ J4 B8 o P* S3 y4 z5 R: b if(st==0){
/ P ?. M7 Z0 Z# o! A- j" z5 r0 J Display_temp(&str);/ N$ B2 m0 @. N9 v) y/ `
flag10ms=0;
7 w/ P& z% N2 e }
9 g1 R, t: Y* m7 _$ Q else if(st==1)
; _& J" P0 }% `4 b5 v {
8 Z$ y' @% B# @* Z3 M, Z& R Display_hum(&str);- {0 w4 M! y' J, r/ j' i
flag10ms=0;/ N6 ~: H2 A. |$ X
}
3 U3 L. W. w5 l" S! Y
" D& y* h, `" @8 Z \4 d- J3 d' E* O0 I5 b
6 q# k2 e: h, a. D& u9 S
4 ?/ `# C; F9 ~4 g' m/ s }4 l. o; z. [6 M G2 a# k) _
else if (flag1s) //每秒更新一次温度、湿度' J3 x6 a3 \! S# n( U6 T" m0 h4 h
{
9 a0 b8 W6 E$ ]7 ~ DHT_Start();
( X) @' p& v% R! A3 s( S+ U* H tmp=DHT_ByteRead(&DHT);
1 p0 B& F+ x! F/ }; Q' d Y) ^ if(tmp==1)/ J1 H' Y# e, e& m1 \, E
{
5 i* ^( g- u4 |- I. P' U7 ~2 u# o2 `- t4 ]0 Q# F6 Q
( l' _3 Z& {8 H" R+ R2 E if(st==0)6 K, w* M, O: X l
{
" a2 m: q& S c+ x: b1 h str = DHT[2] ; //温度; G8 |4 Y& Z, B5 `
Display_temp(&str); ) L- l( d8 S' L3 ~" |
flag1s =0; //标志位清零
2 z& y2 N# J9 B7 y D& P }+ U8 S) Y) N% Z8 ~" @
else if(st==1){
* h2 L) F* L) ~, k' D A6 o" }
5 S- i$ h' v; j' p7 G9 [1 H" f# J6 T( F0 |- b* K( c
str = DHT[0] ; //湿度
' f, j4 j; Q8 n Display_hum(&str); 8 _* G5 x% ]6 I
flag1s =0; //标志位清零3 E, I( [5 A$ S% Q! `) m
}! ]- M/ b. M t* }( X6 O
. a' _% A. M3 Q
! L1 c6 V5 q. H9 @$ P% f / ]* \3 \7 S% _4 Q8 V
. s M7 i& P2 K0 p I g3 @
+ @$ {$ w' O' r }- [( N6 i" [3 G/ \
}' ?) o( ?# o( H5 p
if(button1==0)
' s7 [# Q- ^ p {
8 i, U' F+ a8 @# K& W# z delay(2);( y- x* S) ^9 u! U, d
2 d K6 L. t" q U0 j7 i8 ?8 O
if(button1==0)! a- r/ @$ w: f5 T1 b2 K/ W. T
{4 Y2 M* e3 E* p7 b) n! p
N" @3 Y# B$ [+ V! }9 ~) ~4 T mode++;
2 H, p4 A, K& X+ c+ P) }4 O switch(mode)0 q( t( _) Q8 {" y; {3 s
{
7 h. R1 C& u8 C case 0: st=0; break;& Z9 }. W9 p# Q% u8 m' x' ?
case 1: st=1; break;- U- S }- ]1 N0 | u+ ?
case 2: td=1; break; y( _5 q, b0 Q& {3 ~8 u
default: break;
. H4 Q2 _& P7 B4 f }
8 ]- }( }- [5 Z: f, @ if(mode>=3)
0 {, C1 Z, ]0 m1 W% V) W* P {) a6 a! h }% l1 Q
td=0;
$ G% _- J9 g- G! L |5 W2 l% @ mode=0;
" I5 Q4 I4 E) p ? } }' E) k/ w" l' S- A) a
while(button1==0)
& ] ~! [2 g |4 F* n+ y# ` {
2 t6 {0 I2 ~& h& I* H1 u# j }. K' a& v% C/ e% l _$ G2 I% y
6 z- m7 Y3 w$ \
; g. S- e) r/ Q% O% j
- s( X- W- y# R( X1 p
; m" c8 M! S2 X+ j+ Z6 V8 J3 a }
. m/ N0 I5 h2 ]: E! S' l& o, E4 F
Z5 P# X; o g- l. g O
2 `7 B- Z2 [) m }; a2 R6 N& o& o. u- I8 a* K" S/ S
" g4 P+ D" M8 Z. q! V$ n4 P6 H
! Q$ P# \4 A1 [+ g, y
1 {4 \" k- ?" Q4 T1 k- s6 B/ e7 D/ }2 U8 c, H
+ ~, q. M# O! [* m4 X" Z# \+ A' O& L* P; o; a; y
}
# p# Q3 j/ G, F1 _- g! f}9 P' ~) `' Z1 e/ b* j% F
: [. i& V7 R6 }( e
- s7 s* [/ n# W
+ V4 w' {3 L+ l
) o+ _$ y5 G6 r6 e2 k( Z/* 配置并启动T0,ms-T0定时时间 */' M* U- ]2 [1 i) e: p
void ConfigTimer0(unsigned int ms)
R* A# \+ x3 C- F e+ U' m3 w{ j) f( j7 P4 S7 m$ F! I
unsigned long tmp; //临时变量 f% L! L9 I; E" v$ W1 {
# ?+ l8 r. C* R1 O5 F+ D; a3 Y0 n tmp = 11059200 / 12; //定时器计数频率
4 F; ~/ h0 f, f7 Z/ y0 X* l7 i4 a tmp = (tmp * ms) / 1000; //计算所需的计数值
6 w' o" N* g* V' W tmp = 65536 - tmp; //计算定时器重载值3 R( Q) n! O- E1 d
tmp = tmp + 12; //补偿中断响应延时造成的误差$ G. L+ A1 y5 ]' a4 X% `" |+ R9 }" D
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
" E! ]' B7 Q& x$ G' ^1 m T0RL = (unsigned char)tmp;2 y% Z) A' U F# {6 e
TMOD &= 0xF0; //清零T0的控制位
2 _4 Z( l4 J5 H5 y! q TMOD |= 0x01; //配置T0为模式10 _+ P" ]/ p& Y" b$ p @
TH0 = T0RH; //加载T0重载值7 a9 ]) R0 s4 Y. S
TL0 = T0RL;- h" H$ A( w7 \% |9 _) ?
ET0 = 1; //使能T0中断
8 ~; L3 a& H: x3 h# t3 n: w. X TR0 = 1; //启动T0! A( g3 f4 H6 t) l0 K1 p- b- b2 n
}6 x* O: k% Y, f( f) F3 M; [, W* X( t
/* T0中断服务函数,完成1秒定时 */
8 N0 f4 F' r7 q" z5 ?& Avoid InterruptTimer0() interrupt 1
$ y* K- \& c0 F3 G{
/ K( x+ Y/ m# r
* z1 I/ x; G( K- w$ t7 H0 F* @7 d4 z# X# d! d! G, p. S \% W7 m
TH0 = T0RH; //重新加载重载值: z3 Z/ k$ Z/ k. P% g5 S
TL0 = T0RL;" T7 r2 Z" C p
tmr1s++;) [1 b& }6 x$ N, N! L
sdd++;
! F) x8 b$ y) _+ ~7 u W* ~- ~ tmr10ms++;7 t" G! k) ?* \) } e w
: x$ l! V7 F6 }: u: V
% s( _) D7 q) o- f& ~* S! G if(tmr10ms>=1) // 数码管刷新频率
L' j3 @) U+ C/ e+ m0 c7 Z { f) G4 t" n) _$ V
tmr10ms=0;
- ^. b# d8 _- Q2 K5 ` flag10ms = 1;
8 J3 F* ^8 p& T: t4 c }
* S" e6 N9 [1 k, i4 n if(td==1)
' d/ s5 m$ T3 }8 x, } {( Z0 y3 y, s* `+ X0 a
if(sdd>=500) //温度显示5s 、湿度显示5s
, i: U. o9 l0 m e {
C1 ]+ b7 s! t4 @7 H8 w/ i# U% I sdd=0;
" b- `8 s; G" d7 X3 u& R* {9 U+ c if(st==0)
# A8 E# A( l2 y" k {
, I" G9 T8 Y/ {& |& O st=1;
: J& ?5 C! y l# k3 c# R8 i. A }
. Z6 r8 }9 W; p* @- z( n else st=0;1 m9 U/ }* \. }! T2 O
}
: y) ?7 d( @' Z }- f. ]9 K6 o* n1 r
if (tmr1s >= 200) //1s 数据更新频率
( y& ?/ `+ w; T2 H/ B% J { f, q8 M( R& K' S
tmr1s = 0;
2 ^5 d2 F6 W/ N; T- a7 p flag1s = 1;
4 Z! T6 ?' S! e: M0 o" b }# p+ ]7 H ?+ C+ g& M/ f
1 v) {% t) ^) `
0 V/ I/ q3 o! k* J- y k) i! c
" b; E: M; o o4 U& w}0 d- l4 v$ \5 R$ |) s
+ {/ n5 H' H4 ^3 }' ]
3 X# |' i- p2 G% |5 l
下载:! f* `8 A; F8 W$ K7 }0 w7 C6 n
) k! T, Y, O. z" ` M6 i: p4 C2 q" I: n' q: j
|
|