搜索
bottom↓
回复: 6

SHT10 (温湿度传感器)在M128上实现!!

[复制链接]

出0入0汤圆

发表于 2007-1-18 16:16:17 | 显示全部楼层 |阅读模式
SHT10 虽然能读取温度值和湿度值,但我总觉得值不大对,有SHT10的朋友希望能试一下我的程序,

我在SHT10 在data 线上加了一个1.6K的电阻.

编译器:GCC 3.4.1

调试时:m128的uart0 过232接pc

makefile:中将

.........

#Additional libraries.

# Minimalistic printf version

PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min



# Floating point printf version (requires MATH_LIB = -lm below)

PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt



PRINTF_LIB =$(PRINTF_LIB_FLOAT)  #----->在PRINTF_LIB = 后加上$(PRINTF_LIB_FLOAT)  就可以printf 浮点数



我在网老出问题,传不上东东.

只能贴了

文件包括:temp_humi.h

         UART.h

         main.c





temp_humi.h  如下:

/***************************************************************

                    温湿度传感器头文件

  MCU:m128  

  控制口:默认为 DATA-PC0;SCK-PC1口

  用户函数: temp_humi_test(float *tp,float *hi)反两个float值           

          用法:在主程序中定义IO口:如

                    #define  IO_PF  

                 #define  IO_DATA  0                                 

                 #define  IO_SCK   1

                               

                                 .....

                                 表示使用PF0接DATA线,PF1接SCK线

                                     注意头文件加入的顺序

****************************************************************/



#ifdef  IO_PA  

  #define DIR_   DDRA

  #define IO_    PORTA

  #define DAT_   PINA

#endif

#ifdef  IO_PB  

  #define DIR_   DDRB

  #define IO_    PORTB

  #define DAT_   PINB

#endif



#ifdef  IO_PC  

  #define DIR_   DDRC

  #define IO_    PORTC

  #define DAT_   PINC

#endif  



#ifdef  IO_PD  

  #define DIR_   DDRD

  #define IO_    PORTD

  #define DAT_   PIND

#endif  



#ifdef  IO_PE  

  #define DIR_   DDRE

  #define IO_    PORTE

  #define DAT_   PINE

#endif  



#ifdef  IO_PF  

  #define DIR_   DDRF

  #define IO_    PORTF

  #define DAT_   PINF

#endif  



#ifdef  IO_PG  

  #define DIR_   DDRG

  #define IO_    PORTG

  #define DAT_   PING

#endif  

/**/

#ifndef  IO_DATA  

  #define DIR_   DDRC

  #define IO_    PORTC

  #define DAT_   PINC

  #define IO_DATA   0  

  #define IO_SCK    1   

#endif  



//==========================================================================

#define  _nop_()  asm volatile( "nop
\t" "nop
\t" "nop
\t" "nop
\t" "nop
\t" "nop
\t" "nop
\t"   "nop
\t" "nop
\t" "nop
\t"        "nop
\t" "nop
\t" "nop
\t": : )



#define        DATA_in     DIR_&=~(1<<IO_DATA);IO_|=(1<<IO_DATA)//set in and release DATA-line   

#define        DATA_out    DIR_|=(1<<IO_DATA)                   //set out



#define        DATA_in_N   (DAT_&(1<<IO_DATA))//

#define        DATA_out_1  IO_|=(1<<IO_DATA)

#define        DATA_out_0  IO_&=~(1<<IO_DATA)



#define        SCK_1           DIR_|=(1<<IO_SCK);IO_|=(1<<IO_SCK)

#define        SCK_0           DIR_|=(1<<IO_SCK);IO_&=~(1<<IO_SCK)

/*

#define        DATA_in     DDRC&=~(1<<0)//in

#define        DATA_out    DDRC|=(1<<0) //out



#define        DATA_in_N   (PINC&(1<<0))//

#define        DATA_out_1  PORTC|=(1<<0)

#define        DATA_out_0  PORTC&=~(1<<0)



#define        SCK_1           PORTC|=(1<<1)

#define        SCK_0           PORTC&=~(1<<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





/*====================================================

【函数原形】:char s_write_byte(unsigned char value)

【参数说明】:

【功能说明】:

【修改时间】:  2007.01.09                 

====================================================*/

char s_write_byte(unsigned char value)

//----------------------------------------------------------------------------------

// writes a byte on the Sensibus and checks the acknowledge

{  

  unsigned char i,error=0;  

   DATA_out;//out data

   DATA_out_1;

   SCK_0;

   _nop_();

   SCK_1;                   //Initial state

   _nop_();

   DATA_out_0;

   _nop_();

   SCK_0;

   _nop_();       

   SCK_1;

   _nop_();

   DATA_out_1;

   _nop_();

   SCK_0;

   _nop_();_nop_(); _nop_();   

         

for (i=0x80;i>0;i/=2)               //shift bit for masking

  {

  if (i & value) DATA_out_1;            //masking value with i , write to SENSI-BUS

    else {DATA_out_0;}                        

          _nop_();_nop_();

    SCK_1;                                        //clk for SENSI-BUS

    _nop_();_nop_();                               //pulswith approx. 5 us         

    SCK_0;



  }   // DATA_out_1;  //release DATA-line   

  _nop_();_nop_();

  SCK_1;DATA_in;

  error=DATA_in_N;                 //clk for SENSI-BUS      

  _nop_();_nop_();                               //pulswith approx. 5 us         

  SCK_0;



  return error;                   //error=1 in case of no acknowledge

}



/*====================================================

【函数原形】:char s_read_byte(unsigned char ack)

【参数说明】:

【功能说明】:

【修改时间】:  2007.01.09                 

====================================================*/

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_out;

//DATA_out_1;                     //release DATA-line   



SCK_0;

DATA_in;

  for (i=0x80;i>0;i/=2)             //shift bit for masking

  { _nop_();_nop_();       

    SCK_1;                            //clk for SENSI-BUS   

    _nop_();

    if (DATA_in_N) val=(val | i);    //read bit            

        _nop_();

        SCK_0;       



  }

  _nop_();_nop_();

  DATA_out;//out data

  if(ack==1)DATA_out_0; //in case of "ack==1" pull down DATA-Line

   else DATA_out_1;

  _nop_();_nop_();                     

  SCK_1;                                  //clk #9 for ack

  _nop_();_nop_();         //pulswith approx. 5 us

  SCK_0;                                                    

       // DATA_out_1;                     //release DATA-line

  return val;

}



/*====================================================

【函数原形】:void s_connectionreset(void)

【参数说明】:

【功能说明】:

【修改时间】:  2007.01.09                 

====================================================*/

void s_connectionreset(void)

{  

  unsigned char i;

  DATA_out; DATA_out_1;

SCK_0;                    //Initial state

  for(i=0;i<9;i++)                  //9 SCK cycles

  {        _nop_();_nop_();

    SCK_1;

    _nop_();_nop_();

    SCK_0;

  }

  _nop_();  _nop_();  

   SCK_1;                   //Initial state

   _nop_();

   DATA_out_0;

   _nop_();

   SCK_0;

   _nop_();       

   SCK_1;

   _nop_();

   DATA_out_1;

   _nop_();

   SCK_0;

   _nop_();_nop_();_nop_();_nop_();_nop_();

}



/*====================================================

【函数原形】:void  temp_humi_test(float *tp,float *hi)

【参数说明】:*tp为温度存入地址,   *hi 为湿度存入地址     

【功能说明】: 读取温湿度值

【修改时间】:  2007.01.09                 

====================================================*/

void  temp_humi_test(float *tp,float *hi)

{ uchar err=0;

  volatile float Temp=0,Humi=0;;

  volatile uint  THVAL=0,RHVAL=0;

  uint i;

  //init_IO();

  s_connectionreset();

  err=s_write_byte(MEASURE_TEMP);



for(i=0;i<20000;i++)

  {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}

   

   DATA_in;//in data

   if(DATA_in_N==0)

        {

        THVAL=s_read_byte(ACK);

        THVAL=(THVAL<<8)+s_read_byte(ACK);

        s_read_byte(noACK);

        Temp=THVAL*0.01 - 40;

    *tp=Temp;

         //printf("Temp=%d
",tp);         

        }else s_connectionreset();

       

        //=========================

for(i=0;i<20000;i++)

  {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}



   RHVAL=0;

          //======================

  err= s_write_byte(MEASURE_HUMI);

  for(i=0;i<20000;i++)

  {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}

   DATA_in;//in data

   if(DATA_in_N==0)

        {

        RHVAL=s_read_byte(ACK);

        RHVAL=(RHVAL<<8)+s_read_byte(ACK);

        s_read_byte(noACK);

        Humi=(-0.0000028)*RHVAL*RHVAL + 0.0405*RHVAL - 4.0;

        Humi=(Temp-25)*(0.01+0.00008*RHVAL)+Humi;

        *hi=Humi;

        //printf("Humi=%d
",hi);

        } else s_connectionreset();

//==================

for(i=0;i<10000;i++)

  {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}

//==================       



}







UART.H 如下

/*******************************************

        m128  uart 头文件

  

********************************************/



#define UART0_RXDIEON  UCSR0B=UCSR0B|0X80

#define UART0_RXDIEOFF UCSR0B=UCSR0B&0X7F

#define UART1_RXDIEON  UCSR1B=UCSR1B|0X80

#define UART1_RXDIEOFF UCSR1B=UCSR1B&0X7F



//#if mcu_fosc=

#define  fosc 8000000   //8M晶振11059200

#define  baud 9600       //波特率



/*====================================================

【函数原形】: void init_UART(void)       

【参数说明】:            

【功能说明】: 波特率为19200,

【修改时间】:  2006.06.01                 

====================================================*/



void init_UART(void)

{

//--UART0--

UCSR0B=(1<<RXEN0)|(1<<TXEN0);                        //允许发送接收,无中断--|(1<<RXCIE0)

UBRR0L=(fosc/16/(baud-1))%256;                          //baud high bit

UBRR0H=(fosc/16/(baud-1))/256;                          //baud low  bit

UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);                        //8位数据位,1位停止位(1<<USBS0)|

//--UART1--

UCSR1B=(1<<RXEN1)|(1<<TXEN1);        //                //允许发送接收,无中断---|(1<<RXCIE1)

UBRR1L=(fosc/16/(baud-1))%256;                          //baud high bit

UBRR1H=(fosc/16/(baud-1))/256;                          //baud low  bit

UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);//                  //8位数据位,1位停止位(1<<USBS1)|

}

/*====================================================

【函数原形】: void UART_TXD(uint8_t UARTdata)

【参数说明】:            

【功能说明】:M48UART 发送数据     

【修改时间】:            2006.06.01                 

====================================================*/

void UART_TXD(uint8_t UARTdata)

{

while(!(UCSR0A&(1<<UDRE0)));  //

UDR0=UARTdata;

}

void UART_TXD1(uint8_t UARTdata1)

{

while(!(UCSR1A&(1<<UDRE1)));  //

UDR1=UARTdata1;

}

/*====================================================

【函数原形】: void UART_RXD(uint8_t UARTdata)

【参数说明】:            

【功能说明】:M48UART 接收数据     

【修改时间】:            2006.06.01                 

====================================================*/

uint8_t UART_RXD(void)

{

while(!(UCSR0A&(1<<RXC0)));

return (UDR0);

}/**/





uint8_t UART_RXD1(void)

{

while(!(UCSR1A&(1<<RXC1)));

return (UDR1);

}







/*******************************************

                   main

mcu:m128

fosc: 8M

*******************************************/

#include "avr/io.h"

#include "stdio.h"

#include "UART.h"

#define  uchar unsigned char

#define  uint unsigned  int

//----------------------

#define IO_PF

#define IO_DATA  0

#define IO_SCK  1

#include"temp_humi.h"

int main(void)

{

float tp=0,hi=0;

//int tp=0,hi=0;

init_UART();

fdevopen(UART_TXD,0,0);                         //printf 指向UART_TXD();

while(1)

{

temp_humi_test(&tp,&hi);

printf("Temp=%5.1f'C   Humi=%5.1f%%
",tp,hi); //用串口在PC机上监视

printf("
");

//delay(3000);

}

}
-----此内容被Dong_mcu于2007-01-18,17:17:26编辑过

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2008-4-1 12:07:27 | 显示全部楼层
请教下做过SHTXX的大虾,我做了3个同样的电路读SHT15,为什么各个读到的温度值不一制?相差最大是有2度,同样的程序同样的电路,难道是SHT15一致性问题?

出0入0汤圆

发表于 2010-4-15 10:49:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-3 20:18:11 | 显示全部楼层

出0入0汤圆

发表于 2011-5-15 21:01:55 | 显示全部楼层
收藏。

出0入0汤圆

发表于 2012-10-16 13:51:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-8-4 18:26:34 | 显示全部楼层
mark            
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 23:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表