10位数字温度传感器AD7416驱动程序

来源:本站
导读:目前正在解读《10位数字温度传感器AD7416驱动程序》的相关信息,《10位数字温度传感器AD7416驱动程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《10位数字温度传感器AD7416驱动程序》的详细说明。
简介:本文主要介绍了最新10位数字温度传感器AD7416驱动程序。

//注意要根据不同的情况来减少延时的个数

#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();

}

提醒:《10位数字温度传感器AD7416驱动程序》最后刷新时间 2024-03-14 01:02:54,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《10位数字温度传感器AD7416驱动程序》该内容的真实性请自行鉴别。