|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Zedd 于 2018-11-7 10:09 编辑 . _# M) C1 G, f/ W* j
+ v9 k; {# E0 X- J9 Y0 R2 k) F2 M9 |" o* I( h+ T8 i
使用AM2302温湿度传感器模块,达到测量湿度和温度目的,并在1602上显示出来。' m4 Y9 i" o9 z
! n- Z/ u* R+ V8 }5 L! d" }8 E# r
单片机源程序如下: |
7 g# W/ `; V8 B5 i" a* D/ f#include<reg52.h>
+ O% K" k& G2 \7 j3 m#include <intrins.h>; B' X# Z3 ?4 V6 j
#define uint unsigned int: r% i' R% e# m/ Y
#define uchar unsigned char
2 l) Z) P) O1 p/ g$ e5 h |6 N
9 N2 @7 I( U" u/ Fuchar code table[]=" WELCOME ";; F2 O5 w$ W, F2 ?0 @3 [" b& w
uchar code table1[]="RH: %";+ }" x* h1 {) g" d
uchar code table2[]="Sensor Not";
) ]2 z. X) }- Auchar code table3[]="Connected";
! r( `$ C6 Z5 J+ Y# ^uchar code table4[]="Check wrong";
, K: ]4 x1 r! D" ^9 s& x5 e1 f3 ^# g/ {. N; e! Z" a
sbit Sensor_SDA = P2^0;& V4 L; f# o( l7 m( t
& k( b2 U1 Y2 b/ d0 s5 X c Rsbit key_set=P2^1;, d' v; E2 t7 D" x2 y& D9 K1 o/ P
sbit key_up=P2^2;- ?) a) f3 p$ D7 u% P& X- j: {! S
sbit key_down=P2^3;! m4 v1 U( [: P/ Q
sbit key_ok=P2^4;6 C, K% i8 B: [; y
0 w" [% d. g5 g+ ] zsbit lcdrs=P2^6;8 d' Q; @# h( t% \& M
sbit lcdwr=P2^5;1 y- [/ @ `/ L
sbit lcden=P2^7;
0 {7 l) `# H3 P4 k- i4 N$ i2 s0 h' y# v1 Q) P' i
uchar Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};* y: v5 q3 ~9 l2 W
uchar Sensor_AnsweRFlag; //收到起始标志位! B0 S. j, O$ t
uchar Sensor_ErrorFlag; //读取传感器错误标志: Y) z5 a) F" _# v2 C) s& a1 w
uchar Sensor_Check; //校验和# ^9 m8 k- c- _# n4 t, z3 d
uint Sys_CNT;$ @, U. F, x1 F% I& X* _
uint Tmp;
( B+ A0 J- f0 p, o9 Suint t0;
, b& I" g6 g. ] \7 {/ s- w) W) V" Luchar num;
7 \. o- }" z9 c. L; q9 z4 V/ a, juchar flag;
3 W( E; ^- j" \* a9 m" d; R* ~1 A9 E9 Z# s
void delay(uint z)
9 _2 M* K/ p: c2 H{
: M' h( a* s1 ?% T q7 b, R uint x,y;
1 e; o" T: U: l1 K for(x=z;x>0;x--)
& B: \& L5 @, H8 l9 L5 \, J9 u for(y=123;y>0;y--);* E9 \0 ]& n& G
}
3 R* G- x8 j- z% Y0 K* j5 p. y( o# m+ h3 G
/********************************************\* K7 k5 O( B$ }& L( c- ]
|* 功能: 延时 晶振为12M时 *|! X" g4 |. g0 B0 ?: W
|* t = 1 为 20us 然后成倍增加10us左右 *|
0 `: L! l& Q1 U0 l4 b+ P/ h\********************************************/
+ q' |$ j; F. s! A/ Q- {void Delay_N10us(unsigned char t), C& y' Q0 ?* M% U- E
{( S! U% S9 w8 b
while(t--)( i( }: `3 r4 _2 \3 ]
{3 j$ ^; l- y4 |' m5 w
_nop_();/ Z- c) _; L. b' ]) ~% n
}
. X3 Z8 o# y- ~7 ~9 r6 E}- L8 O2 ]) e7 [2 Y0 U& L! M2 c* p
/********************************************\
" F: o$ r; e2 K1 R/ V" Y- `7 z|* 功能: 延时 晶振为12M时 *|
. B; [) a! j: [* ~|* 延时大约 1ms *|( e, z- J, D: `( o N/ w8 a
\********************************************/ 8 Z6 I/ J; `3 d D6 B" B& _! a. S3 p
void Delay_N1ms(unsigned int t)" A- d @7 A$ v1 P# E8 X: c
{
' U" F+ w+ I+ ~& q+ ] unsigned int i; A6 f6 _! K' x4 I1 V6 x C0 ]
unsigned int j;1 p* P5 }% O0 y( g' P: {
for(j=t;j>0;j--)" z! P5 M+ [; k4 M; T5 ]& R
for(i=124;i>0;i--); //延时大约 1ms
- t4 k1 W7 L7 r5 g( k- {6 ~$ x}0 q+ Q4 n; o; B- Z* H; g- X1 q7 p' N' W
void write_com(uchar com)
7 `0 R+ r8 g* E7 P8 i6 P{5 a- g3 d+ Q' |' p- [0 t
lcdrs=0;
: Y4 P( \5 a/ K) p1 N. T9 D P0=com;' S/ L9 ~' ]$ j4 i
lcden=1;. B. k) l& p1 N1 F3 l
delay(5);7 u; e' A" \8 U8 I
lcden=0;+ E" [, d- j( G8 i+ [, o
}4 G' D4 U% s8 e! M4 {2 ~+ r
void write_date(uchar date)
2 G+ [5 v6 Z0 s- R( S8 E1 O' T{: _+ u( B3 b" a* V9 l& j; o) ]
lcdrs=1;3 L0 H; P( Z1 D6 T
P0=date;% Q) W6 {. J, Z. K
lcden=1;5 h |/ J8 O0 j
delay(5);7 }) u9 ~" k& w, X0 }5 S8 b, S+ x
lcden=0;
$ c: O9 i! B: W; N}
( _# ?8 n1 i3 k% s7 k7 V/ Uvoid diyihang(uint z)
) E, v+ Q* n# `4 t9 M{
, N% {9 k+ d: y7 ] z--;: w7 Q: i# |) ~ j
write_com(0x80+z);
) u* E9 G% b2 T} ; N- T0 S$ H% A# S: @& ^; a
void dierhang(uint z)
2 G" |8 r2 X0 A$ _{' x$ }( [2 R) ]( A, G0 f) R) v! C+ H
z--;% i0 U. X( i0 h
write_com(0x80+0x40+z);
8 }( k2 a- ^9 n$ M4 M$ T0 s$ g- ~}
, t% `# P3 f* |& r) T j+ h) h1 g$ Svoid init_1602()
+ m( _5 h5 w9 ]' y8 j4 }{7 G$ W$ b) e: l- r$ L) u+ J
lcdwr=0;; Q! w" i" z- G* w! r+ ^
lcden=0;! q, H# P& u. k6 _( E3 i9 N
write_com(0x38);//模式* y0 S+ w1 x( W, N2 a' O
write_com(0x0c);//无光标不闪6 t$ v0 y& @/ _, q: `- g5 o7 R
write_com(0x01);//清屏4 L' _0 w! Z# I2 n' t
diyihang(1);//显示位置2 a& o* u/ n9 i8 J+ l
for(num=0;num<11;num++)
]' _( c1 b2 |. t8 t6 G. e {& ~% Y) f4 t( F0 U# O" ~' ~
write_date(table[num]);( v+ n' `: ?4 z( I
//delay(10);4 s; k( ]1 |3 t- @
}% `, a$ y( i# a, d$ Q
dierhang(1);//换行显示
3 |; f3 s. ~' D for(num=0;num<10;num++)
% u/ f. H4 X2 `. D) P {# Y/ z, o% ]- \% A
write_date(table1[num]);
" f5 S# Q( d: A4 X0 z9 _ X //delay(10);$ C; |2 J9 ~7 r) d, h' p+ @! k
}% w- v" C4 ?3 M# T3 }! q
}' L8 J o' B( {4 A* O
void Clear_Data (void)
3 e7 g; t5 C' E{
5 g6 G5 |# E; F: G, s+ M int i; x2 ]( G9 B. q$ _
for(i=0;i<5;i++)
7 A1 E1 Z4 {& n$ u, G$ u6 u5 i {
, n5 l C( a3 s Sensor_Data = 0x00;# B( q$ L' k' p- t4 r/ W
}//接收数据清零
! v/ {' f" v. y* v}2 f e: c! m3 h; r: ^
z8 ?& }! r1 } K
6 ]: T/ ^2 |. Y: B/********************************************\- ?- s: x/ S e1 ]0 o
|* 功能: 读传感器发送的单个字节 *|
: r! k" M$ ^" b& N6 E3 V\********************************************// x3 `3 {2 h L
unsigned char Read_SensorData(void)
" z0 P+ b2 k% ~9 s' }$ o! h" H{; m# {* w6 m( ]8 P* e
unsigned char i,cnt;: R3 U: T }5 b7 M0 v
unsigned char buffer,tmp;
7 a9 m% A; u( E: Q2 {$ _# s buffer = 0;6 m; E8 O4 v1 F1 r9 H$ ?! V( V9 \
for(i=0;i<8;i++)) v* Z" g. H( {- p- V0 z; L
{3 U+ E0 v7 H/ Z
cnt=0;! _8 k5 Y" ^6 [# d* R
while(!Sensor_SDA) //检测上次低电平是否结束$ {) a) K% W! b- V* ?- ]! E
{* g1 F9 T$ A" [8 r R' u7 i+ I. @
if(++cnt >= 300)
0 q8 o( |3 _& j9 O5 k' F {8 h/ D( T E0 s. e2 N. f) m; P* T! V
break;; z4 Y: z' k: }4 |
}
. Z# B9 ~% D) t V/ C- h( b }- P6 J4 N" {+ R2 A
//延时Min=26us Max50us 跳过数据"0" 的高电平5 q$ A, ~. Z; U
Delay_N10us(2); //延时30us
/ Q& p, h' k& J- U6 e$ |( o, u% M
2 D) [3 `* d# | //判断传感器发送数据位
1 I4 \3 H# x$ f# y7 J$ r; F tmp =0;
7 X( `4 l! @/ x- ^+ | if(Sensor_SDA)
- r5 h8 H& d( y0 E1 {; g {! m4 M; Q- c3 g7 g' H
tmp = 1;
X0 ^5 y5 [" F! a9 w& f } . o: i* O6 T7 S- p
cnt =0;3 @0 X& u3 H# G5 Y$ y
while(Sensor_SDA) //等待高电平 结束/ S( y* U' A, [. V% _ p
{
! C4 Q' d2 s( f0 ]" y: d if(++cnt >= 200)8 I* [. j& v' l
{! k/ ^% p# a! Y: I0 C0 d" b. B) q
break;4 ?; l2 I$ n# I5 l- w) {+ i$ {
}8 Z- @- M5 z4 J1 v
}
' S1 k- o2 H) v9 s buffer <<=1;
8 O% ?9 ?" w/ U' j4 ` buffer |= tmp; ) O2 `1 Y% _8 F' ]2 U
}
: ~* m5 h- l. y1 i$ c. O2 p return buffer;
: p5 q# a6 W) Y5 H' i }8 Z+ g* e, T l" k a
$ b+ G* E+ K/ j/ L+ U
/********************************************\( W7 l) @& P- s' x( U1 G9 S
|* 功能: 读传感器 *|- b% E2 d; S) i8 m) V. N
\********************************************/' E' c3 ]. x! e2 k1 P
unsigned char Read_Sensor(void)5 m' G x7 A/ m* e- \1 J i- W. X
{
* Y$ N8 g; ?! K: _ unsigned char i;
) k5 b/ I* L$ s6 p5 ~! | K //主机拉低(Min=800US Max=20Ms)
3 |( ?1 d, l4 |6 M Sensor_SDA = 0;; t/ Y9 D/ u; ?# t1 ^
Delay_N1ms(2); //延时2Ms
8 |- S+ B/ h. q- A8 M
2 `! T+ P* O" o# {, A+ J //释放总线 延时(Min=30us Max=50us)! E" e3 L# b7 V& E- {7 D
Sensor_SDA = 1;
! ?% W9 O9 `0 N; k' h, v Delay_N10us(1);//延时30us
" L" m& E7 d" F" _ //主机设为输入 判断传感器响应信号
6 k4 g: c, }* h# m Sensor_SDA = 1;
$ M! p" u& R! x$ ]3 B2 P- m
! _5 D% W# F: P Sensor_AnswerFlag = 0; // 传感器响应标志
/ k" _) r& W; G; ]4 D
+ y3 x- X8 K" {4 F6 q3 Q& P# X //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 . @( q9 `: o8 \9 A9 q# I
if(Sensor_SDA == 0)
; w W6 y) ]/ C9 h, P8 N {6 f" W& r) k- `: P2 g
Sensor_AnswerFlag = 1;//收到起始信号
! k4 M9 I! T0 o) B
& W4 d4 T1 O" L Sys_CNT = 0;" k: J* _2 }# U7 s. U
//判断从机是否发出 80us 的低电平响应信号是否结束
! Z$ i1 E+ {% Q while((!Sensor_SDA))* E& G& Q1 [! |. {
{; ?$ K: X( y4 F3 l
if(++Sys_CNT>300) //防止进入死循环
, V7 j' l* {: [. C" X; h% b$ h' g { K0 T+ z, y2 z
Sensor_ErrorFlag = 1;6 n& ]* } Q1 P2 c6 [
return 0;
+ L. X2 J: I2 ?5 g m, p }
% b6 K1 e- y2 @2 y5 V9 J5 q1 m0 j }
- B. E1 _, }. \; c! Q Q7 \
D" n" i9 k2 ] b/ k Sys_CNT = 0;2 {. p: x& a$ b/ s# o& J! K
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态: u$ C% o+ P% y: \
while((Sensor_SDA))( M+ _, J t9 O- l6 y
{
" x8 J! p$ N o9 E/ U% q if(++Sys_CNT>300) //防止进入死循环3 Y, ]. [% [1 Q# S- f3 k6 s# b' L( Z
{
8 ~8 B& t, J& S7 b Sensor_ErrorFlag = 1;) g% W. C$ g; d' h- \& l' C
return 0;" I3 k5 k5 ~# D. _( i
}
+ l% } F2 s6 F }
9 h: r9 y, \( v+ y. L // 数据接收 传感器共发送40位数据
5 l. n! M3 c' X3 ^" {* k7 _ // 即5个字节 高位先送 5个字节分别为湿度高位 湿度低位 温度高位 温度低位 校验和& ]. t9 M' O! s; h
// 校验和为:湿度高位+湿度低位+温度高位+温度低位
9 B v6 N5 v! Q$ r9 c for(i=0;i<5;i++)
# ?4 C) o( R. b% S% M {
: O! c/ t J2 K, p Sensor_Data = Read_SensorData();
1 @, c/ s* `! c7 h8 @- n4 L9 O }
7 r% R9 t: s3 _% c9 ~& p, N0 t }$ R- C( M+ d# w* y8 P O
else( r, r1 b" H1 g# S8 h, ]
{
% s; w& C' L8 j6 L x4 J [- | Sensor_AnswerFlag = 0; // 未收到传感器响应 2 y; o; |3 c9 Y y( Y
}! [. J- h3 ]4 e: X7 I3 `6 s
return 1;
8 C+ Q% j! @' b, ^}
4 L( d# l' [5 l- b9 S8 t% c( Rvoid display()" y* w6 ~9 A! L7 i7 r$ q6 t
{! b1 i7 {1 x3 M+ z) A, q0 A. b
Tmp = Sensor_Data[2]*256+Sensor_Data[3];
6 R- |& ~8 g& Q( }: N! T" ` diyihang(6);1 f$ x3 p3 I" |1 }& ~3 P% a0 |
/*write_date(Tmp/100%10 + '0');
! B& ~2 O- E$ f3 k b1 } write_date(Tmp/10%10 + '0');- |" ^0 A. A' L
write_date('.');
9 e7 ^+ H! ^1 |& V( X write_date(Tmp%10 + '0'); */2 G( t; n* W$ W9 U2 |# i& O) N! z% [
1 L t B" M0 G# I* a& n/ m/ t Tmp = Sensor_Data[0]*256+Sensor_Data[1];
7 x. [5 `( s1 q9 ? dierhang(6);( h& `5 m7 z/ R. M
write_date(Tmp/100%10 + '0');) o8 w; G) M t/ }
write_date(Tmp/10%10 + '0');
7 H2 J/ `* j: R write_date('.');& R1 h& I+ s% I8 Y5 r
write_date(Tmp%10 + '0');* X a, s# y' c. J E$ d
}5 _5 S8 w# J; s \5 m9 P
void check_and_display()- a* N0 I% P0 U; v& C
{4 a) ?; v6 _8 L1 N+ G& K9 Z
if(Sensor_AnswerFlag == 1)5 e4 G3 [) T8 f' y% m
{
2 T: O- O+ p( Y z5 u Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];1 r0 Z: k& D" I4 z
//校验成功
, q r0 I, p$ F1 c+ z1 v% C) w if(Sensor_Check ==Sensor_Data[4]) 9 _: o% A1 O" l- ^6 w, C* j( R
{4 ?$ E( b2 e B1 R V
if(flag == 1)# d/ O9 C9 O0 y* {" I0 _
{
% V. D+ n+ a% b6 a1 f. @ flag = 0;
2 l" N0 y$ l+ [, I' _ write_com(0x01);//清屏
9 R2 V, K5 [1 ~* O diyihang(1);//显示位置9 L! r3 ^5 m, s1 `& g9 \
for(num=0;num<11;num++)
; f% {7 p3 v; Z `/ l; ? {
6 N$ d9 U8 z0 U write_date(table[num]);! t0 t/ V. e+ M5 t
//delay(10);8 C. F, \( ~" ^ u" ]# `; T6 O4 n' A
}, L$ D" i2 z5 p4 O0 T
dierhang(1);//换行显示
. K+ Z! [3 S# a/ R1 {3 ` for(num=0;num<10;num++)
4 `1 O# c) A* k2 g {0 S9 i- W2 }, y# v. E) L. k
write_date(table1[num]); 2 l4 P& j8 J: o# L' D. t* } Z
//delay(10);
* D3 P2 E+ m+ G. V8 h; }& V. a }8 M& O! b& M: p, u! \! A
}& v0 o j3 [9 ~% _; b* \3 B7 Q1 n, u
display();( W5 J) ^2 i# K% o. G3 Y% \, o4 G0 H
}
! N2 @8 l: a. I0 w else //校验失败
' F+ P! \4 S: H0 Z7 L9 T8 j {
' e7 u9 Z' Z1 O# c) Q write_com(0x01);//清屏$ m T- V2 z2 r' X
diyihang(1);//显示位置
, I8 R A3 l# ?* K/ q9 H for(num=0;num<11;num++)0 U) f5 J. {; o* m3 |
{9 j0 U+ b' |& E u# G* b: z% h c
write_date(table4[num]);
9 X8 X7 L4 E4 ` //delay(10);
, E6 U% W; F4 f% C% ^: P }
$ b' f$ {* x# e. f flag=1;; g; [; L/ @0 h; Y1 M7 L2 S
}
/ A7 }5 k- u, p8 y) t }
4 J0 K5 Y. r# B' A$ Y& _' Y. s$ [8 E else //没有连接上" T/ `* J3 o: s4 H, A' C& g( q
{
* ~; M" l: B9 f2 ]8 b4 E- i key_set=0;$ }4 }$ ^( I! {7 e) V
write_com(0x01);//清屏- F+ {' R! b8 b9 P
diyihang(1);//显示位置' H& g# Y, t& f
for(num=0;num<10;num++)
) q; ]" G6 a) j0 @4 s8 X2 G* e {
7 U& T& B7 t1 J0 P! A write_date(table2[num]);
( I1 K" f: R% s9 ~ //delay(10);
% [# u* C" J7 B' v4 S1 D5 {2 S }
1 ?9 w" B: N/ m4 h dierhang(1);//换行显示8 q) s5 @; ~- L# U$ s+ z0 z% Y0 P3 N
for(num=0;num<9;num++)
4 e: G1 [) M' [4 C' r3 Z {: E7 [' Y p# ?. F3 Q
write_date(table3[num]); 0 m" Q) b' w% r# h; r; }2 F
//delay(10);
5 x) k3 N9 H0 X& h8 S) U) Q8 z, D }2 ]" D0 Q1 C) P( o7 D- M3 Q
flag=1;. m3 ?: s: O6 a4 C4 h
}
4 [' ?4 Y1 C4 g1 ~5 W( X, D}3 g6 S% K/ V% p) N* @! r8 x% v( b
) H2 D- p0 t: S$ R3 M/*void init_t0()1 V b3 v8 x7 E! \3 T* C5 k! o
{0 z% _& P+ D3 I7 ]0 h1 I
TMOD=0x01;
, w; E7 X7 E2 D& \ TH0=(65536-50000)/256;8 C" C ?! K8 A& S) M7 q% A
TL0=(65536-50000)%256;
0 L; W: x8 t8 \. H7 m/ C% E EA=1;
6 g: W5 b; c! L7 T$ \ ET0=1;- _/ Y; c$ q7 R" S; ~% B$ O
TR0=1;" D* J% \9 ?4 }" Z5 v [: p! n
}*/
/ O h" l( i) A! c/ ~8 C# z3 l. D
8 [5 h- {* T Z3 b5 @void main(), _* c+ ^3 H. s: M7 h* q8 |$ y
{
H+ B) D8 M5 _" c init_1602();( F) z! d$ @' J) U* f
while(1)
5 G& c# T6 Y& ]# z {( o2 X [. W% |
Delay_N1ms(2000); // 延时 2S(两次读取间隔至少2S)
! D& t! \6 _* s |0 Q3 X Clear_Data(); // 清除收到数据
- y/ [8 N9 d1 b$ l* h Read_Sensor(); // 读取传感器数据! N: H$ V7 x& A" `4 i
check_and_display(); // 检测并显示数据 * C1 T# _) o$ u$ X5 T, G6 K/ p
}! {6 v6 N+ O, S! J2 y
}
" z% j( ~, m* g5 n3 f$ b0 v…………
) w6 q' m5 ]0 ~…………限于本文篇幅 余下代码请从eda365.com下载附件…………' P; J- E6 {- s2 N
|
|