您的当前位置:首页正文

SHT21+IIC+MSP430f149

2021-02-23 来源:步旅网


【完成人】刘承桥

【完成日期】2013年7月23日

【说 明】本程序是基于MSP430F149的SHT21的驱动程序,采用模拟IIC总线方式,这里只给出了SHT21.c和IIC.c。其中IIC.c,本人是在已有IIC程序的基础之上修改而来,使用者可以根据自己的需要进行修改。本人是MSP430F149初学者,在使用MSP430F149方面存在诸多问题,如有哪位大侠发现本程序有不足之处,敬请指教。本人QQ:2889223900。

SHT21.c

#include

#include

#include \"IIC.h\"

#include \"SHT21.h\"

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

【函数名称】delay_10ms

【功 能】延时约10ms

【参 数】无

【返回值 】无

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

void Delay_10ms()

{

unsigned int i = 1000;

while(i--);

}

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

【函数名称】Sht21Work

【功 能】Sht21测量温湿度

【参 数】order = 0xf3时测量温度;order = 0xf5时测量湿度

【返回值 】wendu、shidu

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

int Sht21Work(unsigned char order)

{

float temp = 0,TH = 0;

unsigned char MSB,LSB;

unsigned int shidu,wendu;

Start();

if(WriteByte(SHT21ADDR & 0xfe) == ACK)

{

if(WriteByte(order) == ACK)

{

do

{

Delay_10ms();

Start();

}

while(WriteByte(SHT21ADDR | 0x01) == NACK);

MSB = ReadByte();

Mack();

LSB = ReadByte();

MNack();

Stop();

LSB &= 0xfc;

temp = MSB*256+LSB;

if (order == 0xf3)

{

TH=(175.72)*temp/65536-46.85;

wendu =(int)fabs((TH)*100);

return wendu;

}

else

{

TH = (temp*125)/65536-6;

shidu =(int)fabs((TH)*100);

return shidu;

}

}

}

return 1;

}

IIC.c

#include

#include \"IIC.h\"

/*****************************宏定义*****************************/

#define SCL_H P1OUT |= BIT2

#define SCL_L P1OUT &= ~BIT2

#define SDA_H P1OUT |= BIT3

#define SDA_L P1OUT &= ~BIT3

#define SDA_in P1DIR &= ~BIT3 //SDA改成输入模式

#define SDA_out P1DIR |= BIT3 //SDA变回输出模式

#define SDA_val P1IN&BIT3 //SDA的位值

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

【函数名称】Delay

【功 能】延时约15us的时间

【参 数】无

【返回值 】无

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

void Delay(void)

{

unsigned char i;

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

_NOP();

}

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

【函数名称】Start

【功 能】完成IIC的起始条件操作

【参 数】无

【返回值 】无

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

void Start(void)

{

SCL_H;

SDA_H;

Delay();

SDA_L;

Delay();

SCL_L;

Delay();

}

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

【函数名称】Stop

【功 能】完成IIC的终止条件操作

【参 数】无

【返回值 】无

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

void Stop(void)

{

SDA_L;

Delay();

SCL_H;

Delay();

SDA_H;

Delay();

}

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

【函数名称】Mack

【功 能】完成IIC的主机应答操作

【参 数】无

【返回值 】无

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

void Mack(void)

{

SDA_L;

_NOP(); _NOP();

SCL_H;

Delay();

SCL_L;

_NOP(); _NOP();

SDA_H;

Delay();

}

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

【函数名称】MNack

【功 能】完成IIC的主机无应答操作

【参 数】无

【返回值 】无

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

void MNack(void)

{

SDA_H;

_NOP(); _NOP();

SCL_H;

Delay();

SCL_L;

_NOP(); _NOP();

SDA_L;

Delay();

}

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

【函数名称】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();

SDA_out;

if(ack) return NACK;

else return ACK;

}

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

【函数名称】Write1

【功 能】向IIC总线发送一个1

【参 数】无

【返回值 】无

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

void Write1(void)

{

SDA_H;

Delay();

SCL_H;

Delay();

SCL_L;

Delay();

}

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

【函数名称】Write0

【功 能】向IIC总线发送一个0

【参 数】无

【返回值 】无

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

void Write0(void)

{

SDA_L;

Delay();

SCL_H;

Delay();

SCL_L;

Delay();

}

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

【函数名称】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();

SCL_H;

SDA_in;

Delay();

flag = SDA_val;

rdata <<= 1;

if(flag)

rdata |= 0x01;

SDA_out;

SCL_L;

Delay();

}

return rdata;

}

因篇幅问题不能全部显示,请点此查看更多更全内容