请教!ADC采样端口没有输入时仍然有电压值是什么原因?【结贴!程序有误!】

请教!ADC采样端口没有输入时仍然有电压值是什么原因?【结贴!程序有误!】

问题的出现:我的这个时钟试运行了4个多月了,ADC0采样的电池电压监测功能一直运行正常,

昨天修改了一处时钟的非ADC相关的驱动代码,

重新烧录程序后就出现了已经配置为高阻输入用于ADC0采样的P1.0端口始终输出高电平的状况(输出3V比正常端口高电平3.2V略低),

我百思不得其解,接下来怎么弄就不会了请高手指点!!

1.所用单片机为STC8H8K64U(20引脚)。

2.ADC0通道、P1.0引脚。

3.单片机供电电压VDD=3.3V。

4.P1.0端口配置为 P1M0 = 0x00; P1M1 = 0x01; //P1.0为ADC采样口配置为高阻输入

5.采样输入电路如图:

666.jpg (100.74 KB, 下载次数: 14)

下载附件

2025-4-1 11:14 上传

6.测量结果及故障现象:VCC在5V至3.2V时,无论mos开关导通状态还是关闭状态,模拟输入电压V_ADC0都是3V。

7.进一步检查发现拆除R03、R04后V_ADC0的输出电压为3V,并且这个V_ADC0输出电压可以点亮串联1k电阻的LED发光管。

8.ADC代码如下:

#define BGV (*(unsigned int volatile xdata *)0xfde7)//在xdata地址0xfde7中读取内部 1.19V 参考信号电压

//----------------------------------------------------------------------------------------------------------

void ADC_Init()

{

ADCCFG = 0x2f; //所有通道的转换结果数据为右侧对齐模式、SYSclk/2/16(转换速度最低)

ADCTIM = 0x3f; //设置通道选择时间、保持时间、采样时间

ADCEXCFG = 0x07;//转换16次并取平均值(STC8H4K、STC8H8K系列芯片支持扩展寄存器设置硬件自动取平均值功能)

NOP5();

}

//-----------------------------------------------------------------------------------------------------------

u16 ADC_Read(u8 n)

{

ADC_RES = 0;

ADC_RESL = 0;

ADC_CONTR = 0x80 | 0x40 | n;//ACD模块上电0x80、使能ADC转换0x40、给定ADC通道n

delay_ms(2);

while((ADC_CONTR & 0x20) == 0); //等待ADC转换标志ADC_FLAG=1

ADC_CONTR &= ~0x20; //清除标志ADC_FLAG

return (((u16)ADC_RES << 8) | ADC_RESL);

}

//-----ADC数据输出函数--------------------------------------------------------------------------------------

u16 ADC_out(u8 adc_x)

{

u16 adc_data0 = 0;

u32 adc_data1 = 0;

//读取15通道的ADC值

ADC_Read(15); //先读一次15通道并丢弃结果

adc_data0 = ADC_Read(15); //获得15通道16次平均值(硬件平均值运算)

//读取adc_x通道的ADC值

ADC_Read(adc_x); //先读一次目标通道并丢弃结果

adc_data1 = ADC_Read(adc_x); //获得硬件16次平均值

adc_data1 = BGV * adc_data1 / adc_data0; //对比ADC15通道采样值利用STC单片机内部基准电压值换算目标通道电压值(数据放大1000倍)

return (u16)adc_data1;

}复制代码