EDA365电子论坛网
标题:
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码
[打印本页]
作者:
wu68aq
时间:
2019-1-22 13:24
标题:
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码
基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码
+ m8 X& ?- I2 }* R$ P. f' F g
9 S9 \4 ~+ | |
* v3 g! D4 x, g! E9 [
仿真原理图如下
! g/ X4 Q$ ]: J) E F/ z
; |0 f7 ?" m3 K) {3 I# m- s
) V& u% L7 ~ [; K1 {5 b
按button1可以切换模式
; c" `! I; S3 ^$ ]1 C4 ^
模式0 只显示温度
- S1 Y& @: ~4 v
模式1 只显示湿度
1 i6 t$ O. t1 r8 `1 u
模式2 动态显示温度和湿度,每5s切换一次
; X# F% y# L# j, J
3 R4 n; D' H! y
, D+ l3 c( E, g1 z! |
实物如下
5 x0 j! s2 ]0 [. n6 q
温度显示
. I" ^: I- `6 H" c$ r2 P6 `
) ~1 C9 A4 H: q) Z. Q. |) w
湿度显示 小数
$ G g2 p4 ?; T2 B2 x
; K x; n0 C& N, l) `8 o
6 ^, G: r$ O. j
& E7 J. z8 I8 ` H& i, s& O
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。
5 O0 H" n6 }7 t, ], s* O- n
4 p1 ~- L# j: n. z# u9 z
单片机源程序如下:
+ P1 G! c5 w8 e( L# Y' h& Z+ l
#include<reg51.h>
3 a# F" j. |, r+ t1 b- V3 G
9 [# `, d: r2 Z5 @
! F) d7 `. _1 s/ y5 a
bit DHT_Start();
2 }" b+ Y; C! ~) ^/ u) X. h- x
bit DHT_ByteRead(unsigned char *dat);
2 k! u" _1 ?( q+ E# S
void ConfigTimer0(unsigned int ms);
( R# p0 q/ K; v5 X; _$ C: h* E! h2 Z
void Display_hum(unsigned char *num);
* f& x/ [! D2 _
void Display_temp(unsigned char *num);
) c) s- U) }' j% n$ V$ k
; V" t! L) `4 b5 a6 Q
3 m+ J+ e+ y; |& Z3 b g5 s
6 Y+ A! ?3 E* S. P) ?( S% l3 k7 t9 L
, v$ q: N# x1 }: M" s
unsigned char T0RH = 0; //T0重载值的高字节
5 D& X5 s; G9 B4 M o
unsigned char T0RL = 0; //T0重载值的低字节
: \' e* f: ?4 A
unsigned char str=88;
, u* Y7 ]5 G/ }' R7 `* o1 N
unsigned char DHT[5];
" w; y1 M7 U+ q3 `+ M( n, c
5 F3 O3 m5 p% f. U8 L6 s1 h
& P1 x1 [ O: U/ I; o
unsigned int tmr1s = 0;
- B/ A, p1 M3 G0 S1 `
unsigned int tmr10ms = 0;
3 b$ f a% i5 j- Y; ]1 O
unsigned char st=0;
2 r5 g) N7 |4 A; b
unsigned int sdd=0;
) J2 M6 ]. ?; e3 U3 d+ X
unsigned char td=0;
5 m9 U8 v% P& i$ Q' d! S# o
unsigned char mode=0;
9 N" h: V+ t% |4 A2 R
/ ?, A \5 l8 ~ N: H
, f" R. F' o- W4 X
bit flag1s = 0;
/ {6 K$ a6 {- ? z
bit flag10ms = 0;
6 D& ?/ {6 G- N3 ?( o8 f4 A
int x;
! V! ^8 ?( j, G2 h" {) U
5 W2 @+ f9 J! K! }
sbit button1=P0^0;
1 H7 W; G$ }! f+ R' o% t
sbit dot=P1^3; //数码管小数点
$ Z N* u" S/ ]7 a; w5 A# [
3 N3 v. p9 _1 h( I' t: Y4 O
. K H5 \, Q7 V
} s1 f/ D8 R" G7 ]
+ Q% T* e% L" @- {
void delay(unsigned char x) //延时ms
$ v, g4 T$ C1 ?. }2 l3 B1 b; B, a
{
5 s. r+ x8 F9 D( c2 n) r8 v& F
unsigned char a,b,c;
0 u# q# Y3 `+ m% f, C* m: l
for(c=x;c>0;c--)
$ R! g# F) Y1 u5 ] A; k- a
{
% z4 g( d9 y( k$ Q" v2 W0 u
for(b=102;b>0;b--)
$ \$ y! X& g1 D3 w: l2 t g
for(a=3;a>0;a--);
1 n k v! X1 o; V. S% ?8 B
}
3 H* W( o% M( n
}
) K9 h" }. T; ^8 u( A' G- H
void main()
6 T9 N) U1 O8 ?) h
{
% P$ A9 I* P) y, c, g3 @! }/ }8 }* \
) B/ v- E3 _8 c# |8 G5 O; N" J+ {
n- r5 D# z9 S# t$ A# O1 _
bit tmp;
9 M0 b, s: a/ {/ t! v( p# ?# ]
dot=0;
% F7 j" Z/ q' v i9 a0 Y
EA = 1; //开总中断
. D4 h5 {; C6 ~& E$ m' n
ConfigTimer0(10); //T0定时10ms
- c v# n. H; d" C
// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;
1 ^, A2 Z, }+ W$ p) P1 `
DHT_Start();
- r# {3 y% |/ ?, @
delay(5);
( w7 T q7 d# F& ?! v
8 N- m' V/ p: K0 J
+ s H. E# n" B
while (1)
. }# A) Q. _5 u8 r- i- O
{
( U( q M2 ^ v7 i
o8 D( I% @; O% W' J w) w( \ D4 c
8 Q; N7 q' x+ d! z6 A# Z1 y5 ]
# b! n9 r" i. s1 R* C2 M3 ?3 ^% Q
# m- p7 j+ o' `+ K+ o
if(flag10ms) //数码管刷新频率
3 J- ?6 B9 s8 G/ b& n5 f! `
{
0 x$ u4 w( C& [$ V- l' Z( _
if(st==0){
+ \5 F) u% p5 d4 M. X' e1 r1 p
Display_temp(&str);
' B4 Y6 d7 M6 n9 f1 L
flag10ms=0;
+ o( m( l% l; u
}
$ w, i3 \. F6 H2 L1 [& l
else if(st==1)
5 q! E. `4 w0 {% N: b
{
* ~8 W) K( j2 z% S
Display_hum(&str);
: Z. |8 Y h# o8 C& L, ]
flag10ms=0;
( ~$ E% h9 ~3 d' a2 Z y0 J2 v
}
7 @1 p* |+ Y+ D( L
6 U4 K3 M+ ~) g
* w4 w" r* S* }, v
. [" z: \, C: H
4 x( Y6 e' w( x/ I/ u4 x7 t
}
( [! o- J" E3 A
else if (flag1s) //每秒更新一次温度、湿度
3 t' ]; V2 h5 Q
{
' {( H0 t* d4 I1 p/ f4 `- D
DHT_Start();
$ M2 k& u9 @/ G
tmp=DHT_ByteRead(&DHT);
- X; [1 r' @7 `5 n6 k& I
if(tmp==1)
F3 J' [, T( O2 p4 D4 s6 {
{
+ V C& n; }/ T+ l6 D
0 B( a2 i# @0 `. q) D+ e( y
. \7 W7 ]5 Q6 t$ r+ t! X, A5 R- P
if(st==0)
# z& b6 O( X6 W; y3 E
{
. |4 r1 H( D2 C* f& ], y
str = DHT[2] ; //温度
% B- B7 H- o8 [* }1 p- V$ M9 o
Display_temp(&str);
/ |0 y5 U% p3 R* h) ?9 k
flag1s =0; //标志位清零
3 Y! _8 C: s2 ?0 J- u/ I* Y
}
8 p6 ]" X0 X; ~: c4 C# H& ~( Q E. \
else if(st==1){
. r! S0 S4 j# g$ w8 ^4 C. j
$ K& Q0 o. L( v, E; ?7 A
* i- r1 V+ [( r1 [9 V) X4 Z X8 o
str = DHT[0] ; //湿度
4 o( Z! l ^- H8 A9 J" ~
Display_hum(&str);
& y1 o7 R- n P# l
flag1s =0; //标志位清零
) v# @9 B1 l" R! e. B
}
( z* K9 L$ p+ S% M
; [, N% k) U' e( p! l
4 E' n# w; b- g$ L {. i
$ b' k8 p3 H6 i* h# M: [
. a% @2 H- }# _2 A
$ S: d# h/ h5 T: F/ G8 W
}
$ k1 _; ~; H7 F5 P, ~% r
}
' o" r8 x6 j' V% c
if(button1==0)
. F$ J, r) u9 G
{
! K- a) N. d/ K1 ?8 H
delay(2);
7 _$ L4 Y; {9 C* K8 z* Q' Y
5 p- C; A9 \+ O
if(button1==0)
" [. R, I) T" k# ~; M9 G6 C
{
+ }, J: X8 Z" U+ S
# Y/ P% C3 b( L6 Z5 C* Z* ]# c" L8 Q
mode++;
; u; g- Y+ z1 t+ R9 G# Z2 N
switch(mode)
# o; b+ g8 ?0 m
{
/ t" h: M, S3 b( f% E
case 0: st=0; break;
! @0 C+ g' ]" Y5 G9 l
case 1: st=1; break;
( W. m* M: q9 _/ g. C. d( R
case 2: td=1; break;
' p4 U# `7 n& T Z8 R2 j {
default: break;
G8 {/ p! M" @
}
7 P1 s, z! L u4 l- G, b0 N5 M
if(mode>=3)
6 g; o5 ]/ ]' Y0 \' F2 C
{
5 x; ?0 [5 e- U) p: I! ?; r
td=0;
8 W0 i7 O) D8 H: A+ l9 p
mode=0;
2 `7 n; J$ o: v" o) `
}
% }3 [) c5 r) U5 k0 c0 ?* K) S
while(button1==0)
$ r% A5 O% X+ X, B1 ~- n' |
{
/ ^- N5 J+ W8 `3 a4 Y7 x5 I
}
& A! k* p3 u# L" K% b7 B
0 i/ _' n/ [0 ]: x g2 v% x7 t8 g5 t
. D0 A5 T7 C3 h6 E% O- l3 \; P) {
7 T. l. i- [$ q
V9 }: X: ]$ _# Z( \8 z" n+ d9 B
}
* a2 a7 J1 s* S/ d. h& a
' c9 c4 Q* G6 S7 y5 ]- U a
0 H$ v3 P& [4 N& T) C4 c; z1 K9 D
}
9 {! K" M: D! z1 j
- e$ O- E/ A# @4 t" R9 B9 ]
& n; `0 G+ x# e& G z) n7 K. t
7 b: H' u) K' e- p- x7 v0 |$ r5 N
" Q0 W' d. n1 Z: t2 v3 Z5 e5 \$ c- H
" `. r, }& N9 C I( M
7 H/ C. s7 B) n* K* [/ Y
}
; E$ D/ y4 } }1 v
}
9 ]6 @% X+ o7 ]7 b8 h
) g4 F# v: N! c) R/ W. |
* [8 n$ }& I- ~
7 g% a9 W r7 h5 @9 E
9 P: J J) ~; j) a
/* 配置并启动T0,ms-T0定时时间 */
) o9 ~9 v/ [ L; d2 @7 e
void ConfigTimer0(unsigned int ms)
& y, d. Z8 g- P$ o" r/ k1 `
{
* i" D1 p; s* t
unsigned long tmp; //临时变量
7 m- P4 ~+ G P7 g
9 T! e! V2 L3 {5 b9 |$ G8 u
tmp = 11059200 / 12; //定时器计数频率
* ]& Q# U" w( U- \! h5 O
tmp = (tmp * ms) / 1000; //计算所需的计数值
8 ~' d+ r+ p6 F: n6 G
tmp = 65536 - tmp; //计算定时器重载值
, o* N1 ~" S/ z' _+ _0 d1 n' w; F
tmp = tmp + 12; //补偿中断响应延时造成的误差
3 s9 N$ [/ W1 _/ R+ e! [( V
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
, r5 M+ }- B7 U
T0RL = (unsigned char)tmp;
5 I. o, Y+ G& C" U0 n o3 ?: t6 G
TMOD &= 0xF0; //清零T0的控制位
2 H- B" S1 S8 F9 e h& O" a
TMOD |= 0x01; //配置T0为模式1
6 t- n* v y6 H) Q! d, J
TH0 = T0RH; //加载T0重载值
" N: E* X( M: s2 Q4 C4 _7 g' o( r( U
TL0 = T0RL;
4 j- I( {" u3 Z
ET0 = 1; //使能T0中断
. C+ l" L6 }( A- t
TR0 = 1; //启动T0
7 W- G# L" P# R( ^- Z0 r
}
: n( E* U8 w5 x, r; N
/* T0中断服务函数,完成1秒定时 */
4 ^; }5 F* M6 p
void InterruptTimer0() interrupt 1
/ P. j" W0 g+ i3 X/ n1 `
{
9 z4 W& `- R% m, S J
6 y9 c! y! i c* b& m- f6 a1 `
8 s0 d+ d: i! ~) c9 x: \; k& W
TH0 = T0RH; //重新加载重载值
& |( H! W# y, H$ U
TL0 = T0RL;
! R" n* a. e7 [1 r1 c$ a
tmr1s++;
# {6 }2 U ]7 w: p- |) O4 d
sdd++;
. c& D/ X1 y Q) k) ^
tmr10ms++;
4 f+ ~+ X/ p8 Q* h% L* I5 H: }, Y7 p
' ?2 t5 {, D3 v& r
1 q! C$ S: Q" G' a5 f. t3 y* l
if(tmr10ms>=1) // 数码管刷新频率
* [; K7 \, R+ I4 k& p1 u1 J
{
1 b- u) P( R0 K' o! g
tmr10ms=0;
% P5 z; a' d R" N( ^9 {! d
flag10ms = 1;
; J9 a: s8 z+ p4 U0 N$ i6 c
}
- Q7 p& k8 M7 f( p, j r: H7 G2 c
if(td==1)
- Y& V g4 ?1 l/ f
{
3 h# Z. h2 J8 ]% {' x( s
if(sdd>=500) //温度显示5s 、湿度显示5s
, }1 x P T9 l' `
{
& t/ ]3 _. F4 b* J
sdd=0;
" V3 p) |7 c& T. R
if(st==0)
* B) N2 z- o1 k& @7 I
{
/ y* S9 M- B; v% @, H* j: H
st=1;
1 Q; `( J2 v( X9 z
}
: e5 y! F+ c. V. U9 S
else st=0;
* }7 f3 ?8 Z( M* s
}
0 H0 a- s! n. I/ R: T E* p
}
* r8 V7 B2 i' `
if (tmr1s >= 200) //1s 数据更新频率
$ L G' g& w u. I
{
0 t8 k( r2 Z7 L
tmr1s = 0;
5 t: c- Y2 K) C
flag1s = 1;
4 [, {7 `, v6 k' ?
}
2 j7 q# @' v% W N1 j/ n4 y2 I( N' _; j
/ z0 `2 h: ^% `0 G- v0 \2 j; ?
1 f& h$ }7 l% [6 v0 @
\' o. `1 O! F1 t: C
}
3 i' g& y' ^; K; p6 W* S1 }/ C) `; }
) X- {2 Z5 g7 f" w) [! E" O
# _" R* R# N1 I
下载:
) Y! P4 @: l5 t! }: t7 w
^& g7 ^- h7 u) y7 a$ h
0 B0 N1 m6 |4 w6 h- W
作者:
sunygd
时间:
2019-1-22 18:22
看看楼主的代码
作者:
1057982547
时间:
2019-3-26 16:34
! |! _6 e" M/ f M, {7 `
作者:
ORGKFL
时间:
2019-6-11 15:22
- g7 X; v# @2 Q1 e4 o$ y
作者:
zhuzhiwei
时间:
2019-9-8 16:40
好好学习
作者:
1998928hQ
时间:
2019-12-6 11:02
试试能不能用
作者:
chencol
时间:
2019-12-10 23:03
谢谢分享
作者:
satomi
时间:
2020-3-7 11:55
谢谢楼主分享
" [9 L `7 p, P& Z: u; ~
作者:
leyuchen
时间:
2020-4-20 22:21
11111111111
, a3 t: {+ @- F
作者:
15463957
时间:
2020-5-8 14:47
收藏了啦啦啦啦啦
. O/ Y: s" F C U4 x9 C
( ]3 r# ?8 ~1 E
作者:
deam_zhang
时间:
2020-5-9 01:02
我来看看
, L+ b2 e1 o/ ~" ]1 ^5 R. X2 d: J/ k
6 q! n# t$ {; \8 C
作者:
氵水冰水氵
时间:
2020-5-14 17:07
感谢楼主分享,拿来学习学习
作者:
trw
时间:
2020-5-17 15:32
为什么出来之后有错误?
作者:
trw
时间:
2020-5-17 15:41
为什么打开是三个代码吗?求回答
作者:
963079388
时间:
2020-5-20 17:08
大佬康康
作者:
CafeNokia
时间:
2020-5-22 17:06
看看看 借鉴一下 谢谢楼主
2 ]* C# N* @) K' J4 J
' l. j" S4 U) ?$ `" W& ~' h
作者:
18181383535
时间:
2020-5-31 12:38
感谢楼主分享
8 R2 k H4 h* a3 x2 C; f
作者:
好了咯
时间:
2020-6-2 09:10
隐藏内容
作者:
SSTIAN
时间:
2020-6-27 16:49
拿来,学习
作者:
xiaofenga
时间:
2020-6-28 22:55
🤞🤞🤞🤞
( X" x. N' @7 ^. h
作者:
due425
时间:
2020-6-30 23:32
感谢
作者:
帝王迪亚波罗
时间:
2020-7-1 11:01
让我看看怎么样,谢谢分享
M `/ M9 y" ^1 _; g3 A; k6 e2 f
作者:
djdbbdjns
时间:
2020-7-7 10:48
学习学习感谢分享
作者:
a837698047
时间:
2020-7-7 13:10
感谢分享。
作者:
djdbbdjns
时间:
2020-7-7 15:08
看看啊啊啊啊啊啊啊
; }7 e; d7 a( t
作者:
user_EDA
时间:
2020-11-23 21:18
多谢楼主分享!
3 ?# L) F$ o, U% _
作者:
lipeng007
时间:
2020-11-28 11:21
测试一下,谢谢
作者:
yijiya
时间:
2020-12-8 19:15
特地前来学习学习
6 b5 y$ g7 B# m1 H" M
作者:
user_EDA
时间:
2020-12-19 08:38
多谢楼主分享,学习了!
作者:
zhang24654
时间:
2021-1-13 10:45
感谢楼主分享,拿来学习学习
作者:
Joayer
时间:
2021-4-19 20:51
感谢分享!
作者:
2720895144
时间:
2021-12-21 15:15
大佬看看
作者:
2720895144
时间:
2021-12-21 15:18
大佬看看
作者:
wang5825
时间:
2023-2-6 09:40
学习学习感谢分享
作者:
xuebj
时间:
2024-12-8 11:48
看看楼主的代码
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2