|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码1 S! L i4 `$ }; w
- Y; k9 r* L; W U( ~. H9 f# h5 l/ b$ U% L; z
仿真原理图如下
1 @ ^6 {, m3 ^6 L; C . _/ J' v8 X8 r% v
9 |! [4 v" g5 m0 }+ Z' I按button1可以切换模式
9 y, r- j: S* k8 d' p, Z模式0 只显示温度0 O8 v+ P; J4 l7 e, C
模式1 只显示湿度8 U& H- B8 |7 Y4 `8 T; d% g
模式2 动态显示温度和湿度,每5s切换一次
1 w1 [6 I& m+ f) x9 @# p& a7 }9 n8 f7 v7 }0 g& c
7 Q$ B6 d, U! d7 D. e' s7 i; l7 d
实物如下+ o; m( D; B0 q9 b( S$ @
温度显示
* M4 K. P2 f% F- E I I4 Q8 T ( s2 d, D: K, W1 c% H2 n0 @! @# {
湿度显示 小数
% l( _* f u( ~: |
% a: L @( i* |9 w. s6 A% k( a0 R: b! \; e) }6 h# @9 t7 {* p# M
! g- a' `5 p) h3 s3 X模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。
; K' b. c$ v) {
. l: N- J- ^/ \! t" q3 _单片机源程序如下:$ \3 g! T# v3 r: L+ |" Z a y
#include<reg51.h>. W: M: D# ^3 V7 f3 Z! i- n/ {
. p& F) ]. h$ p
1 `) Y, @' ]5 h& C4 I& k# @ e
bit DHT_Start();
b' N; X$ F* k4 hbit DHT_ByteRead(unsigned char *dat);
/ Q! o* C' V. E, [' ivoid ConfigTimer0(unsigned int ms);# G) U/ O8 `- U+ A4 e5 F. L' R6 d
void Display_hum(unsigned char *num);
3 N& f* u& v' L* R+ H' R8 Pvoid Display_temp(unsigned char *num);
: ?2 ]0 j2 s/ C+ J" m' N* T
! f2 a6 N- P! V. g& Y% q+ w0 \: g" h
% b# d+ [4 h& o7 G- Y5 T( L- s E2 U
f. M0 t" w5 M5 j! hunsigned char T0RH = 0; //T0重载值的高字节5 {4 b( Y4 B3 _- H9 n, I
unsigned char T0RL = 0; //T0重载值的低字节
6 b( [( R0 @, E9 h2 [unsigned char str=88;
* i, g# I" x' G5 d+ c; Munsigned char DHT[5];
; r- \" q9 `1 W
. Z4 F( j+ ]( I5 o5 u* c9 _2 i8 L
* a5 P; d4 k1 ~# \, v+ Dunsigned int tmr1s = 0;4 T: F# L+ d4 b
unsigned int tmr10ms = 0;
9 h6 @2 H" f2 ]1 p |! @ ]unsigned char st=0;' ?9 o( `. p) {# n0 F
unsigned int sdd=0;
3 y( M6 \( _2 R2 ~! tunsigned char td=0;$ o6 f9 w+ c% g3 F/ O. j/ m+ x
unsigned char mode=0;
; l# f" \; f4 f" r$ C( ]; P0 D& g. D. k- w9 i, ~* F8 a* Y
, |# d4 e# Y2 v I8 | Lbit flag1s = 0;2 y6 h$ n% @4 T) @7 q0 u
bit flag10ms = 0; * ?. y) r; k2 w1 K& S) n
int x;
& a% U, K, z0 n- N. l' `2 ^
8 J/ {/ n5 `* u' V! ~. q/ Gsbit button1=P0^0;5 G7 i) A" u# P- w
sbit dot=P1^3; //数码管小数点9 f8 k$ c9 K, I+ n6 H' Z
7 M) W+ Q5 T( b: D) L' t' {3 ^( P) V3 k! Y
0 G. y. s: j: J, K3 x: t. e5 }
1 [3 Q2 C' P- ]* s
void delay(unsigned char x) //延时ms
) Q6 t" I% V/ B4 q# Z( o" l{
( ^( h4 t: v* Q/ m7 y1 f unsigned char a,b,c;3 H7 [# n$ ] }% O' ~4 ^
for(c=x;c>0;c--)
/ n7 D! Y2 J/ F9 w$ u2 T$ B0 f {
; b7 i- ~2 O4 D1 z r. O; F for(b=102;b>0;b--)
8 V5 S X* H* P& r for(a=3;a>0;a--);& A! X7 D2 y, z# S- p
}
$ k* ^1 {7 C7 y}
5 {9 s* V2 H% K* B2 uvoid main()
* E: A2 L- c M3 Y; y8 v0 j! g{ 3 [/ F' C6 q" Z% K" Y7 ~" ~
. G7 S, ~: X! b! f6 S
! `# I* i/ W2 q* D4 |& @4 K- { bit tmp;7 `" L# C2 K4 W; b" ]3 ^
dot=0;% X+ ~+ v6 h. _" r& F' r
EA = 1; //开总中断: B4 o( ?) E) W/ o3 d* u2 J
ConfigTimer0(10); //T0定时10ms& `$ v3 y" p5 l% S# W2 |# ]
// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;. x; ?* z. ^- K, g7 {
DHT_Start();
0 g% c" a8 W0 G& Y M8 J/ U: ^, e delay(5);
. d0 X" i9 @1 W: Y/ { ?9 C: y0 Y; s8 N2 E2 B. A% I
- t }8 I& b" J5 t
while (1), s" _8 ]- B+ O- q( Z5 P
{+ Z+ A3 V; @! R4 ]
( Z! a0 m9 M+ G* ^! b* P. s) F: ~
8 F/ _7 k9 H, h" W6 W
: \ E! e* n! y. f1 u6 y8 l! _& ?1 o1 r
if(flag10ms) //数码管刷新频率3 \' z, d: ]" { J# a# T
{
. J7 h w; I2 [( C' _$ T4 r% k if(st==0){
! K* O) k9 g* W5 e; g) V5 q5 W Display_temp(&str);4 N; W5 ?4 d1 _- n
flag10ms=0;* Q) ^( B8 t8 |( h: I5 O
}9 Y/ p. n7 L2 j7 }
else if(st==1), w# b4 t: z8 m- s$ p
{
3 w& {- v5 c8 v7 J3 H `% \: D Display_hum(&str);
0 g3 Y7 M4 B7 g' w8 ?! V' A) u/ V flag10ms=0;4 v, ^/ N$ n8 E% ~" m) l% P. T
}4 l' I- H5 T# H- D9 g6 Y E
; ^2 B9 l) f' A% @6 K, S$ \3 _0 V& `: Y0 V6 a' U1 J
9 n! T6 [: T6 m6 R% Z2 Q) p
& H9 _6 U. S% x r7 w }4 I1 U d9 z. L- K
else if (flag1s) //每秒更新一次温度、湿度0 i. | \8 y) R6 |7 h4 J3 |) F9 N
{* j& d$ c; @% t, \
DHT_Start();! _' k2 |, Z) N; {( O" Z- O. J
tmp=DHT_ByteRead(&DHT);
* q4 j* A1 e! u! p if(tmp==1) E" H: f% N* ~+ p5 b) t( E4 O1 N5 S
{
4 O( R' Z; r' u% t
6 [" h) w4 Q8 J O2 T+ z: K
9 p9 w4 ~9 }5 x7 W, | if(st==0)
4 L+ Y: A6 m2 F- N {% e0 s/ W/ }% _" K. z# Z6 E. j
str = DHT[2] ; //温度
6 n' m5 ]% T. S& r6 L% B Display_temp(&str);
0 @; F9 z) d8 u" ~& E. Z5 X flag1s =0; //标志位清零. |* |- M* G; z; t% D5 Z: r( N
}) g4 g8 m2 L1 Z( M/ |6 ?! _% m
else if(st==1){& @; L/ V8 f0 `: C/ a1 s* U
, k& \( f0 J/ {) O; n7 U: ^& e1 |, W+ u
str = DHT[0] ; //湿度
1 \5 y! z/ c: n5 a. H( H Display_hum(&str);
1 B! o3 Q, L( {4 X0 y6 ]1 q3 l! T flag1s =0; //标志位清零4 q+ m* _1 V4 j/ ^
}
7 x" S" h& s4 ^% S4 @# e' q- g
1 \; a( n' @( v6 x% N* N7 O6 `0 ~* \" x$ Z3 e- X! z
9 a- p/ Y0 R5 C5 c2 W
; p2 i+ ?2 ]: G1 V, L( @! I
" A# w7 ?+ `: N' n6 p }
, \& [2 k6 l( }( \2 X" O }
' u! o; \' M# E* V( E, g if(button1==0)
' b9 \ w! O. b2 j9 _5 S1 b9 `" J. U) j {/ w( e& P$ F8 P# x1 v! f, P, d0 @# b
delay(2);
( _5 N' j6 @" w
. p. x! F$ w! V* E4 l) F if(button1==0), A. m1 ]( q0 Z; q2 }$ f( s1 H* d4 W
{
4 ^* q1 e! g' N: E# g3 {- b 2 b' {( q$ u p' Z
mode++;5 Q4 g& L4 O E" n" D
switch(mode)% I& a- D" _( U; }: P$ P; S5 X
{
1 I. M" N3 X! e- {& R* R0 H @ case 0: st=0; break;
0 D8 i9 X0 @, r. X case 1: st=1; break;
$ O. a1 w# m1 z1 W case 2: td=1; break;# K5 \2 B9 R, v* g' i0 a
default: break;( }# s5 m1 y1 ?$ S" ^
}3 M& n L6 j* O
if(mode>=3): V( f' C8 X1 }7 K/ {
{
# s6 I; d$ f4 D) j0 E2 B td=0;+ T9 [% q" Z b9 ~! y
mode=0;
( X! E' l2 q$ m/ J5 z6 f5 b }
* f; @/ U* y' {! d while(button1==0), S& F! y- e5 E3 ? ]/ P- W
{: V, H8 }) y; M4 q& f
}8 L8 B7 M5 e/ }- e. K$ B
0 A: _! G" U9 J3 q
1 w5 }7 d0 l! u5 H* g4 L! C6 _3 Y, E
6 ]9 G/ A- W) g- ]8 o1 i. Z- {( o" L6 p/ s9 d9 n/ J
}
2 S4 f7 O5 D T) l5 e8 Z# G
, Q- ~ R ~/ l3 N0 z% G/ m" w
5 Y1 ^: @1 C+ b2 W" w# s S }
3 T6 [5 v$ V" B9 `$ T& v) A' E
. d9 |: R2 a1 Q3 M
% p4 S3 y/ B- k! o5 G+ \6 c! P" I8 V
! Q) S/ v* u% j2 m1 |8 s
1 [5 p: J8 Z# {( _3 o
! y5 F3 |7 l9 n5 Z2 D" f
}0 I/ @' v8 @+ u$ B0 ~
}- T- [3 C7 @, ?; G
/ [; Z% J: g0 Q( F0 ], c/ z# O
! ]% m+ _. N( M; q, ~- [, h( J1 f" F1 N5 ]% e3 v
5 H9 j/ `7 G- c- X7 [6 P; i/* 配置并启动T0,ms-T0定时时间 */6 k% f4 D4 K0 t2 p1 y9 G b+ D
void ConfigTimer0(unsigned int ms)9 S$ H5 p# }9 T* N/ Z
{
1 I: [, Z0 U: t7 C- a( A( m unsigned long tmp; //临时变量
' p5 ~* U" z3 Q" Z3 o
* n: d! l/ T& R$ F; ^6 t. g tmp = 11059200 / 12; //定时器计数频率
3 J6 c. e: m) B+ B tmp = (tmp * ms) / 1000; //计算所需的计数值
' t1 k3 b, c, c; ~ tmp = 65536 - tmp; //计算定时器重载值
7 M# n9 S( F" t% l" b- Q% V tmp = tmp + 12; //补偿中断响应延时造成的误差
1 q4 N5 e7 k6 j% d T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节2 b) [4 Q1 H6 X2 I- c' ^! ^
T0RL = (unsigned char)tmp;& k; J/ I; @" T+ o% G/ y# t
TMOD &= 0xF0; //清零T0的控制位
" l/ X/ Z* z4 y, o6 w, w Z TMOD |= 0x01; //配置T0为模式1 e4 E2 c6 Z9 I+ N* w
TH0 = T0RH; //加载T0重载值$ z' V, B& @4 z# Z( G
TL0 = T0RL;
. u! g- O) j; }$ E+ A& t O) F- `1 M ET0 = 1; //使能T0中断+ o) `4 J) L) F
TR0 = 1; //启动T0
2 l& A! L# T, Z; A; N( P$ W}
! [' N$ V* z0 `+ J- X4 u& a/* T0中断服务函数,完成1秒定时 */4 g0 q0 p' G7 d5 x9 h% u8 v5 {
void InterruptTimer0() interrupt 1
4 b0 X% e( a6 {' j9 x{. H4 R6 V4 `) i' F* r0 B* ?' f
3 O' R0 j+ R% G" m) T/ ]* w
5 N* z: Z7 G: R( J8 D. g6 A/ D TH0 = T0RH; //重新加载重载值/ P- E9 w( Z* C! T) A
TL0 = T0RL;
p, ^# t: M2 l( ]5 @ tmr1s++;
5 {$ E" y7 y: P {: o+ d. x sdd++;
% H& y' Q% l, Q0 h5 i' B- s tmr10ms++;. h: T9 s, ~0 W# f+ H5 M
3 \3 P" I( E$ H K* L4 v1 c* l$ I
if(tmr10ms>=1) // 数码管刷新频率9 \" b% [ U1 A V& S+ a
{! F6 u9 ^, o2 W% e' D
tmr10ms=0;
! N1 k2 o8 i; ~$ t7 i$ A flag10ms = 1;) N+ C- }" ?% J7 g
}$ A. X4 Y( e/ f w
if(td==1)- a( d0 t# E3 Z- { \
{' v6 e% F% \' }0 P
if(sdd>=500) //温度显示5s 、湿度显示5s
- D! Q: t" f+ k# }8 \% d `% Q3 [ {
$ Z% v- |" \. M5 @* {& H# C# {' j | sdd=0;5 H& u* G* h Y6 X+ |( l Z8 F
if(st==0); E( k; x) l4 n* e- w& }
{) K, I3 ^) R- l- r0 h3 a
st=1;( H0 H: K* s1 u4 Y
}
. ^5 F0 {1 b+ ]1 u3 k6 _ else st=0;1 U/ D: Q3 n+ ~( _1 u# \8 m
}) q; K9 v: X+ A* z/ D, T0 b u
}& i( S+ q& m+ q0 T
if (tmr1s >= 200) //1s 数据更新频率
0 f9 L. `6 `8 N8 b {# z' H! x7 m1 X" K3 j
tmr1s = 0;
% ~) u# F0 c. U5 T; `" Q/ W) u flag1s = 1;
5 C( z6 ~" d2 { }% f' v5 m E& V0 ]/ a
; g. z+ R$ q+ k5 d, j. ]
" t5 r, v& _; _- j. ] 1 V" s$ Q, ?4 s
}* \, h A4 a4 s9 Y
, Y, R& Q0 h& O2 E- \$ j: F7 y( J+ n9 M4 E1 P7 f5 @9 }
下载:
& ]+ p& n h, k% L* [7 o9 ?, G8 U$ h
, k8 T, q& R' u. S0 d' `- S) w3 c( D, ~" q6 h; d9 U5 g/ W% Q
|
|