找回密码
 注册
搜索
查看: 466|回复: 1

[讨论] I2C 传感器 求高手指教 多谢

[复制链接]
发表于 2010-9-21 08:42:06 | 显示全部楼层 |阅读模式
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define MEASURE_TEMP 0x81

sbit SCLK = P1^3;
sbit DATA = P1^5;

typedef union
{
uint i;
   float  f;
}value;
float temp;

#define noACK 0
#define ACK   1

char s_write_byte(uchar value)
//************************************************************//
// writes a byte on the Sensibus and checks the acknowledge
{
   uchar 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;                        
     SCLK = 1;                    //clk for SENSI-BUS
     _nop_();
  _nop_();
  _nop_();            //pulswith approx. 5 us   
     SCLK = 0;
   }
   DATA = 1;                        //release DATA-line
   SCLK = 1;                        //clk #9 for ack
   error = DATA;                    //check ack (DATA will be pulled down by SHT11)
   SCLK = 0;        
   return error;                    //error=1 in case of no acknowledge
}
//************************************************************//
char s_read_byte(uchar ack)
//************************************************************//
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
{
   uchar i,val = 0;
   DATA = 1;                        //release DATA-line
   for(i = 0x80; i > 0; i /= 2)     //shift bit for masking
   {
       SCLK=1;                      //clk for SENSI-BUS
        if(DATA) val = (val | i);   //read bit  
        SCLK=0;        
}
DATA =! ack;                     //in case of "ack==1" pull down DATA-Line
SCLK = 1;                        //clk #9 for ack
_nop_();
   _nop_();
   _nop_();               //pulswith approx. 5 us
   SCLK = 0;         
   DATA = 1;                        //release DATA-line
   return val;
}
//************************************************************//
void s_transstart(void)
//************************************************************//
// generates a transmission start
//       _____         ________
// DATA:      |_______|
//           ___     ___
// SCLK : ___|   |___|   |______
{  
    DATA = 1;
SCLK = 0;                   //Initial state
    _nop_();
    SCLK = 1;
    _nop_();
    DATA = 0;
    _nop_();
    SCLK =0;  
    _nop_();
_nop_();
_nop_();
    SCLK = 1;
    _nop_();
    DATA = 1;     
    _nop_();
    SCLK = 0;     
}

char s_measure(uchar *p_value, uchar *p_checksum)
//************************************************************//
// makes a measurement (humidity/temperature) with checksum
{
   uchar error = 0;
   s_transstart();
   error += s_write_byte(MEASURE_TEMP);
   if(DATA) error += 1;
   *(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;
}

void main()
{
value val;
   uchar error,checksum;
error = 0;
    error += s_measure((uchar*)&val.i,&checksum);

}


*******************************************************************
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define MEASURE_TEMP 0x81

sbit SCLK = P1^3;
sbit DATA = P1^5;

typedef union
{
uint i;
   float  f;
}value;
float temp;

#define noACK 0
#define ACK   1

char s_write_byte(uchar value)
//************************************************************//
// writes a byte on the Sensibus and checks the acknowledge
{
   uchar 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;                        
     SCLK = 1;                    //clk for SENSI-BUS
     _nop_();
  _nop_();
  _nop_();            //pulswith approx. 5 us   
     SCLK = 0;
   }
   DATA = 1;                        //release DATA-line
   SCLK = 1;                        //clk #9 for ack
   error = DATA;                    //check ack (DATA will be pulled down by SHT11)
   SCLK = 0;        
   return error;                    //error=1 in case of no acknowledge
}
//************************************************************//
char s_read_byte(uchar ack)
//************************************************************//
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
{
   uchar i,val = 0;
   DATA = 1;                        //release DATA-line
   for(i=0;i<8;i++)     //shift bit for masking
   {
       SCLK=1;                      //clk for SENSI-BUS
        if(DATA) val = (val | i);   //read bit  
        SCLK=0;        
}
DATA =! ack;                     //in case of "ack==1" pull down DATA-Line
SCLK = 1;                        //clk #9 for ack
_nop_();
   _nop_();
   _nop_();               //pulswith approx. 5 us
   SCLK = 0;         
   DATA = 1;                        //release DATA-line
   return val;
}
//************************************************************//
void s_transstart(void)
//************************************************************//
// generates a transmission start
//       _____         ________
// DATA:      |_______|
//           ___     ___
// SCLK : ___|   |___|   |______
{  
    DATA = 1;
SCLK = 0;                   //Initial state
    _nop_();
    SCLK = 1;
    _nop_();
    DATA = 0;
    _nop_();
    SCLK =0;  
    _nop_();
_nop_();
_nop_();
    SCLK = 1;
    _nop_();
    DATA = 1;     
    _nop_();
    SCLK = 0;     
}

char s_measure(uchar *p_value,uchar *p_checksum)
//************************************************************//
// makes a measurement (humidity/temperature) with checksum
{
   uchar error = 0;
   s_transstart();
   error += s_write_byte(MEASURE_TEMP);
   if(DATA) error += 1;
   *(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;
}

void main()
{
value val;
   uchar error,checksum;
error = 0;
    error += s_measure((uchar*)&val.i,&checksum);
}


在char s_read_byte函数中设置断点,读取的数据是11111111。本人菜鸟新手,求高手指教
发表于 2010-9-25 11:23:21 | 显示全部楼层
没明白lZ什么意思,说清楚点,或者联系我的邮箱kobe0826@126.com
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-26 11:52 , Processed in 0.047817 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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