# include & ltintrins.h & gt
#定義uchar無符號字符
#定義uint無符號整數
typedef無符號字符unint8//unint8替換未指定的char以提高可移植性
typedef無符號char unint 16;
無符號字符str 1[]= { " " };
無符號字符str 2[]= { " " };
無符號char碼dis 1[]= { " Xh RH:" };//定義壹個數組
無符號字符代碼dis 2[]= { " DO T:" };
sbit buz=p1^0;
sbit TRH = p1^7;//溫濕度傳感器DHT11的數據訪問
sbit LCD _ RS = p1^1;
sbit LCD _ rw = p1^2;
sbit LCD _ en = p1^3;
unint8 TH_data,TL_data,RH_data,RL_data,CK _ data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK _ temp;
unint8 com_data,untemp,temp
unint8響應;
void initcom()
{
TMOD = 0x 20;
th 1 = 0x FD;
TL 1 = 0x FD;
tr 1 = 1;
任= 1;
SM0 = 0;
sm 1 = 1;
EA = 1;
ES = 1;
}
void send(無符號字符溫度)
{
//發送彪子
SBUF = temp
而(!TI);
TI = 0;
}
void sendwd()
{
//發送杜文
uint w _ d;
w _ d = TH _ data+128;
SBUF = w _ d;
而(!TI);
TI = 0;
}
void發送d()
{
//發送杜詩
SBUF = RH _ data
而(!TI);
TI = 0;
}
/*********************************************************************************/
void delay nop()///delay
{
_ nop _();
_ nop _();
_ nop _();
_ nop _();
}
/*********************************************************************************/
/*********************************************************************************/
//毫秒延遲子程序
/*********************************************************************************/
void delay_ms(無符號整數毫秒)
{
無符號字符I;
當(毫秒)
{
for(I = 0;我& lt150;i++)
{
_ nop _();
_ nop _();
_ nop _();
_ nop _();
}
}
}
/*********************************************************************************/
/*********************************************************************************/
//5us類延遲程序
/*********************************************************************************/
void delay_us()
{
unint 8 I;
I-;
I-;
I-;
I-;
I-;
I-;
}
/********************************************************************************/
/********************************************************************************/
//測試LCD的忙碌狀態。
//當//lcd_busy()為1時,忙並等待。lcd_busy()為0時,空閑,可以寫指令和數據。
/********************************************************************************/
位lcd_busy()
{
位結果;
LCD _ RS = 0;
LCD _ RW = 1;
LCD _ EN = 1;
delay nop();
結果=(位)(P0 & amp0x 80);
LCD _ EN = 0;
返回(結果);
}
/*******************************************************************************/
/*******************************************************************************/
//將命令數據寫入LCD。
/*******************************************************************************/
void lcd_wcmd(無符號字符命令)
{
while(LCD _ busy());
LCD _ RS = 0;
LCD _ RW = 0;
LCD _ EN = 0;
_ nop _();
_ nop _();
P0 = cmd
delay nop();
LCD _ EN = 1;
delay nop();
LCD _ EN = 0;
}
/*****************************************************************************/
/*****************************************************************************/
//將顯示數據寫入LCD。
//RS=高電平,RW=低電平,E=高脈沖,D0-D7=數據。
/*****************************************************************************/
void lcd_wdata(無符號字符數據)
{
while(LCD _ busy());
LCD _ RS = 1;
LCD _ RW = 0;
LCD _ EN = 0;
P0 = dat
delay nop();
LCD _ EN = 1;
delay nop();
LCD _ EN = 0;
}
/****************************************************************************/
/****************************************************************************/
//LCD初始化設置
/****************************************************************************/
void lcd_init()
{
delay _ ms(15);
LCD _ wcmd(0x 38);//16*2顯示,5*7點陣,8位數據
delay _ ms(5);
LCD _ wcmd(0x 38);
delay _ ms(5);
LCD _ wcmd(0x 38);
delay _ ms(5);
LCD _ wcmd(0x0c);//打開和關閉顯示光標。
delay _ ms(5);
LCD _ wcmd(0x 06);//移動光標
delay _ ms(5);
//LCD _ wcmd(0x 01);//清除LCD的顯示內容。如果屏幕太暗,這兩句可以刪掉。
//delay _ ms(5);
}
/****************************************************************************/
/****************************************************************************/
//設置LCD顯示位置。
/****************************************************************************/
void lcd_dis_pos(無符號字符位置)
{
LCD _ wcmd(pos | 0x 80);//數據指針=80+地址變量
}
/****************************************************************************/
/****************************************************************************/
//收發器信號檢測,數據讀取
/****************************************************************************/
字符接收()
{
unint 8 I;
com _ data = 0;
for(I = 0;我& lt=7;i++)
{
respond = 2;
而((!TRH)& amp;& amprespond++);
delay _ us();
delay _ us();
delay _ us();
中頻(TRH)
{
temp = 1;
respond = 2;
while((TRH)& amp;& amprespond++);
}
其他
temp = 0;
com _ data & lt& lt=1;
com _ data | = temp
}
return(com _ data);
}
/****************************************************************************/
/****************************************************************************/
//濕度讀數子程序
//溫度高8位== TL_data
//8位低溫== TH_data
//濕度高8位== RH_data
//濕度低8位== RH_data
//校驗8位= = CK _數據
//被調用的程序有delay();,Delay _ 5us();,RECEIVE();
/***************************************************************************/
void read_TRH()
{
//主機下拉18ms。
TRH = 0;
delay _ ms(18);
TRH = 1;
//上拉電阻上拉//數據總線,使主機延遲增加20us。
delay _ us();
delay _ us();
delay _ us();
delay _ us();
//delay _ us();
//delay _ us();delay _ us();delay _ us();delay _ us();
//主機被設置為輸入從機響應信號。
TRH = 1;
//判斷DHT11是否有低電平響應信號。如果它沒有反應,就會跳出來,反應往下跑。
如果(!TRH)
{
respond = 2;
//判斷DHT11是否發出80us低電平響應信號。
而((!TRH)& amp;& amprespond++);
respond = 2;
//判斷從機是否發出80us的高電平,如果是,則進入數據接收狀態。
而(TRH & amp& amprespond++);
//數據接收狀態
RH _ temp = receive();
RL _ temp = receive();
TH _ temp = receive();
TL _ temp = receive();
CK _臨時=接收();
TRH = 1;
//數據檢查
untemp =(RH _ temp+RL _ temp+TH _ temp+TL _ temp);
if(untemp==CK溫度)
{
RH _ data = RH _ temp
RL _ data = RL _ temp
TH _ data = TH _ temp
TL _ data = TL _ temp
CK _數據= CK _溫度;
}
}
//濕度的整數部分
str 1[0]=(char)(0x 30+RH _ data/10);
str 1[1]=(char)(0x 30+RH _ data % 10);
str 1[2]= 0x2e;//小數點
//濕度的小數部分
str 1[3]=(char)(0x 30+RL _ data/10);
str 1[5]= 0x 25;//"%"
str 1[6]= 0x 52;//"R "
str 1[7]= 0x 48;//"H "
//溫度的整數部分
str 2[0]=(char)(0x 30+TH _ data/10);
str 2[1]=(char)(0x 30+TH _ data % 10);
str 2[2]= 0x2e;//小數點
//溫度的小數部分
str 2[3]=(char)(0x 30+TL _ data/10);
str 2[5]= 0x 27;//"'"
str 2[6]= 0x 43;//"C "
}
/****************************************************************************/
//冬夏溫度濕度適宜。
//濕度:30%-80% 30%-60%
//溫度:18℃-25℃,23℃-28℃
/****************************************************************************/
Void baoj()//報警功能
{
if(RH _ data & gt;=80) //濕度上限80%
{
buz = 0;
delay _ ms(200);
buz = 1;
delay _ ms(10);
}
else if(RH _ data & lt;= 30)//濕度下限30%
{
buz = 0;
delay _ ms(200);
buz = 1;
delay _ ms(10);
}
else if(TH _ data & gt;= 25)//溫度上限為25℃
{
buz = 0;
delay _ ms(200);
buz = 1;
delay _ ms(10);
}
else if(TH _ data & lt;= 18)//溫度下限18℃
{
buz = 0;
delay _ ms(200);
buz = 1;
delay _ ms(10);
}
其他
{
buz = 1;
}
}
/****************************************************************************/
//主函數
//th,TL,RH,RL分別代表溫度和濕度的整數和小數部分。
/****************************************************************************/
void main()
{
LCD _ init();
initcom();
delay _ us();
while(1)
{
無符號字符I,n=0x40,m;
read _ TRH();
//寫字符
for(I = 0;我& lt=7;i++)
{
lcd_dis_pos(壹);//顯示字符
LCD _ wdata(dis 1[I]);
LCD _ dis _ pos(n+I);//顯示字符
LCD _ wdata(dis 2[I]);
}
//寫入濕度數據
m = 0x08
for(I = 0;我& lt=7;i++)
{
LCD _ dis _ pos(m);
LCD _ wdata(str 1[I]);
m++;
}
//寫入溫度數據
m = 0x48
for(I = 0;我& lt=7;i++)
{
LCD _ dis _ pos(m);
LCD _ wdata(str 2[I]);
m++;
}
//延遲
delay _ ms(500);
baoj();//報警
發送(0x ff);//wsd標誌
//delay _ ms(10);
send wd();
//delay _ ms(10);
sendsd();
//delay _ ms(10);
}
}