1、基于51单片机的AM2301温湿度传感器在LCD1602上显示驱动程序带实物图AM2301温湿度传感器模块AM2301数字温湿度传感器是一各包括有数字校准输出的温湿度传感器。它采用独特的数字采集模块和高新温湿度采集传感技术,可以确保产品可靠性高以及稳定性好。该款传感器具有响应快、抗干扰力强、性价比高、品质卓越等优点。以及超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用的最佳选则。9AM2301 引脚图图3-10 AM2301引脚图AM2301各引脚说明表3-7 AM2301引脚引脚颜色名称注释1红色VDD供电 3.3-5.5VDC2黄色SDA串行数据,单总线3黑色GND接地
2、,电源负极4NC空脚,请悬空(不要接Vcc或Gnd)AM2301 技术参数表3-8 AM2301技术参数参数条件MinTypMax单位湿度分辨率0.1%RH16Bit重复性1%RH精度253%RH0505%RH互换性可完全互换采样周期12S响应时间1/e(63%)25,1m/s 空气2S迟滞0.3%RH长期稳定性典型值1%RH/yr温度分辨率0.116Bit重复性0.5精度1量程范围-4080响应时间1/e(63%)620SAM2301 驱动电路图3-11 AM2301驱动电路图温湿度传感器模块流程设计用户主机(MCU)发送一次开始信号后,AM2301自动从休眠模式转换到高速模式。等待主机开始
3、,信号发送后,AM2301发送响应信号,送出40比特的数据,发送数据结束之后触发一次信号采集,对外部环境进行数据采集,采集结束传感器自动转入休眠模式,直到下一次通信信号的来临。此时AM2301的SDA数据线由上拉电阻拉高,一直保持高电平,且AM2301的SDA引脚处于输入状态,时刻检测外部信号。一旦接收到主机发送的信号,再次进入采集状态,对外部数据进行一次采集。整个过程流程图如下:图4-10温湿度传感器流程图1602 LCD显示屏测试根据第三章说明的LCD硬件连线要求,将屏幕的14个接口按要求分别连接至单片机的各端口,确认无误后,个单片机上电,并将编完的程序通过STC-ISP软件烧入到单片机中
4、,连线图如下:图5-3 LCD1602连线图 给单片机上电之后,屏幕显示如下:图5-4 LCD1602显示效果 该LCD显示屏能正常显示预期设置字幕。AM2301温湿度传感器测试根据温湿度传感器驱动电路,实物连接图如下:图5-7 AM2301连线图给单片机上电,则可在LCD屏幕上得到如下数据:图5-8 AM2301采集数据LCD屏幕第一行显示当前室内湿度情况,第二行显示当前室内温度情况,若用吹风机对其吹风,则温湿度会相应变化。附录主要程序源代码:1.REG52.H/*-REG52.HHeader file for generic 80C52 and 80C32 microcontroller.
5、Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.-*/#ifndef _REG52_H_#define _REG52_H_/* BYTE Registers */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0
6、x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* 8052 Extensions */sfr T2CON = 0xC8;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;sfr TH2 = 0xCD;/* BIT Registers */* PSW */sbit CY = PSW
7、7;sbit AC = PSW6;sbit F0 = PSW5;sbit RS1 = PSW4;sbit RS0 = PSW3;sbit OV = PSW2;sbit P = PSW0; /8052 only/* TCON */sbit TF1 = TCON7;sbit TR1 = TCON6;sbit TF0 = TCON5;sbit TR0 = TCON4;sbit IE1 = TCON3;sbit IT1 = TCON2;sbit IE0 = TCON1;sbit IT0 = TCON0;/* IE */sbit EA = IE7;sbit ET2 = IE5; /8052 onlysb
8、it ES = IE4;sbit ET1 = IE3;sbit EX1 = IE2;sbit ET0 = IE1;sbit EX0 = IE0;/* IP */sbit PT2 = IP5;sbit PS = IP4;sbit PT1 = IP3;sbit PX1 = IP2;sbit PT0 = IP1;sbit PX0 = IP0;/* P3 */sbit RD = P37;sbit WR = P36;sbit T1 = P35;sbit T0 = P34;sbit INT1 = P33;sbit INT0 = P32;sbit TXD = P31;sbit RXD = P30;/* SC
9、ON */sbit SM0 = SCON7;sbit SM1 = SCON6;sbit SM2 = SCON5;sbit REN = SCON4;sbit TB8 = SCON3;sbit RB8 = SCON2;sbit TI = SCON1;sbit RI = SCON0;/* P1 */sbit T2EX = P11; / 8052 onlysbit T2 = P10; / 8052 only /* T2CON */sbit TF2 = T2CON7;sbit EXF2 = T2CON6;sbit RCLK = T2CON5;sbit TCLK = T2CON4;sbit EXEN2 =
10、 T2CON3;sbit TR2 = T2CON2;sbit C_T2 = T2CON1;sbit CP_RL2 = T2CON0;#endif2.INTRINS.H/*-INTRINS.HIntrinsic functions for C51.Copyright (c) 1988-2004 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.-*/#ifndef _INTRINS_H_#define _INTRINS_H_extern void _nop_ (void);extern bit _testbit_ (b
11、it);extern unsigned char _cror_ (unsigned char, unsigned char);extern unsigned int _iror_ (unsigned int, unsigned char);extern unsigned long _lror_ (unsigned long, unsigned char);extern unsigned char _crol_ (unsigned char, unsigned char);extern unsigned int _irol_ (unsigned int, unsigned char);exter
12、n unsigned long _lrol_ (unsigned long, unsigned char);extern unsigned char _chkfloat_(float);extern void _push_ (unsigned char _sfr);extern void _pop_ (unsigned char _sfr);#endif3.STDIO.H/*-STDIO.HPrototypes for standard I/O functions.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, I
13、nc.All rights reserved.-*/#ifndef _STDIO_H_#define _STDIO_H_#ifndef EOF #define EOF -1#endif#ifndef NULL #define NULL (void *) 0)#endif#ifndef _SIZE_T #define _SIZE_T typedef unsigned int size_t;#endif#pragma SAVE#pragma REGPARMSextern char _getkey (void);extern char getchar (void);extern char unget
14、char (char);extern char putchar (char);extern int printf (const char *, .);extern int sprintf (char *, const char *, .);extern int vprintf (const char *, char *);extern int vsprintf (char *, const char *, char *);extern char *gets (char *, int n);extern int scanf (const char *, .);extern int sscanf
15、(char *, const char *, .);extern int puts (const char *);#pragma RESTORE#endif4.LCD1602.H#include #ifndef _LCD1602_H_H#define _LCD1602_H_H#define uchar unsigned char#define uint unsigned int/-函数声明-void delayms(uchar z);void writecmd(uchar com);void writedata(uchar dat);void init_LCD();/-函数声明结束-/1602
16、端口定义sbit RS = P24 ; /数据命令选择端(H/L)sbit RW = P25 ;/读写选择端(H/L)sbit E=P26;/* /自定义的字符(5X8) uchar code tab1=0x03,0x05,0x19,0x19,0x19,0x05,0x03,0x00;/小喇叭uchar code tab2=0x08,0x0f,0x12,0x0f,0x0a,0x1F,0x02,0x02,;/年uchar code tab3=0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00;/月uchar code tab4=0x00,0x1F,0x11,0x1F,0
17、x11,0x11,0x1F,0x00;/日uchar code tab5=0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00;/C(温度符号)*/*void lcd_pos(uchar pos)/设定显示位置 lcd_wcmd(pos | 0x80) ;*/void delayms(uchar z) /延时函数 uint i,j; for(i=z;i0;i-) for(j=100;j0;j-); void writecmd(uchar com) /写指令 RS=0; RW=0; E=0; delayms(1); P0=com; delayms(1); E=1; de
18、layms(1); E=0;void writedata(uchar dat) /写数据 RS=1; RW=0; E=0; delayms(1); P0=dat; delayms(1); E=1; delayms(1); E=0; /* 写汉字编码到CGRAM函数 *void writetab() unsigned char i ; lcd_wcmd(0x40) ; /写CGRAM for (i = 0 ; i 8 ; i+) lcd_wdat(mytab1 i ) ; */void init_LCD() /初始化1602 delayms(15); writecmd(0x38); /不检测忙信
19、号 delayms(5); writecmd(0x38); /不检测忙信号 delayms(5); writecmd(0x38); /不检测忙信号 delayms(5); writecmd(0x38); /显示模式设置 delayms(5); writecmd(0x01); /显示清屏 delayms(5); writecmd(0x06); /显示光标移动设置 delayms(5); writecmd(0x0c); /显示开及光标设置 delayms(5);/* writetab() ; /自定义字符写入CGRAM delay(5) ; lcd_pos(0x4d) ; lcd_wdat(0x0
20、0) ; /显示自定义字符*/#endif5.主程序#include #include #include #include lcd1602.htypedef unsigned char U8; /* 无符号8位整型变量 */typedef signed char S8; /* 有符号8位整型变量 */typedef unsigned int U16; /* 无符号16位整型变量 */typedef signed int S16; /* 有符号16位整型变量 */typedef unsigned long U32; /* 无符号32位整型变量 */typedef signed long S32;
21、 /* 有符号32位整型变量 */typedef float F32; /* 单精度浮点数(32位长度) */typedef double F64; /* 双精度浮点数(64位长度) */#define uchar unsigned char#define uint unsigned int/-IO口定义-/sbit DHT = P20 ; /AM2301端口定义/-全局变量-/bit flagtemp;/温度正负标志位,k U8count, bit flagsendtemp;/发送温度的标志位U8 U8FLAG;U8 U8temp;U8 U8T_data_H,U8T_data_L,U8RH_
22、data_H,U8RH_data_L,U8checkdata;U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;U8 U8comdata;U16 DHTData1,DHTData2;U8 outdata5; /定义发送的字节数 U8 indata5;U8 count, count_r=0;U8 str5;U8 data tab6=0x00,0x00,0x00,0x00,0x00,0x00;/存储温湿度数据U8 code dis1=Humdity: % ;U8 code di
23、s2=Temper: c ;/*函数名称 : 延时子程序*/void Delay(U16 j) U8 i; for(;j0;j-) for(i=0;i27;i+); void Delay_10us(void)/延时10uS U8 i; i-; i-; i-; i-; i-; i-; /*函数名称 : 读温湿度字节函数 功 能 : 读取温湿度每个字节说 明 : 无*/ void COM(void)/读字节 U8 i; for(i=0;i8;i+) U8FLAG=2; while(!DHT)&U8FLAG+); Delay_10us(); Delay_10us(); Delay_10us(); U
24、8temp=0; if(DHT)U8temp=1; U8FLAG=2; while(DHT)&U8FLAG+); /超时则跳出for循环 if(U8FLAG=1)break; /判断数据位是0还是1 / 如果高电平高过预定0高电平值则数据位为 1 U8comdata=1; U8comdata|=U8temp; /0 /end i /- /- /-湿度读取子程序 - /- /-以下变量均为全局变量- /-温度高8位= U8T_data_H- /-温度低8位= U8T_data_L- /-湿度高8位= U8RH_data_H- /-湿度低8位= U8RH_data_L- /-校验 8位 = U8checkdata- /-调用相关子程序如下- /- Delay();, Delay_10us();,COM(); /-/*函数名称 : 温湿度读取函数功 能 : 读取温湿度数据说 明 : 无*/ void RH(void)/