要求:
1、測量溫濕度。
2、設置濕度閥值,濕度過高自動關窗。
3、顯示屏用LM016L。
4、有自動和手動模式?;?2單片機的下雨自動關窗控制系統(tǒng),顯示屏用LM016L。有報警功能,按鍵調節(jié)閥值。有自動和手動模式。
#include "DHT11.h"
unsigned char dht11_dat[5];//濕度高低+溫度高低+和校驗
void delay1ms(unsigned int i) //延時函數(shù)
{
unsigned char j;
while(i--)
{
for(j=0;j<110;j++);
}
}
void dht11_recive()//接收
{
unsigned char j,k,m;
unsigned int i;
SDA=0;
delay1ms(30);//開始信號20ms
SDA=1;
for(i=0;i<1000;i++)//等待響應
{
if(!SDA)
break;
}
if(i==1000)
{
SDA=1;
return;//如果沒有響應,返回
}
for(i=0;i<1000;i++)//等待響應結束
{
if(SDA)
break;
}
if(i==1000)
{
SDA=1;
return;//如果響應超時,返回
}
for(i=0;i<1000;i++)//等待開始
{
if(!SDA)
break;
}
if(i==1000)
{
SDA=1;
return;//如果沒有響應,返回
}
for(k=0;k<5;k++) //接收5個數(shù)據(jù)
{
for(j=0;j<8;j++)//接收8位
{
m<<=1;
//===========================
for(i=0;i<1000;i++)//等待0信號結束
{
if(SDA)
break;
}
if(i==1000)
{
SDA=1;
return;//如果超時,返回
}
//===========================
for(i=0;i<1000;i++)//等待開始信號
{
if(!SDA)
break;
}
if(i==1000)
{
SDA=1;
return;//如果超時,返回
}
if(i<5)
m++;
}
dht11_dat[k]=~m;
}
delay1ms(1);
}
#include "lcd1602.h"
void delay_uint(uint i)
{
while(i--);
}
/********************************************************************
* 名稱 : write_com(uchar com)
* 功能 : 1602命令函數(shù)
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(20);
e=1;
delay_uint(20);
e=0;
}
/********************************************************************
* 名稱 : write_data(uchar dat)
* 功能 : 1602寫數(shù)據(jù)函數(shù)
* 輸入 : 需要寫入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(20);
e=1;
delay_uint(20);
e=0;
}
/********************************************************************
* 名稱 : write_string(uchar hang,uchar add,uchar *p)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數(shù)如下
write_string(1,5,"ab cd ef;")
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '?') break;
write_data(*p);
p++;
}
}
/********************************************************************
* 名稱 : init_1602()
* 功能 : 初始化1602液晶
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void init_1602()
{
write_com(0x38); //數(shù)據(jù)總線為8位,顯示2行,5x7點陣
write_com(0x0c); //開顯示,有光標,光標閃爍
write_com(0x06); //光標自動右移
delay_uint(1000); //等待設置完成
}
資料借鑒于此?紛傳
閱讀全文