Dong_mcu 发表于 2007-1-18 16:16:17

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

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口:如

                    #defineIO_PF

               #defineIO_DATA0                               

               #defineIO_SCK   1

                               

                               .....

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

                                     注意头文件加入的顺序

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



#ifdefIO_PA

#define DIR_   DDRA

#define IO_    PORTA

#define DAT_   PINA

#endif

#ifdefIO_PB

#define DIR_   DDRB

#define IO_    PORTB

#define DAT_   PINB

#endif



#ifdefIO_PC

#define DIR_   DDRC

#define IO_    PORTC

#define DAT_   PINC

#endif



#ifdefIO_PD

#define DIR_   DDRD

#define IO_    PORTD

#define DAT_   PIND

#endif



#ifdefIO_PE

#define DIR_   DDRE

#define IO_    PORTE

#define DAT_   PINE

#endif



#ifdefIO_PF

#define DIR_   DDRF

#define IO_    PORTF

#define DAT_   PINF

#endif



#ifdefIO_PG

#define DIR_   DDRG

#define IO_    PORTG

#define DAT_   PING

#endif

/**/

#ifndefIO_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_1IO_|=(1<<IO_DATA)

#define        DATA_out_0IO_&=~(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_1PORTC|=(1<<0)

#define        DATA_out_0PORTC&=~(1<<0)



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

#define        SCK_0           PORTC&=~(1<<1)



*/

#define noACK 0

#define ACK   1

                            //adrcommandr/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_();

}



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

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

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

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

【修改时间】:2007.01.09                 

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

voidtemp_humi_test(float *tp,float *hi)

{ uchar err=0;

volatile float Temp=0,Humi=0;;

volatile uintTHVAL=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 如下

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

      m128uart 头文件



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



#define UART0_RXDIEONUCSR0B=UCSR0B|0X80

#define UART0_RXDIEOFF UCSR0B=UCSR0B&0X7F

#define UART1_RXDIEONUCSR1B=UCSR1B|0X80

#define UART1_RXDIEOFF UCSR1B=UCSR1B&0X7F



//#if mcu_fosc=

#definefosc 8000000   //8M晶振11059200

#definebaud 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 lowbit

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 lowbit

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"

#defineuchar unsigned char

#defineuint unsignedint

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

#define IO_PF

#define IO_DATA0

#define IO_SCK1

#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编辑过

topguntoo 发表于 2008-4-1 12:07:27

请教下做过SHTXX的大虾,我做了3个同样的电路读SHT15,为什么各个读到的温度值不一制?相差最大是有2度,同样的程序同样的电路,难道是SHT15一致性问题?

s1031129012 发表于 2010-4-15 10:49:19

mark

522yt 发表于 2011-3-3 20:18:11

xinjie1023 发表于 2011-5-15 21:01:55

收藏。

ddcchh 发表于 2012-10-16 13:51:07

mark

zlpvch 发表于 2013-8-4 18:26:34

mark            
页: [1]
查看完整版本: SHT10 (温湿度传感器)在M128上实现!!