stc8g1k08采集电池电压,如下程序,当前电压为1.8V,但是ADC采集出来的值为36(见图片)
#define _ADC_C
#include "ADC.h"
#include "config.h"
#include "Uart.h"
#define ADC_RES_MAX 1024 // ADC采样最大值
#define V_REF (3.3) // 参考电压为3.3V
#define V_BAT_MAX (2.8) // 电池最大电压为2.8V
#define V_BAT_MIN (1.8) // 电池最小电压为1.8V
#define V_BAT_WARN (2.1) // 电池电量过低警告阈值为2.1V
unsigned int ADC_Value; // 定义全局变量,用于存储采样结果
void ADC_Init()
{
P_SW2 |= 0x80;
ADCTIM = 0x2A; //设置 ADC 内部时序
P_SW2 &= 0x7f;
ADCCFG = 0x20; //设置 ADC 时钟为系统时钟/2,右对齐
ADC_CONTR = 0x80; //使能 ADC 模块
}
void ADC_ISR() interrupt 5
{
ADC_Value = (unsigned int)(ADC_RES << 8) + (unsigned int)ADC_RESL;
ADC_CONTR &= ~0x20; //中断标志位清0
}
void Delay1ms(void)
{
unsigned char data i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void ADC_BATTERY()
{
// unsigned char battery_percent = 0; // 定义电量百分比变量
float adc_res,battery_percent;
float v_bat;
ADC_CONTR &= 0xf0; //底四位清零
ADC_CONTR |= 0x0C; //置通道12
ADC_CONTR |= 0x40; // 启动ADC转换
Delay1ms;
Delay1ms;
Delay1ms;
Delay1ms;
Delay1ms;
adc_res = (float)ADC_Value * V_REF / ADC_RES_MAX;// 计算ADC被转换通道的输入电压
v_bat = adc_res * V_BAT_MAX / V_REF;// 计算电池电压值
battery_percent = (v_bat - V_BAT_MIN) / (V_BAT_MAX - V_BAT_MIN) * 100.0;// 计算电池电量百分比
UartSend(adc_res * 10);