基于单片机的AM温湿度传感器在LCD上显示驱动程序带实物图Word文件下载.docx

上传人:b****6 文档编号:21689237 上传时间:2023-01-31 格式:DOCX 页数:22 大小:1.69MB
下载 相关 举报
基于单片机的AM温湿度传感器在LCD上显示驱动程序带实物图Word文件下载.docx_第1页
第1页 / 共22页
基于单片机的AM温湿度传感器在LCD上显示驱动程序带实物图Word文件下载.docx_第2页
第2页 / 共22页
基于单片机的AM温湿度传感器在LCD上显示驱动程序带实物图Word文件下载.docx_第3页
第3页 / 共22页
基于单片机的AM温湿度传感器在LCD上显示驱动程序带实物图Word文件下载.docx_第4页
第4页 / 共22页
基于单片机的AM温湿度传感器在LCD上显示驱动程序带实物图Word文件下载.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

基于单片机的AM温湿度传感器在LCD上显示驱动程序带实物图Word文件下载.docx

《基于单片机的AM温湿度传感器在LCD上显示驱动程序带实物图Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的AM温湿度传感器在LCD上显示驱动程序带实物图Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。

基于单片机的AM温湿度传感器在LCD上显示驱动程序带实物图Word文件下载.docx

Bit

重复性

±

精度

25℃

0-50℃

5

互换性

可完全互换

采样周期

S

响应时间

1/e(63%)25℃,1m/s空气

迟滞

0.3

长期稳定性

典型值

%RH/yr

温度

0.5

量程范围

-40

80

1/e(63%)

6

20

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

Headergeneric80C52and80C32microcontroller.

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;

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;

/*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.

#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);

3.STDIO.H

STDIO.H

PrototypesforstandardI/Ofunctions.

#ifndef__STDIO_H__

#define__STDIO_H__

#ifndefEOF

#defineEOF-1

#ifndefNULL

#defineNULL((void*)0)

#ifndef_SIZE_T

#define_SIZE_T

typedefunsignedintsize_t;

#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

4.LCD1602.H

#include<

intrins.h>

#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>

j--);

}

voidwritecmd(ucharcom)//写指令

RS=0;

RW=0;

E=0;

delayms

(1);

P0=com;

E=1;

voidwritedata(uchardat)//写数据

RS=1;

P0=dat;

}

/**************************************************

*写汉字编码到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(0x01);

//显示清屏

writecmd(0x06);

//显示光标移动设置

writecmd(0x0c);

//显示开及光标设置

/*

writetab();

//自定义字符写入CGRAM

delay(5);

lcd_pos(0x4d);

lcd_wdat(0x00);

//显示自定义字符

5.主程序

reg52.h>

stdio.h>

#include"

lcd1602.h"

typedefunsignedcharU8;

/*无符号8位整型变量*/

typedefsignedcharS8;

/*有符号8位整型变量*/

typedefunsignedintU16;

/*无符号16位整型变量*/

typedefsignedintS16;

/*有符号16位整型变量*/

typedefunsignedlongU32;

/*无符号32位整型变量*/

typedefsignedlongS32;

/*有符号32位整型变量*/

typedeffloatF32;

/*单精度浮点数(32位长度)*/

typedefdoubleF64;

/*双精度浮点数(64位长度)*/

#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--)

{

for(i=0;

i<

27;

i++);

}

voidDelay_10us(void)//延时10uS

{

U8i;

i--;

/*********************************************************

读温湿度字节函数

功能:

读取温湿度每个字节

说明:

voidCOM(void)//读字节

for(i=0;

8;

i++)

U8FLAG=2;

while((!

DHT)&

&

U8FLAG++);

Delay_10us();

U8temp=0;

if(DHT)U8temp=1;

while((DHT)&

//超时则跳出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)//读取温湿度

//主机

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1