怎样才能让lcd显示器只显示其中一个Dht11传感器的温湿度值,而另一个的值只用来做比较呢
这个是不用在LCD显示器上显示的DHT11的
//函数定义
void Delayms(unsigned int ms);
void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned int z);
void DHT11_start();
uchar DHT11_rec_byte();
uchar DHT11_rec_byte1();
void DHT11_receive();
void DHT11_receive1();
void DHT11_start1()
{
Data1=1;//
DHT11_delay_us(2);
Data1=0;//
DHT11_delay_ms(20);
Data1=1;//
DHT11_delay_us(13);
}
unsigned char DHT11_rec_byte1()
{
unsigned char i,dat1;
for(i=0;i<8;i++)
{
while(!Data1);
DHT11_delay_us(8);
dat1<<=1;
if(Data1==1)
{
dat1+=1;
}
while(Data1);
}
return dat1;
}
void DHT11_receive1()
{
uint R_H1,R_L1,T_H1,T_L1;
uchar RH1,RL1,TH1,TL1,revise1;
DHT11_start1();
Data1=1;
if(Data1==0)
{
while(Data1==0); //等待拉高
DHT11_delay_us(40); //拉高后延时80us
R_H1=DHT11_rec_byte1(); //接收湿度高八位
R_L1=DHT11_rec_byte1(); //接收湿度低八位
T_H1=DHT11_rec_byte1(); //接收温度高八位
T_L1=DHT11_rec_byte1(); //接收温度低八位
revise1=DHT11_rec_byte1(); //接收校正位
DHT11_delay_us(25); //结束
if((R_H1+R_L1+T_H1+T_L1)==revise1) //校正
{
RH1=R_H1;
RL1=R_L1;
TH1=T_H1;
TL1=T_L1;
}
这个是在LCD上显示的
void lcd_init(void) //LCD初始化子程序
{
lcd_wri_com(0x38);//置功能8位双行
lcd_wri_com(0x0c);//显示开关光标
lcd_wri_com(0x06);//字符进入模式屏幕不动字符后移
delay_ms(5);//延时5ms
lcd_wri_com(0x01); //清屏
wri_string(1,0,times);//初始化显示
wri_string(1,6,date);
wri_string(2,0,"H: %RH T: C ");//初始化显示
}
void DHT11_delay_us(unsigned char n)
{
while(--n);
}
void DHT11_delay_ms(unsigned int z)
{
unsigned int i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(30); //延时18ms以上
Data=1;
DHT11_delay_us(30);
}
unsigned char DHT11_rec_byte() //接收一个字节
{
unsigned char i,dat=0;
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(!Data); ////等待50us低电平过去
DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0
dat<<=1; //移位使正确接收8位数据,数据为0时直接移位
if(Data==1) //数据为1时,使dat加1来接收数据1
dat+=1;
while(Data); //等待数据线拉低
}
return dat;
}
void DHT11_receive() //接收40位的数据
{
unsigned char R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0); //等待拉高
DHT11_delay_us(40); //拉高后延时80us
R_H=DHT11_rec_byte(); //接收湿度高八位
R_L=DHT11_rec_byte(); //接收湿度低八位
T_H=DHT11_rec_byte(); //接收温度高八位
T_L=DHT11_rec_byte(); //接收温度低八位
revise=DHT11_rec_byte(); //接收校正位
DHT11_delay_us(25); //结束
if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
humi_value = RH;
temp_value = TH;
}
}
这是LCD所有的程序
```c
void delay_ms(unsigned int cnt) //
{
unsigned int x;
for( ; cnt>0; cnt--)
{
for(x=110; x>0; x--);//软件延时为1MS
}
}
#if 0
void delay_us(unsigned int cnt) //
{
while(cnt--);
}
#endif
/**定时器初始化**/
void time_init(void)
{
TMOD |= 0x01;//time0 工作方式为1
TH0 = 0xf8;//装载初值
TL0 = 0x2f;//装载初值,为2ms(65535-63535)
TR0 = 1;//开启定时器
ET0 = 1;//打开中断
EA=1;
}
/******************************************************
按键扫描
******************************************************/
void key_scan(void)
{
static unsigned char key_in_flag = 0;//按键按下标志
unsigned char key_l;//存储扫描到行列值。
key_value = 20;//按键值清除
if((P3 & 0x0f) != 0x0f)//按键按下
{
delay_ms(1);//按键消抖动
if(((P3 & 0x0f) != 0x0f) && (key_in_flag == 1))
{
key_in_flag = 0;//松手检测防止一直触发
P3 = 0x0f;
//delay_ms(1);//按键消抖动
key_l = P3;//扫描得到按键值
switch(key_l)
{
//获取按键值
case 0x0e:
{
key_value = 1;
}
break;
case 0x0d:
{
key_value = 2;
}
break;
case 0x0b:
{
key_value = 3;
}
break;
//case 0x70:
//break;
}
}
}
else
{
key_in_flag = 1;//(按键松开标志)
}
}
/函 数 名 : LcdWriteCom
函数功能 : 向LCD写入一个字节的命令/
void lcd_wri_com(unsigned char com) //写入命令
{
E = 0; //使能清零
RS = 0; //选择写入命令
RW = 0; //选择写入
DB = com;
delay_ms(1);
E = 1; //写入时序
delay_ms(5);
E = 0;
}
/*函数功能 : 向LCD写入一个字节的数据*/
void lcd_wri_data(unsigned char dat)//写入数据
{
E = 0; //使能清零
RS = 1; //选择写入数据
RW = 0; //选择写入
DB = dat;
delay_ms(1);
E = 1; //写入时序
delay_ms(5);
E = 0;
}
/* 函 数 名 : WriString
* 函数功能 : 刷新屏幕显示*/
void wri_string(unsigned char y,unsigned char x,unsigned char *p)
{
if(y==1)//如果选择第一行
lcd_wri_com(0x80+x);//选中地址
else
lcd_wri_com(0xc0+x);//选中地址
while(*p)
{
lcd_wri_data(*p);//写入数据
p++;
}
}
/ 函数名:lcd_write_char/
void lcd_write_char(unsigned char y, unsigned char x, unsigned char dat) //列x=0~15,行y=0,1
{
unsigned char temp_l, temp_h;
if(y==1)//如果选择第一行
lcd_wri_com(0x80+x);//选中地址
else
lcd_wri_com(0xc0+x);//选中地址
temp_l = dat % 10;
temp_h = dat / 10;
lcd_wri_data(temp_h + 0x30); //convert to ascii
lcd_wri_data(temp_l + 0x30);
}
/光标控制/
void lcd1602_guanbiao(unsigned char y, unsigned char x,unsigned char on_off)
{
if(on_off == 1) //开光标
{
if(y==1)//如果选择第一行
lcd_wri_com(0x80+x);
else
lcd_wri_com(0xc0+x);//将光标移动到秒个位
lcd_wri_com(0x0f);//显示光标并且闪烁
}
else
{
if(y==1)//如果选择第一行
lcd_wri_com(0x80+x);
else
lcd_wri_com(0xc0+x);//将光标移动到秒个位
lcd_wri_com(0x0c); //关光标
}
}
void lcd_init(void) //LCD初始化子程序
{
lcd_wri_com(0x38);//置功能8位双行
lcd_wri_com(0x0c);//显示开关光标
lcd_wri_com(0x06);//字符进入模式屏幕不动字符后移
delay_ms(5);//延时5ms
lcd_wri_com(0x01); //清屏
wri_string(1,0,times);//初始化显示
wri_string(1,6,date);
wri_string(2,0,"H: %RH T: C ");//初始化显示
}
void DHT11_delay_us(unsigned char n)
{
while(--n);
}
void DHT11_delay_ms(unsigned int z)
{
unsigned int i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(30); //延时18ms以上
Data=1;
DHT11_delay_us(30);
}
unsigned char DHT11_rec_byte() //接收一个字节
{
unsigned char i,dat=0;
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(!Data); ////等待50us低电平过去
DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0
dat<<=1; //移位使正确接收8位数据,数据为0时直接移位
if(Data==1) //数据为1时,使dat加1来接收数据1
dat+=1;
while(Data); //等待数据线拉低
}
return dat;
}
void DHT11_receive() //接收40位的数据
{
unsigned char R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0); //等待拉高
DHT11_delay_us(40); //拉高后延时80us
R_H=DHT11_rec_byte(); //接收湿度高八位
R_L=DHT11_rec_byte(); //接收湿度低八位
T_H=DHT11_rec_byte(); //接收温度高八位
T_L=DHT11_rec_byte(); //接收温度低八位
revise=DHT11_rec_byte(); //接收校正位
DHT11_delay_us(25); //结束
if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
humi_value = RH;
temp_value = TH;
}
}
这是有humi_value值的输入
```c
void init_all_hardware(void)
{
time_init();//定时器初始化
lcd_init();
lcd_write_char(2,2,humi_value);
lcd_write_char(2,11,temp_value);
lcd_wri_com(0xcd);
lcd_wri_data(0xdf);
key_value = 20;
now_window = normal_mode;
cnt_100ms = 0;
time_100ms_flag = 0;
curr_menu = 0;
}
void time_service(void)
{
if(time_100ms_flag)
{
time_100ms_flag = 0;
if (++cnt_500ms>5)
{
cnt_500ms = 0;
if(now_window == normal_mode)
{
EA = 0;
DHT11_receive();
EA = 1;
lcd_write_char(2,2,humi_value);
lcd_write_char(2,11,temp_value);
AlarmJudge();//报警函数
}
}
}
}
LCD代码中去掉或者注释掉第二个Dht11传感器值的显示程序