基于51单片机的AM2301温湿度传感器在LCD1602上显示驱动程序带实物图概要.docx
- 文档编号:27506817
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:25
- 大小:1.69MB
基于51单片机的AM2301温湿度传感器在LCD1602上显示驱动程序带实物图概要.docx
《基于51单片机的AM2301温湿度传感器在LCD1602上显示驱动程序带实物图概要.docx》由会员分享,可在线阅读,更多相关《基于51单片机的AM2301温湿度传感器在LCD1602上显示驱动程序带实物图概要.docx(25页珍藏版)》请在冰豆网上搜索。
基于51单片机的AM2301温湿度传感器在LCD1602上显示驱动程序带实物图概要
AM2301温湿度传感器模块
AM2301数字温湿度传感器是一各包括有数字校准输出的温湿度传感器。
它采用独特的数字采集模块和高新温湿度采集传感技术,可以确保产品可靠性高以及稳定性好。
该款传感器具有响应快、抗干扰力强、性价比高、品质卓越等优点。
以及超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用的最佳选则。
[9]
AM2301引脚图
图3-10AM2301引脚图
AM2301各引脚说明
表3-7AM2301引脚
引脚
颜色
名称
注释
1
红色
VDD
供电3.3-5.5VDC
2
黄色
SDA
串行数据,单总线
3
黑色
GND
接地,电源负极
4
NC
空脚,请悬空(不要接Vcc或Gnd)
AM2301技术参数
表3-8AM2301技术参数
参数
条件
Min
Typ
Max
单位
湿度
分辨率
0.1
%RH
16
Bit
重复性
±1
%RH
精度
25℃
±3
%RH
0-50℃
±5
%RH
互换性
可完全互换
采样周期
1
2
S
响应时间
1/e(63%)25℃,1m/s空气
2
S
迟滞
±0.3
%RH
长期稳定性
典型值
±1
%RH/yr
温度
分辨率
0.1
℃
16
Bit
重复性
±0.5
℃
精度
±1
℃
量程范围
-40
80
℃
响应时间
1/e(63%)
6
20
S
AM2301驱动电路
图3-11AM2301驱动电路图
温湿度传感器模块流程设计
用户主机(MCU)发送一次开始信号后,AM2301自动从休眠模式转换到高速模式。
等待主机开始,信号发送后,AM2301发送响应信号,送出40比特的数据,发送数据结束之后触发一次信号采集,对外部环境进行数据采集,采集结束传感器自动转入休眠模式,直到下一次通信信号的来临。
此时AM2301的SDA数据线由上拉电阻拉高,一直保持高电平,且AM2301的SDA引脚处于输入状态,时刻检测外部信号。
一旦接收到主机发送的信号,再次进入采集状态,对外部数据进行一次采集。
整个过程流程图如下:
图4-10温湿度传感器流程图
1602LCD显示屏测试
根据第三章说明的LCD硬件连线要求,将屏幕的14个接口按要求分别连接至单片机的各端口,确认无误后,个单片机上电,并将编完的程序通过STC-ISP软件烧入到单片机中,连线图如下:
图5-3LCD1602连线图
给单片机上电之后,屏幕显示如下:
图5-4LCD1602显示效果
该LCD显示屏能正常显示预期设置字幕。
AM2301温湿度传感器测试
根据温湿度传感器驱动电路,实物连接图如下:
图5-7AM2301连线图
给单片机上电,则可在LCD屏幕上得到如下数据:
图5-8AM2301采集数据
LCD屏幕第一行显示当前室内湿度情况,第二行显示当前室内温度情况,若用吹风机对其吹风,则温湿度会相应变化。
附录
主要程序源代码:
1.REG52.H
/*--------------------------------------------------------------------------
REG52.H
Headerfileforgeneric80C52and80C32microcontroller.
Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.
Allrightsreserved.
--------------------------------------------------------------------------*/
#ifndef__REG52_H__
#define__REG52_H__
/*BYTERegisters*/
sfrP0=0x80;
sfrP1=0x90;
sfrP2=0xA0;
sfrP3=0xB0;
sfrPSW=0xD0;
sfrACC=0xE0;
sfrB=0xF0;
sfrSP=0x81;
sfrDPL=0x82;
sfrDPH=0x83;
sfrPCON=0x87;
sfrTCON=0x88;
sfrTMOD=0x89;
sfrTL0=0x8A;
sfrTL1=0x8B;
sfrTH0=0x8C;
sfrTH1=0x8D;
sfrIE=0xA8;
sfrIP=0xB8;
sfrSCON=0x98;
sfrSBUF=0x99;
/*8052Extensions*/
sfrT2CON=0xC8;
sfrRCAP2L=0xCA;
sfrRCAP2H=0xCB;
sfrTL2=0xCC;
sfrTH2=0xCD;
/*BITRegisters*/
/*PSW*/
sbitCY=PSW^7;
sbitAC=PSW^6;
sbitF0=PSW^5;
sbitRS1=PSW^4;
sbitRS0=PSW^3;
sbitOV=PSW^2;
sbitP=PSW^0;//8052only
/*TCON*/
sbitTF1=TCON^7;
sbitTR1=TCON^6;
sbitTF0=TCON^5;
sbitTR0=TCON^4;
sbitIE1=TCON^3;
sbitIT1=TCON^2;
sbitIE0=TCON^1;
sbitIT0=TCON^0;
/*IE*/
sbitEA=IE^7;
sbitET2=IE^5;//8052only
sbitES=IE^4;
sbitET1=IE^3;
sbitEX1=IE^2;
sbitET0=IE^1;
sbitEX0=IE^0;
/*IP*/
sbitPT2=IP^5;
sbitPS=IP^4;
sbitPT1=IP^3;
sbitPX1=IP^2;
sbitPT0=IP^1;
sbitPX0=IP^0;
/*P3*/
sbitRD=P3^7;
sbitWR=P3^6;
sbitT1=P3^5;
sbitT0=P3^4;
sbitINT1=P3^3;
sbitINT0=P3^2;
sbitTXD=P3^1;
sbitRXD=P3^0;
/*SCON*/
sbitSM0=SCON^7;
sbitSM1=SCON^6;
sbitSM2=SCON^5;
sbitREN=SCON^4;
sbitTB8=SCON^3;
sbitRB8=SCON^2;
sbitTI=SCON^1;
sbitRI=SCON^0;
/*P1*/
sbitT2EX=P1^1;//8052only
sbitT2=P1^0;//8052only
/*T2CON*/
sbitTF2=T2CON^7;
sbitEXF2=T2CON^6;
sbitRCLK=T2CON^5;
sbitTCLK=T2CON^4;
sbitEXEN2=T2CON^3;
sbitTR2=T2CON^2;
sbitC_T2=T2CON^1;
sbitCP_RL2=T2CON^0;
#endif
2.INTRINS.H
/*--------------------------------------------------------------------------
INTRINS.H
IntrinsicfunctionsforC51.
Copyright(c)1988-2004KeilElektronikGmbHandKeilSoftware,Inc.
Allrightsreserved.
--------------------------------------------------------------------------*/
#ifndef__INTRINS_H__
#define__INTRINS_H__
externvoid_nop_(void);
externbit_testbit_(bit);
externunsignedchar_cror_(unsignedchar,unsignedchar);
externunsignedint_iror_(unsignedint,unsignedchar);
externunsignedlong_lror_(unsignedlong,unsignedchar);
externunsignedchar_crol_(unsignedchar,unsignedchar);
externunsignedint_irol_(unsignedint,unsignedchar);
externunsignedlong_lrol_(unsignedlong,unsignedchar);
externunsignedchar_chkfloat_(float);
externvoid_push_(unsignedchar_sfr);
externvoid_pop_(unsignedchar_sfr);
#endif
3.STDIO.H
/*--------------------------------------------------------------------------
STDIO.H
PrototypesforstandardI/Ofunctions.
Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.
Allrightsreserved.
--------------------------------------------------------------------------*/
#ifndef__STDIO_H__
#define__STDIO_H__
#ifndefEOF
#defineEOF-1
#endif
#ifndefNULL
#defineNULL((void*)0)
#endif
#ifndef_SIZE_T
#define_SIZE_T
typedefunsignedintsize_t;
#endif
#pragmaSAVE
#pragmaREGPARMS
externchar_getkey(void);
externchargetchar(void);
externcharungetchar(char);
externcharputchar(char);
externintprintf(constchar*,...);
externintsprintf(char*,constchar*,...);
externintvprintf(constchar*,char*);
externintvsprintf(char*,constchar*,char*);
externchar*gets(char*,intn);
externintscanf(constchar*,...);
externintsscanf(char*,constchar*,...);
externintputs(constchar*);
#pragmaRESTORE
#endif
4.LCD1602.H
#include
#ifndef_LCD1602_H_H
#define_LCD1602_H_H
#defineucharunsignedchar
#defineuintunsignedint
//----------------函数声明--------------------------
voiddelayms(ucharz);
voidwritecmd(ucharcom);
voidwritedata(uchardat);
voidinit_LCD();
//----------------函数声明结束----------------------
//1602端口定义
sbitRS=P2^4;//数据命令选择端(H/L)
sbitRW=P2^5;//读写选择端(H/L)
sbitE=P2^6;
/*//自定义的字符(5X8)
ucharcodetab1[]={0x03,0x05,0x19,0x19,0x19,0x05,0x03,0x00};//小喇叭
ucharcodetab2[]={0x08,0x0f,0x12,0x0f,0x0a,0x1F,0x02,0x02,};//年
ucharcodetab3[]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00};//月
ucharcodetab4[]={0x00,0x1F,0x11,0x1F,0x11,0x11,0x1F,0x00};//日
ucharcodetab5[]={0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00};//C(温度符号)
*/
/*
voidlcd_pos(ucharpos)//设定显示位置
{
lcd_wcmd(pos|0x80);
}
*/
voiddelayms(ucharz)//延时函数
{
uinti,j;
for(i=z;i>0;i--)
for(j=100;j>0;j--);
}
voidwritecmd(ucharcom)//写指令
{
RS=0;
RW=0;
E=0;
delayms
(1);
P0=com;
delayms
(1);
E=1;
delayms
(1);
E=0;
}
voidwritedata(uchardat)//写数据
{
RS=1;
RW=0;
E=0;
delayms
(1);
P0=dat;
delayms
(1);
E=1;
delayms
(1);
E=0;
}
/**************************************************
*写汉字编码到CGRAM函数
**************************************************
voidwritetab()
{
unsignedchari;
lcd_wcmd(0x40);//写CGRAM
for(i=0;i<8;i++)
lcd_wdat(mytab1[i]);
}
*/
voidinit_LCD()//初始化1602
{
delayms(15);
writecmd(0x38);//不检测忙信号
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(0x00);//显示自定义字符
*/
}
#endif
5.主程序
#include
#include
#include
#include"lcd1602.h"
typedefunsignedcharU8;/*无符号8位整型变量*/
typedefsignedcharS8;/*有符号8位整型变量*/
typedefunsignedintU16;/*无符号16位整型变量*/
typedefsignedintS16;/*有符号16位整型变量*/
typedefunsignedlongU32;/*无符号32位整型变量*/
typedefsignedlongS32;/*有符号32位整型变量*/
typedeffloatF32;/*单精度浮点数(32位长度)*/
typedefdoubleF64;/*双精度浮点数(64位长度)*/
#defineucharunsignedchar
#defineuintunsignedint//----------------IO口定义-------------------//
sbitDHT=P2^0;//AM2301端口定义
//----------------全局变量--------------------//
bitflagtemp;//温度正负标志位,kU8count,
bitflagsendtemp;//发送温度的标志位
U8U8FLAG;
U8U8temp;
U8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8U8comdata;
U16DHTData1,DHTData2;
U8outdata[5];//定义发送的字节数
U8indata[5];
U8count,count_r=0;
U8str[5];
U8datatab[6]={0x00,0x00,0x00,0x00,0x00,0x00};//存储温湿度数据
U8codedis1[]={"Humdity:
%"};
U8codedis2[]={"Temper:
c"};
/*********************************************************
函数名称:
延时子程序
*********************************************************/
voidDelay(U16j)
{U8i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
voidDelay_10us(void)//延时10uS
{
U8i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/*********************************************************
函数名称:
读温湿度字节函数
功能:
读取温湿度每个字节
说明:
无
*********************************************************/
voidCOM(void)//读字节
{
U8i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!
DHT)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(DHT)U8temp=1;
U8FLAG=2;
while((DHT)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
//如果高电平高过预定0高电平值则数据位为1
U8comdata<<=1;
U8comdata|=U8temp;//0
}//endi
}
//--------------------------------------------------------------
//--------------------------------
//-----湿度读取子程序------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位==U8T_data_H------
//----温度低8位==U8T_data_L------
//----湿度高8位==U8RH_data_H-----
//----湿度低8位==U8RH_data_L-----
//----校验8位==U8checkdata-----
//----调用相关子程序如下----------
//----Delay();,Delay_10us();,COM();
//--------------------------------
/*********************************************************
函数名称:
温湿度读取函数
功能:
读取温湿度数据
说明:
无
*********************************************************/
voidRH(void)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 AM2301 温湿度 传感器 LCD1602 显示 驱动程序 实物 概要