SHT10 使用过程中遇到问题,有没有高手指点一下

2020-01-20 19:03发布

先上图
1.jpg (2.18 MB, 下载次数: 0) 下载附件 1602显示的结果 2015-2-11 20:18 上传

焊接了sht10,DATA也接了10k的上拉电阻,但是程序下载进去以后1602上面只显示了RH2个字母,引脚连接也都检查了,都正常,但是不知道为什么出了这样的问题
程序在这里,大家帮忙看下
#include <REG52.h> //Microcontroller specific library, e.g. port definitions
#include <intrins.h> //Keil library (is used for _nop()_ operation)
#include <math.h>    //Keil library
#include <stdio.h>   //Keil library

typedef union
{ unsigned int i;
  float f;
} value;
int tem,humi,x,y,z,m;
enum {TEMP,HUMI};
sbit DATA = P1^0;
sbit SCK = P1^1;
#define noACK 0
#define ACK   1
                            //adr command r/w
#define STATUS_REG_W 0x06   //000   0011    0
#define STATUS_REG_R 0x07   //000   0011    1
#define MEASURE_TEMP 0x03   //000   0001    1
#define MEASURE_HUMI 0x05   //000   0010    1
#define RESET        0x1e   //000   1111    0

#define uchar unsigned char

uchar jgh[10]={"000%c"};
void show_time();   //液晶显示程序
/**************************
1602液晶显示部分子程序
*****************************/
//Port Definitions**********************************************************
sbit LcdRs      = P3^4;
sbit LcdRw      = P3^5;
sbit LcdEn      = P3^6;
sfr DBPort     = 0x80;     //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
//内部等待函数**************************************************************************
unsigned char LCD_Wait(void)
{
    LcdRs=0;
    LcdRw=1;    _nop_();
    LcdEn=1;    _nop_();
    LcdEn=0;
    return DBPort;  
}
//向LCD写入命令或数据************************************************************
#define LCD_COMMAND         0      // Command
#define LCD_DATA            1      // Data
#define LCD_CLEAR_SCREEN    0x01      // 清屏
#define LCD_HOMING          0x02      // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
    LcdEn=0;
    LcdRs=style;
    LcdRw=0;        _nop_();
    DBPort=input;   _nop_();//注意顺序
    LcdEn=1;        _nop_();//注意顺序
    LcdEn=0;        _nop_();
    LCD_Wait();
}

//设置显示模式************************************************************
#define LCD_SHOW            0x04    //显示开
#define LCD_HIDE            0x00    //显示关

#define LCD_CURSOR          0x02    //显示光标
#define LCD_NO_CURSOR       0x00    //无光标        

#define LCD_FLASH           0x01    //光标闪动
#define LCD_NO_FLASH        0x00    //光标不闪动

void LCD_SetDisplay(unsigned char DisplayMode)
{
    LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}

//设置输入模式************************************************************
#define LCD_AC_UP       0x02
#define LCD_AC_DOWN         0x00      // default
#define LCD_MOVE            0x01      // 画面可平移
#define LCD_NO_MOVE         0x00      //default
void LCD_SetInput(unsigned char InputMode)
{
    LCD_Write(LCD_COMMAND, 0x04|InputMode);
}

//初始化LCD************************************************************
void LCD_Initial()
{
    LcdEn=0;
    LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
    LCD_Write(LCD_COMMAND,0x38);
    LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
    LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
    LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
}

//液晶字符输入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{
    if(y==0)
        LCD_Write(LCD_COMMAND,0x80|x);
    if(y==1)
        LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}

//将字符输出到液晶显示
void Print(unsigned char *str)
{
    while(*str!='')
    {
        LCD_Write(LCD_DATA,*str);
        str++;
    }
}
//----------------------------------------------------------------------------------
char s_write_byte(unsigned char value)
//----------------------------------------------------------------------------------
// writes a byte on the Sensibus and checks the acknowledge
{
unsigned char i,error=0;
for (i=0x80;i>0;i/=2)             //shift bit for masking
{ if (i & value) DATA=1;          //masking value with i , write to SENSI-BUS
    else DATA=0;                        
    SCK=1;                          //clk for SENSI-BUS
    _nop_();_nop_();_nop_();        //pulswith approx. 5 us
    SCK=0;
}
DATA=1;                           //release DATA-line
SCK=1;                            //clk #9 for ack
error=DATA;                       //check ack (DATA will be pulled down by SHT11)
SCK=0;        
return error;                     //error=1 in case of no acknowledge
}

//----------------------------------------------------------------------------------
char s_read_byte(unsigned char ack)
//----------------------------------------------------------------------------------
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
{
unsigned char i,val=0;
DATA=1;                           //release DATA-line
for (i=0x80;i>0;i/=2)             //shift bit for masking
{ SCK=1;                          //clk for SENSI-BUS
    if (DATA) val=(val | i);        //read bit
    SCK=0;      
}
DATA=!ack;                        //in case of "ack==1" pull down DATA-Line
SCK=1;                            //clk #9 for ack
_nop_();_nop_();_nop_();          //pulswith approx. 5 us
SCK=0;         
DATA=1;                           //release DATA-line
return val;
}

//----------------------------------------------------------------------------------
void s_transstart(void)
{
   DATA=1; SCK=0;                   //Initial state
   _nop_();
   SCK=1;
   _nop_();
   DATA=0;
   _nop_();
   SCK=0;
   _nop_();_nop_();_nop_();
   SCK=1;
   _nop_();
   DATA=1;     
   _nop_();
   SCK=0;     
}

//----------------------------------------------------------------------------------
void s_connectionreset(void)
//----------------------------------------------------------------------------------
// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
{
unsigned char i;
DATA=1; SCK=0;                    //Initial state
for(i=0;i<9;i++)                  //9 SCK cycles
{ SCK=1;
    SCK=0;
}
s_transstart();                   //transmission start
}
/**********************************
       复位sht10
*********************************
char s_softreset(void)
{
        unsigned char error=0;
        s_connectionreset();              //reset communication
        error+=s_write_byte(RESET);       //send RESET-command to sensor
        return error;                     //error=1 in case of no response form the sensor
}                                         */
/**********************************
       读取sht10(8-bit)
*********************************
char s_read_statusreg(unsigned char *p_value, unsigned char *p_checksum)
{
        unsigned char error=0;
        s_transstart();                   //transmission start
        error=s_write_byte(STATUS_REG_R); //send command to sensor
        *p_value=s_read_byte(ACK);        //read status register (8-bit)
        *p_checksum=s_read_byte(noACK);   //read checksum (8-bit)
        return error;                     //error=1 in case of no response form the sensor
}
                                        */
/**********************************
       写sht10(8-bit)
*********************************
char s_write_statusreg(unsigned char *p_value)
{
        unsigned char error=0;
        s_transstart();                   //transmission start
        error+=s_write_byte(STATUS_REG_W);//send command to sensor
        error+=s_write_byte(*p_value);    //send value of status register
        return error;                     //error>=1 in case of no response form the sensor
}
                           */
//----------------------------------------------------------------------------------
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
//----------------------------------------------------------------------------------
// makes a measurement (humidity/temperature) with checksum
{
unsigned error=0;
unsigned int i;

s_transstart();                   //transmission start
switch(mode){                     //send command to sensor
    case TEMP : error+=s_write_byte(MEASURE_TEMP); break;
    case HUMI : error+=s_write_byte(MEASURE_HUMI); break;
    default     : break;
}
for (i=0;i<65535;i++) if(DATA==0) break; //wait until sensor has finished the measurement
if(DATA) error+=1;                // or timeout (~2 sec.) is reached
*(p_value) =s_read_byte(ACK);    //read the first byte (MSB)
*(p_value+1)=s_read_byte(ACK);    //read the second byte (LSB)
*p_checksum =s_read_byte(noACK); //read checksum
return error;
}

/**********************************
设置sht10波特率
11.059 MHz 9600 bps   
*********************************
void init_uart()
{
        SCON = 0x52;   
        TMOD = 0x20;   
        TCON = 0x69;   
        TH1  = 0xfd;   
}                                   */
/**********************************
       数据计算处理
input : humi [Ticks] (12 bit)
        temp [Ticks] (14 bit)
output: humi [%RH]
**********************************/
void calc_sth11(float *p_humidity ,float *p_temperature)
{ const float C1=-4.0;              // for 12 Bit
const float C2=+0.0405;           // for 12 Bit
const float C3=-0.0000028;        // for 12 Bit
const float T1=+0.01;             // for 14 Bit @ 5V
const float T2=+0.00008;           // for 14 Bit @ 5V

float rh=*p_humidity;             // rh:      Humidity [Ticks] 12 Bit
float t=*p_temperature;           // t:       Temperature [Ticks] 14 Bit
float rh_lin;                     // rh_lin: Humidity linear
float rh_true;                    // rh_true: Temperature compensated humidity
float t_C;                        // t_C   : Temperature [癈]

t_C=t*0.01 - 40;                  //calc. temperature from ticks to [癈]
rh_lin=C3*rh*rh + C2*rh + C1;     //calc. humidity from ticks to [%RH]
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //calc. temperature compensated humidity [%RH]
if(rh_true>100)rh_true=100;       //cut if the value is outside of
if(rh_true<0.1)rh_true=0.1;       //the physical possible range

*p_temperature=t_C;               //return temperature [癈]
*p_humidity=rh_true;              //return humidity[%RH]
}
//--------------------------------------------------------------------
float calc_dewpoint(float h,float t)
//--------------------------------------------------------------------
// calculates dew point
// input:   humidity [%RH], temperature [癈]
// output: dew point [癈]
{ float logEx,dew_point;
   logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
   dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
return dew_point;
}
/**********************************
       主函数
// 1. connection reset
// 2. measure humidity [ticks](12 bit) and temperature [ticks](14 bit)
// 3. calculate humidity [%RH] and temperature [癈]
// 4. calculate dew point [癈]
// 5. print temperature, humidity, dew point
**********************************/
void main()

{
value humi_val,temp_val;
float dew_point;
unsigned char error,checksum;
//init_uart();
   LCD_Initial();
   GotoXY(0,0);
   Print("TEMP:   . %C");
    GotoXY(0,1);
   Print("HUMI:     RH");
   s_connectionreset();
while(1)
{
    error=0;
    error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI); //measure humidity
    error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP); //measure temperature
    if(error!=0) s_connectionreset();                 //in case of an error: connection reset
    else
    { humi_val.f=(float)humi_val.i;                   //converts integer to float
      temp_val.f=(float)temp_val.i;                   //converts integer to float
      calc_sth11(&humi_val.f,&temp_val.f);            //calculate humidity, temperature
      dew_point=calc_dewpoint(humi_val.f,temp_val.f); //calculate dew point
   tem=temp_val.f*10;
      humi=humi_val.f*10;
      GotoXY(5,0);//液晶字符显示位置
      x=tem/1000;
      x+=0x30;
      jgh[0]=x;
      y=tem%1000/100;
      y+=0x30;
      jgh[1]=y;
   z=tem%1000%100/10;
      z+=0x30;
      jgh[2]=z;
   m=tem%10;
   m+=0x30;
   jgh[3]=0x2E;
      jgh[4]=m;
      Print(jgh);
               
                  
                    GotoXY(5,1);//液晶字符显示位置
      x=humi/1000;
      x+=0x30;
      jgh[0]=x;
      y=humi%1000/100;
      y+=0x30;
      jgh[1]=y;
   z=humi%1000%100/10;
      z+=0x30;
      jgh[2]=z;
   m=humi%10;
   m+=0x30;
   jgh[3]=0x2E;
      jgh[4]=m;
      Print(jgh);

    }
}
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
liude2006
1楼-- · 2020-01-22 03:14
 精彩回答 2  元偷偷看……
liude2006
2楼-- · 2020-01-22 08:08
你好  我用了这个程序,用串口发数据给上位机,在不接传感器的时候  没有数据返回,接上传感器才有数据返回,怎么回事呢?不接数据应该返回0的吧?单步调试是可以调通,能过串口发送函数

一周热门 更多>