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

 AM2302湿度测量单片机源程序

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 Zedd 于 2018-11-7 10:09 编辑 ) s# E' f! T- Q' f* U
9 m% T: @9 r+ V: o5 q, n. }
AM2302湿度测量单片机源程序
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
游客,如果您要查看本帖隐藏内容请回复

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-11 04:36 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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