问题的出现:我的这个时钟试运行了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.采样输入电路如图:
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;
- }
复制代码
|