找回密码
 注册
关于网站域名变更的通知
查看: 333|回复: 1
打印 上一主题 下一主题

 AM2302湿度测量单片机源程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-6 07:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 Zedd 于 2018-11-7 10:09 编辑 . _# M) C1 G, f/ W* j

+ v9 k; {# E0 X- J9 Y
AM2302湿度测量单片机源程序
0 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
游客,如果您要查看本帖隐藏内容请回复

该用户从未签到

2#
发表于 2019-1-10 17:06 | 只看该作者
看看楼主的代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-3 15:19 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表