//来源文件#includeSHT21.H/*================================================================【名称】字符表【功能】用于查表生成对应数字的ASCII码【备注】【作者】【时间】2010年8月18日11:24:09================================================================*/constunsignedcharNum[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};/*================================================================【名称】【功能】模拟IIC使用的引脚定义,注意要上拉电阻【备注】【作者】【时间】2010年8月18日11:24:09================================================================*/sbitSDA=P2^4;sbitSCL=P2^3;/*================================================================【名称】【功能】SHT21的I2C地址【备注】【作者】【时间】2010年8月18日11:24:09================================================================*/#defineSHT21ADDR0x80/*================================================================【名称】【功能】应答位电平定义【备注】【作者】【时间】2010年8月18日11:24:09================================================================*/#defineACK0#defineNACK1/*================================================================【名称】voidDelay(unsignedintt)【功能】延时长【备注】【作者】【时间】2010年8月18日11:24:09================================================================*/voidDelay(unsignedintt){unsignedchari;while(t--){for(i=0;i200;i++);}}//***********************以下是模拟I2C函数****************************///*================================================================【名称】voidI2CDelay(unsignedchart)【功能】模拟IIC用的短延时【备注】【作者】【时间】2010年8月18日11:24:09================================================================*/voidI2CDelay(unsignedchart){while(t--);}/*================================================================【名称】voidI2CInit(void)【功能】I2C初始化,空闲状态【备注】【作者】【时间】2010年8月18日11:24:09================================================================*/voidI2CInit(void){SDA=1;SCL=1;}/*================================================================【名称】voidI2CStart(void)【功能】I2C起始信号【备注】SCL、SDA同为高,SDA跳变成低之后,SCL跳变成低【作者】【时间】2010年8月18日11:24:09================================================================*/voidI2CStart(void){SDA=1;SCL=1;I2CDelay(10);SDA=0;I2CDelay(20);SCL=0;I2CDelay(20);}/*================================================================【名称】voidI2CStop(void)【功能】I2C停止信号【备注】SCL、SDA同为低,SCL跳变成高之后,SDA跳变成高【作者】【时间】2010年8月18日11:24:09================================================================*/voidI2CStop(void){SDA=0;SCL=0;I2CDelay(10);SCL=1;I2CDelay(10);SDA=1;I2CDelay(10);}/*================================================================【名称】unsignedcharI2CWRByte(unsignedcharWRByte)【功能】I2C写一个字节数据,返回ACK或者NACK【备注】从高到低,依次发送【作者】【时间】2010年8月18日11:24:09================================================================*/unsignedcharI2CWRByte(unsignedcharWRByte){unsignedchari;SCL=0;for(i=0;i8;i++){if(WRByte&0x80){SDA=1;}else{SDA=0;}I2CDelay(10);SCL=1;//输出SDA稳定后,拉高SCL给出上升沿,从机检测到后进行数据采样I2CDelay(50);SCL=0;I2CDelay(10);WRByte=1;}SDA=1;SCL=1;I2CDelay(20);if(SDA==1)//SDA为高,收到NACK{SCL=0;I2CDelay(50);returnNACK;}else//SDA为低,收到NACK{SCL=0;I2CDelay(50);returnACK;}}/*================================================================【名称】unsignedcharI2CRDByte(unsignedcharAckValue)【功能】I2C读一个字节数据,入口参数用于控制应答状态,ACK或者NACK【备注】从高到低,依次接收【作者】【时间】2010年8月18日11:24:09================================================================*/unsignedcharI2CRDByte(unsignedcharAckValue){unsignedchari,RDByte=0;SCL=0;SDA=1;//释放总线for(i=0;i8;i++){RDByte=1;//移位SCL=1;//给出上升沿I2CDelay(30);//延时等待信号稳定if(SDA==1)//采样获取数据{RDByte|=0x01;}else{RDByte&=0xfe;}SCL=0;//下降沿,从机给出下一位值I2CDelay(10);}SDA=AckValue;//应答状态I2CDelay(10);SCL=1;I2CDelay(50);SCL=0;SDA=1;I2CDelay(1);returnRDByte;}/*================================================================【名称】voidSHT21Init(void)【功能】SHT21初始化函数,主函数中调用【备注】从高到低,依次接收【作者】【时间】2010年8月18日11:24:09================================================================*/voidSHT21Init(void){I2CInit();//I2C初始化I2CStart();//启动I2CI2CWRByte(SHT21ADDR&0xfe);//写SHT21I2C地址I2CWRByte(0xfe);I2CStop();//停I2CDelay(600);//短延时}/*================================================================【名称】longReadSht21(charwhatdo)【功能】读取函数函数【备注】【作者】【时间】2010年8月18日11:24:09================================================================*/longReadSht21(charwhatdo){unsignedlongtemp;unsignedcharHumidity,HumidityH,HumidityL;unsignedlongwendu;I2CStart();if(I2CWRByte(SHT21ADDR&0xfe)==ACK){if(I2CWRByte(whatdo)==ACK){do{Delay(30);I2CStart();}while(I2CWRByte(SHT21ADDR|0x01)==NACK);HumidityH=I2CRDByte(ACK);HumidityL=I2CRDByte(ACK);I2CRDByte(NACK);I2CStop();HumidityL&=0xfc;temp=HumidityH*256+HumidityL;if(whatdo==((char)0xf5)){Humidity=(unsignedchar)((temp*125)/65536-6)%0xff;returnHumidity;}else{temp=((long)17572)*temp;temp=temp/((long)65536);wendu=temp-((long)4685);returnwendu;//输出}//SendStrings(Humidity:);//输出到串口//SendByte(Num2Ascii[Humidity%100/10]);//SendByte(Num2Ascii[Humidity%10]);//SendByte('%');//SendByte('\n');}}return0;}SHT21.h文件*================================================================【名称】voidDelay(unsignedintt)【功能】延时长【备注】【作者】【时间】2010年8月18日11:24:09================================================================*/voidDe