小涵子爸爸 发表于 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
是的,可以。

这样不能用于量产,最好在程序中读取,不然生产几十万件产品,你个个去改代码吗?
页: 1 2 3 [4] 5
查看完整版本: 利用ADC15通道在内部固定接的1.19V辅助固定信号源,反推其他通道的输入电压或VCC