#include "STC12C4052AD.h"
typedef struct
{
BOOL Run; //BOOL量作为定时采样标志,比如每隔3秒,置位一
次该标志
BYTE Curch; //当前通道
BYTE tempCvData[6]; //转换结果临时缓冲
BYTE CvTimes; //采样次数 采样4次,去最大最小,保留4个取平均值
BYTE ADData[MAX_ADCH]; //MAX_ADCH保存各通道最终采样数据
}STADC;
STADC ADC;
void InitADC()
{
Uint16 i;
ADC_CONTR = 0xC0; //ADC模块加电,420周期转换一次
for(i=0;i<20000;i++); //ADC电源开启后,延时
//设置P口外AD模式
P1M0 = 0x03; //ADC0/1 高阻输入
P1M1 = 0x00;
EADC_SPI = 1; //开放ADCSPI总中断
ADC_DATA = 0;
AUXR = EADCI; //开放ADC中断
MEMSet(&ADC,0,sizeof(STADC));
//启动0号通道
ADC.Curch = 0;
ADC_CONTR |= ADC.Curch; //设置下一通道
ADC.Run = TRUE; //标志ADC正在转换
ADC_CONTR |= ADC_START; //启动AD转换器
}
void ADCISR() interrupt ADC_VECTOR
{
ADC_CONTR &= ADC_STOP; //stop AD
ADC.Run = FALSE;
ADC.tempCvData[ADC.CvTimes] = ADC_DATA;//取转换值
ADC_DATA = 0;
ADC.CvTimes++;
ADC.CvTimes %= 6;
if(ADC.CvTimes!=0)
{
ADC_CONTR |= ADC_START; //启动AD转换器
ADC.Run = TRUE;
}
ADC_CONTR &= ADC_FLAG; //清除ADC_FLAG 中断标志
}
void Proc_ADC()
{
Uint16 CvSum = 0,i;
BYTE MaxCv=0,MinCv=0;
if(ADC.Run||ADC.CvTimes!=0) //AD还在进行,等待
return;
for(i=0;i<6;i++)
{
if(ADC.tempCvData[i]>MaxCv)
MaxCv = ADC.tempCvData[i];
if(ADC.tempCvData[i]<MinCv)
MinCv = ADC.tempCvData[i];
}
for(i=0;i<4;i++)
CvSum += ADC.tempCvData[i];
CvSum = CvSum-MaxCv-MinCv;
ADC.ADData[ADC.Curch] = (CvSum>>2);
ADC.Curch++;
ADC.Curch %= MAX_ADCH
ADC_CONTR &= 0xF8; //先清除当前通道值
ADC_CONTR |= ADC.Curch; //设置下一通道
ADC.Run = TRUE; //标志ADC正在转换
for(i=0;i<500;i++); //通道切换延时 100us左右
ADC_CONTR |= ADC_START; //启动AD转换器
}
本文关键字:单片机 程序 51单片机,单片机-工控设备 - 51单片机