|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码! T1 q" @) b9 H% O( A0 g
+ ]4 V- u1 @# h. I% d
" D: j; p {1 q1 f' |: V仿真原理图如下' w) W" v, O' D3 \7 J0 Y
' N/ f( S4 Z& h0 y" T% M
! X% I0 Y1 l7 H2 t- v按button1可以切换模式
+ D8 u" p7 @ `# A8 l模式0 只显示温度
4 o' l1 w- h- Q6 B* E" v模式1 只显示湿度& R" N. g& X# p0 Z4 L N! H
模式2 动态显示温度和湿度,每5s切换一次2 T7 d) X" `& O2 ?, ?+ y2 h' `
1 H" w+ g6 T' L7 O Q
5 I: P* y5 G6 L7 q% S# x实物如下
% ]3 a; R) n! y' ]* J' r温度显示& f: y6 X; y) Y& B. l7 E
+ n3 l2 Z6 ?7 b6 ^4 V湿度显示 小数
K7 {: u- A! C$ N# ]" X9 T
; A: e* G P2 e6 V) _. s: ~* _- z* i
& F8 d, N$ L7 {模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。 h8 C! P# X9 [/ V: E, R
, {7 O. ~/ } M单片机源程序如下: f A$ p( h3 ~2 ?
#include<reg51.h>
! o# _( U. w; _3 _$ x6 L
6 i, j3 M- m' A9 F7 v1 p' l6 t- X
% f+ X0 H* B/ m1 p5 v0 Pbit DHT_Start();
# W% y7 n2 G# ~; M$ t' Fbit DHT_ByteRead(unsigned char *dat);6 B$ ?* }9 t9 T w6 ^ A' _
void ConfigTimer0(unsigned int ms);) s. j8 d0 X, D$ `* C/ g
void Display_hum(unsigned char *num);5 ?2 X; Z9 d8 e7 t* J9 |( z, j6 Q
void Display_temp(unsigned char *num);2 d: W1 F( \/ p; r. I4 O3 J: I
5 F- l& M- F. B: w/ L8 C$ M6 K8 Z
4 f7 {$ e8 g7 P3 O2 [. S& r
7 r' B. X7 y( x/ N( }6 l
. \5 @9 x2 E7 I8 ^2 m6 B/ T) Vunsigned char T0RH = 0; //T0重载值的高字节
$ A- Z' `* V1 W- Z$ z2 X! funsigned char T0RL = 0; //T0重载值的低字节 ( n5 X F3 l7 G+ V( Y6 \8 g2 A
unsigned char str=88;5 ?, E" Q$ s9 F6 d5 ?
unsigned char DHT[5];
/ a3 S3 f. ]: b3 R
' {* d |, T$ C: l( l$ T* F4 S- y8 P9 Y6 g4 y( C
unsigned int tmr1s = 0;" V% H. r+ Y& D/ P4 o6 k5 Q
unsigned int tmr10ms = 0;; d4 N8 E& \% P" E" M9 U! A7 `3 Q
unsigned char st=0;
& ^* [' P: `% z. v, C+ B0 Uunsigned int sdd=0;2 [& Y; D9 r4 N
unsigned char td=0;3 _( N+ q( X+ A$ J2 Q
unsigned char mode=0;
' {1 P. }% X, X0 u: w" V1 K Y8 V9 t. r4 U- z2 P/ C3 ` q r4 k
7 E' ^, y N+ l4 ?) j
bit flag1s = 0;
9 W: N! r( l& [, n6 ]6 kbit flag10ms = 0;
5 i- s( j( L) j; Mint x;
- ]% Z) {7 u4 S5 b+ c$ _' C* q $ k7 U t5 j, Y" O( V/ d3 l T
sbit button1=P0^0;9 f: P9 M$ k; k+ T8 A# Y; a
sbit dot=P1^3; //数码管小数点
; o4 h; b/ t' }6 T
& |' p# K4 A8 B$ @. ~# r w j u0 D& } { W
. N; Q. o" ?7 z2 e
: H! ]- ?7 G, y: v3 J4 P5 r1 m
void delay(unsigned char x) //延时ms7 y/ y5 Z$ Z: u2 e/ f) |
{
! A5 W) P# r# g3 M unsigned char a,b,c;# x' K9 V1 l0 G' ~* u
for(c=x;c>0;c--)' _ z5 P* T: U3 Z6 J
{8 |. ]" g' L8 j
for(b=102;b>0;b--) f& {9 D7 C4 l3 `& w' ]- Z
for(a=3;a>0;a--);
h0 Z7 e( K0 {3 ^4 l d }' F1 T8 Y0 N+ P0 y0 o
}
8 `: ]# y+ R- g8 E- dvoid main()
0 @0 m9 Q# y& i2 _7 J- N{
7 U. |: y) V6 ?2 \$ f6 I# l; L4 u6 n/ p7 g7 F7 `, \& r
' R/ X& P/ g2 q
bit tmp;
- A6 ~4 ?* B% c& B; e8 o9 W9 i dot=0;# h6 f5 B9 e. p/ d$ ^
EA = 1; //开总中断, y& d' b' c/ o7 z3 m- r
ConfigTimer0(10); //T0定时10ms
! z( d- H2 {/ A5 z// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;
6 r2 U' ^" r& |) ], b2 `& l3 s DHT_Start();8 X u- T7 f5 _* r1 M, d
delay(5);
2 Y5 p$ v n! K z
" T( v/ ^2 t) ~9 F
! z4 |4 M- g8 n+ }7 s! k while (1)
: T7 t* S" k( c5 p" N) J+ U {& k$ m* l2 y: u3 `+ M6 K
) i. @" O- [# U3 L: i% u1 p
( l0 d2 E6 W' ?9 a8 p* N( k1 Q. t. d0 {, h2 L
; l5 z U2 }! ~ if(flag10ms) //数码管刷新频率. }8 K B/ E" Q8 D4 D
{
- E6 e8 M- b/ \6 M. D7 C$ C+ F$ _ if(st==0){( P3 S! N5 C; A9 ]9 X6 ?
Display_temp(&str);
3 F6 `. s/ i1 v flag10ms=0;* P+ a3 A) Y( z3 I( d! N
}/ \+ ?! _- ]* o4 e y6 o3 K% ~# X
else if(st==1)
3 e' i3 O2 ^5 W# P! _ {+ @; k6 L" v+ d
Display_hum(&str);
0 h; h* ]# B5 `5 P8 s8 I flag10ms=0;: a W' j6 m/ \8 N5 H
}
) J3 V4 t6 J. g/ e3 p$ f' l+ T) E# B3 j1 N# \3 Y1 c9 F1 ?
2 K" ^6 ?) O2 x
6 Y3 n( F: S& c! k0 d4 K 8 ?6 C$ v6 Z. P& k9 D' L
}
) ^0 V! d; F4 k; L" w/ Q( Q. C else if (flag1s) //每秒更新一次温度、湿度
5 ^4 @+ L' g7 c: g8 m% U {
% k9 o: o, D! d3 R+ g DHT_Start();
+ n y% Y6 ^# ` P4 C& ^. k# N tmp=DHT_ByteRead(&DHT);/ a, |+ B/ Z: a v2 i$ y
if(tmp==1)+ o; G& T9 X W
{
) q9 w! D8 l; A" j' C( K4 q
. ~* F. m: x8 _' M$ Q! q4 D
! l& q1 n1 }& _% S if(st==0)
% f0 U/ X7 V, j; M {
" v) g& _. a# t I str = DHT[2] ; //温度
* z$ W: V2 s- K2 s: I1 `7 R Display_temp(&str);
7 F5 F; x- L* Z/ h* _' @7 \% w flag1s =0; //标志位清零
: |" l5 ~( h( e$ { w' o6 O }: {, @: t K1 }3 ?: }
else if(st==1){6 k6 Z8 g! w2 E( H* N
* A. g9 Y: [7 e* ?: h6 E/ ~
- o! I n1 K- E" H% A str = DHT[0] ; //湿度4 H$ t4 I2 ?' Y7 W2 W2 d
Display_hum(&str); $ L v4 v# L' n3 J! W& f) e% I
flag1s =0; //标志位清零
; F5 @4 P5 _7 L8 @+ f; w& t }- s$ B/ m. a& F; ~8 c/ Q
$ K' d1 U- J- G6 {4 P1 f, K% P, r+ V+ ^
# G) q) g( r) P1 w 1 F) M7 ?( i+ P0 {4 I+ q
: E# s2 ^6 H, F) p$ n/ U3 T( I. |7 v5 q% x! U; R2 L7 L
}! M. V) C# g+ O, K6 i
}5 }- t4 d0 D1 [# n4 ^; r
if(button1==0)2 j. U2 Y: h" F* C2 c% v6 b
{
( J% q9 g7 ^! u9 r delay(2);
& l4 k5 D' P' V! g: Q9 D
4 |0 s% i V2 W/ w* N if(button1==0)! u1 o! o% L! V+ D" x
{; P+ |" A1 _$ W) M) z+ }7 s. n. o
: V7 C( a5 V/ s7 p; o [ mode++;
) n- w' ?9 I* I+ c6 P* S switch(mode), h9 ^- C7 o: e/ [' H1 m
{9 G: @+ G4 E0 k/ m3 ?! Q
case 0: st=0; break;
4 v7 I8 H! ~+ ^8 j6 |; j case 1: st=1; break;
& X& b/ u. r$ Y; H; ` case 2: td=1; break;
# L2 d8 P+ K# M; i/ m9 x7 I) q default: break;
) l0 T: y/ D3 ^2 U }
1 i# A8 c* A3 x- E5 M4 m if(mode>=3)
' y6 Q, P* B, W6 r" I {' H) ~6 A! e! r* b
td=0;: {/ W; D3 O/ K$ {3 {
mode=0;
) z) a4 y v5 I }
6 s$ h6 [7 R. w( }5 F, v( G while(button1==0): o& L# c% c/ U4 R! ?9 h
{
2 y3 \. o. N+ y6 b1 S; X" B }
* n/ h. P# C1 `: X* n* n$ E, s5 q v! J0 M! ^ V1 W
/ N8 |/ ]- T/ u9 z. X
7 V/ J1 z2 Q9 _, s4 ` n% [
1 \" `: ~! Q9 ]4 }9 j3 N( N
}* x8 N# k/ w5 J: c+ F9 g8 K
+ q( Z& i$ H3 Z2 }7 L- P# }/ c5 F# H$ z( [0 L
}
- b0 {% U( ~: [7 P6 F
* s9 A6 u P8 v( t$ l3 c7 ^ k
% a, E! Z+ z1 K; E) M9 h1 e7 g& T, M, [! N( Q9 r6 h; D
, P" c2 ~5 \0 t4 E3 g' F
6 M* U) `4 Q( X: w+ J: B* s( ~- ? F4 |! p4 D$ ]
}2 {' m7 ~7 z* q0 O* m: g
}
) m1 ~# z8 h5 A9 d" X: H/ G/ B4 i. l+ H) E; {6 |& Z( m
R" J, H$ L3 Z# \' ~! E& N& ^$ C0 p
0 L& U: Z0 [5 I1 j8 P4 n% r
5 @$ Q% d3 U& ~* Z, o3 o/* 配置并启动T0,ms-T0定时时间 */
4 m3 `- n5 ^, g* c3 r( _5 y0 _void ConfigTimer0(unsigned int ms)! M9 {5 C" Y H9 [3 F
{5 A: P5 v) K" ?6 F2 u
unsigned long tmp; //临时变量
4 V6 \9 u* d* u' k ? ) o% Q! C: N6 K) W9 i
tmp = 11059200 / 12; //定时器计数频率* |: f& H7 |( P6 \
tmp = (tmp * ms) / 1000; //计算所需的计数值
$ j P5 v1 [" f1 J2 m( b; c- T& e tmp = 65536 - tmp; //计算定时器重载值
. q) C9 S, c2 J/ ?# A tmp = tmp + 12; //补偿中断响应延时造成的误差9 C' \! d6 k |0 N
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节4 D7 B( c& y$ @4 K9 ?
T0RL = (unsigned char)tmp;
5 A- |! c9 Z( o: ^, o! v TMOD &= 0xF0; //清零T0的控制位: ~5 u8 c) |0 M3 ?7 A
TMOD |= 0x01; //配置T0为模式1
! ?& O' S- e- L* U7 X TH0 = T0RH; //加载T0重载值
% g' Q8 C! z4 h% r% ]: l- } TL0 = T0RL;
) T% J' V, x- T. M, Y; l/ ^ ET0 = 1; //使能T0中断* h* L. f6 N. m. w9 `- V$ b
TR0 = 1; //启动T0
5 T5 `% N4 r( K8 y; c}( z7 b% V0 \' O3 T) I; S
/* T0中断服务函数,完成1秒定时 */
( F- b& e- u& p# g( x" evoid InterruptTimer0() interrupt 1( O O% C3 Y3 {! N, ]5 ?/ O
{: t9 E! I% B! ?* R
) _9 h$ f- r4 a! t, r* f8 @3 O; y) P C
& C; F% ~+ k; D+ e T B7 ^ TH0 = T0RH; //重新加载重载值5 [5 a$ W$ N/ M+ _
TL0 = T0RL;$ t4 w& R1 V/ S! g6 { G# E% k! ~
tmr1s++;! | [( e3 ]- I0 A2 B0 T3 J
sdd++;; y1 A/ ?; J" C) t! r/ B
tmr10ms++;
5 Q0 [, X7 N5 v; F1 J+ Z5 U; { D
) k8 p$ Y5 d. ^5 |6 F5 F( ]) l if(tmr10ms>=1) // 数码管刷新频率
8 G1 b0 ?9 x; ?( ^( M {
- n Z1 R4 [4 t- P- A' [ tmr10ms=0;. o9 e5 b% K4 `
flag10ms = 1;
- q+ t3 y7 H8 t, X4 S/ b }
4 G: `2 s/ J# ` if(td==1); F4 |; K4 @: L
{3 r- U/ @+ B6 R# C) {7 I
if(sdd>=500) //温度显示5s 、湿度显示5s
: j9 G, a F: E: F! W {
5 z$ w3 H/ F2 }4 l& w sdd=0;
5 @! Z* X, O5 D4 i; H6 L1 X if(st==0)
' B |" B2 J+ Y {/ N# l% [$ d2 j+ s8 S J
st=1;
1 m S: [- M3 O3 y. P }+ q$ m5 {. `. {2 o* I F& @- J
else st=0;. F, \, G) B) j, O0 _
}, r0 I) Q% q# f' f; V6 _
}& G% ?3 z" q: e/ R3 r8 X0 p2 r
if (tmr1s >= 200) //1s 数据更新频率
. ^7 `) i- L, [1 \3 J2 `3 @ {$ t7 ]+ W, c$ m. a
tmr1s = 0;
6 @5 V- }1 ?$ p; e6 [* m flag1s = 1;
) {8 V7 P7 r& l }
- G, j8 Q0 c U a$ r) _' i& G9 D
6 i, K* `& u( y, u+ `& {* \3 S
$ L% p" U; D0 ]8 W0 t ; l0 Q2 [4 t' C- K0 L
}7 V1 G" s0 @/ J( S
2 j: ]) X, p: c; ^. P z
, E# R7 Z/ }% c! O5 n5 }( h, y1 q下载:/ h' X; v* ]( q$ E5 d) w
7 F4 J( u( g }7 t9 S* [+ X
) |, t9 b ~& }* p/ _ |
|