小涵子爸爸
发表于 2025-3-15 08:43:20
用来反推锂电池电压,挺方便的
xxkj2010
发表于 2025-4-7 13:47:27
我读出来的怎么是00 00,芯片用STC8H8K64U-SOP16,究竟是哪里错了
//测试工作频率为11.0592MHz
#include "stc8h.h"
#include "intrins.h"
#define FOSC 11059200UL
#define BRT (65536-(FOSC / 115200+2) / 4)
//加2操作是为了让Keil编译器
//自动实现四舍五入运算
int *BGV; //内部参考信号源值存放在idata中
//idata的EFH地址存放高字节
//idata的F0H地址存放低字节
//电压单位为毫伏(mV)
bit busy;
void UartIsr() interrupt 4
{
if(TI)
{
TI = 0;
busy = 0;
}
if(RI)
{
RI = 0;
}
}
void UartInit()
{
SCON= 0x50;
TMOD= 0x00;
TL1= BRT;
TH1= BRT >> 8;
TR1= 1;
AUXR= 0x40;
busy= 0;
}
void UartSend(char dat)
{
while(busy);
busy= 1;
SBUF= dat;
}
void ADCInit()
{
ADCTIM= 0x3f; //设置ADC内部时序
ADCCFG= 0x2f; //设置ADC时钟为系统时钟/2/16
ADC_CONTR= 0x8f; //使能ADC模块,并选择第15通道
}
int ADCRead()
{
int res;
ADC_CONTR|= 0x40; //启动AD转换
_nop_();
_nop_();
while(!(ADC_CONTR & 0x20)); //查询ADC完成标志
ADC_CONTR&= ~0x20; //清完成标志
res= (ADC_RES << 8) | ADC_RESL; //读取ADC结果
return res;
}
void Delay2000ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
i = 113;
j = 53;
k = 228;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
int res;
int vcc;
int i;
P_SW2|= 0x80; //使能访问XFR
P0M0= 0x00;
P0M1= 0x00;
P1M0= 0x00;
P1M1= 0x00;
P2M0= 0x00;
P2M1= 0x00;
P3M0= 0x00;
P3M1= 0x00;
P4M0= 0x00;
P4M1= 0x00;
P5M0= 0x00;
P5M1= 0x00;
BGV= (int idata *)0xef;
ADCInit(); //ADC初始化
UartInit(); //串口初始化
ES= 1;
EA= 1;
// ADCRead();
// ADCRead(); //前两个数据建议丢弃
while(1)
{
res= 0;
for(i=0; i<8; i++)
{
res += ADCRead(); //读取8次数据
}
res>>= 3; //取平均值
vcc= (int)(4096L * *BGV / res); //(12位ADC算法)计算VREF管脚电压,即电池电压
// vcc= (int)(1024L * *BGV / res); //(10位ADC算法)计算VREF管脚电压,即电池电压
//注意,此电压的单位为毫伏(mV)
UartSend(vcc>> 8); //输出电压值到串口
UartSend(vcc);
Delay2000ms();
}
}
wyp567
发表于 2025-5-8 14:21:39
ADC_VREF+/ADC_AVCC/MCU_VCC 这3条可以直接连一起吗
wyp567
发表于 2025-5-8 14:22:43
ADC_VREF+/ADC_AVCC/MCU_VCC
神农鼎
发表于 2025-5-8 14:29:24
wyp567 发表于 2025-5-8 14:21
ADC_VREF+/ADC_AVCC/MCU_VCC 这3条可以直接连一起吗
可以
vb2002
发表于 2025-5-16 17:36:14
比如我的电压读出来是1193
那我直接用1193代替 BGV就行了吧
应该也是精准的
梁工
发表于 2025-5-17 13:46:04
vb2002 发表于 2025-5-16 17:36
比如我的电压读出来是1193
那我直接用1193代替 BGV就行了吧
应该也是精准的 ...
是的,可以。
垂柳工作室
发表于 2025-5-20 08:55:50
“STC8H系列的ADC最快速度:12位ADC为800K(每秒进行80万次ADC转换),10位ADC为500K(每秒进行50万次ADC转换)”
ADC位数越多越精确,转换消耗资源越多,那么12位ADC每秒80万次,10位ADC每秒50万次,神雕大佬,这个怎么理解?
神农鼎
发表于 2025-5-20 09:06:34
垂柳工作室 发表于 2025-5-20 08:55
“STC8H系列的ADC最快速度:12位ADC为800K(每秒进行80万次ADC转换),10位ADC为500K(每秒进行50万次ADC转 ...成本:
10位ADC, 成本低些,再牺牲下速度,换来成本更低;
12位ADC, 本来成本就高,再少许提升点成本,将速度也提升了下,成本而已
李硕
发表于 2025-6-25 16:09:29
梁工 发表于 2025-5-17 13:46
是的,可以。
这样不能用于量产,最好在程序中读取,不然生产几十万件产品,你个个去改代码吗?