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

📄 adconvt.c

📁 采用PICC18编写的单片机源代码
💻 C
字号:
#include "ADConvt.h"
/**********************AD初始化函数**********************
*入口: 无
*出口: 无
*占用资源: ADCON0、ADCON1
********************************************************/
void AD_initial(void)
{
   uint8 tmpADChn;   //循环控制
   ADCON0=0x81;   //转换时钟Fosc/32,选择通道0,暂不启动AD,打开AD
   ADCON1=0x83;   //转换时钟Fosc/32,右对齐,AN0,AN1,AN2,AN4为模拟其余为数字
   ADIF=0;    //清0AD转换标志
   ADIE=0;    //禁止AD中断
   Tr_AN0=1;     //AD通道设为输入
   Tr_AN1=1;
   Tr_AN2=1;
   Tr_AN3=1;
   ADChnRe.ADNum=0;    //AD转换数目清0
   for(tmpADChn=0;tmpADChn<ConADChnNum;tmpADChn++)
   {
      ADChnRe.ADBuf[tmpADChn]=0;     //AD缓冲区赋值
      ADChnRe.ADResult[tmpADChn]=0;     //AD转换结果赋值
      ADChnRe.ADMin[tmpADChn]=1023;   //最小值赋初始值
      ADChnRe.isStartADSap[tmpADChn]=FALSE;    //未开始采样
   }
}
/**********************AD转换函数************************
*入口: 待转换的通道号ADChn(0,1,2,3)
*出口: AD转换结果
*占用资源: ADRESH,ADRESL,ADIF
********************************************************/
uint16 ADConvt(uint8 ADChn)
{
   uint16 ADConvResult;    //AD转换结果
   uint16 ADWaitPluse;  //AD等待脉冲
   ADCON0=TableADCON0[ADChn];   //选择AD通道
   delay(1);
   GODONE=1;   //启动AD
   ADWaitPluse=0;
   while(GODONE==0)    //等待AD转换完成
   {
      ADWaitPluse++;
      if(ADWaitPluse>=ConADWaitPluse)
      {
         return 0;
      };
   }
   ADIF=0;   //清0AD转换标志
   ADConvResult=ADRESL+(ADRESH<<8);
   return(ADConvResult);
}
/************************采集各通道AD值*******************
*入口:无
*出口:无
*占用资源:结构体ADChnRe
*采集各通道的AD转换结果,采样点达到规定数目ConAdNum时,计算
*均值,存入ADChnRe.ADResult[]数组中
**********************************************************/
void MainAdConv(void)
{
   uint8 NowADChn;    //当前AD通道
   //采样各通道AD值
   for(NowADChn=0;NowADChn<ConADChnNum;NowADChn++)
   {
      ADChnRe.ADBuf[NowADChn]+=ADConvt(NowADChn);
   }
   ADChnRe.ADNum++;
   if(ADChnRe.ADNum==ConAdNum)
   {
      for(NowADChn=0;NowADChn<ConADChnNum;NowADChn++)
      {
         ADChnRe.ADResult[NowADChn]=ADChnRe.ADBuf[NowADChn]/ConAdNum;   //计算均值
         ADChnRe.ADBuf[NowADChn]=0;    //AD缓冲区清0
         if((ADChnRe.ADResult[NowADChn]< ADChnRe.ADMin[NowADChn])&(ADChnRe.isStartADSap[NowADChn]==TRUE))//若开始采样,并采到最小值
         {
            ADChnRe.ADMin[NowADChn]=ADChnRe.ADResult[NowADChn];    //AD采样最小值
         }
      }
   }
}

⌨️ 快捷键说明

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