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

📄 adc11p.c

📁 TLC2543 12位AD转换程序
💻 C
字号:
//-------------------------------------------------------------------------*
//文件描述:本文件包含了AD采集的2子程序,分别为:                             * 
//(1)ADC11P:1片2543-11路AD采集                                            *
//(2)TLC2543:TLC2543芯片A/D转换子程序                                      *
//-------------------------------------------------------------------------*
#include "ADC11P.h"

//A/D转换并求平均值(11路)子程序(AD22P.ASM)---------------------------------*
//功  能:采集TLC2543,共11通道,取16次平均值放入内存ADValue               *
//参  数:cs:片选,cs=0~7对应PTC0~7                                        *
//        ADValue:存放11路AD转换结果的数组首地址                           *
//返  回:内存ADValue开始连续的11个地址内即为转换的结果                    *
//调  用:TLC2543                                                          *
//修  改:*ADValue是传址,一般在子程序中不直接修改参数,应另声明一个局部   *
//       变量地址,代其执行,最后将结果赋到参数地址带回 (ZY 2007.05.11)    *
//-------------------------------------------------------------------------*
void ADC11P(INT8U cs,INT16U *ADValue)
{   
	INT8U i,j,channel,flag,buff[2]; 
    INT16U temp,tmp[3]; 
    INT16U ADVal[11]; 
    
    //1 将A/D数据存放区清0   
    for(flag=0;flag<=10;flag++)      
    	ADVal[flag]=0; 
    	
    
    //3 对11个通道采集数据,每一路采集16次,16次的数据总和-->ADValue   
    for(j=1;j<=16;j++)   
    {  
      flag=0; 
      //3.1第0片TLC2543的0~10通道转换      
      for(channel=0;channel<=10;channel++)      
      {    
        //3.1.1将通道j的AD转换结果存入内存buff     
        for(i=0;i<3;i++)     //中值滤波
        {
           TLC2543(cs,channel,buff);   //得到"空数据"--不要
           TLC2543(cs,channel,buff);        
           //3.1.2从内存buff取出数据-->ADValue[flag]中         
           tmp[i]=*((unsigned int *)buff);
        }        
        temp=MidVal(tmp);
        ADVal[flag]=ADVal[flag]+temp;
        flag++;    
      }
    } 
       
    //4 求22路A/D数据的16次平均值   
    for(flag=0;flag<=10;flag++)     
       ADVal[flag]=ADVal[flag]/16;
    for(i=0;i<11;i++)
      ADValue[i] =ADVal[i];
}

//
INT16U MidVal(INT16U *x)
{
    INT8U i,j;
    INT16U tmp;
    //冒泡法
    for(i = 0; i < 3; i ++)
       for(j = i; j < 3; j ++)
         if( x[i] > x[j] )
         {
            tmp=x[i];
            x[i]=x[j];
            x[j]=tmp; 
         }
    
    return x[1];
}



//TLC2543芯片A/D转换子程序(TLC2543.c)--------------------------------------*
//TLC2543的接线:                                                           *
//             ① I/O LOCK(18)接MC08HC908GP32的SPSCK(18)                   *
//             ② DATA INPUT(17)接MC08HC908GP32的MOSI(17)                  *
//             ③ DATA OUT (16)接MC08HC908GP32的MISO(16)                   *
//             ④ 0-1片的片选CS(15)接分别接MC08HC908GP32的PTC0~1           *
//参  数:cs-片号,cs=0~7对应PTC0~7                                         *
//        channel-通道号0,1,2 ...10  buf-存放数据的首址                    *
//返  回:内存buf开始连续两个地址为取出的数(高4位、低8位)                *
//说  明:(070418)将CS_D=0xff;    CS_P=0xff                               *
//              改为CS_D|=1<<cs;   CS_P|= 1<<cs;以避免影响PTC其他口        *
//-------------------------------------------------------------------------*
void TLC2543(INT16U cs,INT16U channel,INT8U *buf)
{
  INT8U temp;
  
  //1 初始化片选信号为1
  CS_D |=1<<cs;    //定义PTC的第cs引脚为输出
  CS_P |=1<<cs;	   //C口的第cs引脚为高电平
  	
  //2 相应片TLC2543的选CS=0,产生高到低的变化    
  CS_P &= ~(1<<cs);      
  
  //3 写控制字到相应片TLC2543   
  SPDR = (channel<<4) | 0x0C;//入口通道、16位格式、MSB先送出、二进制
  
  //4 等待发送器空
  while ((SPSCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
  
  //5 等待接收器满
  while ((SPSCR & (1<<ReFullBit)) == 0);    //为0等待,也就是等待SPRF为1
  
  //6 取出上次转换结果高字节 
  *buf = SPDR; //*buf中存放的是D11~D4位   
  SPDR = *buf;	//上次转换结果低字节(后四位为0),握手信号
  
  //7 等待发送结束  
  while ((SPSCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
  
  //8 等待新数据到达
  while ((SPSCR & (1<<ReFullBit)) == 0);    //为0等待,也就是等待SPRF为1 
  
  //9 取出上次转换结果的低4位 
  *(buf+1) = SPDR;// *(buf+1)中存放D3~D0位(后四位为0)
  
  //10 TLC2543片选CS=1   
  CS_P |=1<<cs;
  	    
  //11 整合后*buf存放高四位(D11~D8),*(buf+1)中存放低八位(D7~D0) 
  *(buf+1) = (*(buf+1)>>4) | (*buf<<4);    
  *buf = *buf>>4;    
 }

⌨️ 快捷键说明

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