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

📄 ad7705_va.c

📁 AD7705的驱动程序,二通道,可用于检测小电压变化的传感器
💻 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 + -