【完成人】刘承桥
【完成日期】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; } 因篇幅问题不能全部显示,请点此查看更多更全内容