|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码5 U5 j7 |4 y& J# P
]" F5 f7 m- F4 a" @
1 y9 }! i. X& z- m8 x j p* f仿真原理图如下
: t n3 W% d; G) A: ] , B2 o0 ?* r4 m5 X8 [: |3 J: J: R. \( ]
$ `4 l( z0 U) K7 c1 `: m按button1可以切换模式/ d$ f" y/ ]2 Q# J1 b! C4 i
模式0 只显示温度5 y o( f6 O: c' R) r$ G- h3 V2 p
模式1 只显示湿度5 |4 ^' c! \' M
模式2 动态显示温度和湿度,每5s切换一次
+ j5 |; q$ l$ `+ l
& C6 A! w# T6 U% k8 O2 N. w8 G+ I& q" i5 M: s
实物如下
% R3 F5 _* O- _温度显示4 X0 b6 }4 F: N5 S" N
/ j; O* ~1 z+ A q& }* ]
湿度显示 小数4 H1 I; r: G7 \/ |& R4 t5 k
- ^: T3 r! `1 N5 [# f
+ w1 i7 F' m/ p3 m+ w3 m
# n0 w9 M: R1 M7 e0 v模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。, D) d* o/ `8 k o9 H- U
* t0 s& L5 f" s/ A/ T6 T单片机源程序如下:* Y. }- O: h4 l, }3 ~
#include<reg51.h>; P! \- `0 t" B
3 t% M0 E( K! p5 R
3 J8 g, @) Z, Y) R2 {5 C" Kbit DHT_Start();, B0 w$ m. A/ B8 @& @
bit DHT_ByteRead(unsigned char *dat);
( C! V' m! C/ ^- Evoid ConfigTimer0(unsigned int ms);9 r! k- p/ J2 y! D4 P
void Display_hum(unsigned char *num);
# O- p) U+ K0 |/ U, O- L. @void Display_temp(unsigned char *num);
& }+ e# O4 S1 L3 D6 Q! ~2 u v. I$ l2 R9 n; \9 K4 u: q
$ X4 n6 S% |+ R, F9 k) U- x( N
* R# s% |1 ]9 u4 q! |6 o( ?/ K& |" }
unsigned char T0RH = 0; //T0重载值的高字节# u4 b" O5 i# \! `: |. I. @% p9 D
unsigned char T0RL = 0; //T0重载值的低字节
' O7 ]0 a! l0 x$ W, ?unsigned char str=88;
. T) n( H8 ^1 Vunsigned char DHT[5];# E6 H# _6 [9 g% B, U* L
# {0 U% j, s- @; ^/ y
2 F" k" x$ `# k) X% c+ Q7 B% \
unsigned int tmr1s = 0;4 {* s. n/ E2 K# n4 l5 L7 l3 M
unsigned int tmr10ms = 0;2 g# {* L! Z& T( f% H/ _' i
unsigned char st=0;
- T2 f! K2 l; I% A* b. k) Bunsigned int sdd=0;& ?! s2 h( _' Y6 X
unsigned char td=0;+ A: ~' |3 b& [* u7 b
unsigned char mode=0;
% {1 m& @! [# l& f5 a9 W; o6 A! ]/ m0 C, J, }) w
( h: ^- q5 ?& O: M7 Obit flag1s = 0;! {/ O" S5 x; K
bit flag10ms = 0;
' p$ b% {0 z6 T- vint x;; r" e9 |5 ~% O7 W# S( |* i% F9 K
% v# S6 |3 ]7 T# ] }6 R* V' q/ Jsbit button1=P0^0;
, R' I9 K8 N2 |, k! zsbit dot=P1^3; //数码管小数点* }# w+ K7 }4 T
! X" o9 p/ ~5 t/ j4 m! L: d2 p5 L* G* u! t. p
' @' N7 n9 J, O, D5 P: m0 B- f0 C6 ^" ?
2 J- r6 K9 n2 Avoid delay(unsigned char x) //延时ms) n3 i t& b, Y
{, F' Z. O3 U- i2 J
unsigned char a,b,c;
( ~" u) [/ a5 A" U$ c; @+ B for(c=x;c>0;c--)
4 _, D L! v r( R9 o {
# g7 M. B& j' w( ]9 S$ w for(b=102;b>0;b--)4 d3 N. o* @, \5 y
for(a=3;a>0;a--);
( _) v; `) S h }9 c l; ~" t7 X5 Y( v
}
# T4 y% {0 i, c) Y5 E1 wvoid main() 9 C: L6 K7 O; A3 X q; n5 v
{ - j: d9 }! v5 a$ u. U
: l f9 G' r- t9 `( v% u3 o4 O6 G3 D7 u# [8 P/ Z) ?' @4 v
bit tmp;
" t. M% [, e. @# c; |( b dot=0;1 z% V$ l! S) B8 o& H
EA = 1; //开总中断
- B7 q% b# @) y2 Z( T. C6 H ConfigTimer0(10); //T0定时10ms7 z( A$ _! \' h# h* Y9 n: J6 n
// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;4 k, @, ^, ~5 |" O
DHT_Start();
( n) N! @! l: ?. K( g3 m' d delay(5);
# I+ \& `( C' Q& M% A: X/ t6 e
t6 [! R* {# T) ?6 k" J3 K( c: ~
while (1)5 t( [! o$ z. N
{3 u; v- ]! i8 ]) b* `7 H
+ `$ t2 o/ F! q- A* Y- z" A1 B6 ]7 }. N5 W6 ` q) I" l
& x( d7 N% P& L' M8 R
% w3 S$ P* N) l' m# t- z if(flag10ms) //数码管刷新频率
( c) s) r1 ]4 s* v6 l7 Q7 u {% j9 g X$ N3 H T4 q
if(st==0){
% Z7 x8 `: K7 @; f Display_temp(&str);- ~7 O5 L7 T" I
flag10ms=0;' L% V8 ~4 v6 Y: T
}
6 R8 V7 O [( Z! `) \2 V1 a5 L else if(st==1)
4 {9 w7 Q& D8 R8 ?$ ]4 f S3 l {
9 }' y7 c$ l8 d7 M. [ Display_hum(&str);
% v; x8 f. C: L( T flag10ms=0;# B I, ~2 B" t8 k) Y4 V/ ~( T; C
}1 f0 A1 n# J* U& l
2 i$ ?6 \+ Q* G% y3 E/ V0 e2 [, |
6 U, Z: }6 N$ l! g! C* C
' b2 H. b# M. G( S% p* ~9 U . s) C9 d8 z& p, E
}: ]2 A- T2 L9 A" x
else if (flag1s) //每秒更新一次温度、湿度
( d" O1 [6 j% S# Q {$ j X* I; \/ r3 S% o
DHT_Start();
+ U. _2 x8 T* E% E tmp=DHT_ByteRead(&DHT);/ I7 s7 B- i4 t' t2 x9 n
if(tmp==1)7 X$ X7 \, a* e. o
{
+ v* o& Z) S1 s! ~. O" V/ z/ j
: ~+ p; E/ B) E1 m- p7 ?; m( J4 }9 j* m
if(st==0)0 V S$ z* k, P- k& E# Y
{
, S+ [4 O; F9 { str = DHT[2] ; //温度, b& L [' }. R. l- w" X
Display_temp(&str);
0 U; V+ j+ i. ?. E. K, h flag1s =0; //标志位清零
7 U) O$ v; v! S C5 n }
2 d/ i' r+ U) a6 ~ else if(st==1){
% @6 w) m, E& G1 L
% d1 {! M! f2 E, k* \% E8 {
' s, @* V1 G: z. o2 i) ? str = DHT[0] ; //湿度
* X( w/ `$ X6 \% x& c+ ~ Display_hum(&str); ( l* D6 \3 F8 D# C1 Y
flag1s =0; //标志位清零) i5 C7 ^) V/ Y! e8 r8 V
}
$ w& j: f/ b1 H% j5 Y; T7 E* S) w/ U7 g; T- O1 E6 i# U
) w9 @) W3 Z8 S0 B \, b
1 z3 w* ~# k3 f8 D
/ b' C% c( B; R. ]9 ^: O
/ {1 a% k" [9 T& w" a( m: R
}7 N5 J' a# v/ d2 R
}
4 |( j) [$ x! e, t8 p if(button1==0)- D1 B* L& N/ z& y
{4 C9 {# j/ d& v7 `9 m" }
delay(2);7 q% F' ^- C8 j1 G9 p
9 R% h8 [: E0 \" e* Y0 c8 n if(button1==0)5 R6 ]/ j# X9 v1 m+ L* V
{& ?$ {: k, S% u& ~+ Q( O
, w, ^' U$ b, G mode++;
( N1 P6 I+ D/ f8 g switch(mode)4 F! w* o. y2 |1 Z: f( |
{
$ l) }9 }& j& G4 r case 0: st=0; break;
# _% l" Q3 H& } L& T# a case 1: st=1; break;
# L) U4 v1 j8 D case 2: td=1; break;! C" O/ n5 ~/ E; [3 y0 V
default: break;
! T( {1 q# i/ m7 d9 o }- o* O3 ?- @" g3 `0 |3 B
if(mode>=3)+ A) a" x1 u& x2 \1 {" f% i2 r
{
+ w, X) q+ {/ {+ q6 E9 I0 b0 f td=0;
! G% I# U- H; E. t, X' l mode=0;$ _3 \) c4 f1 n( N
}
( |0 [& \5 _& O0 ~ while(button1==0)/ G; @) ?. }! K& @/ i
{
& y3 M6 r3 d1 y( \ }
7 E+ @% {! T+ Q- g( `1 z
6 e- s% r3 r$ e) V: ^; P1 z
. R) @$ l' _$ v6 a( d! p9 t* ^4 B
$ l" x. N! S6 ~
}2 L. n/ I4 N& F3 d) d3 A y" n7 M5 _
6 r& n- p/ J9 [% e
- s4 L1 {1 j0 y) S% T }. D. D; w. X( g N" M1 w& K0 l: f
; K& n' }1 i0 a+ ~8 ]) ?
$ d( I( t; j5 `) \
) {! L" \* ]9 _& T2 F3 d+ d! u' N7 t: M
5 ^# i( h( ^' Z# M5 U4 }+ t
C& t6 w6 f5 J6 l% t- l }
, i7 r; N9 X- Q( M4 d% C}* T4 p9 m* [7 m i: S
: R1 Z. \# `( | c
$ G2 W" T; E& ^% }- R) q. [% L2 T8 Q
1 y+ a3 h# _& F7 U. o* m2 _3 L: B& J/* 配置并启动T0,ms-T0定时时间 */
/ B1 ]! }4 Y$ [9 m6 l4 t4 r9 a `void ConfigTimer0(unsigned int ms)
* _, B5 m7 I' Q0 s( \3 E* v{6 q- S3 `2 u- f6 y& ~3 o: q$ C
unsigned long tmp; //临时变量% P: ^/ h' ?9 F6 i
9 R9 D; ^ k3 o
tmp = 11059200 / 12; //定时器计数频率' {7 Z; ?2 y5 [8 _" h
tmp = (tmp * ms) / 1000; //计算所需的计数值
( {9 I; m d# M1 s* v! M! y. b4 W tmp = 65536 - tmp; //计算定时器重载值
9 @7 I; u8 i' W$ [- Z! {. Y tmp = tmp + 12; //补偿中断响应延时造成的误差
" i; E7 j( P5 |! t ~" f T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节: `' h$ v* m% {( \% k1 i4 z: Z
T0RL = (unsigned char)tmp;. @" X P; B( x1 Y
TMOD &= 0xF0; //清零T0的控制位! m" [: \ q# n, [' p. a- }
TMOD |= 0x01; //配置T0为模式1- H& d* e8 Y( I% z$ K- }
TH0 = T0RH; //加载T0重载值, V1 o3 @: l. Y; Y5 o
TL0 = T0RL;- @( p2 z8 U( ~! y$ I1 c
ET0 = 1; //使能T0中断
( H1 Q& u( R* Q" Y/ } h9 d TR0 = 1; //启动T0
. n Y) W% U) D+ G, r}
0 V4 v) b; U1 y* F9 ?/* T0中断服务函数,完成1秒定时 */9 z$ H9 @8 @- o1 h1 e4 o U
void InterruptTimer0() interrupt 1+ }8 f8 l S. y1 {, u: g
{
* f5 [9 S; n- }! Z, W) q0 }6 G# l$ \3 ^
+ q% [# P2 ^# l: D1 f6 i$ E& ~
TH0 = T0RH; //重新加载重载值
! f* [+ k7 P. u' X TL0 = T0RL;
2 B+ C' `( f9 |; @5 G tmr1s++;. L" z8 ?* d. ]+ J- J; w# G0 r
sdd++;
2 i0 u1 t7 g8 P, D8 B4 V( v tmr10ms++;
3 p7 E/ p! w r4 r
- {1 `4 O3 Z+ |8 u4 H- T/ ^3 m3 W" _, u" s4 [2 Z; g
if(tmr10ms>=1) // 数码管刷新频率
4 ]3 Y4 |. I1 G( x {
) Y5 n4 h( J0 L. O2 Y! q tmr10ms=0;4 I, {/ f; N+ D$ @0 i1 q
flag10ms = 1;8 h2 ~6 W- ], _6 W7 c% N& G5 `4 N
}
( q6 C! E" X/ w( [ t8 V2 b3 q* j if(td==1)4 {- ?, ^5 \$ {' V/ y
{2 f' e- W1 M/ D, n% q5 s
if(sdd>=500) //温度显示5s 、湿度显示5s( S/ B& M) w) z
{! S c/ G( w2 s& Y! n: e. m
sdd=0;% L7 @' J' W: I2 ?8 `9 N
if(st==0)
7 u& D2 L) l) F n8 a4 `$ X {
2 }2 R! ~- w2 w8 f( o/ F* l! n st=1;
4 E" ~5 a3 W9 F# v0 N" \& z+ A; g }: w# s9 D6 a* @3 ]5 {
else st=0;
* R+ ?9 y Y3 S% S8 | }: }9 p H7 ^* {: W4 S6 |7 k! w
}
) H) S/ v9 H, X5 e if (tmr1s >= 200) //1s 数据更新频率0 S& I$ F9 A% {( @5 s& q* F+ s4 C
{0 b! R9 C, D$ `5 R# b( ~. |
tmr1s = 0;; d2 Y0 O6 m' [ v
flag1s = 1;
% ]( J9 L+ B4 ]* v) a: E. X }# g8 L0 l& Y. _* {& D& D" \+ v4 {0 V5 M
/ C" x( L' N6 T1 ]0 g( C
: u$ k' E1 h$ @, d3 D1 A
! A" X0 h& u' l7 w0 @6 ^
}
& K [( N1 H, t
/ v$ p$ ` t/ f0 A8 S/ ~& r. i) o
" y* Y7 O# i6 y& Z& g+ E0 W下载:# j: B8 b" t$ D4 J9 w, R
0 G/ o% s. l* q/ x
2 p$ S! S7 f1 Y- y8 j' m |
|