|
/*------------------------------------------------------------------------------------------ [文件名] AD7416.c [功能] 最新10位數(shù)字溫度傳感器AD7416驅(qū)動(dòng)程序 [版本] 1.5 [作者] 鞠春陽 [最后修改時(shí)間] 2003年5月12日 [版權(quán)所有] www.mcuzb.com [資料] 請(qǐng)到www.mcuzb.com下載 ===========================================================================================*/ //注意要根據(jù)不同的情況來減少延時(shí)的個(gè)數(shù) #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; //正還是負(fù) //#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_();} //延時(shí)函數(shù) AD7416_delay() { unsigned int i=60; while(i--); } /*-------------------------------------------------------------------------------- 調(diào)用方式:void AD7416_I2CStart(void) ﹫2001/07/0 4 函數(shù)說明:私有函數(shù),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(); }
/*-------------------------------------------------------------------------------- 調(diào)用方式:void AD7416_I2CStop(void) ﹫2001/07/0 4 函數(shù)說明:私有函數(shù),I2C專用 ---------------------------------------------------------------------------------*/ void AD7416_I2CStop(void) { AD7416_SCL=0; AD7416_SDA=0; AD7416_delay();//INI AD7416_SCL=1; AD7416_delay();//STOP EA=1; } /*-------------------------------------------------------------------------------- 調(diào)用方式:I2CAck(void) ﹫2001/07/0 4 函數(shù)說明:私有函數(shù),I2C專用,等待從器件接收方的應(yīng)答 ACK BY AD7416 ---------------------------------------------------------------------------------*/ AD7416_WaitAck(void) { unsigned char errtime=255;//因故障接收方無ACK,超時(shí)值為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(); } /*-------------------------------------------------------------------------------- 調(diào)用方式:void SendAck(void) ﹫2001/07/0 4 函數(shù)說明:私有函數(shù),I2C專用,主器件為接收方,從器件為發(fā)送方時(shí),非應(yīng)答信號(hào)。 ---------------------------------------------------------------------------------*/ void AD7416_SendNotAck(void) { AD7416_SDA=1; AD7416_delay(); AD7416_SCL=1; AD7416_delay(); AD7416_SCL=0; AD7416_delay(); } /*-------------------------------------------------------------------------------- 調(diào)用方式:void I2CSend(unsigned char ch) ﹫2001/07/0 5 函數(shù)說明:私有函數(shù),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(); } /*-------------------------------------------------------------------------------- 調(diào)用方式:unsigned char I2CReceive(void) ﹫2001/07/0 5 函數(shù)說明:私有函數(shù),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給傳感器一個(gè)低,所以這個(gè)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(); } //讀溫度傳感器 /*---------------------------------------------------------------------------------------------------- 溫度值寄存器是一個(gè)16位只讀寄存器,它的高10位以2的補(bǔ)碼格式儲(chǔ)存由AD轉(zhuǎn)換器送來的10位溫度讀 數(shù)。位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; //循環(huán)兩次 wendu=h;temp=l; //將高8位和低8位的前2位連接 while(c--) { if(temp&0x80) { wendu<<=1; wendu|=0x0001; } else { wendu<<=1; } } //判斷溫度正負(fù) if(h&0x80) //負(fù) { 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; } } //設(shè)定7416的OTI和HYST /*---------------------------------------------------------------------------- OTI為上限 HYST為下限 7416做為恒溫器使用 OTI必須低有效。當(dāng)溫度高于OTI值時(shí)由OTI腳發(fā)出低,直到溫度低于 HYST值OTI腳才發(fā)出高。 -----------------------------------------------------------------------------*/ Setup7416OTI(unsigned char OTI,unsigned char HYST,unsigned char address) {
unsigned char a,b; a=OTI; //溫度轉(zhuǎn)換 a=a*4; a>>=2; b=HYST; //溫度轉(zhuǎn)換 b=b*4; b>>=2; AD7416_I2CStart(); AD7416_I2CSendByte(address); //寫 AD7416_WaitAck(); AD7416_I2CSendByte(0x01); //指向狀態(tài)寄存器 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(); }
|