⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad7416_new.c

📁 温度传感器AD7416C程序(能帮你了解I2C原理
💻 C
字号:
/*AD7416温度传感器接口程序*/
/*2004年11月4日*/
#include <reg51.h>
#include <intrins.h>
#include <string.h>
#include <stdio.h>
sbit SDA = P3^5;
sbit SCL = P3^4;

char Start() 						//当SCL为高时,SDA由高到低跳变,认为开始
{
	SCL=1;
	SDA=1; 
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	if( SCL==0 || SDA==0 ) return 0; //如果不满足条件,开始错误
	else
	{
		SCL=1;						 //建立开始条件
		_nop_();
		_nop_();					 //开始条件为:当时钟SCL为高时,SDA产生一个由高到低的跳变
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		SDA=0;
		_nop_();
		_nop_();
		_nop_(); 
		_nop_();
		_nop_();
		SCL=0;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		SDA=1; 
	}
} 

void Stop()	  //当SCL为高时,SDA由低到高发生跳变,这认为停止
{
	SDA=0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SCL=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SDA=1; 
}

char Shin()	  //读入一个字节的数据
{
	char i,RetByte;
	for(i=0;i<8;i++)
	{
		SCL=0;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		SCL=1;
		_nop_();
		_nop_();
		RetByte=RetByte<<1;
		if( SDA==1 ) RetByte=RetByte|0x01;
	}
	SCL=0;
	_nop_();
	_nop_();
	SDA=1;
	return RetByte;
}

void Shout( char Byte )//写一个字节的数据
{		
	char i;
	for(i=0;i<8;i++)
	{
		SCL=0;
		_nop_();
		_nop_();
		if( Byte&0x80 ) SDA=1;
		else SDA=0;
		_nop_();
		_nop_();
		Byte=Byte<<1;
		SCL=1;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
	}
	SCL=0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SDA=1; 
}

char TestAck()	//检察是否有应答信号
{
	char rf=0; //是否应答标志
	SCL=0;
	_nop_();   //应答是在时钟的低时期将SDA拉低来产生应答
	_nop_();
	_nop_();
	SDA=1; 
	_nop_();
	_nop_();
	SCL=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	if( SDA==1 ) rf=1;//没有应答信号,置标志为高
	else rf=0;
		SCL=0;
		_nop_();
		_nop_();
		_nop_();
	return rf;
}

//unsigned int LM74_Read(void)
float LM74_Read(void)
{
	unsigned char rc_h=0, rc_l=0,i;
//	unsigned int bbData,sum;
	float hight,low,sum,d1,d2,tempt;
	unsigned char a,b;

	Start();
	Shout( 0x90 );          //发送地址信号:地址为000
	if( !TestAck() )
	{
		Shout(0);           //选中温度数据寄存器
		TestAck();
	}
	Stop();

	sum=0.0;
	for(i=0;i<10;i++)
	{
		Start();
		Shout( 0x91 );    //读温度寄存器中的数据
		if( !TestAck() )
		{
			rc_h=Shin();  //温度数据高8位
			if( !TestAck() )
			rc_l=Shin();  //温度数据低8位
			TestAck();
		}
		Stop();

//		bbData=rc_h;
//		bbData=_irol_(bbData,8);
//		bbData=bbData|rc_l;
//		bbData=_iror_(bbData,6);
//		bbData=bbData&0x0FFF;
		hight=rc_h;
		a=rc_l&0x80;
		b=rc_l&0x40;
		if(a==1)
			d1=0.5;
		else d1=0.0;
		if(b==1)
			d2=0.25;
		else d2=0.0;
		low=d1+d2;
		sum+=(hight+low);
	

//		sum+=bbData;
	}
//	bbData=sum/10;
//	return (bbData);
	tempt=sum/10.0;
	return(tempt);
}

void LM74_Set()
{
	unsigned char  rc_l;
//	unsigned char rc_h, rc_l;
//	unsigned int bbData;

	Start();
	Shout( 0x90 );         //发送地址信号,并为写
	if( !TestAck() )
	{
		Shout( 1 );        //设置配置寄存器
		if( !TestAck() )
		{
			Shout(0x0);	   //写配置寄存器内容
			TestAck();
		}
	}
	Stop();

	Start();
	Shout( 0x91 );        //读数据
	if( !TestAck() )
	{
	rc_l=Shin();
	TestAck();
	}
	Stop();

}
main()
{
	float temp;
	TMOD=0x20|TMOD;
    TL1=0xfd;
    TH1=0xfd;
    TR1=1;
    SCON=0x50;
	TI=1;
	puts("the temp is;\r\n");
	LM74_Set();
	temp=LM74_Read();
	printf("%.2f\r\n",temp);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -