×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-15 发布时间:
|

#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  驱动程序

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向