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

📄 ad5513.c

📁 AD5513双通道采样程序
💻 C
字号:

#include "includes.h"
INT32S	idata AD_Data0[8];
INT32S	idata AD_Data1[8];
INT8U   AD0,AD1;
extern bit SendFlag0;
extern bit SendFlag1;
extern bit ErrFlag;
/*============================================================
*
* 函 数 名:Ad_Init
*
* 参  数:
*
* 功能描述:AD程序初始化        
*
*
* 返 回 值:
*
* 抛出异常:
*
============================================================*/
void Ad_Init(void)
{
     LED0 = 0;
     LED1 = 0;
     ADCS0  =1;
     ADCS1  =1;
	 ADSCLK0=0;
	 ADSCLK1=0;
	 ADSDO0 = 1;
	 ADSDO1 = 1;
}
/*============================================================
*
* 函 数 名:ADRcvData0
*
* 参  数:
*
* 功能描述:通道0采样        
*
*
* 返 回 值:
*
* 抛出异常:
*
============================================================*/
INT32U	ADRcvData0 (void)
{
    INT8U   i,j;
	INT8U  err;
	INT32U	rcvdata;							/* save AD conversion 20bit							*/
	INT32U	rcv_temp;
	rcvdata		= 0;							/* initialization RcvData 0						*/
	ADCS0		= 0;							/* select AD*/
    err	= 0;
	while(ADSDO0)
	{	
		if(ErrFlag){
		     ErrFlag = 0;
		     err++;
	         if(err>40){
			     LED0	= 1;						//Led灯灭,说明第一通道坏死
			     break;
		     }
		 }
	}
  if(!LED0)
  {
	if(!ADSDO0)
	{
		for(i=0;i<24;i++)  			/*要传送的数据长度为20位					*/
    	{
			for(j=0;j<10;j++);
	 		ADSCLK0		= 1;
	 		rcvdata	<<=1;
     		if(ADSDO0)									/*判断发送位								*/
	 			rcvdata+=1;
     		ADSCLK0		= 0;              	 			/*置时钟线为高,通知被控器开始接收数据位	*/
		}
		ADCS0		= 1;
		rcv_temp	= rcvdata&0xF00000;
		if(rcv_temp==0)
			return (rcvdata&0xFFFFF);
		else if(rcv_temp==0x400000)
			return (0x7FFFF);
		else
			return (0x100000);
	}
	else
	{
		return (0x100000);
	}

  }
}
/*============================================================
*
* 函 数 名:ADFilter0
*
* 参  数:
*
* 功能描述:通道0数据处理        
*
*
* 返 回 值:
*
* 抛出异常:
*
============================================================*/
void ADFilter0(void)
{
      INT8S i;
      INT32U ad_temp;
	  INT32S tmp;
	  INT32S sum;
      if(!LED0){
		   ad_temp = ADRcvData0();				//第一通道第一次转化
		   if(ad_temp<0x100000){
			   if(ad_temp>0x7FFFF)
				   tmp = 0xFFF00000|ad_temp;
			   else
				   tmp = ad_temp;
		       AD_Data0[AD0++] = tmp;
		       if ( AD0 > 7) 
	                  AD0 = 0;
		       sum=0;
		       for(i=0; i<8; i++)
        	       sum += AD_Data0[i];
 		       sum >>= 3;
		       if(sum<0)
			       sum &= 0x000FFFFF;
               if(SendFlag0){
                   SendFlag0 = 0;
		           send0(sum);
               }
	       }
	  }
}
/*============================================================
*
* 函 数 名:ADRcvData1
*
* 参  数:
*
* 功能描述:通道1采样        
*
*
* 返 回 值:
*
* 抛出异常:
*
============================================================*/

INT32U	ADRcvData1 (void)
{
	INT8U   i,j;
	INT8U   err;
	INT32U	rcvdata;							/* save AD conversion 20bit							*/
	INT32U	rcv_temp;
	rcvdata		= 0;							/* initialization RcvData 0						*/
	ADCS1		= 0;							/* select AD*/
    err	= 0;
	while(ADSDO1)
	{	
	     if(ErrFlag){
		     ErrFlag = 0;
		     err++;
	         if(err>40){
			     LED1	= 1;						//Led灯灭,说明第二通道坏死
			     break;
		     }
		 }
	}
    if(!LED1)
   {
	   if(!ADSDO1)
	   {
		   for(i=0;i<24;i++)  			/*要传送的数据长度为20位					*/
    	   {
		       for(j=0;j<10;j++);
	 		   ADSCLK1		= 1;
	 		   rcvdata	<<=1;
     		   if(ADSDO1)									/*判断发送位								*/
	 			   rcvdata+=1;
     		   ADSCLK1		= 0;              	 			/*置时钟线为高,通知被控器开始接收数据位	*/
		   }
		   ADCS1		= 1;
		   rcv_temp	= rcvdata&0xF00000;
		   if(rcv_temp==0)
			     return (rcvdata&0xFFFFF);
		   else if(rcv_temp==0x400000)
			     return (0x7FFFF);
		   else
			     return (0x100000);
	   }
	   else
	   {
		   return(0x100000);
	   }
     }
}
/*============================================================
*
* 函 数 名:ADFilter1
*
* 参  数:
*
* 功能描述:通道1数据处理        
*
*
* 返 回 值:
*
* 抛出异常:
*
============================================================*/
void ADFilter1(void)
{
      INT8S i;
      INT32U ad_temp;
	  INT32S tmp;
	  INT32S sum;
      if(!LED1){
		   ad_temp = ADRcvData1();				//第一通道第一次转化
		   if(ad_temp<0x100000){
			   if(ad_temp>0x7FFFF)
				   tmp = 0xFFF00000|ad_temp;
			   else
				   tmp = ad_temp;
		       AD_Data1[AD1++] = tmp;
		       if ( AD1 > 7) 
	                  AD1 = 0;
		       sum=0;
		       for(i=0; i<8; i++)
        	       sum += AD_Data1[i];
 		       sum >>= 3;
		       if(sum<0)
			       sum &= 0x000FFFFF;
			    if(SendFlag1){
                   SendFlag1 = 0;
		           send1(sum);
               }
	       }
	  }
}

⌨️ 快捷键说明

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