⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sht10.txt

📁 SHT10 (温湿度传感器)在M128上实现
💻 TXT
字号:
 SHT10 (温湿度传感器)在M128上实现

#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) 
【参数说明】:              
【功能说明】:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -