用protues仿真,使用sht11 温湿度模块,读取数据时第一个字节能成功读取,后面的字节无法读取。
sht11 的通讯时序图如下
我卡在了蓝色圈这里
1、开始通讯
2、向sht11发送命令,高三位为地址,低三位为命令,发送完毕后sht11会拉到低数据线data作为响应,然后释放数据线,等待 11/55/210 ms for a 8/12/14bit 准备测量数据,准备完毕后sht11拉低数据线data响应表示可以读取数据了。
3、读取数据:每读取八个字节后Uc会拉低数据线data作为应答(ack)
#include<reg52.h>
#define uchar unsigned char
sbit io_clk=P2^5;
sbit io_data=P2^6;
sbit led_flag=P3^2;
int buff; //用于接收数据
void delay_s(int num)
{
int i,k;
for(i=0;i<num;i++)
{
for(k=0;k<1000;k++);
}
}
// 10=100us
void delay (uchar number)
{
uchar i;
for(i=0;i<number;i++);
}
//sht11开始通讯
void sht11_start()
{
io_clk=0;
delay(5);
io_clk=1;
io_data=1;
delay(5);
io_data=0;
delay(5);
io_clk=0;
delay(10);
io_clk=1;
delay(5);
io_data=1;
delay(5);
io_clk=0;
}
//向sht11 发送测量湿度命令 ”000 00101”
void sht11_sendcomd()
{
io_clk=0;
io_data=0;
delay(10);
//发送地址位“000”
io_clk=1;
delay(5);
io_clk=0;
delay(5);
io_clk=1;
delay(5);
io_clk=0;
delay(5);
io_clk=1;
delay(5);
io_clk=0;
delay(5);
//发送测量湿度命令“00101”
io_clk=1;
delay(5);
io_clk=0;
delay(5);
io_clk=1;
delay(5);
io_clk=0;
delay(2);
io_data=1;
delay(3);
io_clk=1;
delay(5);
io_clk=0;
delay(2);
io_data=0;
delay(3);
io_clk=1;
delay(5);
io_clk=0;
delay(2);
io_data=1;
delay(3);
io_clk=1;
delay(5);
io_clk=0;
delay(5);
}
//接收sht11测量数据
void sht11_receive()
{
uchar i,j;
//向sht11发送命令后,sht11会拉低data作为响应
while(io_data);
//应答 ack
io_clk=1;
delay(5);
io_clk=0;
delay(5);
//等待一段时间sht11测量结束
//while(io_data);
delay_s(2000);
//接收两个字节的测量数据
for(j=0;j<2;j++)
{
for(i=0;i<8;i++)
{
io_clk=1;
delay(2);
buff=buff<<1;
if(1==io_data)
buff|=0x01;
delay(3);
io_clk=0;
delay(5);
}
//接收完一个字节数据后Uc拉低data 作为应答
io_data=0;
delay(2);
io_clk=1;
delay(5);
io_clk=0;
delay(5);
}
}
void main()
{
//跳过sht11上电不稳定时间段
delay_s(100);
delay_s(100);
delay_s(100);
delay_s(100);
//sht11开始通讯
sht11_start();
//向sht11发送命令
sht11_sendcomd();
//读取sht11测量数据
sht11_receive();
while(1);
}
sht11开始通讯以及发送测量命令
sht11接收数据
从应答信号后(画红线的地方)开始就接收不到sht11的数据
帮我看看哪里出错了,为什么我按照手册上的时序图进行通讯第一个字节可以接收,然后我给了sht11一个应答后,后面的数据sht11没反应
我已经自己解决了,居然连个回答都没有,呜呜呜