DHT90与LCD1602的温湿度显示KeilC程序.docx
- 文档编号:4082781
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:13
- 大小:19KB
DHT90与LCD1602的温湿度显示KeilC程序.docx
《DHT90与LCD1602的温湿度显示KeilC程序.docx》由会员分享,可在线阅读,更多相关《DHT90与LCD1602的温湿度显示KeilC程序.docx(13页珍藏版)》请在冰点文库上搜索。
DHT90与LCD1602的温湿度显示KeilC程序
/***********************************************************************************
;功能说明:
DHT90与LCD1602的温湿度显示KeilC程序
;文件名称:
DHT90.c
;微处理器:
AT89S52
;编译环境:
KeiluVisionV2.38a
;作 者:
HuangYanxiang
;版 权:
(c)HuangYanxiang
;创建日期:
2008.08.15
;版 本:
V1.2
;修改日期:
2008.08.26
;修改说明:
添加了一个LCD_disp_str()函数,修改了延时函数的注释。
;***********************************************************************************/
/*************定义接口********************
P0------DB0~DB7 (LCD1602)
P2.0------RS (LCD1602)
P2.1------RW (LCD1602)
P2.2------E (LCD1602)
P2.6------SCK (DHT90)
P2.7------DATA (DHT90)
*****************************************/
#include
#include
#include
#include
//*********************第一部分LCD1602设置START****************************************
#defineLCD_DB P0
sbit LCD_RS=P2^0; //P2^0是p2.0的意思;LCD_RS与P2.0等效起来,对LCD_RS读写,就是对P2.0读写好处在于LCD_RS含义直接明了,写程序多了就会知道有必要de
sbit LCD_RW=P2^1; //P2^1是p2.1的意思
sbit LCD_E=P2^2; //P2^2是p2.2的意思
/******定义函数****************/
#defineucharunsignedchar
#defineuintunsignedint
voidLCD_init(void); //初始化函数
voidLCD_write_command(ucharcommand); //写指令函数
voidLCD_write_data(uchardat); //写数据函数
voidLCD_disp_char(ucharx,uchary,uchardat);//在某个屏幕位置上显示一个字符,X(0-15),y(1-2)
voidLCD_disp_str(ucharx,uchary,uchar*str);//LCD1602显示字符串函数
voiddelay_n10us(uintn); //延时函数
/*--------------------------------------
;模块名称:
LCD_init();
;功 能:
初始化LCD1602
;占用资源:
--
;参数说明:
--
;创建日期:
2008.08.15
;版 本:
FV1.0(函数版本FunctionVersion)
;修改日期:
--
;修改说明:
--
;-------------------------------------*/
voidLCD_init(void)
{
delay_n10us(10);
LCD_write_command(0x38);//设置8位格式,2行,5x7
delay_n10us(10);
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
delay_n10us(10);
LCD_write_command(0x06);//设定输入方式,增量不移位
delay_n10us(10);
LCD_write_command(0x01);//清除屏幕显示
delay_n10us(100); //延时清屏,延时函数,延时约n个10us
}
/*--------------------------------------
;模块名称:
LCD_write_command();
;功 能:
LCD1602写指令函数
;占用资源:
P2.0--RS(LCD_RS),P2.1--RW(LCD_RW),P2.2--E(LCD_E).
;参数说明:
dat为写命令参数
;创建日期:
2008.08.15
;版 本:
FV1.0(函数版本FunctionVersion)
;修改日期:
--
;修改说明:
--
;-------------------------------------*/
voidLCD_write_command(uchardat)
{
delay_n10us(10);
LCD_RS=0; //指令
LCD_RW=0; //写入
LCD_E=1; //允许
LCD_DB=dat;
delay_n10us(10); //实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
LCD_E=0;
delay_n10us(10); //实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
}
/*--------------------------------------
;模块名称:
LCD_write_data();
;功 能:
LCD1602写数据函数
;占用资源:
P2.0--RS(LCD_RS),P2.1--RW(LCD_RW),P2.2--E(LCD_E).
;参数说明:
dat为写数据参数
;创建日期:
2008.08.15
;版 本:
FV1.0(函数版本FunctionVersion)
;修改日期:
--
;修改说明:
--
;-------------------------------------*/
voidLCD_write_data(uchardat)
{
delay_n10us(10);
LCD_RS=1; //数据
LCD_RW=0; //写入
LCD_E=1; //允许
LCD_DB=dat;
delay_n10us(10);
LCD_E=0;
delay_n10us(10);
}
/*--------------------------------------
;模块名称:
LCD_disp_char();
;功 能:
LCD1602显示一个字符函数,在某个屏幕位置上显示一个字符,X(0-15),y(1-2)。
;占用资源:
--
;参数说明:
X为1602的列值(取值范围是0-15),y为1602的行值(取值范围是1-2),dat为所要显示字符对应的地址参数。
;创建日期:
2008.08.15
;版 本:
FV1.0(函数版本FunctionVersion)
;修改日期:
--
;修改说明:
--
;-------------------------------------*/
voidLCD_disp_char(ucharx,uchary,uchardat)
{
ucharaddress;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}
/*--------------------------------------
;模块名称:
LCD_disp_str();
;功 能:
LCD1602显示字符串函数,在某个屏幕起始位置{X(0-15),y(1-2)}上显示一个字符串。
;占用资源:
--
;参数说明:
X为1602的列值(取值范围是0-15),y为1602的行值(取值范围是1-2),str为所要显示字符串对应的指针参数。
;创建日期:
2008.08.16
;版 本:
FV1.0(函数版本FunctionVersion)
;修改日期:
--
;修改说明:
--
;-------------------------------------*/
voidLCD_disp_str(ucharx,uchary,uchar*str)
{
ucharaddress;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
while(*str!
='\0')
{
LCD_write_data(*str);
str++;
}
}
/*--------------------------------------
;模块名称:
delay_n10us();
;功 能:
延时函数,延时约n个10us
;占用资源:
--
;参数说明:
--
;创建日期:
2008.08.15
;版 本:
FV1.1(函数版本FunctionVersion)
;修改日期:
2008.08.26
;修改说明:
修改为较精确的延时函数,"_nop_()"延时1us@12M晶振
;-------------------------------------*/
voiddelay_n10us(uintn) //延时n个10us@12M晶振
{
uinti;
for(i=n;i>0;i--)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
//*********************第一部分LCD1602设置END****************************************
//*********************第二部分DHT90设置 START****************************************
sbitSCK =P2^6; //定义通讯时钟端口
sbitDATA=P2^7; //定义通讯数据端口
typedefunion
{unsignedinti; //定义了两个共用体
floatf;
}value;
enum{TEMP,HUMI}; //TEMP=0,HUMI=1
#definenoACK0 //用于判断是否结束通讯
#defineACK 1 //结束数据传输
//adr command r/w
#defineSTATUS_REG_W0x06 //000 0011 0
#defineSTATUS_REG_R0x07 //000 0011 1
#defineMEASURE_TEMP0x03 //000 0001 1
#defineMEASURE_HUMI0x05 //000 0010 1
#defineRESET 0x1e //000 1111 0
/****************定义函数****************/
voids_transstart(void); //启动传输函数
voids_connectionreset(void); //连接复位函数
chars_write_byte(unsignedcharvalue);//DHT90写函数
chars_read_byte(unsignedcharack); //DHT90读函数
chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode);//测量温湿度函数
voidcalc_dht90(float*p_humidity,float*p_temperature);//温湿度补偿
/*--------------------------------------
;模块名称:
s_transstart();
;功 能:
启动传输函数
;占用资源:
--
;参数说明:
--
;创建日期:
2008.08.15
;版 本:
FV1.0(函数版本FunctionVersion)
;修改日期:
--
;修改说明:
--
;-------------------------------------*/
voids_transstart(void)
//generatesatransmissionstart
// _____ ________
//DATA:
|_______|
// ___ ___
//SCK:
___| |___| |______
{
DATA=1;SCK=0; //Initialstate
_nop_();
SCK=1;
_nop_();
DATA=0;
_nop_();
SCK=0;
_nop_();_nop_();_nop_();
SCK=1;
_nop_();
DATA=1;
_nop_();
SCK=0;
}
/*--------------------------------------
;模块名称:
s_connectionreset();
;功 能:
连接复位函数
;占用资源:
--
;参数说明:
--
;创建日期:
2008.08.15
;版 本:
FV1.0(函数版本FunctionVersion)
;修改日期:
--
;修改说明:
--
;-------------------------------------*/
voids_connectionreset(void)
//communicationreset:
DATA-line=1andatleast9SCKcyclesfollowedbytransstart
// _____________________________________________________ ________
//DATA:
|_______|
// _ _ _ _ _ _ _ _ _ ___ ___
//SCK:
__||__||__||__||__||__||__||__||__||______| |___| |______
{
unsignedchari;
DATA=1;SCK=0; //Initialstate
for(i=0;i<9;i++) //9SCKcycles
{
SCK=1;
SCK=0;
}
s_transstart(); //transmissionstart
}
/*--------------------------------------
;模块名称:
s_write_byte();
;功 能:
DHT90写函数
;占用资源:
--
;参数说明:
--
;创建日期:
2008.08.15
;版 本:
FV1.0(函数版本FunctionVersion)
;修改日期:
--
;修改说明:
--
;-------------------------------------*/
chars_write_byte(unsignedcharvalue)
//----------------------------------------------------------------------------------
//writesabyteontheSensibusandcheckstheacknowledge
{
unsignedchari,error=0;
for(i=0x80;i>0;i/=2) //shiftbitformasking
{
if(i&value)DATA=1; //maskingvaluewithi,writetoSENSI-BUS
elseDATA=0;
SCK=1; //clkforSENSI-BUS
_nop_();_nop_();_nop_(); //pulswithapprox.3us
SCK=0;
}
DATA=1; //releaseDATA-line
SCK=1; //clk#9forack
error=DATA; //checkack(DATAwillbepulleddownbyDHT90),DATA在第9个上升沿将被DHT90自动下拉为低电平。
_nop_();_nop_();_nop_();
SCK=0;
DATA=1; //releaseDATA-line
returnerror; //error=1incaseofnoacknowledge//返回:
0成功,1失败
}
/*--------------------------------------
;模块名称:
s_read_byte();
;功 能:
DHT90读函数
;占用资源:
--
;参数说明:
--
;创建日期:
2008.08.15
;版 本:
FV1.0(函数版本FunctionVersion)
;修改日期:
--
;修改说明:
--
;-------------------------------------*/
chars_read_byte(unsignedcharack)
//readsabyteformtheSensibusandgivesanacknowledgeincaseof"ack=1"
{
unsignedchari,val=0;
DATA=1; //releaseDATA-line
for(i=0x80;i>0;i/=2) //shiftbitformasking
{SCK=1; //clkforSENSI-BUS
if(DATA)val=(val|i); //readbit
_nop_();_nop_();_nop_(); //pulswithapprox.3us
SCK=0;
}
if(ack==1)DATA=0; //incaseof"ack==1"pulldownDATA-Line
elseDATA=1; //如果是校验(ack==0),读取完后结束通讯
_nop_();_nop_();_nop_(); //pulswithapprox.3us
SCK=1; //clk#9forack
_nop_();_nop_();_nop_(); //pulswithapprox.3us
SCK=0;
_nop_();_nop_();_nop_(); //pulswithapprox.3us
DATA=1; //releaseDATA-line
returnval;
}
/*--------------------------------------
;模块名称:
s_measure();
;功 能:
测量温湿度函数
;占用资源:
--
;参数说明:
--
;创建日期:
2008.08.15
;版 本:
FV1.0(函数版本F
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DHT90 LCD1602 温湿度 显示 KeilC 程序