📄 ad7416_new.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 + -