首 页 行业热点 新车 试驾评测 养车用车 车型库
当前位置:首页DHT11测温湿度程序lcd1602显示

DHT11测温湿度程序lcd1602显示

2020-07-17 来源:好土汽车网
导读 DHT11测温湿度程序lcd1602显示


#include

#include

#define uchar unsigned char

#define uint unsigned int

#define Data P0 //数据端口

sbit RS=P2^4;

sbit RW=P2^5;

sbit E=P2^6;

sbit DHT=P1^0;

uchar FirstLine[] =\"wen:00.00\"; //第一行数据

uchar SecondLine[]=\"shi:00.00\"; //第二行数据

unsigned char shiZ,shiX,wenZ,wenX,check;

unsigned char tr_shiZ,tr_shiX,tr_wenZ,tr_wenX;

unsigned char flag;

unsigned int n=20,m;

void delay_1ms(unsigned int i)

{

unsigned int j=88;

for(;i>0;i--)

{

while(j>0)j--;

}

}

void delay_10us()

{

unsigned char i;

i--;

i--;

i--;

i--;

i--;

i--;

}

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

/*************温湿度读取函数***************/

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

char read_data()

{

unsigned char i,num,temp;

num=0;

for(i=0;i<8;i++)

{

flag=2;

while((!DHT)&&flag++);

delay_10us();

delay_10us();

delay_10us();

if(DHT==1)

{

temp=1;

flag=2;

while(DHT&&flag++);

}

else

temp=0;

num<<=1;

num|=temp;

}

return(num);

}

void delay(uchar ms) {

uchar i,j;

for(i=ms;i>0;i--)

for(j=100;j>0;j--);

// 延时函数ms毫秒

}

void DelayUs(unsigned char us) //--延时函数

{

unsigned char uscnt;

uscnt=us>>1; /*12MHz频率*/

while(--uscnt);

}

void DelayMs(unsigned char ms)

{

while(--ms)

{

DelayUs(250);

DelayUs(250);

DelayUs(250);

DelayUs(250);

}

}

void lcd_write_com(uchar c) //写命令

{

DelayMs(5);//操作前短暂延时,保证信号稳定

E=0;

RS=0;

RW=0;

_nop_();

E=1;

Data=c;

E=0;

}

void lcd_write_dat(uchar c) //写数据

{

DelayMs(5); E=0;

RS=1;

RW=0;

_nop_();

E=1;

Data=c;

E=0;

RS=0;

//操作前短暂延时,保证信号稳定

}

void lcd_init() //LCD初始化

{

DelayMs(15);

lcd_write_com(0x38); //display mode

lcd_write_com(0x38); //display mode

lcd_write_com(0x38); //display mode

lcd_write_com(0x06); //显示光标移动位置

lcd_write_com(0x0c); //显示开及光标设置

lcd_write_com(0x01); //显示清屏

}

void ShowChar(uchar pos,uchar c) //显示单个字符

{

unsigned char p;

if (pos>=0x10)

p=pos+0xb0; //是第二行则命令代码高4位为0xc

else

p=pos+0x80; //是第二行则命令代码高4位为0x8

lcd_write_com(p);//写命令

lcd_write_dat(c); //写数据

}

void ShowString (uchar line,char *ptr) //显示字符串

{

unsigned char l,*p;

p=ptr;

l=line<<4;

while((*p)!='\\0')

{

ShowChar(l++,*(p));

p++;

}

}

void disp(void) //主函数调用的显示函数

{

ShowString(0,FirstLine);

ShowString(1,SecondLine);

}

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

/************初始化及采集程序**************/

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

void read_init()

{

DHT=0; //主机使DHT11低电平并延时至少18ms

delay_1ms(21);

DHT=1; //主机置DHT11高电平20~40us,并等待从机相应

delay_10us();

delay_10us();

delay_10us();

delay_10us();

DHT=1;

if(!DHT) //从机发出相应信号

{

flag=2;

while((!DHT)&&flag++);

flag=2;

while(DHT&&flag++); //开始采集数据

tr_shiZ=read_data();//采集湿度整数部分

tr_shiX=read_data();//采集湿度小数部分

tr_wenZ=read_data();//采集温度整数部分

tr_wenX=read_data();//采集温度小数部分

check=read_data(); //采集校验位

DHT=1;

}

}

void main()

{

unsigned char temp;

lcd_init();

delay(50);

while(1)

{

disp();

read_init();

temp=tr_shiZ+tr_shiX+tr_wenZ+tr_wenX;

if(check==temp)

{

shiZ=tr_shiZ;

shiX=tr_shiX;

wenZ=tr_wenZ;

wenX=tr_wenX;

}

FirstLine[4]='0'+wenZ/10;

FirstLine[5]='0'+wenZ%10;

FirstLine[8]='0'+wenX/10;

FirstLine[9]='0'+wenX%10;

SecondLine[4]='0'+shiZ/10;

SecondLine[5]='0'+shiZ%10;

SecondLine[8]='0'+shiX/10;

SecondLine[9]='0'+shiX%10;

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容