📄 ad7705.c
字号:
#include "mylib.h"
uint ch;
unsigned char ad7705timer;
/*
编写:bobo
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结合来决定数据刷新速度。
*/
/*
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:看门狗定时器分频值。
*/
/* AD7705软件延时 */
void Wait7705(unsigned int t)
{
for( ;t>0 ;t-- );
}
void writeword(unsigned int byteword)
{
unsigned int AD16bit,Token;
unsigned char i ;
AD_CLK=1;
AD_CS=0;//开始
delay();
Token=0x80;
AD16bit=byteword;
for(i=0;i<8;i++)
{
/*if(AD16bit&Token)
AD_IN=1;//输入数据位
else AD_IN=0;
AD_CLK=1;
delay();
AD_CLK=0;
delay();
AD_CLK=1;
delay();
Token=Token>>1;*/
AD_CLK=0;
delay();
if(AD16bit&Token)
AD_IN=1;//输入数据位
else AD_IN=0;
AD_CLK=1;
delay();
Token=Token>>1;
}
AD_CLK=1;
AD_IN=1;//结束
AD_CS=1;
}
uint getch(uchar chanl)
{
uchar count;
if(AD_REDY==0)
{
count++;
if(count==3)
count=0;
if(count==1)
{
writeword(chanl);
ch=readdata();
}
if(count==2)
{
writeword(chanl);
ch=readdata();
}
}
return(ch);
}
unsigned int readdata()
{
unsigned int AD16bit;
unsigned char i,DataH,DataL;
DataH=0;
DataL=0;
// writeword(0x38); //设置读当前通道数据
// while(AD_REDY==1); //等待数据准备好
delay();
AD_CLK=1;
AD_CS=0;
delay();
AD16bit=0;
AD_OUT=1;
for(i=0;i<8;i++)
{
AD_CLK=0;
DataH<<=1;
delay();
AD_CLK=1;
delay();
if(AD_OUT==1)
DataH|=0x01;
// DataH++;
// DataH<<=1;
}
DataH=DataH&0xff;
for(i=0;i<8;i++)
{
AD_CLK=0;
DataL<<=1;
delay();
AD_CLK=1;
delay();
if(AD_OUT==1)
DataL|=0x01;
// DataL++;
// DataL<<=1;
}
DataL=DataL&0xff;
/* for(i=0;i<16;i++)
{
// AD16bit=AD16bit<<1;
AD_CLK=0;
// if(i<15)
AD16bit=AD16bit<<=1;
delay();
AD_CLK=1;
delay();
if(AD_OUT==1)
AD16bit|=0x01;//读取数据位
// AD16bit=AD16bit++;//读取数据位
}*/
delay();
while(AD_REDY==0);
AD_CS=1;
AD16bit=DataH*256+DataL;
// AD16bit=DataL;
return(AD16bit);
}
/*
读取第1通道或第二通道的AD值
mode:1时读取第1通道值;2时读取第2通道值。
*/
void CH1_init(void)
{
AD_CS=0;
writeword(0x20);//发送写命令序列 clock register
AD_CS=1;
AD_CS=0;
// writeword(0x09);//设置更新频率
writeword(0x0c);//设置更新频率
AD_CS=1;
AD_CS=0;
writeword(0x10);//set up register
AD_CS=1;
AD_CS=0;
// writeword(0x44);
writeword(0x46);
AD_CS=1;
}
void CH2_init(void)
{
AD_CS=0;
writeword(0x21);//发送写命令序列 clock register
AD_CS=1;
AD_CS=0;
writeword(0x0c);//设置更新频率
AD_CS=1;
AD_CS=0;
writeword(0x11);//set up register
AD_CS=1;
AD_CS=0;
writeword(0x46);
AD_CS=1;
}
void AD7705_reset(void)
{
AD_RST=1;
delay();
AD_RST=0;
delay();
AD_RST=1;
delay();
AD_CS=0;
}
unsigned int ReadDataCh1_Ch2(bit mode)
{
uint AD16bit;
uchar i,DataH,DataL; //AD值的高位与低位
DataH=0;
DataL=0;
if(mode==1)
writeword(0x39);
else
writeword(0x38);
while(AD_REDY==1); //等待数据准备好
delay();
AD_CLK=1;
AD_CS=0;
delay();
AD16bit=0;
AD_OUT=1;
/* for(i=0;i<8;i++)
{
AD_CLK=0;
DataH<<=1;
delay();
AD_CLK=1;
delay();
if(AD_OUT==1)
DataH|=0x01;
}
// DataH=DataH&0xff;
for(i=0;i<8;i++)
{
AD_CLK=0;
DataL<<=1;
delay();
AD_CLK=1;
delay();
if(AD_OUT==1)
DataL|=0x01;
} */
for(i=0;i<16;i++)
{
AD16bit=AD16bit<<1;
AD_CLK=0;
// if(i<15)
// AD16bit=AD16bit<<1;
delay();
AD_CLK=1;
delay();
if(AD_OUT==1)
AD16bit|=0x01;//读取数据位
// DataL=DataL&0xff;
}
delay();
while(AD_REDY==0);
AD_CS=1;
//AD16bit=DataH*256+DataL;
return(AD16bit);
}
void delay()
{
unsigned int j;
for(j=0;j<8;j++);
}
void INI7705(void)
{
writeword(0xff);
writeword(0xff);
writeword(0xff);
writeword(0xff);
writeword(0xff);
}
/*
bit START_CH1(void)
{
bit temp=0;
INI7705();
WRITE7705(0x20);
WRITE7705(0x0a); //0x0c
WRITE7705(0x10);
WRITE7705(0x40); //setup setup reg.
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);
y=READ7705();
return y;
}
bit START_CH2(void)
{
bit temp=0;
INI7705();
WRITE7705(0x21);
WRITE7705(0x0a); //0x0c
WRITE7705(0x11);
WRITE7705(0x40);
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;
}
#endif
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -