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

📄 spi.#2

📁 ad转换的程序
💻 #2
字号:
/*================================================================================================

						AD7705 analogy serialport driver

==================================================================================================
		AD7705------W77E58		AD7705------W77E58		AD7705------W77E58
		AD_DOUT-------P0.7 		AD_DIN----------P0.4	AD_SCLK-------P2.2 	
[note] CYGANAL at 6MHz, AD7705BN at 2.576MHz
================================================================================================*/
#include <C8051F020.H>
//#include <reg51.h>
//#include <math.h>
//#include <intrins.h>

/*--------------------global define-------------------------------------------------------------*/
#define	 uchar unsigned char
#define  STORE_BUF_LEN  12                 	    /*size of storing buffer    					*/
uchar idata ucidStoreBuf[STORE_BUF_LEN];  		/*storage for storing ADC results				*/     
uchar idata *inlast=ucidStoreBuf;  				/*the positon of last ADC result				*/
long int transfer_ad;
extern unsigned int xdata canmodify_package[];
extern int cycle_times;
extern xdata int Parameter_transfer;
/*-------------------interface define-------------------------*/
sbit AD_SCLK 	= P0^6;							/*analogize TX in serial mode 0					*/
sbit AD_DIN 	= P0^4;							/*												*/
sbit AD_DOUT 	= P0^7;	
sbit CS         = P1^7;						/*												*/
sfr16 DAC0=0Xd2;
/*---------------function prototype define--------------------*/
extern void 	writeCmd (uchar);						/*write command code to AD7705's register		*/
extern uchar	readStatus (void);						/*read the communication register's status		*/
extern void 	readData (void);						/*read ADC result from AD7705					*/
extern uchar 	readByte (void);						/* read a byte from AD7705						*/
extern void delay(int a );
extern  init3();
void ad1 (void)				  
{  


		readData ();							/*read ADC result								*/
}

/* -----------------------------------------------------------------------------------------------
Function:		void writeCmd (uchar)
PURPOSE: 		write command code to AD7705's regester
PARAMETERS:
RETURN:
COMMENTS:
HISTORY:   
	Date:		2002-7-18  		2002-7-23
	Author:		xiaolan   		xiaolan
	Comment:	Wrote it		Revise it
------------------------------------------------------------------------------------------------*/
void writeCmd (uchar command)
{
	xdata uchar i;

	/* AD_CS = 0; */
	for (i = 0; i < 8; i ++)
	{
		AD_SCLK = 0;

		if (command & 0x80)
			AD_DIN = 1;
		else
			AD_DIN = 0;

		command <<= 1;
		AD_SCLK = 1;
	}
	/* AD_CS = 1; */
	AD_DIN = 1; 
	AD_SCLK = 1; 
}

/* -----------------------------------------------------------------------------------------------
Function:		uchar readStatus (void);
PURPOSE: 		read AD7705's regester status
PARAMETERS:
RETURN:
COMMENTS:
HISTORY:   
	Date:		2002-7-18  		2002-7-23
	Author:		xiaolan   		xiaolan
	Comment:	Wrote it		Revise it
------------------------------------------------------------------------------------------------*/
uchar readStatus (void)
{
 xdata	uchar ucStatus = 0x00;
   if(canmodify_package[6]==3)
	writeCmd (0x08);							/*write to communications register setting up 	*/
   if(canmodify_package[6]==1)
     writeCmd(0x09);												/*next operation to be a read from the communic-*/
												/*ations register 								*/
	ucStatus = readByte();
	return (ucStatus);
}

/* -----------------------------------------------------------------------------------------------
Function:		uchar	readData (void);
PURPOSE: 		read AD7705's regester status
PARAMETERS:
RETURN:
COMMENTS:
HISTORY:   
	Date:		2002-7-18  		2002-7-23
	Author:		xiaolan   		xiaolan
	Comment:	Wrote it		Revise it
------------------------------------------------------------------------------------------------*/
void readData (void)
{
 xdata	uchar ucStatus = 0x00, ucDataHigh = 0x00, ucDataLow = 0x00;
  static long  xdata jiyi[4];
 static unsigned dec=5;
 static long total=0L;
 long  xdata transfer1;
 long  xdata transfer2;
 long xdata   transfer3;
 long  xdata transfer;
//	{
//	ucStatus = readStatus();
//	}while (ucStatus & 0x80);
	ucStatus = readStatus();					/*wait for ADC result							*/
    if((ucStatus & 0x80)==0x00)
{
    if(canmodify_package[6]==3)
		  writeCmd(0x38);							/*write to communications register setting up 	*/
    if(canmodify_package[6]==1)
	      writeCmd(0x39);												/*next operation to be a read from the communic-*/											/*ations register 								*/

	ucDataHigh = readByte();					/*first get the high 8 bits						*/
	*inlast = ucDataHigh;            			/*store the ADC result							*/          
	inlast++;			            			/*add 1 to the position of the last ADC result	*/  
	if (inlast == ucidStoreBuf + STORE_BUF_LEN) 
		inlast = ucidStoreBuf;					/*reset the pointer of the last ADC result 		*/      

	ucDataLow = readByte();					/*then get the low 8 bits						*/
	*inlast = ucDataLow;            			/*store the ADC result							*/          
	inlast++;			            			/*add 1 to the position of the last ADC result	*/  
	if (inlast == ucidStoreBuf + STORE_BUF_LEN) 
		inlast = ucidStoreBuf;	
/*------------------------------------------------------------------------------------------------	
     AD                          dealing with the data	
----------------------------------------------------------------------------------------------------*/
        
		transfer=(ucDataHigh<<8)+ucDataLow;
        total+=transfer;
		dec--;
		if(dec==0)
		  {
		   jiyi[0]=jiyi[1];
	       jiyi[1]=jiyi[2];
	       jiyi[2]=jiyi[3];
	       //jiyi[3]=jiyi[4];
	       //jiyi[4]=jiyi[5];
	       //jiyi[5]=jiyi[6];
	       //jiyi[6]=jiyi[7];
	       //jiyi[7]=jiyi[8];
	       //jiyi[8]=jiyi[9]; 
           transfer1=((total/5));
	       if(transfer<0)transfer1=jiyi[2];
	       jiyi[3]=transfer1;
           transfer2=(jiyi[0]+jiyi[1]+jiyi[2]+jiyi[3])/4;
		   
		   Parameter_transfer=(int)transfer2;
		   //transfer2=(jiyi[0]+jiyi[1]+jiyi[2]+jiyi[3]+jiyi[4]+jiyi[5]+jiyi[6]+jiyi[7]+jiyi[8]+jiyi[9])/10;
		   if(canmodify_package[6]==1)
		      {
		          
				 
				// transfer_ad=(transfer2-canmodify_package[0])*(canmodify_package[3]*1000)/65536;
                 
			// if(transfer2>=(canmodify_package[0])+12752)
/*----------------------------------------It is temporary-------------------------------------------------------*/	                     
				//if(transfer2>=(canmodify_package[0]*52368/(canmodify_package[3]*1000))+12752)	
                if(transfer2>=((long)canmodify_package[0]*(canmodify_package[17]-canmodify_package[15])/(canmodify_package[3]*1000))+canmodify_package[15])
/*------------------------------------------------------------------------------------------------------------------*/
	                 {
                          cycle_times=1;
                          //transfer_ad=((transfer2-canmodify_package[0]-12752)*(canmodify_package[3]*1000))/52368;
/*----------------------------------------It is temporary-------------------------------------------------------*/	                     
						 //transfer_ad=(((transfer2-12752)*(canmodify_package[3]*1000))/52368)-canmodify_package[0];
                         //transfer3=transfer_ad*4095/(canmodify_package[3]*1000);                         
                         transfer_ad=(((transfer2-canmodify_package[15])*(canmodify_package[3]*1000))/(canmodify_package[17]-canmodify_package[15]))-canmodify_package[0];
                         transfer3=transfer_ad*4095/(canmodify_package[3]*1000);  
/*------------------------------------------------------------------------------------------------------------------*/
						  //transfer3=((transfer2-canmodify_package[0]-12752)*4095)/52368;

	              if (transfer3>=4095)
				          DAC0=4095;
	                 else
	               	      {DAC0=transfer3;}
	                }
	                 else 
	                     {
	                        cycle_times=-8;
	                        //transfer_ad=((canmodify_package[0]+12752-transfer1)*(canmodify_package[3]*1000))/52368;
/*----------------------------------------It is temporary-------------------------------------------------------*/	                     
					         //transfer_ad=((canmodify_package[0]*52368/(canmodify_package[3]*1000)+12752)-transfer2)*(canmodify_package[3]*1000)/52368;
                             transfer_ad=(((long)canmodify_package[0]*(canmodify_package[17]-canmodify_package[15])/(canmodify_package[3]*1000)+canmodify_package[15])-transfer2)*(canmodify_package[3]*1000)/(canmodify_package[17]-canmodify_package[15]);
/*------------------------------------------------------------------------------------------------------------------*/                
							DAC0=0;
	                     }				            
			   }

		 if(canmodify_package[6]==3)
		   {
		    // if(transfer2>=canmodify_package[0]+127)
/*----------------------------------------It is temporary-------------------------------------------------------*/	                     
			//if(transfer2>=canmodify_package[0]*65404/(canmodify_package[3]*1000)+127)
            if(transfer2>=(long)canmodify_package[0]*(canmodify_package[18]-canmodify_package[16])/(canmodify_package[3]*1000)+canmodify_package[16])
/*------------------------------------------------------------------------------------------------------------------*/                	               
	           {
	               cycle_times=1;
	              // transfer_ad=(transfer2-canmodify_package[0]-127)*(canmodify_package[3]*1000)/65404;
/*----------------------------------------It is temporary-------------------------------------------------------*/	                     
				 // transfer_ad=(transfer2-127)*(canmodify_package[3]*1000)/65404-canmodify_package[0];	    
                 // DAC0=transfer_ad*4095/(canmodify_package[3]*1000);
                  transfer_ad=(transfer2-canmodify_package[16])*(canmodify_package[3]*1000)/(canmodify_package[18]-canmodify_package[16])-canmodify_package[0];	    
                  DAC0=transfer_ad*4095/(canmodify_package[3]*1000);
/*------------------------------------------------------------------------------------------------------------------*/                	               
				   //DAC0=(transfer2-canmodify_package[0])*4095/65536;
	               if(transfer2>=65404)DAC0=4095;
	          }
	         else
	           {
	              cycle_times=-8;
	              //transfer_ad=(canmodify_package[0]+127-transfer2)*(canmodify_package[3]*1000)/65404;
/*----------------------------------------It is temporary-------------------------------------------------------*/	                     
			      //transfer_ad=((canmodify_package[0])*65404/(canmodify_package[3]*1000)+127-transfer2)*(canmodify_package[3]*1000)/65404;
                  transfer_ad=((long)canmodify_package[0]*(canmodify_package[18]-canmodify_package[16])/(canmodify_package[3]*1000)+canmodify_package[16]-transfer2)*(canmodify_package[3]*1000)/(canmodify_package[18]-canmodify_package[16]);
/*------------------------------------------------------------------------------------------------------------------*/                	               
				  DAC0=0;

	 }
		   }
                //transfer_ad=transfer2;
		        dec=5;
		        total=0; 
		  }

}						/*reset the pointer of the last ADC result 		*/      
}

/* -----------------------------------------------------------------------------------------------
Function:		uchar readByte (void)
PURPOSE: 		
PARAMETERS:
RETURN:
COMMENTS:
HISTORY:   
	Date:		2002-7-23  
	Author:		xiaolan   
	Comment:	Wrote it
------------------------------------------------------------------------------------------------*/
uchar readByte (void)
{
xdata	uchar i, ucReturn = 0x00;

	/* AD_CS = 0; */
	AD_DOUT = 1;
	AD_SCLK = 1;

	for (i = 0; i < 8; i ++)				
	{
		AD_SCLK = 0;
		ucReturn <<= 1;
		if (AD_DOUT)
			ucReturn |= 0x01;	
		AD_SCLK = 1;
	}

	/* AD_CS = 1; */
	AD_DOUT = 1; 
	AD_SCLK = 1; 

	return (ucReturn);
}

/* -----------------------------------------------------------------------------------------------
Function:		void delayMS (uchar)
PURPOSE: 		delay certain time
PARAMETERS:
RETURN:
COMMENTS:
HISTORY:   
	Date:		2002-7-1  
	Author:		xiaolan   
	Comment:	Wrote it
------------------------------------------------------------------------------------------------*/
void delayMS (uchar MS)
{
xdata	uchar us,usn;
	while (MS!=0)
	{WDTCN=0xa5;
		usn = 4;
		while (usn!=0)
		{WDTCN=0xa5;
		   	us = 0xf0;
			while (us!=0)
			{WDTCN=0xa5;
			    us--;
			}
			usn--;
		}
		MS--;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -