|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Zedd 于 2018-11-7 10:09 编辑 , W+ a0 y) V9 r3 @
7 W6 C2 @& `1 ~1 r0 h: a+ i. G1 I) J- |; l# t3 E/ X& V# w
使用AM2302温湿度传感器模块,达到测量湿度和温度目的,并在1602上显示出来。
8 b. N) N- G, c' {7 u- K2 }& Z$ d, @; \0 s) z
单片机源程序如下: | 2 O# ]- N: a5 M$ G- u
#include<reg52.h>) c _. E# l6 u
#include <intrins.h>
3 e& B# ^6 [% X, v# i- T% V4 j$ U#define uint unsigned int1 }. ^: E, S1 @5 D d5 Q
#define uchar unsigned char* A( Q4 c4 Q& Q! q) T( ~" N" `* L
7 R/ R8 y+ `4 q: f1 Ouchar code table[]=" WELCOME ";
- |. K6 V& R% P1 d/ euchar code table1[]="RH: %";
8 a' d1 e1 }& \9 K& |9 F F$ M: iuchar code table2[]="Sensor Not";& _ K, S9 E( V- [% D" C( G
uchar code table3[]="Connected";4 L8 |# P& H3 |9 {. `+ l* R* N$ _
uchar code table4[]="Check wrong";# {# O# C- D" y9 K* L5 {, [
9 B) H5 j, U1 E2 d6 j
sbit Sensor_SDA = P2^0;3 I, H! t% K. e( q
+ s) f' C, x9 b7 ]$ P
sbit key_set=P2^1;
1 G' V. u8 N! K: t2 J& Psbit key_up=P2^2;) y- b+ ?; z$ I7 H" |
sbit key_down=P2^3;
- I" g1 B. {7 o3 xsbit key_ok=P2^4;7 O( O+ y! Q* `1 [6 A6 a
, u8 g! b- V- C* ?7 Z9 q9 y
sbit lcdrs=P2^6;
$ J8 y& l; G0 M% p& |sbit lcdwr=P2^5;
+ n) f3 u! m/ r9 B9 i- J! c u1 xsbit lcden=P2^7;. }& S$ V q) a6 p1 E7 q
9 U8 m, G- q: x4 a9 o9 B% M- T" S8 puchar Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
' r) X/ u) ^+ Z- N7 E: Suchar Sensor_AnsweRFlag; //收到起始标志位
a2 ~2 p! t5 B0 J, L. a& zuchar Sensor_ErrorFlag; //读取传感器错误标志
u& |1 c$ f% I7 auchar Sensor_Check; //校验和# f6 V3 {/ u6 r' @3 ?5 r
uint Sys_CNT;
" b* ~# l5 L% ^uint Tmp;' \8 t( L+ ], r- N) H4 ^: h
uint t0;& t/ v* d+ j" ~# r% p* B5 `6 o
uchar num;2 v1 k+ m$ j: C3 M/ S
uchar flag;
# ?! \& Z$ a9 M9 O* ^9 D9 n% N8 C* q/ k5 H; i
void delay(uint z)$ k2 [! W0 H; @8 @
{; e/ P5 S8 b# Z4 }- r
uint x,y;3 M8 O$ Y+ L" \! r: j
for(x=z;x>0;x--)$ q% N* |/ ]% B3 d* }0 ~8 T
for(y=123;y>0;y--);
1 f7 @2 {, q6 L}, h1 J% m5 d: W! W& R# L
: p# R7 ^/ z6 O" u" d1 B
/********************************************\
0 m. R- H' I7 T a|* 功能: 延时 晶振为12M时 *|
% i9 r8 y0 ^( ?4 l# q$ o|* t = 1 为 20us 然后成倍增加10us左右 *|$ U1 d! Z* p. Q: E1 j
\********************************************/, _- W$ s5 m3 z L% k7 f
void Delay_N10us(unsigned char t)
3 o( J; S2 z* } T3 J{1 d' R# s4 Q6 F; ~
while(t--)' W% x. d5 f9 M' _, P
{
! i. u3 p4 U5 l; i8 r% O3 u J _nop_();: a4 I/ \/ c8 I% d! p& ]
}1 f% Y4 y. x9 Z/ P3 \) G% K
}8 B: s" j0 E+ t# M, Z1 @
/********************************************\8 V* N7 @. s" k! m0 N. J$ t# N
|* 功能: 延时 晶振为12M时 *|! L6 e+ f# n7 ?
|* 延时大约 1ms *|
6 v+ L b+ }7 A: ~5 p\********************************************/ 9 B; T, x- x: u. ]# l0 `
void Delay_N1ms(unsigned int t)
8 F. ]+ o1 y7 d9 Q1 x{
/ D9 L* `! ]! }2 t1 C6 i unsigned int i;1 L/ Q/ Q" C- T6 r5 T$ p) B
unsigned int j;9 O. i( }; D, g% D
for(j=t;j>0;j--)& o& v- W% U/ w& g/ z0 R# }' a
for(i=124;i>0;i--); //延时大约 1ms
. f: @' C$ }$ T2 f}
" `2 K7 q1 J- ~% O5 R8 t4 mvoid write_com(uchar com)0 ?6 p2 F+ \5 `, _( `1 h
{4 V3 _0 ]4 b' i @# B; ]
lcdrs=0;3 b% K E# }% c
P0=com;- Q+ L* @2 {6 K h9 {- [9 x
lcden=1;1 f, y9 f# i* ~/ L( L
delay(5);4 x8 ]) i# W1 ~( E) B3 ~0 X
lcden=0;; o+ a% P5 J" l7 j. ^
}
" p! f* D0 ~7 Z7 h* }void write_date(uchar date)
. |/ \: `4 q3 r) X{" z% v' I; T6 l2 V, R" z
lcdrs=1;7 r2 n. i# x+ q' k3 f! D4 |
P0=date;" f$ h- @. g5 T" O
lcden=1;' J1 X/ _4 {- i5 o5 H' Q% t
delay(5);
1 V( Z( f6 r5 r* B' y/ \ lcden=0;
& d) i, G+ K" a}
' p; f" d6 S6 ]7 u: q. svoid diyihang(uint z)
. [: i$ [ i) g* b0 H8 F+ {{! D: M- i2 {4 x7 ~
z--;2 Y' h( {/ R w4 I/ P! {( B. o
write_com(0x80+z);
+ v+ ^) V4 f; V9 E" |}
/ T" k8 n5 C# L" R4 lvoid dierhang(uint z)
4 v# m1 m7 S+ @6 F{
5 n% d# G: q3 }% E' E z--;' @0 @+ r! U) a+ w# g
write_com(0x80+0x40+z);
) n. C# e6 u) Z: E, ~9 Q* Z4 i8 G}! `6 L$ X+ Z7 J# j* s
void init_1602()
8 Q- O, J x2 K7 x+ v; c. ~4 s{: H6 f- U% `) K
lcdwr=0;6 h1 d& w# M; U: `, \
lcden=0;. q) h; }, I& h8 i
write_com(0x38);//模式
$ w2 O V; \: p write_com(0x0c);//无光标不闪& k0 [# u: [+ e4 [5 a0 g2 M
write_com(0x01);//清屏2 z# u! c3 y% V( O* k
diyihang(1);//显示位置9 f/ x. m4 S* G, d0 F' l
for(num=0;num<11;num++)7 D. R- Q; j' {& @5 W5 X, m
{
/ g4 `1 }0 k! b6 M! l# i write_date(table[num]);
# {; O$ z0 T) \9 n E( u y //delay(10);
# e" @! f% T I7 [ }, N+ T8 }1 u; J) \0 w, \
dierhang(1);//换行显示
6 q4 G& M; S& L" L: ] Q: z+ [ for(num=0;num<10;num++)
- m9 i+ y& |7 G# N; t% r {0 }, C1 c0 q" k9 b: D% i: I8 P/ u# ]
write_date(table1[num]); & i3 Y0 G, `5 n6 l* g( I0 c
//delay(10);5 ~9 l+ _! c, G: [5 R% }
}3 ]2 h7 E! S3 Y0 |4 M) _' z
}- F* H" Z- p1 D( _: k$ h
void Clear_Data (void)
$ {5 d3 c% Y( ~* N1 r2 w0 N% S{
$ S" ^; d8 }( N- `2 A$ s! W int i;
& ]* W2 `& W) X* F& | for(i=0;i<5;i++)9 B3 l% r, Q9 s4 y1 _
{
' v) s6 l- ~2 \ Sensor_Data = 0x00;4 I, E/ V% u; {3 A n5 @
}//接收数据清零. w0 B: H5 }- {. u$ ~
}
. _' ?4 \# w/ l+ w+ q, {. p7 | H9 @
2 V! L: q# p2 S: f
/********************************************\6 T9 S9 q5 s0 c: q9 ]) T3 T
|* 功能: 读传感器发送的单个字节 *|
9 J, L8 y* p& L0 p\********************************************/, M" {2 B3 c) P5 T7 z; V
unsigned char Read_SensorData(void)4 B. I; A$ J/ x" P) H
{
( A7 F0 V% e2 q unsigned char i,cnt;
* b$ ~' i( L) p. | unsigned char buffer,tmp;
/ s+ D4 Z7 }6 d# P5 a) h& O4 l" F buffer = 0;1 _& H, A: [; o5 D; ^, v) i
for(i=0;i<8;i++)7 J9 H2 `2 D$ H$ K/ ?
{/ q, W1 o/ Y- G r4 `2 P5 u7 W& r) ?
cnt=0;
1 J2 y/ N; Z. q5 i& _ while(!Sensor_SDA) //检测上次低电平是否结束
$ |' h! Q* L O8 h {, M: [( T* y$ H, B9 g2 ~/ a
if(++cnt >= 300)' u8 K) {4 t- X- ]
{ M7 A( n, ]" i
break;7 d2 R1 B( |; x" [7 P# q
}
. ]( T3 A# h% f+ l: W! b/ G# s' |( U }! @0 K1 k8 g& N6 n
//延时Min=26us Max50us 跳过数据"0" 的高电平 e/ n! w C. p) P) L2 z2 X
Delay_N10us(2); //延时30us
, N: A" n4 T+ n8 T; r: l. l, ?; B1 D( G+ q, ^
//判断传感器发送数据位
) F: M& ^( V) T3 |- L6 C: Z T tmp =0;3 q' d l8 D, J
if(Sensor_SDA)
+ \ k* a* b8 m u {6 ` p4 s' k+ u# t" G; ~8 \
tmp = 1;; W5 w5 z# V4 Y; E% l3 i- J. M" N
} - K( Y0 X; O" l+ a* b% [- R' K
cnt =0;3 I5 [) R: k6 Q: n' p3 F+ ~ d
while(Sensor_SDA) //等待高电平 结束: D* |2 v2 |+ t# l/ x3 {! b3 h5 }
{9 I* P7 N/ Q0 m# T
if(++cnt >= 200)
! @2 \: [7 k% l J: k/ N8 [& H {& k* j) Q8 Y" G) q$ T- O
break;
) ~; Z- N2 C- ]' `- @! W }
3 H1 [9 E' H2 C3 e/ g8 F }' Y# B0 u+ m# ~# g" `0 e: K M: a
buffer <<=1;0 y. O9 C' N% `1 t) M
buffer |= tmp;
. J! |6 L0 r d1 R3 h }
0 V# y$ K, g+ N% W ]/ n return buffer;
y$ h# }5 t6 q2 t4 F }0 K4 b; j& J& O" D! c
t) W- O" b$ k- r/********************************************\* ~) s$ L$ k2 z8 c* ]( D& ^, _) F
|* 功能: 读传感器 *|
+ Z, \ _. }4 K\********************************************/" \" w8 t' Y( F _" M; p
unsigned char Read_Sensor(void)
% S, }6 }; s7 X. `; S{
& j6 Y4 C. L4 ?1 ~0 q unsigned char i;* G# d( B. C; r! w1 Z* y
//主机拉低(Min=800US Max=20Ms)
) g* Z! z4 Q7 n! u, R. L Sensor_SDA = 0;
c# l/ R$ K5 s4 z Delay_N1ms(2); //延时2Ms
% x* B8 G- V+ @, w( b* U& f* w# p7 A, J7 I) ]8 J
//释放总线 延时(Min=30us Max=50us)
& Z4 O& R( X# u4 ~7 y# b Sensor_SDA = 1;
& k' m2 H# }. @4 W2 o0 S# m Delay_N10us(1);//延时30us$ @0 _( l' J/ s0 P3 d: ]7 p! \5 n
//主机设为输入 判断传感器响应信号
1 n/ v" M, V6 \; F Sensor_SDA = 1; . b. O( a0 {* u1 }9 ]
u, W# C. w* T, U( j
Sensor_AnswerFlag = 0; // 传感器响应标志
9 g/ W5 @4 Y+ H/ f( j; V* m
7 f# _& V2 g7 D! g* _ //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
0 O* B; Z; x2 y) A& ` if(Sensor_SDA == 0)
6 M8 ?4 _, K3 c3 W* ^ {
! M6 V" s/ e/ ?: z2 D Sensor_AnswerFlag = 1;//收到起始信号
* j- }. B1 s. T. \' c* l W, C' a5 J/ y
Sys_CNT = 0;
2 t) O+ T: d0 k //判断从机是否发出 80us 的低电平响应信号是否结束 + ~7 c" C5 j3 F& M
while((!Sensor_SDA))# Y( X: g' D' |. I2 N+ U
{# E* {6 @# B Y( Y
if(++Sys_CNT>300) //防止进入死循环" `9 j8 ^" d3 \/ l$ u+ o5 d
{
2 }+ P3 @ v. W& P; \8 U; U Sensor_ErrorFlag = 1;
0 A7 L( q! w- n7 e return 0;
4 B6 {+ m( ~; g0 |# `9 \1 w } / m( Q' C& w5 a3 G! m8 h$ _
}
4 M& f1 r; D8 _ a( f1 P5 {0 e, `+ I, R9 }: ~8 E
Sys_CNT = 0;2 _$ }1 Q! n# K: @
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态; J3 b5 j- s& x6 H
while((Sensor_SDA))
+ d4 \* _4 o1 a( U ^; |) o {
u" m0 ]* T6 I, O+ T8 [- P if(++Sys_CNT>300) //防止进入死循环/ t, P ]1 k0 _: h
{
! z B' v, X3 d3 H% L" P+ L( ^ Sensor_ErrorFlag = 1;+ L8 L6 J. |9 T
return 0;
/ i: ^$ P. \' \3 n$ Z0 j9 @0 D- y/ v. i } 8 h) W, H! T1 e. E
} - |/ R+ `: \- z! e
// 数据接收 传感器共发送40位数据
5 z: Q" A% T6 s, { k+ @2 A // 即5个字节 高位先送 5个字节分别为湿度高位 湿度低位 温度高位 温度低位 校验和
V; a+ w; }. L! j9 z // 校验和为:湿度高位+湿度低位+温度高位+温度低位
9 A- a. H; t' |9 H for(i=0;i<5;i++)
0 o( e$ m4 }3 r$ g+ U( X% n, r2 k {7 G7 z+ l* N" N1 m; Y" P
Sensor_Data = Read_SensorData();
5 z& x* i1 Z+ S; y/ E5 U2 e } _8 u# m: W& U4 f
}- \6 f, e. ^4 a+ @* J- I# m
else1 k6 i! w' D! ?
{% R$ Y2 h5 |4 Y. d6 f) n' a
Sensor_AnswerFlag = 0; // 未收到传感器响应 ! ?; a, Y/ s3 O$ {, E
}
( k1 K; G$ z$ o8 E return 1;0 `! u9 |) W* A0 I
}
$ O4 N) D, }% n, }: I& Q4 Yvoid display()' ?) g# A8 H }) Q8 I3 u2 a
{
4 q* M. ^ |7 | Tmp = Sensor_Data[2]*256+Sensor_Data[3];& @8 E# _3 F1 l8 x; f
diyihang(6);
, Q$ v" M) N$ G1 x /*write_date(Tmp/100%10 + '0');
1 V0 H$ }- D: e2 v' l- C0 A write_date(Tmp/10%10 + '0');
7 _3 {! {- L) u$ R write_date('.');
' a1 I8 v k! S _- R write_date(Tmp%10 + '0'); */
3 _% f$ R1 J1 o) M' [$ V
9 a. L8 m8 w7 @( f- J" Q# ] Tmp = Sensor_Data[0]*256+Sensor_Data[1];/ t; e, s+ R7 @( K1 Q8 O( R
dierhang(6);
& r0 Y3 M/ N# v* Q5 ?" p( e write_date(Tmp/100%10 + '0');3 ?" i* M2 p- w& s' o/ V, Q
write_date(Tmp/10%10 + '0');
6 i8 N2 d+ t, |4 h write_date('.');
4 [0 g& ]8 x9 b6 D6 t write_date(Tmp%10 + '0');
: U5 L* s* f/ V8 B8 j' R}
; F* l- v4 \3 w5 q+ Tvoid check_and_display()
' h# F* u" t* E4 ]{
2 E: I0 W' H6 Z, S' p if(Sensor_AnswerFlag == 1), }3 V; \6 _, a. i
{+ m! B7 z1 y' B- y
Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];/ Z7 L4 J2 E( u2 a" z4 m
//校验成功
2 m+ d& M5 T5 {( r M if(Sensor_Check ==Sensor_Data[4]) 2 i: C! R0 T# C; r [/ P
{
! Q, @0 L9 [8 E. R1 B. ^) N if(flag == 1)4 Y- r; g" Q2 C4 B2 A
{
( ?4 j" v0 V- | flag = 0;0 l# U9 `6 Y: h% j! m
write_com(0x01);//清屏
/ J8 o1 F( i3 A4 t* t diyihang(1);//显示位置
( M% Y0 x& W7 f5 ?6 H4 B2 T for(num=0;num<11;num++)
, f) T: O/ e9 s; a# m {
+ k) O8 z& F. G write_date(table[num]);
7 M2 c: n0 u" X' ~$ B; c0 P, n //delay(10);
: A l3 P% L. i" ? }! T; }5 B0 T! u- d: ^6 \" l0 W
dierhang(1);//换行显示* ~( y" I) J: Q
for(num=0;num<10;num++)
9 m: K. u5 a; C% ] {
6 ^ a4 A. @0 o& F8 A; A1 N9 o2 V' O write_date(table1[num]); " ^+ E F" d' D
//delay(10);' [" E/ `! R! S
}9 }0 ?& l& c3 ^) b1 m7 [7 q3 R! a
}
6 H0 e# ^2 m2 d; z* [% W display();, Z1 N4 f i0 i$ L# l5 ~! P; E$ t
}
% P$ W3 R( C) i6 U% b2 z else //校验失败
4 |0 V9 N8 \: Q) s6 ` {8 ?2 d6 i0 q- f$ G
write_com(0x01);//清屏$ y& V0 C" S% R( J) t
diyihang(1);//显示位置
- s1 }6 A$ O" n+ M6 z+ E& U for(num=0;num<11;num++)1 @4 d8 } n; f) [
{
3 r, Y1 p7 a8 t1 J/ { write_date(table4[num]);3 A( \' q! [2 v7 n
//delay(10);8 g5 v& h7 `& d, p4 r/ f$ z
}
/ f+ l, C; X3 G0 I flag=1;9 u8 d, a& u( B" f. E0 Y( q
}
5 \, c) q; r" l3 ?7 k q9 M }
1 S) c3 P. f" Q5 \) s6 f2 n else //没有连接上
/ \, Z& c8 |# k! g; c {
9 Q5 C$ a5 t; l key_set=0;* W. L! F% W+ K
write_com(0x01);//清屏
. e' F& r! r. Z" l* I* S diyihang(1);//显示位置! E* q+ Y2 E _) r! n' I
for(num=0;num<10;num++). m& k/ I0 n, o) i$ h. T0 y2 Q8 m
{
4 y* p- J' O, z write_date(table2[num]);, |. |* n5 Z n8 q( e! ?( E
//delay(10);
. A2 x) z' G1 u' n( ` }3 i1 `) ^- ^4 @; T
dierhang(1);//换行显示
6 B' z$ V# W) ~8 C+ C; S for(num=0;num<9;num++)' @& {8 {% r$ m; x; _! l' P) R: x
{* o0 }( H+ n4 P3 ^' Z. k4 L
write_date(table3[num]);
1 P% H9 I- f) @6 S* _+ t3 r0 b //delay(10);7 \; G+ r& [! @5 e4 V2 ]
}: i. k. o* I5 [1 Z! a
flag=1;# _, R1 a2 q/ ~3 c0 x: v
} " h0 D; \ b1 R1 t* D5 p! m% f3 ?
}
T6 E0 a" F3 e1 X9 R3 o& x& `8 Y) w' }: y1 h
/*void init_t0()6 m, U7 T4 q2 D! Q! U. L5 D) Q
{
4 t* L& H" S I' D% D TMOD=0x01;
/ e, r- |9 ]3 L( J% K, G4 A TH0=(65536-50000)/256;. A- e b) ]. [3 G
TL0=(65536-50000)%256;
* ]2 j) z; }) i+ b EA=1;
( l' q+ k5 G; ] ET0=1;; N" W; c, i2 u1 `' U" i) p; b8 {6 r
TR0=1;# }2 f( B3 R, ` f! _6 }
}*/
# M1 k% \( u1 ~- Y
2 G$ M; v V& evoid main()) r: V+ }# X3 z' j! A
{
& d) J0 M8 B8 }" K5 V5 f init_1602();. c4 T, Q: \6 U* I/ j6 H3 y
while(1)0 p( E: Q: T7 }
{
1 x; |- @! [8 } Delay_N1ms(2000); // 延时 2S(两次读取间隔至少2S)# `9 \5 ~- Y% B6 z
Clear_Data(); // 清除收到数据
1 g1 V( L+ j& S$ Y8 ~ Read_Sensor(); // 读取传感器数据! ?5 I% R8 |, r8 K7 |& ?+ H/ g
check_and_display(); // 检测并显示数据
8 b- y% q4 e, _# h }2 t/ m& P& A1 S( o. T7 S
}
3 p4 A/ [+ e4 T. a* Q…………
% U7 \: W% V) ]- ~3 ] y" U' N. s…………限于本文篇幅 余下代码请从eda365.com下载附件…………
1 j f& u( q9 m |
|