|
sbit Sensor_SDA = P1^2; //定義DHT11端口SDA
// 變量定義
unsigned char Sensor_Data[5]={0x00,0x00,0x02d,0x2d,0x00};
unsigned char Sensor_Check; //校驗(yàn)和
unsigned char Sensor_AnswerFlag; //收到起始標(biāo)志位
unsigned char Sensor_ErrorFlag; //讀取傳感器錯誤標(biāo)志
unsigned int Sys_CNT;
unsigned int Tmp;
unsigned char *String;
#define S_Temp "Temp:"
#define S_RH "RH:"
#define S_CRCT "Check: True"
#define S_CRCF "Check: Wrong"
#define S_Data "Data: "
#define S_NotS "Sensor Not Connected"
unsigned char code cdis1[ ] = {" Check: True "};
unsigned char code cdis2[ ] = {" Check: Wrong "};
unsigned char code cdis3[ ] = {" DHT11 ERR0R "};
/*******************************************************************/
/* */
/* 數(shù)據(jù)轉(zhuǎn)換與濕度、溫度顯示 */
/* */
/*******************************************************************/
Disp_Temperature()
{ unsigned char m=0;
if(Sensor_AnswerFlag == 1)
{
Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];
//校驗(yàn)成功
if(Sensor_Check ==Sensor_Data[4])
{
unsigned char s=0;
Tmp=Sensor_Data[0]+0x06; //RH
display[1]=Tmp%10+0x30;
display[0]=Tmp/10+0x30;
if(display[0]==0x30) //高位為0,不顯示
{
display[0]=0x20;
if(display[1]==0x30) //次高位為0,不顯示
display[1]=0x20;
}
lcd_pos(0x08,1);
lcd_wdat(display[0],1); //十位數(shù)顯示
lcd_wdat(display[1],1); //個位數(shù)顯示
Tmp=Sensor_Data[2]; //Temp
display[1]=Tmp%10+0x30;
display[0]=Tmp/10+0x30;
if(display[0]==0x30) //高位為0,不顯示
{
display[0]=0x20;
if(display[1]==0x30) //次高位為0,不顯示
display[1]=0x20;
}
lcd_pos(0x46,1);
lcd_wdat(display[0],1); //十位數(shù)顯示
lcd_wdat(display[1],1); //個位數(shù)顯示
}else //校驗(yàn)失敗 送上讀到數(shù)據(jù)
{
lcd_pos(0x40,2);
for(m=0;m<16;m++) //顯示字符
lcd_wdat(cdis2[m],2);
Delay_N1ms(36000); // 延時 2S(兩次讀取間隔至少2S)
}
}// 傳感器未連接
else
{
lcd_pos(0x40,2);
for(m=0;m<16;m++) //顯示字符
lcd_wdat(cdis3[m],2);
Delay_N1ms(36000); // 延時 2S(兩次讀取間隔至少2S)
}
}
/********************************************\
|* 功能: 讀傳感器發(fā)送的單個字節(jié) *|
\********************************************/
unsigned char Read_SensorData(void)
{
unsigned int i,cnt;
unsigned char buffer,tmp;
buffer = 0;
for(i=0;i<8;i++)
{
cnt=0;
while(!Sensor_SDA) //檢測上次低電平是否結(jié)束
{
if(++cnt >= 3600)
{
break;
}
}
//延時Min=26us Max50us 跳過數(shù)據(jù)"0" 的高電平
Delay(48); //延時30us
//判斷傳感器發(fā)送數(shù)據(jù)位
tmp =0;
if(Sensor_SDA)
{
tmp = 1;
}
cnt =0;
while(Sensor_SDA) //等待高電平 結(jié)束
{
if(++cnt >= 2400)
{
break;
}
}
buffer <<=1;
buffer |= tmp;
}
return buffer;
}
/********************************************\
|* 功能: 讀傳感器 *|
\********************************************/
unsigned char Read_Sensor(void)
{ unsigned char i; //主機(jī)拉低(Min=800US Max=20Ms)
Sensor_SDA = 0;
Delay_N1ms(216); //延時20Ms
//釋放總線 延時(Min=30us Max=50us)
Sensor_SDA = 1;
Delay_N10us(36);//延時30us
//主機(jī)設(shè)為輸入 判斷傳感器響應(yīng)信號
Sensor_SDA = 1;
Sensor_AnswerFlag = 0; // 傳感器響應(yīng)標(biāo)志
//判斷從機(jī)是否有低電平響應(yīng)信號 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
if(Sensor_SDA ==0)
{ Sensor_AnswerFlag = 1; //收到起始信號
Sys_CNT = 0; //判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號是否結(jié)束
while((!Sensor_SDA))
{ if(++Sys_CNT>1200)
{
Sensor_ErrorFlag = 1; //防止進(jìn)入死循環(huán)
return 0;
}
}
Sys_CNT = 0; //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
while((Sensor_SDA))
{
if(++Sys_CNT>1200)
{
Sensor_ErrorFlag = 1; //防止進(jìn)入死循環(huán)
return 0;
}
} // 數(shù)據(jù)接收 傳感器共發(fā)送40位數(shù)據(jù)
// 即5個字節(jié) 高位先送 5個字節(jié)分別為濕度高位 濕度低位 溫度高位 溫度低位 校驗(yàn)和
// 校驗(yàn)和為:濕度高位+濕度低位+溫度高位+溫度低位
for(i=0;i<5;i++)
{
Sensor_Data[i] = Read_SensorData();
}
}
else
{
Sensor_AnswerFlag = 0; // 未收到傳感器響應(yīng)
}
return 1;
}
void Clear_Data (void)
{
int i;
for(i=0;i<5;i++)
{
Sensor_Data[i] = 0x2d;
}//接收數(shù)據(jù)清零
} |
|