/*----------------------------------*/
/*-------- 温湿度模块am2301 ---------*/
/*----------------------------------*/
void Clear_Data (void)
{
int i;
for(i=0;i<5;i++)
{
Sensor_Data[i] = 0x00;
}//接收数据清零
}
/********************************************\
|* 功能: 读传感器发送的单个字节 *|
\********************************************/
unsigned char Read_SensorData(void)
{
unsigned char i,cnt;
unsigned char buffer,tmp;
buffer = 0;
for(i=0;i<8;i++){
cnt=0;
//数据位的低电平是否结束
while(!Sensor_SDA){ //检测上次低电平是否结束
if(++cnt >= 300){
break;
}
}
//从数据位的低电平结束时刻开始经过 30us 后,如果 SDA 还是高电平则数据位为 1,
//如果 SDA 为低电平则数据位位 0
Delay_N10us(3); //延时30us
tmp =0;
if(Sensor_SDA){
tmp = 1;
}
cnt =0;
//等待高电平 结束
while(Sensor_SDA){
if(++cnt >= 200){
break;
}
}
buffer <<=1;
buffer |= tmp;
}
return buffer;
}
/********************************************\
|* 功能: 读传感器 *|
\********************************************/
unsigned char Read_Sensor(void)
{
unsigned char i;
//主机拉低(Min=800US Max=20Ms)
Sensor_SDA = 0;
Delay_N1ms(2); //延时2Ms
//释放总线 延时(Min=30us Max=50us)
Sensor_SDA = 1;
Delay_N10us(3); //延时30us
Sensor_SDA = 1;
Sensor_AnswerFlag = 0;// 传感器响应标志
//从机是否有低电平响应信号,如不响应则跳出,响应则向下运行
if(Sensor_SDA ==0){
Sensor_AnswerFlag = 1; //收到起始信号
Sys_CNT = 0;
//从机发出的低电平响应信号是否结束(80us)
while( (!Sensor_SDA) ){
if(++Sys_CNT>300){ //防止进入死循环
Sensor_ErrorFlag = 1;
return 0;
}
}
Sys_CNT = 0;
//从机发出的高电平响应信号是否结束(80us)
while((Sensor_SDA)){
if(++Sys_CNT>300){ //防止进入死循环
Sensor_ErrorFlag = 1;
return 0;
}
}
// 数据接收 传感器共发送40位数据
// 即5个字节 高位先送 5个字节分别为湿度高位 湿度低位 温度高位 温度低位 校验和
// 校验和为:湿度高位+湿度低位+温度高位+温度低位
for(i=0;i<5;i++){
Sensor_Data[i] = Read_SensorData();
}
}else{
Sensor_AnswerFlag = 0; // 未收到传感器响应
return 0;
}
return 1;
}
//========以下是main 方法中得到温度和湿度=================================
//是否显示温度
if(dispMod ==2 )
{
tmp =0;
tmp += (unsigned int)Sensor_Data[3];
tmp += (unsigned int)Sensor_Data[2] *256;
//显示摄氏温度模式
if(!tempMod){
tempH = (unsigned char)(tmp/100%10);
tempL = (unsigned char)(tmp/10%10);
write_number(black, RED);
write_number(tempH, RED);
write_number(tempL, RED);
//write_number(tempL+dot2, RED);
// write_number(tmp%10, RED);
write_number(33, RED);
//显示华氏温度模式
}else {
tmp = tmp/10; //摄氏温度
tempFF = 32 + 1.8 * (float)tmp;
tempF[0] = (uchar)tempFF /100%10;
tempF[1] = (uchar)tempFF /10%10;
tempF[2] = (uchar)tempFF %10;
if(tempF[0]){
write_number(tempF[0], RED);
write_number(tempF[1], RED);
write_number(tempF[2], RED);
write_number(34, RED);
}else{
write_number(black, RED);
if(tempF[1])
{
write_number(tempF[1], RED);
write_number(tempF[2], RED);
write_number(34, RED);
}else{
write_number(black, RED);
write_number(tempF[2], RED);
write_number(34, RED);
}
}
}
LE =1;
LE =0;
}
//是否显示湿度度
if(dispMod ==3){
Humi=0;
Humi += (unsigned int)Sensor_Data[1];
Humi += (unsigned int)Sensor_Data[0]*256;
write_number(Humi/100%10, RED);
write_number((Humi%10%10)+dot2, RED);
write_number(Humi%10, RED);
write_number(35, RED);
LE =1;
LE =0;
}