历史上的今天
今天是:2025年01月08日(星期三)
2018年01月08日 | STC12C4052AD STC单片机ADC采样C程序
2018-01-08 来源:eefocus
#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]
}
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转换器
}
上一篇:AT93C46的汇编读写软件程序
史海拾趣
|
在柏林推出的DVB T(地面数字广播)数字电视也已经影响到汽车娱乐系统中的电视接收。现在,汽车电视接收机不仅能够接收模拟电视信号(它仍将在城市以外的地区继续存在数年),而且也能够接收和处理DVB T信号。Hirschmann Electronic ...… 查看全部问答> |
|
1 引 言 洗片机是各医院影像科的必需设备。医院影像科每天要冲洗大量的x-射线透射胶片,工作量大,且洗片操作有一定难度,对操作人员专业技术要求高,另外,洗片时化学药液对人体有伤害。因此,目前医院大多采用医用自动洗片机。进口的 ...… 查看全部问答> |
|
我使用 ARM 2440开发板, 使用WINCE 5.0 (中文)OS, 现在想实验软键盘 汉字输入 和手写 输入。 请前辈们 描述一下实现 思路。 … 查看全部问答> |
|
void InitSio(void) { u16 RELOAD_COUNT = 0; //使用独立波特率发生器作为波特率发生器 S2CON = 0x50;  ...… 查看全部问答> |




