|
最新10位数字温度传感器AD7416驱动程序
/*------------------------------------------------------------------------------------------ [文件名] AD7416.c [功能] 最新10位数字温度传感器AD7416驱动程序 [版本] 1.5 [作者] 鞠春阳 [最后修改时间] 2003年5月12日 [版权所有] www.mcuzb.com [资料] 请到www.mcuzb.com下载 ===========================================================================================*/ //注意要根据不同的情况来减少延时的个数 #i nclude "reg51.h" #i nclude "intrins.h"
sbit AD7416_SCL= P1^6; sbit AD7416_SDA= P1^7;
unsigned char AD7416_SystemError; unsigned int Temperature; //温度 unsigned char ZorF; //正还是负
//#define SomeNOP(); { _nop_(); _nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_(); _nop_();_nop_();_nop_(); _nop_(); _nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_();}
//延时函数 AD7416_delay() { unsigned int i=60; while(i--); } /*-------------------------------------------------------------------------------- 调用方式:void AD7416_I2CStart(void) ﹫2001/07/0 4 函数说明:私有函数,I2C专用 ---------------------------------------------------------------------------------*/ void AD7416_I2CStart(void) { EA=0; AD7416_SDA=1; AD7416_SCL=1; AD7416_delay();//INI AD7416_SDA=0; AD7416_delay();//START AD7416_SCL=0; AD7416_delay(); }
/*-------------------------------------------------------------------------------- 调用方式:void AD7416_I2CStop(void) ﹫2001/07/0 4 函数说明:私有函数,I2C专用 ---------------------------------------------------------------------------------*/ void AD7416_I2CStop(void) { AD7416_SCL=0; AD7416_SDA=0; AD7416_delay();//INI AD7416_SCL=1; AD7416_delay();//STOP EA=1; }
/*-------------------------------------------------------------------------------- 调用方式:I2CAck(void) ﹫2001/07/0 4 函数说明:私有函数,I2C专用,等待从器件接收方的应答 ACK BY AD7416 ---------------------------------------------------------------------------------*/ AD7416_WaitAck(void) { unsigned char errtime=255;//因故障接收方无ACK,超时值为255。 AD7416_SDA=1;AD7416_delay(); AD7416_SCL=1;AD7416_delay(); AD7416_SystemError=0x10; while(AD7416_SDA) { errtime--; if(!errtime) { AD7416_I2CStop(); AD7416_SystemError=0x11; return; } } AD7416_SCL=0; AD7416_delay(); } /*-------------------------------------------------------------------------------- 调用方式:void SendAck(void) ﹫2001/07/0 4 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。 ---------------------------------------------------------------------------------*/ void AD7416_SendNotAck(void) { AD7416_SDA=1; AD7416_delay(); AD7416_SCL=1; AD7416_delay(); AD7416_SCL=0; AD7416_delay(); } /*-------------------------------------------------------------------------------- 调用方式:void I2CSend(unsigned char ch) ﹫2001/07/0 5 函数说明:私有函数,I2C专用 ---------------------------------------------------------------------------------*/ void AD7416_I2CSendByte(unsigned char ch) { unsigned char i=8; while(i--) { AD7416_SCL=0;_nop_(); AD7416_delay(); AD7416_SDA=(bit)(ch&0x80); ch<<=1; AD7416_delay(); AD7416_SCL=1; AD7416_delay(); } AD7416_SCL=0; AD7416_delay(); } /*-------------------------------------------------------------------------------- 调用方式:unsigned char I2CReceive(void) ﹫2001/07/0 5 函数说明:私有函数,I2C专用 ---------------------------------------------------------------------------------*/ unsigned char AD7416_I2CReceiveByte(void) { unsigned char i=8; unsigned char dat=0; AD7416_SDA=1; while(i--) { dat<<=1; AD7416_SCL=0;AD7416_delay(); AD7416_SCL=1;AD7416_delay(); dat|=AD7416_SDA; } AD7416_SCL=0; AD7416_delay(); return(dat); } //////////////////////////////////////////////////////////////////////////////////////////// /*-------------------------------------------------------------------------- ACK BY MASTER 有CPU给传感器一个低,所以这个ACK是来自CPU的。 ---------------------------------------------------------------------------*/ AD7416_bitout() { AD7416_SDA=0; AD7416_delay(); AD7416_SCL=0; AD7416_delay(); AD7416_SDA=0; AD7416_delay(); AD7416_SCL=1; AD7416_delay(); AD7416_SCL=0; AD7416_delay(); }
//读温度传感器 /*---------------------------------------------------------------------------------------------------- 温度值寄存器是一个16位只读寄存器,它的高10位以2的补码格式储存由AD转换器送来的10位温度读 数。位5至0未用 -128℃ 10 0000 0000 -125℃ 10 0000 1100 -100℃ 10 0111 0000 -75℃ 10 1101 0100 -50℃ 11 0011 1000 -25℃ 11 1001 1100 -0.25℃ 11 1111 1111 0℃ 00 0000 0000 +0.25℃ 00 0000 0001 +10℃ 0 0001 01000 +25℃ 0 0011 00100 +50℃ 0 0110 01000 +75℃ 0 1001 01100 +100℃ 0 1100 10000 +125℃ 0 1111 10100 +127℃ 0 1111 11100 -----------------------------------------------------------------------------------------------------*/ Read7416(unsigned char address) { unsigned char h,l,temp,c; unsigned int wendu;
AD7416_I2CStart(); AD7416_I2CSendByte(address); //写 AD7416_WaitAck(); AD7416_I2CSendByte(0x00); //指向温度寄存器 AD7416_SendNotAck(); AD7416_I2CStop();
AD7416_I2CStart(); AD7416_I2CSendByte(address+1); //读 AD7416_WaitAck(); h=AD7416_I2CReceiveByte(); //读高8位 AD7416_bitout(); //CUP送低 l=AD7416_I2CReceiveByte(); //读低8位 AD7416_SendNotAck(); AD7416_I2CStop();
c=2; //循环两次 wendu=h;temp=l; //将高8位和低8位的前2位连接 while(c--) { if(temp&0x80) { wendu<<=1; wendu|=0x0001; } else { wendu<<=1; } } //判断温度正负 if(h&0x80) //负 { wendu=wendu-0x01; wendu=~wendu; //变回原码 wendu=wendu&0x03FF; wendu=wendu*0.25; Temperature=wendu; ZorF=0; } else //正 { wendu=wendu*0.25; Temperature=wendu; ZorF=1; }
}
//设定7416的OTI和HYST /*---------------------------------------------------------------------------- OTI为上限 HYST为下限 7416做为恒温器使用 OTI必须低有效。当温度高于OTI值时由OTI脚发出低,直到温度低于 HYST值OTI脚才发出高。 -----------------------------------------------------------------------------*/ Setup7416OTI(unsigned char OTI,unsigned char HYST,unsigned char address) {
unsigned char a,b;
a=OTI; //温度转换 a=a*4; a>>=2;
b=HYST; //温度转换 b=b*4; b>>=2;
AD7416_I2CStart(); AD7416_I2CSendByte(address); //写 AD7416_WaitAck(); AD7416_I2CSendByte(0x01); //指向状态寄存器 AD7416_WaitAck(); AD7416_I2CSendByte(0x18); AD7416_SendNotAck(); AD7416_I2CStop();
AD7416_I2CStart(); AD7416_I2CSendByte(address); //写 AD7416_WaitAck(); AD7416_I2CSendByte(0x03); //指向OTI存器 AD7416_WaitAck(); AD7416_I2CSendByte(a); //送温度高8位 AD7416_WaitAck(); AD7416_I2CSendByte(0x00); //送温度低8位 AD7416_SendNotAck(); AD7416_I2CStop();
AD7416_I2CStart(); AD7416_I2CSendByte(address); //写 AD7416_WaitAck(); AD7416_I2CSendByte(0x02); //指向HYST寄存器 AD7416_WaitAck(); AD7416_I2CSendByte(b); //送温度高8位 AD7416_WaitAck(); AD7416_I2CSendByte(0x00); //送温度低8位 AD7416_SendNotAck(); AD7416_I2CStop(); }
|