求助 MEGA16采集SHT10无答应信号ACK返回

西湖采莲人 2018-10-26 01:08:46
利用M16采集SHT10,通过485输出。测试输出test1的值为06,说明write_Bytes写命令返回ACK是1,而不是0.麻烦各位帮忙一下看哪错了,谢谢!



#define F_CPU 7372800UL
#define DIR_TX PORTD|=(1<<2)


uint8 a=0x00;
uint8 b=0x00;
uint8 c=0x00;

uint8 test1=0;
uint8 test2=0;



enum {SHT1X_TEMP, SHT1X_HUMI};



void UART_Init(uint32 Baud)
{
UCSRC = 0x86; //异步模式,无校验,停止位1,字符长度8位,
UBRRL= (F_CPU/Baud/16-1)%256; //在Codeblocks中已配置F_CPU为8M
UBRRH= (F_CPU/Baud/16-1)/256;
UCSRB = 0x98;
DDRD|=(1<<2); // DDRD|=(1<<PD2); 把485EN配置成输出
DIR_TX;
}

void uart_send(uint8 e_DATA)
{
UDR=e_DATA;
}


void SHT1x_Init(void)
{
SHT10_SCK_Out;
SHT10_DATA_Out;
SHT10_SCK_L;
SHT10_DATA_H;
SHT10_ConReset(); //复位通讯
}



//*************************************************************
// Function :SHT10_WriteByte
// Description:写1字节,主要用来写地址+命令(如示例时序000 00101)
// Input : value:要写入的字节
// return : err: 0-正确 1-错误 ,【返回的为应答位】
//*************************************************************/
uint8 SHT10_WriteByte(uint8 value)
{
uint8 i, err = 0;

SHT10_DATA_Out;
SHT10_DATA_H;
SHT10_SCK_L;

//设置DATA数据线为输出
for(i = 0x80; i > 0; i/=2) //写1个字节 1000 0000 另一种写法for(i = 0x80; i > 0; i /= 2)
{
if(i & value) //获取value每一位的值。
SHT10_DATA_H;
else
SHT10_DATA_L;
delay_1us();
SHT10_SCK_H;
delay_3us();
delay_3us();
SHT10_SCK_L;
delay_1us();

}
SHT10_DATA_H; //注意此处 ,把DATA置为高,看传感器是否拉低来ack
SHT10_SCK_H;
SHT10_DATA_In; //设置DATA数据线为输入,释放DATA线
if(SHT10_DATA_Read==0)
{
err=0;
}
else
{
err=5;
}
SHT10_SCK_L;
delay_1us();
return err; //返回01问题所在
}

///*************************************************************
// Function :SHT10_ReadByte
// Description:读1字节数据. 主要是读数据和校验
// Input : Ack: 0-不应答 1-应答 (读完数据后一般给个应答信号为好)
// return : val读出的值
//*************************************************************/
uint8 SHT10_ReadByte(uint8 Ack)
{
uint8 i,val = 0;

SHT10_DATA_Out; //释放数据线
SHT10_DATA_H;
SHT10_DATA_In;
for(i = 0x80; i > 0; i/= 2) //读取1字节的数据
{
SHT10_SCK_H;
delay_1us();
if(SHT10_DATA_Read==0x02) val = (val | i); //PINC&0X02 , 识别是1还是0,==0x02,说明传输过来的是1
SHT10_SCK_L;
delay_1us();
}
delay_1us();
SHT10_DATA_Out;
delay_1us();
if(Ack) //Ack: 0-不应答 1-应答
SHT10_DATA_L; //应答,则会接下去读接下去的数据(校验数据)
else
SHT10_DATA_H; //不应答,数据至此结束
delay_1us();
SHT10_SCK_H;
delay_3us();
delay_3us();
SHT10_SCK_L;
delay_1us();
SHT10_DATA_H;
return val; //返回读到的值
}


///*************************************************************
// Function :SHT10_TransStart
// Description:开始传输信号,时序如下:
// _____ ________
// DATA: |_______|
// ___ ___
// SCK : ___| |___| |______
// Input : none
// return : none
//*************************************************************/
void SHT10_TransStart(void)
{
SHT10_DATA_Out; //设置DATA数据线为输出

SHT10_DATA_H;
SHT10_SCK_L; //初始状态
delay_1us();
SHT10_SCK_H;
delay_1us();
SHT10_DATA_L;
delay_1us();
SHT10_SCK_L;
delay_3us();
delay_3us();
SHT10_SCK_H;
delay_1us();
SHT10_DATA_H;
delay_1us();
SHT10_SCK_L;
delay_1us();

}


///*************************************************************
// Function :SHT10_ConReset
// Description:通讯复位,主要是把通信的时序重新理一下,不修改寄存器内容。时序如下:
// _____________________________________________________ ________
// DATA: |_______|
// _ _ __ _ __ _ _ _ _ ___ ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |_____| |____| |______
// Input : none
// return : none
//*************************************************************/
void SHT10_ConReset(void)
{
uint8 i;

SHT10_DATA_Out;

SHT10_DATA_H;
SHT10_SCK_L; //起始状态

for(i = 0; i < 9; i++) //触发SCK时钟9c次
{
SHT10_SCK_H;
delay_1us();
SHT10_SCK_L;
delay_1us();
}
delay_1us();
SHT10_TransStart(); //启动传输
}



///*************************************************************
// Function :SHT10_SoftReset
// Description:软复位, 主要是复位状态寄存器为默认状态
// Input : none
// return : err: 0-正确 1-错误
//*************************************************************/
uint8 SHT10_SoftReset(void)
{
uint8 err = 0;

SHT10_ConReset(); //通讯复位 主要是复位时序
err += SHT10_WriteByte(SOFTRESET); //写RESET复位命令 #define SOFTRESET 0x1E //000 11110 复位命令

return err;
}


///*************************************************************
// Function :SHT10_ReadStatusReg
// Description:读状态寄存器
// Input : p_value-读到的数据;p_checksun-读到的校验数据
// return : err: 0-正确 1-错误
//*************************************************************/
uint8 SHT10_ReadStatusReg(uint8 *p_value, uint8 *p_checksum)
{
uint8 err = 0;

SHT10_TransStart(); //开始传输
err = SHT10_WriteByte(STATUS_REG_R); //写STATUS_REG_R读取状态寄存器命令 //000 00111
*p_value = SHT10_ReadByte(ACK); //读取状态数据 ACK=1
*p_checksum = SHT10_ReadByte(noACK); //读取检验和数据

return err;
}



///*************************************************************
// Function :SHT10_WriteStatusReg
// Description:写状态寄存器
// Input : p_value-要写入的数据值
// return : err: 0-正确 1-错误
//*************************************************************/
uint8 SHT10_WriteStatusReg(uint8 *p_value)
{
uint8 err = 0;

SHT10_TransStart(); //开始传输
err += SHT10_WriteByte(STATUS_REG_W); //写STATUS_REG_W写状态寄存器命令
err += SHT10_WriteByte(*p_value); //写入配置值
return err;
}



///*************************************************************
// Function :SHT10_Measure
// Description:从温湿度传感器读取温湿度
// Input : p_value-读到的值;p_checksum-读到的校验数
// return : err: 0-正确 1—错误
//*************************************************************/
uint8 SHT10_Measure(float *p_value, uint8 *p_checksum, uint8 mode)
{
uint8 err = 0;
uint32 i;
int8 value_H = 0;
int8 value_L = 0;

SHT10_TransStart(); //开始传输
switch(mode)
{
case SHT1X_TEMP: //测量温度
err += SHT10_WriteByte(MEASURE_TEMP);//写MEASURE_TEMP测量温度命令
break;
case SHT1X_HUMI:
err += SHT10_WriteByte(MEASURE_HUMI);//写MEASURE_HUMI测量湿度命令
break;
default:
break;
}
SHT10_DATA_In;
delay_1ms();
for(i = 0; i < 65535; i++)
{
if(SHT10_DATA_Read==0)
break; //等待DATA信号被拉低
}
if(SHT10_DATA_Read)
{err += 1; //如果等待超时了
test1=err; //02
}
value_H = SHT10_ReadByte(ACK);
value_L = SHT10_ReadByte(ACK);
*p_checksum = SHT10_ReadByte(noACK); //读取校验数据
*p_value = (value_H << 8) | value_L;
return err;
}



void SHT10_WORK_Value(void)
{
float temp_read;
float humi_read;
uint8 err1 = 0,err2 = 0,checksum = 0;

err1 += SHT10_Measure(&temp_read, &checksum, SHT1X_TEMP); //获取温度测量值

err2 += SHT10_Measure(&humi_read, &checksum, SHT1X_HUMI); //获取湿度测量值

if(err1 != 0)
{
test2=err1;
a=0x11;
b=0x12;
c=0x13;

// SHT10_ConReset(); //原文有此行
}
else if(err2 != 0)
{
a=0x04;
b=0x05;
c=0x06;

// SHT10_ConReset(); //原文有此行
}
else
{

a = 0x07;
b = 0x08;
c = 0x09;

}

}


void main(void)
{
// delay_nms(11);
UART_Init(9600) ;
SHT1x_Init();


while(1)
{

SHT10_WORK_Value();
uart_send(test1);
delay_nms(1000);
uart_send(test2);

delay_nms(1000);
uart_send(a);
delay_nms(1000);
uart_send(b);
delay_nms(1000);
uart_send(c);
delay_nms(1000);

}
}
...全文
263 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
西湖采莲人 2018-11-01
  • 打赏
  • 举报
回复
非常感谢您的解决,谢谢!
西湖采莲人 2018-10-29
  • 打赏
  • 举报
回复
@一树梅 我按“记的在SHT10_DATA_In;之后加延时,1us可能不够。”您说的思路,加了延时,真的就改变了效果,真的是太感谢您了,我继续调试一下。
西湖采莲人 2018-10-29
  • 打赏
  • 举报
回复
@一树梅 非常感谢您的耐心解答,我按这个方法试一下,还是不行
yishumei 2018-10-29
  • 打赏
  • 举报
回复
引用 10 楼 huaimengzi 的回复:
@一树梅 我按“记的在SHT10_DATA_In;之后加延时,1us可能不够。”您说的思路,加了延时,真的就改变了效果,真的是太感谢您了,我继续调试一下。
楼主,如果我的回复对你有帮助,请打分结贴。
yishumei 2018-10-28
  • 打赏
  • 举报
回复
忘了说明(PINC&0X02==0)为什么是(PINC&(0X02==0))了:运算符&的运算优先级低于==。 如果是这个原因,以后不管宏定义什么,把()加上不会有坏处。
yishumei 2018-10-28
  • 打赏
  • 举报
回复
引用 4 楼 huaimengzi 的回复:
非常感谢您的帮助,非常感谢. 下面我把所有文件都贴出来,以便您看。(说明:我把DATA拉个10k上拉也不行,都快崩溃了)
楼主,把宏定义 #define SHT10_DATA_Read PINC&0X02 改为 #define SHT10_DATA_Read (PINC&0X02) 加一个括号,否则判断语句if(SHT10_DATA_Read==0)的判断条件就常为false。 不加括号的宏定义替换展开后PINC&0X02==0,即PINC&(0X02==0),而0X02==0常为false。 记的在SHT10_DATA_In;之后加延时,1us可能不够。
西湖采莲人 2018-10-28
  • 打赏
  • 举报
回复
///************************************************************* // Function :SHT10_Calculate // Description:计算温湿度的值 // Input : Temp-从传感器读出的温度值;Humi-从传感器读出的湿度值 // p_humidity-计算出的实际的湿度值;p_temperature-计算出的实际温度值 // return : none //*************************************************************/ void SHT10_Calculate(float t, float rh, float *p_temperature, float *p_humidity) { const float d1 = -39.7; const float d2 = +0.01; const float C1 = -2.0468; const float C2 = +0.0367; const float C3 = -0.0000015955; const float T1 = +0.01; const float T2 = +0.00008; float RH_Lin; //RH线性值 float RH_Ture; //RH真实值 float temp_C; temp_C = d1 + d2 * t; //计算温度值 t为从传感器读出的温度值 RH_Lin = C1 + C2 * rh + C3 * rh * rh; //计算湿度值 rh为从传感器读出的湿度值 RH_Ture = (temp_C -25) * (T1 + T2 * rh) + RH_Lin; //湿度的温度补偿,计算实际的湿度值 if(RH_Ture > 100) //设置湿度值上限 RH_Ture = 100; if(RH_Ture < 0.1) RH_Ture = 0.1; //设置湿度值下限 *p_humidity = RH_Ture; //保存温度补偿后的结果 *p_temperature = temp_C; } ///************************************************************* // Function :SHT10_CalcuDewPoint // Description:计算露点 // Input : h-实际的湿度;t-实际的温度 // return : dew_point-露点 //*************************************************************/ float SHT10_CalcuDewPoint(float t, float h) { float logEx; float dew_point; logEx = 0.66077 + 7.5 * t / (237.3 + t) + (log10(h) - 2); dew_point = ((0.66077 - logEx) * 237.3) / (logEx - 8.16077); return dew_point; //两位小数 //下面是一种更靠谱的计算方法,备用 // const float m1=1762; //for 0=< T <=50; // const float tn1=24312; //for 0=< T <=50; // const float tn2=27262; //for -40=< T <0; // const float m2=2246; //for -40=< T <0; // float dew_point,h1,t1 ; // if((t>=0)&&(t<=50)) // { // h1=tn1*(log10(h)+(m1*t)/(tn1+t*100)); // t1=m1-log10(h)*100-((m1*t*100)/(tn1+t*100)); // dew_point=h1/t1; // } // else if((t<0)&&(t>=-40)) // { // h1=tn2*(log10(h)+(m2*t)/(tn2+t*100)); // t1=m2-log10(h)*100-((m2*t*100)/(tn2+t*100)); // dew_point=h1/t1; // } } void SHT10_WORK_Value(void) { float temp_read; float humi_read; uint8 err1 = 0,err2 = 0,checksum = 0; err1 += SHT10_Measure(&temp_read, &checksum, SHT1X_TEMP); //获取温度测量值 err2 += SHT10_Measure(&humi_read, &checksum, SHT1X_HUMI); //获取湿度测量值 if(err1 != 0) { // SHT10_Real_TEMP = 0x04; // SHT10_Real_HUMI = 0x05; // SHT10_Dew_Point = 0x06; test2=err1; a=0x11; b=0x12; c=0x13; // SHT10_ConReset(); //原文有此行 } else if(err2 != 0) { // SHT10_Real_TEMP = 0x04; // SHT10_Real_HUMI = 0x05; // SHT10_Dew_Point = 0x06; a=0x04; b=0x05; c=0x06; // SHT10_ConReset(); //原文有此行 } else { SHT10_Calculate(temp_read, humi_read, &SHT10_float_TEMP, &SHT10_float_HUMI); //计算实际的温湿度值 SHT10_float_Point = SHT10_CalcuDewPoint(SHT10_float_TEMP, SHT10_float_HUMI); //计算露点温度 // SHT10_Real_TEMP = (int16)(SHT10_float_TEMP*100); // SHT10_Real_HUMI = (int16)(SHT10_float_HUMI*100); // SHT10_Dew_Point = (int16)(SHT10_float_Point*100); a = 0x07; b = 0x08; c = 0x09; } } void main(void) { _delay_ms(13); UART_Init(9600) ; SHT1x_Init(); while(1) { SHT10_WORK_Value(); uart_send(test1); _delay_ms(1000); uart_send(test2); _delay_ms(1000); uart_send(a); _delay_ms(1000); uart_send(b); _delay_ms(1000); uart_send(c); _delay_ms(1000); } }
西湖采莲人 2018-10-28
  • 打赏
  • 举报
回复
【第四个文件:SHT11.C】 #define ENABLE_BIT_DEFINITIONS #include "iom8a.h" #include "avr_macros.h" #include "math.h" #include "main.h" #include "Delay.h" #include "SHT11.h" #define F_CPU 8000000UL #define DIR_TX PORTD|=(1<<2) // 三个数值都有2位小数 int16 SHT10_Real_TEMP = 0x01; int16 SHT10_Real_HUMI = 0x02; int16 SHT10_Dew_Point = 0x03; uint8 a=0x00; uint8 b=0x00; uint8 c=0x00; uint8 test1=0; uint8 test2=0; uint8 test3=0; uint8 test4=0; float SHT10_float_HUMI = 0.00; float SHT10_float_TEMP = 0.00; float SHT10_float_Point = 0.00; enum {SHT1X_TEMP, SHT1X_HUMI}; void UART_Init(uint32 Baud) { UCSRC = 0x86; //异步模式,无校验,停止位1,字符长度8位, UBRRL= (F_CPU/Baud/16-1)%256; //在Codeblocks中已配置F_CPU为8M UBRRH= (F_CPU/Baud/16-1)/256; UCSRB = 0x98; DDRD|=(1<<2); // DDRD|=(1<<PD2); 把485EN配置成输出 DIR_TX; } void uart_send(uint8 e_DATA) { UDR=e_DATA; } void SHT1x_Init(void) { SHT10_SCK_Out; SHT10_DATA_Out; SHT10_SCK_L; SHT10_DATA_H; SHT10_ConReset(); //复位通讯 //通电传感器需要11ms进入休眠状态,在此之前不允许对传感器发送任何命令 } //************************************************************* // Function :SHT10_WriteByte // Description:写1字节,主要用来写地址+命令(如示例时序000 00101) // Input : value:要写入的字节 // return : err: 0-正确 1-错误 ,【返回的为应答位】 //*************************************************************/ uint8 SHT10_WriteByte(uint8 value) { uint8 i, err = 0; SHT10_DATA_Out; // SHT10_DATA_H; // SHT10_SCK_L; //设置DATA数据线为输出 for(i=0x80;i>0;i>>=1) //写1个字节 1000 0000 另一种写法for(i = 0x80; i > 0; i /= 2) { if(i & value) //获取value每一位的值。 SHT10_DATA_H; else SHT10_DATA_L; _delay_us(1); SHT10_SCK_H; _delay_us(5); SHT10_SCK_L; _delay_us(1); } SHT10_DATA_H; //注意此处 ,把DATA置为高,看传感器是否拉低来ack SHT10_DATA_In; //设置DATA数据线为输入,释放DATA线 SHT10_SCK_H; _delay_us(1); err=((SHT10_DATA_Read==0)?0:1); SHT10_SCK_L; _delay_us(1); return err; //返回01问题所在 } ///************************************************************* // Function :SHT10_ReadByte // Description:读1字节数据. 主要是读数据和校验 // Input : Ack: 0-不应答 1-应答 (读完数据后一般给个应答信号为好) // return : val读出的值 //*************************************************************/ uint8 SHT10_ReadByte(uint8 Ack) { uint8 i,val = 0; SHT10_DATA_Out; //释放数据线 SHT10_DATA_H; SHT10_DATA_In; for(i = 0x80; i > 0; i/= 2) //读取1字节的数据 { SHT10_SCK_H; _delay_us(1); if(SHT10_DATA_Read==0x02) val = (val | i); //PINC&0X02 , 识别是1还是0,==0x02,说明传输过来的是1 //初始值为0000 0000 ,如果传输过来的是1,就改变相应的位为1, 若是某位传输的是0,由于该位初值本身就是0,可以不管 SHT10_SCK_L; _delay_us(1); } _delay_us(1); SHT10_DATA_Out; _delay_us(1); //设置DATA数据线为输出 if(Ack) //Ack: 0-不应答 1-应答 SHT10_DATA_L; //应答,则会接下去读接下去的数据(校验数据) else SHT10_DATA_H; //不应答,数据至此结束 _delay_us(1); SHT10_SCK_H; _delay_us(5); SHT10_SCK_L; _delay_us(1); SHT10_DATA_H; return val; //返回读到的值 } ///************************************************************* // Function :SHT10_TransStart // Description:开始传输信号,时序如下: // _____ ________ // DATA: |_______| // ___ ___ // SCK : ___| |___| |______ // Input : none // return : none //*************************************************************/ void SHT10_TransStart(void) { SHT10_DATA_Out; //设置DATA数据线为输出 SHT10_DATA_H; SHT10_SCK_L; //初始状态 _delay_us(1); SHT10_SCK_H; _delay_us(1); SHT10_DATA_L; _delay_us(1); SHT10_SCK_L; _delay_us(5); SHT10_SCK_H; _delay_us(1); SHT10_DATA_H; _delay_us(1); SHT10_SCK_L; _delay_us(1); } ///************************************************************* // Function :SHT10_ConReset // Description:通讯复位,主要是把通信的时序重新理一下,不修改寄存器内容。时序如下: // _____________________________________________________ ________ // DATA: |_______| // _ _ __ _ __ _ _ _ _ ___ ___ // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |_____| |____| |______ // Input : none // return : none //*************************************************************/ void SHT10_ConReset(void) { uint8 i; SHT10_DATA_Out; SHT10_DATA_H; SHT10_SCK_L; //起始状态 for(i = 0; i < 9; i++) //触发SCK时钟9c次 { SHT10_SCK_H; _delay_us(1); SHT10_SCK_L; _delay_us(1); } SHT10_TransStart(); //启动传输 } ///************************************************************* // Function :SHT10_SoftReset // Description:软复位, 主要是复位状态寄存器为默认状态 // Input : none // return : err: 0-正确 1-错误 //*************************************************************/ uint8 SHT10_SoftReset(void) { uint8 err = 0; SHT10_ConReset(); //通讯复位 主要是复位时序 err += SHT10_WriteByte(SOFTRESET); //写RESET复位命令 #define SOFTRESET 0x1E //000 11110 复位命令 return err; } ///************************************************************* // Function :SHT10_ReadStatusReg // Description:读状态寄存器 // Input : p_value-读到的数据;p_checksun-读到的校验数据 // return : err: 0-正确 1-错误 //*************************************************************/ uint8 SHT10_ReadStatusReg(uint8 *p_value, uint8 *p_checksum) { uint8 err = 0; SHT10_TransStart(); //开始传输 err = SHT10_WriteByte(STATUS_REG_R); //写STATUS_REG_R读取状态寄存器命令 //000 00111 *p_value = SHT10_ReadByte(ACK); //读取状态数据 ACK=1 *p_checksum = SHT10_ReadByte(noACK); //读取检验和数据 return err; } ///************************************************************* // Function :SHT10_WriteStatusReg // Description:写状态寄存器 // Input : p_value-要写入的数据值 // return : err: 0-正确 1-错误 //*************************************************************/ uint8 SHT10_WriteStatusReg(uint8 *p_value) { uint8 err = 0; SHT10_TransStart(); //开始传输 err += SHT10_WriteByte(STATUS_REG_W); //写STATUS_REG_W写状态寄存器命令 err += SHT10_WriteByte(*p_value); //写入配置值 return err; } ///************************************************************* // Function :SHT10_Measure // Description:从温湿度传感器读取温湿度 // Input : p_value-读到的值;p_checksum-读到的校验数 // return : err: 0-正确 1—错误 //*************************************************************/ uint8 SHT10_Measure(float *p_value, uint8 *p_checksum, uint8 mode) { uint8 err = 0; uint32 i; int8 value_H = 0; int8 value_L = 0; SHT10_TransStart(); //开始传输 switch(mode) { case SHT1X_TEMP: //测量温度 err += SHT10_WriteByte(MEASURE_TEMP);//写MEASURE_TEMP测量温度命令 break; case SHT1X_HUMI: err += SHT10_WriteByte(MEASURE_HUMI);//写MEASURE_HUMI测量湿度命令 break; default: break; } SHT10_DATA_In; _delay_ms(200); for(i = 0; i < 65535; i++) { if(SHT10_DATA_Read==0) break; //等待DATA信号被拉低 } if(SHT10_DATA_Read) { err += 1; //如果等待超时了 } value_H = SHT10_ReadByte(ACK); value_L = SHT10_ReadByte(ACK); *p_checksum = SHT10_ReadByte(noACK); //读取校验数据 *p_value = (value_H << 8) | value_L; return err; }
西湖采莲人 2018-10-28
  • 打赏
  • 举报
回复
非常感谢您的帮助,非常感谢. 下面我把所有文件都贴出来,以便您看。(说明:我把DATA拉个10k上拉也不行,都快崩溃了) 【第一个文件: SHT11.H】 //************************************************************* // Copyright (C), Forain.com // File name : SHT10.h // Author : forain // Version : V1.0 // Data : 2018/10/10 // Description: Digital temperature and humidity sensor driver code // PC0接SCK PC1接DATA //*************************************************************/ #ifndef __SHT11_H__ #define __SHT11_H__ #include "main.h" extern int16 SHT10_Real_HUMI ; extern int16 SHT10_Real_TEMP ; extern int16 SHT10_Dew_Point ; //extern float SHT10_float_HUMI ; //extern float SHT10_float_TEMP ; //extern float SHT10_float_Point; //* IO相关宏定义 *// #define SHT10_SCK_Out DDRC|=(1<<0) //SCK输出 #define SHT10_SCK_H PORTC|=(1<<0) //拉高SCK时钟线 #define SHT10_SCK_L PORTC&=~(1<<0) //拉低SCK时钟线 #define SHT10_DATA_Out DDRC|=(1<<1) //输出 #define SHT10_DATA_H PORTC|=(1<<1) //拉高DATA数据线 #define SHT10_DATA_L PORTC&=~(1<<1) //拉低DATA数据线 #define SHT10_DATA_In DDRC&=~(1<<1);PORTC|=(1<<1); //输入,带上拉 #define SHT10_DATA_Read PINC&0X02 //读DATA数据线,0000 0010 DATA在1位PC1,非0位 //* 传感器相关宏定义 *// #define noACK 0 #define ACK 1 //addr command r/w #define STATUS_REG_W 0x06 //000 00110 写状态寄存器 #define STATUS_REG_R 0x07 //000 00111 读状态寄存器 #define MEASURE_TEMP 0x03 //000 00011 测量温度 #define MEASURE_HUMI 0x05 //000 00101 测量湿度 #define SOFTRESET 0x1E //000 11110 软复位 void UART_Init(uint32 Baud); void uart_send(uint8 e_DATA); void SHT1x_Init(void); void SHT10_Delay(void); uint8 SHT10_WriteByte(uint8 value); uint8 SHT10_ReadByte(uint8 Ack); void SHT10_TransStart(void); void SHT10_ConReset(void); uint8 SHT10_SoftReset(void); uint8 SHT10_ReadStatusReg(uint8 *p_value, uint8 *p_checksum); uint8 SHT10_WriteStatusReg(uint8 *p_value); uint8 SHT10_Measure(float *p_value, uint8 *p_checksum, uint8 mode); void SHT10_Calculate(float t, float rh, float *p_temperature, float *p_humidity); float SHT10_CalcuDewPoint(float t, float h); void SHT10_WORK_Value(void); #endif /***************************************************************************************************/ 【第二个头文件:main.h】 #ifndef __main_H__ #define __main_H__ typedef unsigned char uint8; // 无符号8 位整型变量 typedef signed char int8; // 有符号8 位整型变量 typedef unsigned int uint16; // 无符号16 位整型变量 typedef signed int int16; // 有符号16 位整型变量 typedef unsigned long uint32; // 无符号32 位整型变量 typedef signed long int32; // 有符号32 位整型变量 typedef float fp32; // 单精度浮点数(32位长度) typedef double fp64; // 双精度浮点数(64 位长度) #endif /*************************************************************************************************************/ 【第三个头文件:Delay.h】 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值 //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值 //================================================== void _delay_us(unsigned int us) { unsigned int i; us=us*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值 for( i=0;i<us;i++); } void _delay_ms(unsigned int ms) { unsigned int i,j; for( i=0;i<ms;i++) for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值 }
西湖采莲人 2018-10-27
  • 打赏
  • 举报
回复
延时6us也没有,我在怀疑 SHT10有没有能力将引脚拉低,这个引脚我配置有内部上拉电阻和外部10k上位电阻,依然没能拉低。我想是不是单片机本身的特性原因,是不是在SHT10_DATA_In; 后要加上这么一句: SHT10_DATA_L;?加上这么一句,感觉无法区别是否是器件把引脚拉低.
yishumei 2018-10-27
  • 打赏
  • 举报
回复
引用 2 楼 huaimengzi 的回复:
延时6us也没有,我在怀疑 SHT10有没有能力将引脚拉低,这个引脚我配置有内部上拉电阻和外部10k上位电阻,依然没能拉低。我想是不是单片机本身的特性原因,是不是在SHT10_DATA_In; 后要加上这么一句: SHT10_DATA_L;?加上这么一句,感觉无法区别是否是器件把引脚拉低.
楼主可以把SHT10_DATA_In和SHT10_DATA_Out的单片机底层配置贴出来吗?
yishumei 2018-10-26
  • 打赏
  • 举报
回复
引用 楼主 huaimengzi 的回复:
利用M16采集SHT10,通过485输出。测试输出test1的值为06,说明write_Bytes写命令返回ACK是1,而不是0.麻烦各位帮忙一下看哪错了,谢谢!
SHT10_DATA_In; //设置DATA数据线为输入,释放DATA线(在uint8 SHT10_WriteByte(uint8 value)函数里) 在这条语句后延时6us然后再读取DATA,看看有没有应答。

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧