基于单片机的AM温湿度传感器在LCD上显示驱动程序带实物图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AM2301温湿度传感器模块
AM2301数字温湿度传感器是一各包括有数字校准输出的温湿度传感器。
它采用独特的数字采集模块和高新温湿度采集传感技术,可以确保产品可靠性高以及稳定性好。
该款传感器具有响应快、抗干扰力强、性价比高、品质卓越等优点。
以及超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用的最佳选则。
[9]
AM2301 引脚图
图3-10 AM2301引脚图
AM2301各引脚说明
表3-7 AM2301引脚
引脚颜色名称注释
1 红色VDD 供电 3.3-5.5VDC
2 黄色SDA 串行数据,单总线
3 黑色GND 接地,电源负极
4 NC 空脚,请悬空(不要接Vcc或Gnd)
AM2301 技术参数
表3-8 AM2301技术参数
参数条件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-11 AM2301驱动电路图
温湿度传感器模块流程设计
用户主机(MCU)发送一次开始信号后,AM2301自动从休眠模式转换到高速模式。
等待主机开始,信号发送后,AM2301发送响应信号,送出40比特的数据,发送数据结束之后触发一次信号采集,对外部环境进行数据采集,采集结束传感器自动转入休眠模式,直到下一次通信信号的来临。
此时AM2301的SDA数据线由上拉电阻拉高,一直保持高电平,且AM2301的SDA引脚处于输入状态,时刻检测外部信号。
一旦接收到主机发送的信号,再次进入采集状态,对外部数据进行一次采集。
整个过程流程图如下:
图4-10温湿度传感器流程图
1602 LCD显示屏测试
根据第三章说明的LCD硬件连线要求,将屏幕的14个接口按要求分别连接至单片机的各端口,确认无误后,个单片机上电,并将编完的程序通过STC-ISP 软件烧入到单片机中,连线图如下:
图5-3 LCD1602连线图
给单片机上电之后,屏幕显示如下:
图5-4 LCD1602显示效果
该LCD显示屏能正常显示预期设置字幕。
AM2301温湿度传感器测试
根据温湿度传感器驱动电路,实物连接图如下:
图5-7 AM2301连线图
给单片机上电,则可在LCD屏幕上得到如下数据:
图5-8 AM2301采集数据
LCD屏幕第一行显示当前室内湿度情况,第二行显示当前室内温度情况,若用吹风机对其吹风,则温湿度会相应变化。
附录
主要程序源代码:
1.REG5
2.H
/*--------------------------------------------------------------------------
REG52.H
Header generic 80C52 and 80C32 microcontroller.
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 = 0x87;
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;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0; //8052 only
/* TCON */
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
/* IE */
sbit EA = IE^7;
sbit ET2 = IE^5; //8052 only sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
/* IP */
sbit PT2 = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
/* P3 */
sbit RD = P3^7;
sbit WR = P3^6;
sbit T1 = P3^5;
sbit T0 = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD = P3^1;
sbit RXD = P3^0;
/* SCON */
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
/* P1 */
sbit T2EX = P1^1; // 8052 only
sbit T2 = P1^0; // 8052 only
/* T2CON */
sbit TF2 = T2CON^7;
sbit EXF2 = T2CON^6;
sbit RCLK = T2CON^5;
sbit TCLK = T2CON^4;
sbit EXEN2 = T2CON^3;
sbit TR2 = T2CON^2;
sbit C_T2 = T2CON^1;
sbit CP_RL2 = T2CON^0;
#endif
2.INTRINS.H
/*-------------------------------------------------------------------------- INTRINS.H
Intrinsic 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_ (bit);
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); extern unsigned long _lrol_ (unsigned long, unsigned char); extern unsigned char _chkfloat_(float);
extern void _push_ (unsigned char _sfr);
extern void _pop_ (unsigned char _sfr);
#endif
3.STDIO.H
/*-------------------------------------------------------------------------- STDIO.H
Prototypes for standard I/O functions.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. 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 SA VE
#pragma REGPARMS
extern char _getkey (void);
extern char getchar (void);
extern char ungetchar (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 (char *, const char *, ...);
extern int puts (const char *);
#pragma RESTORE
#endif
4.LCD1602.H
#include <intrins.h>
#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端口定义
sbit RS = P2^4 ; //数据命令选择端(H/L)
sbit RW = P2^5 ;//读写选择端(H/L)
sbit E=P2^6;
/* //自定义的字符(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,0x11,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;i>0;i--)
for(j=100;j>0;j--);
}
void writecmd(uchar com) //写指令
{
RS=0;
RW=0;
E=0;
delayms(1);
P0=com;
delayms(1);
E=1;
delayms(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); //不检测忙信号
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 <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include "lcd1602.h"
typedef 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; /* 有符号32位整型变量*/
typedef float F32; /* 单精度浮点数(32位长度)*/
typedef double F64; /* 双精度浮点数(64位长度)*/
#define uchar unsigned char
#define uint unsigned int//----------------IO口定义-------------------//
sbit DHT = P2^0 ; //AM2301端口定义
//----------------全局变量--------------------//
bit flagtemp;//温度正负标志位,k U8count,
bit flagsendtemp;//发送温度的标志位
U8 U8FLAG;
U8 U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8
U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_t emp;
U8 U8comdata;
U16 DHTData1,DHTData2;
U8 outdata[5]; //定义发送的字节数
U8 indata[5];
U8 count, count_r=0;
U8 str[5];
U8 data tab[6]={0x00,0x00,0x00,0x00,0x00,0x00};//存储温湿度数据
U8 code dis1[]={"Humdity: % "} ;
U8 code dis2[]={"Temper: c "} ;
/*********************************************************
函数名称: 延时子程序
*********************************************************/
void Delay(U16 j)
{ U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)//延时10uS
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/********************************************************* 函数名称: 读温湿度字节函数
功能: 读取温湿度每个字节
说明: 无
*********************************************************/
void COM(void)//读字节
{
U8 i;
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
}//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)//读取温湿度
{
//主机拉低1-5ms
DHT=0;
Delay(5);
DHT=1;
//总线由上拉电阻拉高主机延时40us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入判断从机响应信号
DHT=1;
//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行
if(!DHT) //T !
{
U8FLAG=2;
//判断从机是否发出80us 的低电平响应信号是否结束
while((!DHT)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出80us 的高电平,如发出则进入数据接收状态
while((DHT)&&U8FLAG++);
//数据接收状态
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
DHT=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
if(1)
{
U8RH_data_H = U8RH_data_H_temp;//湿度
U8RH_data_L = U8RH_data_L_temp;
DHTData1 = U8RH_data_H;
DHTData1 <<= 8;
DHTData1 |= U8RH_data_L;//获得完整的湿度
tab[0]=DHTData1/100+0x30; //湿度百位
tab[1]=DHTData1%100/10+0x30;//湿度十位
tab[2]=DHTData1%10+0x30; //湿度个位
U8T_data_H = U8T_data_H_temp;//温度
U8T_data_L = U8T_data_L_temp;
DHTData2 = U8T_data_H;
DHTData2<<=8;
DHTData2 |= U8T_data_L;//获得完整的温度
if(DHTData2&0x8000)//如果温度为负值
{
flagtemp=1;
DHTData2&=0x7FFF;
}
tab[3]=DHTData2/100+0x30;
tab[4]=DHTData2%100/10+0x30;
tab[5]=DHTData2%10+0x30;//
U8checkdata=U8checkdata_temp;
}//fi
}//fi
}
/********************************************************* 函数名称: 显示温湿度函数
功能: 显示温湿度数据
说明: 无
*********************************************************/ void display()
{
U8 m;
//====显示湿度======
m = 0 ;
writecmd(0x80);
while(dis1[m] != '\0')//显示字符
{
writedata(dis1[m]) ;
m++ ;
}
writecmd(0x89);
writedata(tab[0]);
writedata(tab[1]);
writedata('.');
writedata(tab[2]);
//=====显示温度=====
m = 0 ;
writecmd(0xc0);
while(dis1[m] != '\0')//显示字符
{
writedata(dis2[m]) ;
m++ ;
}
writecmd(0xC8);
if(flagtemp)writedata('-');
else writedata('+');
writecmd(0xC9);
writedata(tab[3]);
writedata(tab[4]);
writedata('.');
writedata(tab[5]);
}
void main()
{
//U8 buff[4];
//U8 timecount;
init_LCD();
while(1)
{
RH();//调用温湿度读取子程序
display(); //1602显示数据
Delay(2000);
}
}。