|  | 
 
 
| 
#include "reg51.h"
×
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册  #include "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();
 }
 
 
 (((注意要根据不同的情况来减少延时的个数)))
 | 
 |