晶振对了? |
先接一下上拉电阻,还不行就检查一下延时的时间有没有问题 |
慕芸 发表于 2020-2-9 11:30 你好! 1、首先要硬件连接没错 2、基本就是程序的问题 |
同样的问题,怎么解决 |
我也有这个问题,怎么解决的呢 |
你看看有没有按照要求接上上拉电阻,没接肯定不行的,有的开发板是直接在上面就已经接好了 |
一二三亖 发表于 2019-4-30 14:19 怎么解决的? |
一定要接5K的上拉电阻!!!!! |
我之前也遇到过类似的问题 |
我之前也遇到过类似的问题 |
找到问题是什么了吗 我也遇到这个问题了 |
一二三亖 发表于 2019-4-30 14:19 我的搞定了 |
周英俊 发表于 2019-3-28 10:55 我的也是 ,,,,stc12的 |
我的也有问题,传感器根本不响应。 |
解决了吗 兄弟 我现在也遇到了相同问题 |
不一定是程序问题哦。 数据线一定、一定、一定要接10K的上拉电阻!!!!! |
续继,续继,期待更精彩 |
网上的程序可能是1t单片机的延时时间不对,建议你找一个51开发板附带的程序试试,绝对可以,问题肯定出在延时上 |
注意延时长度在范围内即可。 |
sbit Sensor_SDA = P1^2; //定义DHT11端口SDA // 变量定义 unsigned char Sensor_Data[5]={0x00,0x00,0x02d,0x2d,0x00}; unsigned char Sensor_Check; //校验和 unsigned char Sensor_AnswerFlag; //收到起始标志位 unsigned char Sensor_ErrorFlag; //读取传感器错误标志 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 "}; /*******************************************************************/ /* */ /* 数据转换与湿度、温度显示 */ /* */ /*******************************************************************/ Disp_Temperature() { unsigned char m=0; if(Sensor_AnswerFlag == 1) { Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3]; //校验成功 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); //十位数显示 lcd_wdat(display[1],1); //个位数显示 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); //十位数显示 lcd_wdat(display[1],1); //个位数显示 }else //校验失败 送上读到数据 { 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) } } /********************************************\ |* 功能: 读传感器发送的单个字节 *| \********************************************/ 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) //检测上次低电平是否结束 { if(++cnt >= 3600) { break; } } //延时Min=26us Max50us 跳过数据"0" 的高电平 Delay(48); //延时30us //判断传感器发送数据位 tmp =0; if(Sensor_SDA) { tmp = 1; } cnt =0; while(Sensor_SDA) //等待高电平 结束 { if(++cnt >= 2400) { break; } } buffer <<=1; buffer |= tmp; } return buffer; } /********************************************\ |* 功能: 读传感器 *| \********************************************/ unsigned char Read_Sensor(void) { unsigned char i; //主机拉低(Min=800US Max=20Ms) Sensor_SDA = 0; Delay_N1ms(216); //延时20Ms //释放总线 延时(Min=30us Max=50us) Sensor_SDA = 1; Delay_N10us(36);//延时30us //主机设为输入 判断传感器响应信号 Sensor_SDA = 1; Sensor_AnswerFlag = 0; // 传感器响应标志 //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(Sensor_SDA ==0) { Sensor_AnswerFlag = 1; //收到起始信号 Sys_CNT = 0; //判断从机是否发出 80us 的低电平响应信号是否结束 while((!Sensor_SDA)) { if(++Sys_CNT>1200) { Sensor_ErrorFlag = 1; //防止进入死循环 return 0; } } Sys_CNT = 0; //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while((Sensor_SDA)) { if(++Sys_CNT>1200) { Sensor_ErrorFlag = 1; //防止进入死循环 return 0; } } // 数据接收 传感器共发送40位数据 // 即5个字节 高位先送 5个字节分别为湿度高位 湿度低位 温度高位 温度低位 校验和 // 校验和为:湿度高位+湿度低位+温度高位+温度低位 for(i=0;i<5;i++) { Sensor_Data[i] = Read_SensorData(); } } else { Sensor_AnswerFlag = 0; // 未收到传感器响应 } return 1; } void Clear_Data (void) { int i; for(i=0;i<5;i++) { Sensor_Data[i] = 0x2d; }//接收数据清零 } |