C51温湿度传感器DHT11驱动LCD1602显示程序.docx
《C51温湿度传感器DHT11驱动LCD1602显示程序.docx》由会员分享,可在线阅读,更多相关《C51温湿度传感器DHT11驱动LCD1602显示程序.docx(20页珍藏版)》请在冰豆网上搜索。
C51温湿度传感器DHT11驱动LCD1602显示程序
DHT11.c 文件
#include
#include
//the main only needs to call getDHT11(),then the temperature and huminity was geted in
//F16T,F16RH as float
sbit bit11=P2^0;
unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
//用于最终读取的温湿度数据
// read 8 bits onice
char COM(void)
{
char i,U8temp,U8comdata;
for(i=0;i<8;i++) {
while(!
bit11); //表示 读取的高电位延时大于20多us则读取的是1否则读取的是
0
//通过U8FLAG可判断
Delay_us(35);
U8temp=0;
if(bit11)U8temp=1;
while(bit11);
U8comdata<<=1;
U8comdata|=U8temp; //0 }//rof
return U8comdata;
}
//--------------------------------
//-----温湿度读取子程序------------ //-------------------------------- //----以下变量均为全局变量-------- //----温度高8位== U8T_data_H------ //----温度低8位== U8T_data_L------ //----湿度高8位== U8RH_data_H----- //----湿度低8位== U8RH_data_L----- //----校验8位== U8checkdata----- //----调用相关子程序如下---------- //---- Delay();, Delay_10us();,COM();
//--------------------------------
void getDHT11(void) {
//主机拉低18ms
GO1:
bit11=0;
Delay_ms(20);
bit11=1;
//总线由上拉电阻拉高 主机延时20us
Delay_us(60);
//主机设为输入 判断从机响应信号 //
bit11=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!
bit11) {
while(!
bit11);
while(bit11); //数据接收状态
//T !
//wait DHT goto high
U8RH_data_H=COM();
U8RH_data_L=COM();
U8T_data_H=COM();
U8T_data_L=COM();
U8checkdata=COM();
bit11=1; //数据校验
if((U8T_data_H+U8T_data_L+U8RH_data_H+U8RH_data_L)!
=U8checkdata)
//Ifcheck wrong,read again
goto GO1; }//fi
F16T=U8T_data_H+(float)U8T_data_L/256; //change integer to float
F16RH=U8RH_data_H+(float)U8RH_data_L/256;
}
LCD1602 文件
#include
#include
#include
#include
#include
#define LCD_DATA P0
#define uint unsigned int
#define uchar unsigned char
/*只由主函数调用的 有 Init_Lcd()
LCD_write_str(uchar X,uchar Y,uchar *s) //LCD1602 data transfer define
LCD_value(unsigned char x,unsigned char y,float f)
*/
sbit LCD_RS = P2^5;
sbit RW = P2^6;
sbit LCD_E = P2^7;
//1602 control define
/***************************************************************************
//显示开
//显示关
#define LCD_CURSOR_ON 0x0A //显示光标
//无光标 //有光标,光标闪动 //有光标,光标不闪动
//进入模式设置指令
//新数据后光标右移
//新数据后光标左移 //画面可平移 //画面不可平移
//设定显示屏或光标移动方向指令
//光标左移1格,且AC值减1 //光标右移1格,且AC值加1
//显示器上字符全部左移一格,但光标不动 //显示器上字符全部右移一格,但光标不动
***************************************************************************/
//注 有主函数调用的函数都已作说明 其他函数一般不由主函数调用
/****************************************************************************
*名
*功 称:
Init_Lcd()主函数调用 能:
Lcd初始化 *入口参数:
无 *出口参数:
无 *范
例:
在主函数中直接调用
****************************************************************************/
//LCD初始化
{
LCD_write_char(0x38,0); Delay_ms
(1);
LCD_write_char(0x38,0); Delay_ms
(1);
LCD_write_char(0x38,0); Delay_ms
(1);
LCD_write_char(0x0c,0); Delay_ms
(1);
LCD_write_char(0x06,0); Delay_ms
(1);
LCD_write_char(0x0c,0); Delay_ms
(1); //
}
/***********************
*名
*功
称:
LCD_write_str(uchar X,uchar Y,uchar *s)主函数调用 能:
在指定地址写一个字符串eg:
Y=0,1,2,3,4,5,6,7,8,9,10...15。
X=0,1。
*入口参数:
X:
横坐标Y:
纵坐标*s:
字符串首地址 *出口参数:
无 *范
例:
LCD_write_str(1,1,uchar *s)
****************************************************************************/
void LCD_write_str(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_write_char(0,' ');
//写地址 //写显示字符
{
LCD_write_char( 0, *s ); s ++;
}
/*****
*名
*功
称:
LCD_set_xy( uchar x, uchar y ) 能:
指定一个地址 the optic sign flash?
*入口参数:
X:
横坐标Y:
纵坐标 *出口参数:
无 *范
例:
LCD_set_xy(5,1) CD_set_xy*********************************************************
******/
void LCD_set_xy( uchar x, uchar y ) //写地址函数
{
unsigned char address;
if (y == 0) address = 0x80 + x;
else
address = 0xc0 + x;
LCD_write_char( address, 0 );
}
/****************************************************************************
*名
*功 称:
LCD_en_write(void) 能:
液晶使能 *入口参数:
无 *出口参数:
无 *范
例:
直接调用
*************CD_set_xy*********************************************************
******/
//液晶使能
{
_nop_();
LCD_E=1;//EN=1
_nop_();
LCD_E=0;//EN=0
}
//------------------------------------------------
/****************************************************************************
*名 称:
LCD_write_char(uchar cd,uchar ab)
*功 无效
能:
写指令或数据 当写ab时 应使cd=0
当cd不为0则写cd且ab的赋值
*入口参数:
cd:
指令内容ab:
数据内容 指令常量已在上面定义 但一般不用 *出口参数:
无 *范
例:
LCD_write_char( 0,‘f’ )
*************CD_set_xy*********************************************************
******/
void LCD_write_char(uchar cd,uchar ab) //写数据
{
Delay_us(20); if(cd==0)
{
//RS=1,写显示内容
LCD_byte(ab);
}
else
{
//RS=0,写命令
LCD_byte(cd);
}
}
/****************************************************************************
*名
*功 称:
LCD_byte(abc); 能:
写一个字符到or called one byte to LCD中 *入口参数:
*出口参数:
无
*************CD_set_xy*********************************************************
******/
void LCD_byte(unsigned char abc)
{
RW = 0;
LCD_E = 0;
LCD_DATA = abc;
LCD_en_write();
}
//在液晶中显示浮点数函数
LCD_value(unsigned char x,unsigned char y,float f)
{
//不能定义为char* str,数组长度一定要大于浮点
数的总位数
//1表示小数位数 小数太多 自动四舍五入
LCD_write_str( x, y, str);
return 0;
}
主函数文件
#include
#include
#include
#include
#include"DHT11.h"
//全局变量声明
void main ()
{
Init_Lcd();
LCD_write_str(0,1,"abc"); //液晶预显示测试
LCD_value(0,0,34.345);
Delay_ms(2000);
Init_Lcd();
while
(1)
{
getDHT11();
LCD_write_str(0,0,"T=");
//字符"应用转义格式
LCD_write_str(0,1,"RH=");
LCD_value(4,1,F16RH);
Delay_ms(500);
}
}
//以下为延时函数
LCD_write_str(9,1,"%");
//this is fit to old C51 12MHz, 12 devide freqency void Delay_ms(unsigned int n)//n毫秒延时
{
unsigned char j; while(n--)
{
for(j=0;j<125;j++);
}
}
//N us延时函数
void Delay_us(unsigned char n)
{
n=n/2;
while(--n);
}
#include
#include
typedefunsignedcharuchar;
typedefunsignedintunint;
unsignedcharstr1[]={""};
unsignedcharstr2[]={""};
unsignedcharcodedis1[]={"TRHRH:
"};
unsignedcharcodedis2[]={"TRH T:
"};
sbitTRH=P2^7;//温湿度传感器DHT11数据接入
sbitLCD_RS=P3^5;
sbitLCD_RW=P3^6;
sbitLCD_EN=P3^4;
ucharTH_data,TL_data,RH_data,RL_data,CK_data;
ucharTH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
ucharcom_data,untemp,temp;
ucharrespond;
/*********************************************************************************/
voiddelayNOP()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************************************/
/*********************************************************************************/
//毫秒级延时子程序
/*********************************************************************************/
voiddelay_ms(unsignedcharms)
{
unsignedchari;
while(ms--)
{
for(i=0;i<150;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*********************************************************************************/
/*********************************************************************************/
//5us级延时程序
/*********************************************************************************/
voiddelay_us()
{
uchari;
i--;
i--;
i--;
i--;
i--;
i--;
}
/********************************************************************************/
/********************************************************************************/
//测试LCD忙碌状态
//lcd_busy()为1时,忙,等待。
lcd_busy()为0时,闲,可写指令与数据。
/********************************************************************************/
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&0x80);
LCD_EN=0;
return(result);
}
/*******************************************************************************/
/*******************************************************************************/
//写入指令数据到LCD
/*******************************************************************************/
voidlcd_wcmd(unsignedcharcmd)
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P0=cmd;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*****************************************************************************/
/*****************************************************************************/
//写显示数据到LCD
//RS=高电平,RW=低电平,E=高脉冲,D0-D7=数据。
/*****************************************************************************/
voidlcd_wdata(unsignedchardat)
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/****************************************************************************/
/****************************************************************************/
//LCD初始化设定
/****************************************************************************/
voidlcd_init()
{
delay_ms(15);