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

📄 ad7705.c

📁 液晶显示屏12232的驱动程序.内包含了EEPROM及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 + -