|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Zedd 于 2018-11-7 10:09 编辑 ) s# E' f! T- Q' f* U
9 m% T: @9 r+ V: o5 q, n. }
2 v$ i- o1 @! N% _/ y5 ]% j
使用AM2302温湿度传感器模块,达到测量湿度和温度目的,并在1602上显示出来。
; b) R: L4 Y$ e3 X) _
& F$ U+ O& Z' ]单片机源程序如下: |
, {! Q* A. p. m#include<reg52.h>
0 P0 R, C3 c5 P( H1 m#include <intrins.h>4 p. L2 l( H# O" {* o6 S
#define uint unsigned int
; D* |6 \7 Z+ I4 k% }& v5 `#define uchar unsigned char3 y. k+ }+ Q) n
7 z0 ?& D. ^ S# A8 H7 ~+ A
uchar code table[]=" WELCOME ";) q2 m7 q( _; ]: S2 E
uchar code table1[]="RH: %";9 J2 c' v: H6 k0 ]% N
uchar code table2[]="Sensor Not";
& p+ S* c. x' q8 iuchar code table3[]="Connected";
# l) z# l0 x/ Q3 A+ f3 S# j5 c/ |uchar code table4[]="Check wrong";
, [5 t% q# {* C- @! t2 a5 [% Z5 s( e G) G' Y- A) M
sbit Sensor_SDA = P2^0;
5 V+ ?: F) y; c' u' C
6 ?; p0 X: V# j0 r, }- ?# o3 Wsbit key_set=P2^1;
2 M: r v- |7 w: k- d& [( ~: P$ vsbit key_up=P2^2; |9 t! p9 Z5 H
sbit key_down=P2^3;
* g1 h: E. L2 fsbit key_ok=P2^4;! H, W P+ _, T) G0 l
2 i0 [6 c5 E$ j9 r( c; O4 e$ k
sbit lcdrs=P2^6;
Q$ A d, j# k+ T* Esbit lcdwr=P2^5;
0 j9 `, H4 \0 ^& lsbit lcden=P2^7;
" T* k/ w: i4 E+ }$ I5 t
, M8 a+ g- C7 ^7 auchar Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
5 W" z7 @+ I; H/ S! ouchar Sensor_AnsweRFlag; //收到起始标志位
% J9 ~+ K4 [4 Y; }1 m( Euchar Sensor_ErrorFlag; //读取传感器错误标志
4 n% K5 ~. L% ]: A: puchar Sensor_Check; //校验和9 K! V1 U" \& d: ~# A% l
uint Sys_CNT;1 P$ r G" U" I; R- X
uint Tmp;
, U! i2 D, Z, B0 |* W. w5 B8 Iuint t0;
' @- ^% i. ~! q6 Z; s j- guchar num;
& o, x4 [" j1 o" b% e6 [uchar flag;
0 `% [$ i6 W3 m% M! O) { B* l0 r
g0 Q* G0 K0 t3 N& U- qvoid delay(uint z)
6 g2 H, A ` @{
; }+ s( L3 S( M1 W8 R4 R: P' w uint x,y;% F; x# D; @2 K7 F
for(x=z;x>0;x--)! w2 s1 o1 G( U( J6 b
for(y=123;y>0;y--);
) t/ s. c8 u6 _( E* r# [}6 d4 V/ j. F. r& b7 }4 a" ]6 j3 N
6 n* d: d: M( _
/********************************************\
4 y; t: Y; _& p6 ]0 s|* 功能: 延时 晶振为12M时 *|* Y" }- {7 @8 X2 A* F
|* t = 1 为 20us 然后成倍增加10us左右 *|# D! l' |, z$ a6 E: a9 E2 L+ A
\********************************************/
- d9 ?* B/ S; }7 Zvoid Delay_N10us(unsigned char t)3 V+ c H) q* W! c
{
7 y: V3 }4 @- c r$ k& i while(t--)9 C; M& l3 a. e) t: y) s
{& R4 n% ~, p5 c8 g, G
_nop_();
& Z6 T6 k" p8 b y0 W G3 i1 _6 L }& M Q6 N# u0 I+ O- R# a, k
}
+ e' u1 U( P% N2 c2 O+ N9 v/********************************************\
6 L/ H$ J; t# c) l: M% Z0 B|* 功能: 延时 晶振为12M时 *|
2 t G0 }" {; c! ~( g& q, B|* 延时大约 1ms *|4 S, a% [" ~; h: L9 B* t
\********************************************/
1 ^' _* c6 X7 G- a5 u4 }void Delay_N1ms(unsigned int t)+ _( s3 O; t3 B# g9 e% E" d- `
{
' {& m* C/ x3 ]2 | unsigned int i;! q* e1 D& V: E, [, c: _8 f" M* ? V4 b
unsigned int j;
, z/ r7 p8 h& T6 p# t for(j=t;j>0;j--)
$ g3 X5 Z" e+ U3 y; u4 q- { for(i=124;i>0;i--); //延时大约 1ms
0 \0 n9 r3 n Z8 z/ m" D}
! }7 i& v8 t |6 {$ z; Kvoid write_com(uchar com)
! ]5 Y: ?' B: g+ g$ d, a{% }- |5 m% }7 A4 ~
lcdrs=0;# g& v: x8 @7 g% Z7 K" T! b+ @. P
P0=com;
) F% y% z, u7 [3 R6 j" K8 N lcden=1;9 N" [$ j; q) t: I# G- m
delay(5);7 {4 z* {- O; W
lcden=0;
, G w0 f; I# f0 R; z/ ?7 u}* y0 v3 K) C9 j+ w
void write_date(uchar date)9 [3 a) T% k0 u9 f$ G3 y. q
{
5 }# k0 D5 c' K) i) c0 z lcdrs=1;# J/ `! l" N* H8 N# H3 c( L
P0=date;$ _$ Q/ V; p- O9 k( ^; y6 w/ t
lcden=1;
* I: w' A$ A0 I* M& K delay(5); R `; k O, E1 C# h0 s/ ^* \
lcden=0;
; Q8 u/ F( X0 c* \! m* w}
, Y7 H1 o3 O! ^3 n0 rvoid diyihang(uint z)
" C! l+ N; z/ L/ I" D2 X. L{
0 A( ^1 A s h9 g, T z--;, g$ z U' k( q
write_com(0x80+z);
8 v5 E H! m" [, k6 Z) l}
; B: ^4 s& ?. Z3 b) cvoid dierhang(uint z)
! x2 N# ^4 |& k8 A0 x{
3 t9 d" z& ~& X; |; Z4 d* W. A6 _ z--;
( W" N5 L* V" C' }) y write_com(0x80+0x40+z);
0 [. c9 o+ K3 V4 T3 w+ O0 R}
' q9 r: W; d6 s0 B" ^) ^; Jvoid init_1602()
! K& ~; N8 G- x4 o4 D6 G{7 L6 {3 S6 `8 v1 |& ^
lcdwr=0;# ^8 F7 V: [0 C' g! H2 @1 }/ C Z
lcden=0;* V0 c& J$ y: y' H
write_com(0x38);//模式
& l8 _, }& ~; D m3 L/ t write_com(0x0c);//无光标不闪. c& r- v4 o, D' [5 \* @
write_com(0x01);//清屏' {; }) t( I7 e1 c4 q' k
diyihang(1);//显示位置
7 w8 a+ O6 V1 k for(num=0;num<11;num++)
2 i' _2 x8 \- Y( U, \& c. ?% J$ g8 ^! d {
. n% O. i: g' U& s- E write_date(table[num]);
' f/ e4 A( j3 f# n //delay(10);
, B3 V8 g. t; g5 N7 _( ^' m2 Y }
1 ^; U2 v# h- p& i ?* n0 L dierhang(1);//换行显示7 U( q: k X5 m8 q( I) y
for(num=0;num<10;num++)
! I9 z$ [. X& E; o% U# s+ p {9 l8 _. w* Q1 p' p
write_date(table1[num]);
( R7 R* q% n3 b, ~* U //delay(10);4 g' X( x! ` R, O
}
4 G& K) q4 L( f# M}
2 B1 ^% F- z3 N2 K" D8 ]/ _void Clear_Data (void)
. ^7 m5 F% Z% Z4 T4 W9 S5 a{
" L G/ K6 p+ `9 i# R O int i;" \* P- e. I8 e( d3 j
for(i=0;i<5;i++)
) N1 l. E u6 R, h( O; P1 w {9 H/ i, R* F# X7 ^
Sensor_Data = 0x00;
! Y! C$ n! G5 s4 Y/ M# Q }//接收数据清零
# {/ y3 ]. j5 }. Q6 G}, a6 U4 T) g0 h0 l
8 d N& }+ w/ k7 W3 _
/ ]1 ~% x c( Q0 f0 U3 p% y/********************************************\
- M) W7 U8 x4 e. S. O4 p j# Q|* 功能: 读传感器发送的单个字节 *|
8 p% N7 v% C' }! e\********************************************/) U, h* a8 F5 T+ S
unsigned char Read_SensorData(void)' @9 l8 ~: f! [% Q N) S1 Y
{
3 i( D2 T2 H; q% H# X8 H& Y% ]! u unsigned char i,cnt;
8 |) w# D; H3 f/ [ unsigned char buffer,tmp;
; B+ x6 \+ Y' T8 i8 K buffer = 0;% K8 f2 Q% r6 c6 I- v
for(i=0;i<8;i++)5 H3 J: a% U% g# c
{
! d: e1 ]% S: r& t: D3 n cnt=0;
! @9 O. p) Q. C while(!Sensor_SDA) //检测上次低电平是否结束
& t* U# v# M! o! P' _) w {
|: {$ A6 j: [. {# D" C if(++cnt >= 300)
* O0 d) {; k$ A+ G8 o! L* N: Q {
( ?( K+ J4 E2 Y) [' H5 o i. B0 I break;
: V S6 X' i8 K) t }, [) x5 O* E' w! u; y) \9 O
}. g( P. g( w- P1 |4 ]+ Z# X
//延时Min=26us Max50us 跳过数据"0" 的高电平; V2 w2 Z9 h: t* b3 c# O7 z3 h
Delay_N10us(2); //延时30us 7 W0 F& U: G& o6 h. e" h
* h7 Q; C1 M! x7 m& ^; b7 D4 }( { //判断传感器发送数据位
j/ }' j; R; R# H" H8 J; [ tmp =0;
, ^, G( } r1 x/ P: _ if(Sensor_SDA) 6 v, j- v H3 v4 ?8 `0 [4 t
{ l* x6 Y! l) [/ W" |9 N
tmp = 1;
7 U+ ~$ p) u! C' W/ C/ }& Y, g } ) r# k8 N5 D, R# M" l# u
cnt =0; K# G f9 F! x- k h4 `4 B! q
while(Sensor_SDA) //等待高电平 结束
! p8 }% y6 F9 }$ b: C- C {( O3 P4 T" ]0 _+ H h- v" [
if(++cnt >= 200)
' V7 r4 U3 u: V! H/ V4 r6 w7 W* f {* C, W1 C b+ W0 [2 P
break;
* j5 R! W! S# q- k$ G }
! K8 G+ ^8 h# Y, D% V7 S }; w# t( |$ A/ D- k
buffer <<=1;
. H$ k, I1 D$ _& O$ R0 ^ buffer |= tmp; ; |/ r) n7 |( y
}# q; |! Z; }3 R" |; e! I
return buffer;3 i9 F( ]: h/ G, g6 u. ^; R
}# z/ {) k4 t! z) K
( n% h! r4 W; R% E0 J/********************************************\
: H' c; f4 R! g, V|* 功能: 读传感器 *|
* q2 ]. J' J# M+ o\********************************************/
1 R% B) D# n& p: e3 ?: c. u% `( Sunsigned char Read_Sensor(void)
0 q, J c$ V( d& i4 @{
. ?+ \7 V4 u& T! i0 R5 m4 x unsigned char i;( n' ]& ?+ G2 F5 P8 A' K
//主机拉低(Min=800US Max=20Ms) * V+ M( ^. k" B H# |
Sensor_SDA = 0;
7 x! @4 J6 I. t6 {5 z6 u- z Delay_N1ms(2); //延时2Ms; O4 X# j) ]1 W" F8 K
; O+ s6 ?$ X" b# \* w" ? //释放总线 延时(Min=30us Max=50us)" C; F: @! \8 K5 @1 B3 l7 W" i
Sensor_SDA = 1;
& H) M# w7 n9 v" { Delay_N10us(1);//延时30us1 ^: u5 c+ }" }4 e9 }) @
//主机设为输入 判断传感器响应信号
3 c+ W, N0 F# _ Sensor_SDA = 1;
: N# {/ }' P: e: p. B2 j% E+ H& y/ m$ k% v f6 A8 P
Sensor_AnswerFlag = 0; // 传感器响应标志 - \/ F0 k: z2 S( C
) l- q$ |& C6 |) a1 ]0 m: I/ }
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
* U& h, t$ W4 w if(Sensor_SDA == 0)
0 `2 Q, H! k# M+ Y ?! ~( Y5 E {
& |9 C) S% C0 E0 s! t, Q4 y Sensor_AnswerFlag = 1;//收到起始信号
/ P* @' i0 \) {8 `( ^
6 j9 Y7 C9 R3 H! ? Y' c Sys_CNT = 0;
9 }! Q7 V- D" n9 W- t* z //判断从机是否发出 80us 的低电平响应信号是否结束
- |4 F1 u3 g6 A/ c+ [ while((!Sensor_SDA))
; w" b9 R( z* d" k' K7 n1 r6 K" ? {
" ~7 C% b1 \5 {& D( t if(++Sys_CNT>300) //防止进入死循环( \0 t4 |" [" A( O5 R7 _
{! E+ |4 E0 ~" ^6 k% d
Sensor_ErrorFlag = 1;- m# B7 n1 S" u1 ]- a# s0 p
return 0;
6 A; G" ]% d& }+ a9 ]1 f }
! S K, Y7 L, |& P0 O8 \$ o }
- z0 R* q& k: S5 r5 L6 O
! T0 ?6 A4 y. h" | Sys_CNT = 0;
# A6 L0 @: F! H7 X //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
8 x, T9 J1 f3 E* B8 U: x while((Sensor_SDA)). d; D8 e) H& n: h
{
# x( Y, Q+ S0 y9 G7 S8 E; U1 [ if(++Sys_CNT>300) //防止进入死循环; w) Q/ Q y0 @" { F) \9 q r
{
{: ~5 P5 _ x4 Z' w) T9 O% l6 H Sensor_ErrorFlag = 1;
5 L+ m, H; ]5 ^* e return 0;1 n& M0 p% U8 {$ u- W
}
. ~' F! t$ g% ^( U" l/ v# T4 C* j6 r- ^ }
5 \" z6 I' _ y // 数据接收 传感器共发送40位数据
5 P: |6 M' y+ d0 B // 即5个字节 高位先送 5个字节分别为湿度高位 湿度低位 温度高位 温度低位 校验和
3 [2 B$ g. }3 w8 y1 n# [7 N // 校验和为:湿度高位+湿度低位+温度高位+温度低位
$ Q& }; l; ?% p% C+ T for(i=0;i<5;i++)
( I. c! v/ q1 l) H) F8 P {
1 W6 B, U4 l1 q7 Z Sensor_Data = Read_SensorData();
5 k) z H) o8 l$ R5 Y }) J" T# L* n& b, a* L
}6 {9 l7 y% a( s
else
# u X& T+ ?' R5 D {
6 m+ K- g* {+ i2 s Sensor_AnswerFlag = 0; // 未收到传感器响应
F* e, q, G& q6 b }2 y% P9 m" A5 _4 }& W: F
return 1;
* P$ l7 J% i7 M3 U}
}: o4 F- {1 Kvoid display()- l+ V; @: E0 X9 [2 o+ N1 n7 u
{. x6 @$ K7 L" [
Tmp = Sensor_Data[2]*256+Sensor_Data[3];9 v0 @9 a3 n3 Y. j& i/ T6 h8 J
diyihang(6);2 l7 D1 k: Z+ @: c [; P
/*write_date(Tmp/100%10 + '0');. ? t# O3 a2 e1 `
write_date(Tmp/10%10 + '0');+ a4 m( j4 W0 X( z: V3 z% R
write_date('.');% ]: F# ?" Y& b0 p- j3 e
write_date(Tmp%10 + '0'); */+ J+ i" {+ B, B* A" _& a
1 [# I1 o) g* [4 l7 S& j. Y+ M7 R
Tmp = Sensor_Data[0]*256+Sensor_Data[1];$ ]3 E; n. |2 X! b6 D% j
dierhang(6);
" s! i5 p% A* R' D3 C8 e write_date(Tmp/100%10 + '0');! J8 c6 N; J; P: R
write_date(Tmp/10%10 + '0');
9 M& W# i* T" `" T* S# F" @ write_date('.');- d$ F) g- a+ X
write_date(Tmp%10 + '0');
3 }6 n( E- U1 `9 Q}
& H+ S, I% r( w1 ^3 j9 Xvoid check_and_display()
/ r4 t4 G' v! w9 S( X) @{" t- C4 c+ O( p7 T- C2 q$ ~
if(Sensor_AnswerFlag == 1)
$ W9 Z8 ?. {$ M$ e3 g1 m: Z( Q {
! p: ^9 m% c8 L5 w) X" t Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];
8 l3 Z4 E# X( q: n- {! s7 A) A //校验成功
# D2 Z, n: {2 G if(Sensor_Check ==Sensor_Data[4])
1 ^6 s: R7 w+ j5 c+ I. T2 B {
6 E! K: B' ~6 [0 x. B if(flag == 1)4 [3 r6 Z \9 K- K+ i* T8 g
{$ m) }: `) p. V4 N
flag = 0;
6 [6 Q! w. P8 s- C9 } write_com(0x01);//清屏
! r; E' R8 e+ l; s) Y$ V! R2 Z diyihang(1);//显示位置
- a0 J: k c0 c. ~7 l D for(num=0;num<11;num++)
+ c6 u/ C$ R8 o+ i' \/ m {! l; d& g5 w% z5 E# c/ }/ N
write_date(table[num]);
! g/ W; s1 H$ D: `$ ? //delay(10);8 Z' f) ]/ _& G9 t7 W+ P8 K
}
: r4 K' {, F0 G2 n7 C3 n! } dierhang(1);//换行显示
, G" b+ a! S0 R, X$ V1 M/ u for(num=0;num<10;num++)
) H" X9 e# q& `) J {3 P5 c+ n$ h6 p* }; D9 s0 `
write_date(table1[num]);
7 E$ L& R3 @4 C) a% |2 D/ Z //delay(10);: |8 C8 j4 R" y! @1 X
} N$ k. w4 _; ~; F% e
}
+ @9 \! ~$ K5 D+ f display();
! k; F' X4 Q9 i- J1 c }
$ _8 P' r8 q: p8 d; o- i1 `$ b else //校验失败 M) G* X# N1 w& D+ n4 N( |
{
& L" p' Z# p5 X0 \8 y* w6 |4 m, k e3 T write_com(0x01);//清屏& ]) s5 k' W# [8 g4 K% @) i0 [
diyihang(1);//显示位置
6 i& D! X7 F9 j2 b( u for(num=0;num<11;num++)! z) O9 v3 L4 ~
{: b( u' p* q) ?
write_date(table4[num]);
$ x, U, h/ z& p1 P //delay(10);: \$ _0 R0 w0 S0 F; {) z, q
}
% K! Q" R- H2 Y8 O4 a! A- K flag=1;: d8 Q3 G0 b' I
}; r3 F) R1 `% s! F: `' Q0 {- N
}
$ ^4 A- G$ X0 w5 U! O$ d else //没有连接上( S; n$ a3 ?- U
{
; t7 j, V( b5 Y/ K+ y9 t' V key_set=0;
1 t4 V+ {( q' E9 R* L write_com(0x01);//清屏- f; f' m7 t& T4 @9 R* C
diyihang(1);//显示位置
$ k' Y) l9 L' p* ~$ ^! i3 s for(num=0;num<10;num++)! @2 K- U9 C4 K8 {2 x
{( Z2 ^* V) A3 P. J# A6 n' ~4 g# h
write_date(table2[num]);) _. w* t3 @9 E* _+ g+ O
//delay(10);8 A9 t( V+ _9 l* g% ^3 h
}. E9 s `1 \3 P _3 \, v1 v
dierhang(1);//换行显示5 o: O0 [$ |! K' K
for(num=0;num<9;num++)' ~9 n6 E" m* R- `$ c
{
% M- Q! S. b" m% q write_date(table3[num]);
. a2 y% Y- R3 _; a7 [ //delay(10);
$ k# i* b& r" M9 r- V. M+ @ Y }4 Z3 M) z! E* S9 R1 K; [- v& _
flag=1;0 W' F' j( U$ a8 `1 {& C
} : _3 c# N0 j6 M$ j8 k4 Y: w. S3 d/ K
}4 F% J: L! l: o' C. \
/ }; |; V z: T% v# u
/*void init_t0()4 q1 B" h4 H6 I0 x$ |5 ~
{
% v6 I2 d" l. I) T7 } TMOD=0x01;
7 u7 F0 d; F0 E0 V* ? TH0=(65536-50000)/256;: D0 H5 e" p6 H5 n7 j3 i4 }# b& j: f
TL0=(65536-50000)%256;
8 h' C6 v( t2 v' V EA=1;9 p: g7 k7 l, T) v/ R# X
ET0=1;0 g" r: @* w8 l6 H3 Z
TR0=1;
7 p7 C, }2 D, l* l, ~9 Z; C: Z}*/
. j$ N) f4 H7 C, l7 j w; M" F' s1 m1 a# c/ V1 p
void main()
) M1 C4 W' u) N{
z! t2 z2 A$ v2 O: g init_1602();5 J1 k- b4 y5 S o0 z* s: m2 z
while(1)7 x# y2 Y3 O+ C& T! C. X1 X
{
* c* y: O2 A" X" t' G Delay_N1ms(2000); // 延时 2S(两次读取间隔至少2S)
/ c, f8 u4 { E( C Clear_Data(); // 清除收到数据1 t. `- Y5 m6 w# |7 K( l
Read_Sensor(); // 读取传感器数据4 L2 _# z) i- K5 X
check_and_display(); // 检测并显示数据
( y; w h8 ~* J: G( _ }9 A/ D0 R% C& L
}6 u& z9 l7 N m" w3 A. `5 x
…………
7 |. N( M& U) l# x: X…………限于本文篇幅 余下代码请从eda365.com下载附件…………
5 K4 T- w$ G6 k' ?$ O |
|