📄 ad7705.c
字号:
#include <ad7705.h>
/*
void Delay(unsigned int t)
{
do
{
TH0 = 0xDC;
TL0 = 0x00;
TR0 = 1;
while ( !TF0 );
TF0 = 0;
TR0 = 0;
} while (--t);
}*/
/*
void main()
{
while(1)
{
unsigned int dat[5];
unsigned char j;
for(j=0;j<5;j++)
{
dat[j]= ReadData7705();
}
_nop_();
}
}*/
//--------------------------------------------------------------------------
//-------------------------读取AD7705转换数据函数--------------------------
//入口参数:无
//出口参数:去掉最大值和最小值后的平均值(5个数据)
//--------------------------------------------------------------------------
unsigned int ReadData7705()
{
unsigned int fiter[5],fiter_d;
unsigned char read_num;
unsigned long temp;
bit sort_flag;
ad7705_ini();
for(read_num=0;read_num<5;read_num++)
{
reset_AD7705();
write_AD7705_byte(0x20);//写通信寄存器,选择通道1,将下一次操作设为写时钟寄存器
write_AD7705_byte(0x01);//写时钟寄存器,不分频,更新频率25Hz
write_AD7705_byte(0x10);//写通信寄存器,选择通道1
write_AD7705_byte(0x3e);//写设置寄存器4,单极性,非缓冲模式,清除滤波器同步,不启动对1通道的自校准
while(ad7705_rdy); //等待转换结束
write_AD7705_byte(0x38);//写通信寄存器,下一次操作为读数据寄存器
fiter[read_num]= read_AD7705_word();
}
sort_flag = 1;//排序程序
while( sort_flag )
{
unsigned char i;
sort_flag = 0;
for( i=0; i<4; i++ )
{
if( fiter[i] > fiter[i+1] )
{
fiter_d = fiter[i];
fiter[i] = fiter[i+1];
fiter[i+1] = fiter_d ;
sort_flag = 1;
}
}
}//排序程序结束
temp=((unsigned long)fiter[1]+fiter[2]+fiter[3])/3;
fiter_d=(unsigned int) temp;
return fiter_d;
}
//----------------------------------------------------------------------------
//函数:reset_AD7705
//功能:AD7705串行接口失步后将其复位。复位后要延时500us再访问
//----------------------------------------------------------------------------
void reset_AD7705()
{
unsigned char i;
ad7705_din=1;
for( i=0; i<36; i++ )
{
ad7705_clk=0;
_nop_();
_nop_();
_nop_();
ad7705_clk=1;
_nop_();
_nop_();
_nop_();
}
//Delay(5);
}
//------------------------------------------------------------------------------------------
//函数:write_AD7705_byte
//功能:往AD7705写8位数据
//------------------------------------------------------------------------------------------
void write_AD7705_byte(unsigned char wr_dat)
{
unsigned char i;
for(i=0; i<8;i++)
{
ad7705_clk=0;
_nop_();
_nop_();
_nop_();
ad7705_din=(bit)(wr_dat&0x80);
_nop_();
_nop_();
_nop_();
ad7705_clk=1;
_nop_();
_nop_();
_nop_();
wr_dat=wr_dat<<1;
}
}
//------------------------------------------------------------------------------------------
//函数:read_AD7705_word
//功能:从AD7705读一个字的数据,共16bit
//------------------------------------------------------------------------------------------
unsigned int read_AD7705_word()
{
unsigned int read_dat=0;
unsigned char i;
for(i=0;i<16;i++)
{
read_dat=read_dat<<1;
ad7705_clk=0;
_nop_();
_nop_();
_nop_();
if(ad7705_dout)read_dat++;
_nop_();
_nop_();
_nop_();
ad7705_clk=1;
_nop_();
_nop_();
_nop_();
}
return read_dat;
}
//------------------------------------------------------------------------------------------
//函数:AD7705_ini
//功能:AD7705初始化
//------------------------------------------------------------------------------------------
void ad7705_ini()
{
reset_AD7705();
write_AD7705_byte(0x20);//写通信寄存器,选择通道1,将下一次操作设为写时钟寄存器
write_AD7705_byte(0x01);//写时钟寄存器,不分频,更新频率25Hz
write_AD7705_byte(0x10);//写通信寄存器,选择通道1
write_AD7705_byte(0x7e);//写设置寄存器4,单极性,非缓冲模式,清除滤波器同步,启动对1通道的自校准
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -