[讨论]8051F005 ADC/************************ ADC 通道切换函数 ***************************
* 名称: Switch_Gate
* 说明: 交叉数据采样
* 功能: 通道切换交叉启动 ADC
* 调用: 无
* 输入: 无
* 返回值: I_Scale , V_Scale ,A_Scale
*********************************************************************/
void Switch_Gate(void)
{
ES = 0;
Frequency = 0;
I_Scale = 0;
V_Scale = 0;
A_Scale = 0;
Chnnl = 'A';
for (;Frequency <= 149;)
{
switch (Chnnl)
{
case 'A':
AMX0SL = 0x00; // ADC 电流通道
ADC0CN = 0xbc; // 启动 ADC
ADC0CN = 0xb0; // 启动 ADC
EIE2 = 0x02; // 开 ADC 中断
break;
case 'B':
AMX0SL = 0x01; // ADC 电压通道
ADC0CN = 0xbc; // 启动 ADC
ADC0CN = 0xb0; // 启动 ADC
EIE2 = 0x02; // 开 ADC 中断
break;
case 'C':
AMX0SL = 0x02; // ADC 电源电压通道
ADC0CN = 0xbc; // 启动 ADC
ADC0CN = 0xb0; // 启动 ADC
EIE2 = 0x02; // 开 ADC 中断
break;
}
}
I_Scale /= 50.0;
V_Scale /= 50.0;
A_Scale /= 50.0;
ES = 1;
return;
}
/************************ ADC 中断函数 ******************************
* 名称: ADC_Serve
* 说明: 读取采样数据
* 功能: 保存采样数据
* 调用: 无
* 输入: 无
* 返回值: V_Scale 电压值积、 I_Scale 电流值积 V_power 电源电压值积
*********************************************************************/
void ADC_Serve(void) interrupt 15
{
EIE2 = 0x00; // 关 ADC 中断
switch (Chnnl)
{
case 'A':
I_Scale += ADC0;
Chnnl = 'B';
break;
case 'B':
V_Scale += ADC0;
Chnnl = 'C';
break;
case 'C':
A_Scale += ADC0;
Chnnl = 'A';
break;
}
Frequency ++;
return;
}