📄 ad7705_va.c
字号:
#include "mylib.h"
unsigned char ad7705timer;
unsigned int READ7705(void);
void WRITE7705(unsigned char n);
void INI7705(void);
bit START_CH1(void);
unsigned int READ_CH1(void);
bit START_CH2(void);
unsigned int READ_CH2(void);
bit ERR7705(void);
unsigned int READ7705(void)
{
char i,j;
unsigned int ctemp=0;
CS_7705=0;
DOUT_7705=1;
for(i=0;i<16;i++)
{
SCLK_7705=0;
ctemp=ctemp<<1;
for(j=0;j<20;j++)
__nop_();
SCLK_7705=1;
for(j=0;j<20;j++)
__nop_();
if(DOUT_7705)
{
ctemp++;
}
}
CS_7705=1;
return(ctemp);
}
void WRITE7705(unsigned char n)
{
char i,j;
CS_7705=0;
for(i=0;i<8;i++)
{
DIN_7705=(n & 0x80);
for(j=0;j<20;j++)
__nop_();
SCLK_7705=0;
__nop_();
__nop_();
for(j=0;j<20;j++)
__nop_();
SCLK_7705=1;
n=(n<<1);
for(j=0;j<20;j++)
__nop_();
}
CS_7705=1;
}
void INI7705(void)
{
WRITE7705(0xff);
WRITE7705(0xff);
WRITE7705(0xff);
WRITE7705(0xff);
WRITE7705(0xff);
}
/*
AD7705寄存器
1:通信寄存器
DRDY RS2 RS1 RS0 R/W STBY CH1 CH0
DRDY:写操作时此位为0。
RS2、RS1、RS0:选择寄存器。000:通信寄存器; 001:设置寄存器; 010:时钟寄存器。
R/W:0写操作; 1读操作.
STBY:等待模式。0正常工作模式.
CH1 CH0:通道选择。
2:设置寄存器
MD1 MD0 G2 G1 G0 B/U BUF FSYNC
MD1 MD0:校准模式选择。00正常模式; 01自校准模式; 10 零刻度校准模式; 11全刻度校准模式.
G2 G1 G0:增益选择位。
B/U:单极性与双极性选择。0双极,1单极。
BUF:缓冲。1缓冲,0无缓冲。
FSYNC:同步过滤器。
3:时钟寄存器
ZER0 ZER0 ZER0 CLKDIS CLKDIV CLK FS1 FS0
ZER0:0必须写进该位,才能保证7705的运转正确。
CLKDIS:主时钟禁止位。"1"禁止MCLKOUT脚输出。
CLKDIV:时钟分频位。"1"主时钟二频; "0"不分频。
CLK:时钟位。2.4576M/4.9152M时对应CLK=1;1M/2M时对应CLK=0.
FS0 FS1:数据刷新选择位。应与CLK结合来决定数据刷新速度。
*/
bit START_CH1(void)
{
bit temp=0;
INI7705();
WRITE7705(0x20);//00100000 选择时钟寄存器,第1通道。
WRITE7705(0x06);//00000110 数据刷新速度为250Hz,主时钟不分频,晶振为2.4576M.
WRITE7705(0x10);//00010000 选择设置寄存器,第1通道。
WRITE7705(0x40);//01000000 自校准模式,增益为1,双极性
ad7705timer=0;
while(ad7705timer<50)
{
if(DRDY_7705)
{
temp=1;
ad7705timer=51;
}
}
if(!temp)
return(0);
ad7705timer=0;
while(ad7705timer<50)
{
if(!DRDY_7705)
{
return(1);
}
}
return(0);
}
unsigned int READ_CH1(void)
{
idata unsigned int y;
START_CH1();
ad7705timer=0;
while(ad7705timer<50)
{
if(DRDY_7705)
{
ad7705timer=51;
}
}
ad7705timer=0;
while(ad7705timer<50)
{
if(!DRDY_7705)
{
ad7705timer=51;
}
}
WRITE7705(0x38);//00111000选择数据寄存器,读第一通道.
y=READ7705();
return y;
}
bit START_CH2(void)
{
bit temp=0;
INI7705();
WRITE7705(0x21);
WRITE7705(0x0a);
WRITE7705(0x11);
WRITE7705(0x44);
ad7705timer=0;
while(ad7705timer<50)
{
if(DRDY_7705)
{
temp=1;
ad7705timer=51;
}
}
if(!temp) return(0);
ad7705timer=0;
while(ad7705timer<50)
{
if(!DRDY_7705)
{
return(1);
}
}
return(0);
}
unsigned int READ_CH2(void)
{
idata unsigned int y;
START_CH2();
ad7705timer=0;
while(ad7705timer<50)
{
if(DRDY_7705)
{
ad7705timer=51;
}
}
ad7705timer=0;
while(ad7705timer<50)
{
if(!DRDY_7705)
{
ad7705timer=51;
}
}
WRITE7705(0x39); //选择数据寄存器
y=READ7705();
return y;
}
/*
STC看门狗介绍WDT_CONTR:
-- -- EN_WDT CLR_WDT IDLE_WDT PS2 PS1 PS0
EN_WDT:看门狗允许位,设置为1时看门狗启动。
CLR_WDT:看门狗清0位,设置为1时看门狗重新计数,硬件将自动清0此位
IDLE_WDT:当设置为1时看门狗定时器在空闲模式下计数;
当设置为0时看门狗定时器在空闲模式下不计数.
PS2 PS1 PS0:看门狗定时器分频值。
*/
bit ERR7705(void) //
{ unsigned int n;
// WDT_CONTR=0x3c;
INI7705();
WRITE7705(0x20);
WRITE7705(0x0a); //SH1
WRITE7705(0x10);
WRITE7705(0x44);
n=0;
while(DRDY_7705)
{
WDT_CONTR=0x3c;
n++;
if(n>0xfff)
{
return 1;
}
}
n=0;
while(!DRDY_7705)
{
WDT_CONTR=0x3c;
n++;
if(n>0xfff)
{
return 1;
}
}
INI7705();
WRITE7705(0x21);
WRITE7705(0x0a); //SH2
WRITE7705(0x11);
WRITE7705(0x44);
n=0;
while(DRDY_7705)
{
WDT_CONTR=0x3c;
n++;
if(n>0xfff)
return 1;
}//00111100
n=0;
while(!DRDY_7705)
{
WDT_CONTR=0x3c;
n++;
if(n>0xfff)
return 1;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -