对着参考手册看了一遍,还是没找到哪里不对,再加上才接触IIC,对其理解不深刻,身边又没有示波器之类的,难受哦 #ifndef __SHT20_H_
#define __SHT20_H_ #include "msp430x14x.h" /***************************** 宏定义 *****************************/
#define SCL_H P3OUT |= BIT6
#define SCL_L P3OUT &= ~BIT6
#define SDA_H P3OUT |= BIT7
#define SDA_L P3OUT &= ~BIT7
#define SDA_in P3DIR &= ~BIT7 //SDA 改成输入模式
#define SDA_out P3DIR |= BIT7 //SDA 变回输出模式
#define SDA_val P3IN&BIT7 //SDA 的位值 #define ACK 0
#define NACK 1 #define SHT20ADDR 0x80 void Delay(void);
void Start(void);
void Stop(void);
void Mack(void);
void MNack(void);
unsigned char Check(void);
void Write1(void);
void Write0(void);
unsigned char WriteByte(unsigned char wdata);
unsigned char ReadByte(void);
void Delay_10ms();
float Sht21Work(unsigned char order);
#endif
#include "sht20.h" /*****************************************************************
【函数名称】 Start
【功 能】完成 IIC 的起始条件操作
【参 数】无
【返回值 】无
*****************************************************************/
void Start(void)
{
SCL_H;
SDA_H;
delay_us(15);
SDA_L;
delay_us(15);
SCL_L;
delay_us(15);
}
/*****************************************************************
【函数名称】 Stop
【功 能】完成 IIC 的终止条件操作
【参 数】无
【返回值 】无
*****************************************************************/
void Stop(void)
{ SDA_L;
delay_us(15);
SCL_H;
delay_us(15);
SDA_H;
delay_us(15);
}
/*****************************************************************
【函数名称】 Mack
【功 能】完成 IIC 的主机应答操作
【参 数】无
【返回值 】无
*****************************************************************/
void Mack(void)
{
SDA_L;
_NOP(); _NOP();
SCL_H;
delay_us(15);
SCL_L;
_NOP(); _NOP();
SDA_H;
delay_us(15);
}
/*****************************************************************
【函数名称】 MNack
【功 能】完成 IIC 的主机无应答操作
【参 数】无
【返回值 】无
*****************************************************************/
void MNack(void)
{
SDA_H;
_NOP(); _NOP();
SCL_H;
delay_us(15);
SCL_L;
_NOP(); _NOP();
SDA_L;
delay_us(15);
}
/*****************************************************************
【函数名称】 Check
【功 能】检查从机的应答操作 ,1--有, 0--无
【参 数】无
【返回值 】ACK (应答信号) or NACK (非应答信号)
*****************************************************************/
unsigned char Check(void)
{
unsigned char ack;
SDA_H;
_NOP(); _NOP();
SCL_H;
_NOP(); _NOP();
SDA_in;
_NOP(); _NOP();
ack = SDA_val; //读入 SDA 数值
SCL_L;
delay_us(15);
SDA_out;
if(ack) return NACK;
else return ACK;
}
/*****************************************************************
【函数名称】 Write1
【功 能】向 IIC 总线发送一个 1
【参 数】无
【返回值 】无
*****************************************************************/
void Write1(void)
{
SDA_H;
delay_us(15);
SCL_H;
delay_us(15);
SCL_L;
delay_us(15);
}
/*****************************************************************
【函数名称】 Write0
【功 能】向 IIC 总线发送一个 0
【参 数】无
【返回值 】无
*****************************************************************/
void Write0(void)
{
SDA_L;
delay_us(15);
SCL_H;
delay_us(15);
SCL_L;
delay_us(15);
}
/*****************************************************************
【函数名称】 WriteByte
【功 能】向 IIC 总线发送一个字节
【参 数】 wdata 为待写数据
【返回值 】respond 为从机返回的应答信号
*****************************************************************/
unsigned char WriteByte(unsigned char wdata)
{
unsigned char i,respond;
for(i = 8;i > 0;i--)
{
if(wdata & 0x80)
Write1();
else
Write0();
wdata <<= 1;
}
SDA_H;
_NOP();
respond = Check();
return respond;
}
/*****************************************************************
【函数名称】 ReadByte
【功 能】从 IIC 总线读取一个字节
【参 数】无
【返回值 】rdata 为读取的数据
*****************************************************************/
unsigned char ReadByte(void)
{
unsigned char rdata = 0x00,i;
unsigned char flag;
for(i = 0;i < 8;i++)
{
SDA_H;
delay_us(15);
SCL_H;
SDA_in;
delay_us(15);
flag = SDA_val;
rdata <<= 1;
if(flag)
rdata |= 0x01;
SDA_out;
SCL_L;
delay_us(15);
}
return rdata;
} /*****************************************************************
【函数名称】 Sht21Work
【功 能】 Sht21 测量温湿度
【参 数】 order = 0xf3 时测量温度; order = 0xf5 时测量湿度
【返回值 】wendu、shidu
*****************************************************************/
float Sht21Work(unsigned char order)
{
float temp = 0,TH = 0;
unsigned char MSB,LSB;
Start();
if(WriteByte(SHT20ADDR & 0xfe) == ACK)
{
if(WriteByte(order) == ACK)
{
do
{
delay_ms(10);
Start();
}while(WriteByte(SHT20ADDR | 0x01) == NACK);
MSB = ReadByte();
Mack();
LSB = ReadByte();
MNack();
Stop();
LSB &= 0xfc;
temp = MSB*256+LSB;
if (order == 0xf3)
{
TH = ((float)temp * 0.00268127) - 46.85;
return TH;
}
else
{
TH = ((float)temp * 0.00190734) - 46.85;
return TH;
}
}
}
return 1;
}
|