找回密码
 立即注册
查看: 257|回复: 7

用STC8H1K08-36I-TSSOP20检测ADC1通道电压,一直测不到是什么原因

[复制链接]

12

主题

53

回帖

844

积分

高级会员

积分
844
发表于 2026-9-19 18:07:30 | 显示全部楼层 |阅读模式
9.png
这是串口送回的数据。
代码如下面,检测AD1的电压,例程参考了规格书的,然后与STC AI助手折腾了一天,总是测量不出来正确的电压,但按例程测VCC电压和内置基准1.19V却是正确的,不知是那里出了问题,有大师有空帮看下是那里错了吗? VP-234Y- main.c (5.21 KB, 下载次数: 60)
  1. /* ============================================================================
  2.    VP-234Y  AD 采集  main.c  
  3.    编译: Keil C51 (C89)
  4.    ----------------------------------------------------------------------------
  5.          硬件部份:
  6.    1. 芯片: STC8H1K08-36I-TSSOP20
  7.          2. AD通道为10位 ADC        
  8.    3.        8脚VCC供电为稳压约5V
  9.    4.        9脚 ADC_VRef+,接到8脚VCC(5V)
  10.    5. 11/12脚串口1: P3.0/P3.1, 115200,8,N,1, 文本显示         
  11.          6. 16脚P3.5 推挽 LED 每 1s 翻转         
  12.          ----------------------------------------------------------------------------
  13.           软件要求:
  14.    1. 串口1同时打印 ADC15(内部1.19V) 与 ADC1(P1.1),文本显示
  15.    ============================================================================ */
  16. #include "stc8h.h"
  17. #define     FOSC        11059200UL
  18. #define     BRT         (65536 - (FOSC / 115200 + 2) / 4)
  19. #define     T0_50MS     (65536 - FOSC / 12 / 20)
  20. bit         busy;
  21. bit         print_flag;
  22. unsigned char t0_count;
  23. unsigned char g_res, g_resl;      //保存最近一次 ADC 原始字节
  24. void UartIsr() interrupt 4
  25. {
  26.     if (TI) { TI = 0; busy = 0; }
  27.     if (RI) { RI = 0; }
  28. }
  29. void UartInit()
  30. {
  31.     SCON = 0x50;
  32.     TMOD = 0x00;
  33.     TL1 = BRT;
  34.     TH1 = BRT >> 8;
  35.     TR1 = 1;
  36.     AUXR = 0x40;
  37.     busy = 0;
  38. }
  39. void UartSend(char dat)
  40. {
  41.     while (busy);
  42.     busy = 1;
  43.     SBUF = dat;
  44. }
  45. void UartSendStr(char *p)
  46. {
  47.     while (*p) UartSend(*p++);
  48. }
  49. void UartSendInt(int n)
  50. {
  51.     char buf[6];
  52.     char i = 0;
  53.     unsigned int num;
  54.     if (n < 0)
  55.     {
  56.         UartSend('-');
  57.         num = (unsigned int)(-n);
  58.     }
  59.     else
  60.     {
  61.         num = (unsigned int)n;
  62.     }
  63.     if (num == 0)
  64.     {
  65.         UartSend('0');
  66.         return;
  67.     }
  68.     while (num > 0)
  69.     {
  70.         buf[i++] = (char)(num % 10) + '0';
  71.         num /= 10;
  72.     }
  73.     while (i > 0)
  74.     {
  75.         UartSend(buf[--i]);
  76.     }
  77. }
  78. void TM0_Isr() interrupt 1
  79. {
  80.     t0_count++;
  81.     if (t0_count >= 10)           //10 × 50ms = 500ms
  82.     {
  83.         t0_count = 0;
  84.         print_flag = 1;
  85.         P35 = !P35;               //每 500ms 翻转, 周期 1s
  86.     }
  87. }
  88. void Timer0Init()
  89. {
  90.     AUXR &= ~0x80;                //T0x12=0, 12T 模式
  91.     TMOD &= 0xf0;                 //只清 T0 设置, 不影响 T1
  92.     TL0 = T0_50MS;
  93.     TH0 = T0_50MS >> 8;
  94.     TF0 = 0;
  95.     TR0 = 1;
  96.     ET0 = 1;
  97. }
  98. void ADCInit()
  99. {
  100.     ADCTIM = 0x3f;                //ADC 内部时序
  101.     ADCCFG = 0x2f;                //RESFMT=1(右对齐), SPEED=1111: SYSclk/2/16
  102.     ADC_CONTR = 0x80;             //使能 ADC 模块
  103. }
  104. int ADCRead(unsigned char ch)
  105. {
  106.     int res;
  107.     ADC_CONTR &= 0xf0;                       //清通道位(保留ADC_POWER)
  108.     ADC_CONTR |= ch;                         //选通道
  109.     ADC_CONTR |= 0x40;                       //第1次: 预采样(丢弃, 让采样电容充电)
  110.     _nop_();
  111.     _nop_();
  112.     while (!(ADC_CONTR & 0x20));             //等待完成
  113.     ADC_CONTR &= ~0x20;                      //清完成标志
  114.     ADC_CONTR |= 0x40;                       //第2次: 正式采样
  115.     _nop_();
  116.     _nop_();
  117.     while (!(ADC_CONTR & 0x20));             //等待完成
  118.     ADC_CONTR &= ~0x20;                      //清完成标志
  119.     g_res  = ADC_RES;                        //保存原始字节
  120.     g_resl = ADC_RESL;
  121.     res = ((g_res << 8) | g_resl) & 0x03ff;  //右对齐: 取低10位
  122.     return res;
  123. }
  124. int BGV_Read()
  125. {
  126.     unsigned char hi, lo;
  127.     int val;
  128.     hi = *(unsigned char idata *)0xef;       //0xEF 高字节
  129.     lo = *(unsigned char idata *)0xf0;       //0xF0 低字节
  130.     val = ((int)hi << 8) | lo;
  131.     return val;
  132. }
  133. void main()
  134. {
  135.     int bgv, resbg, resx, vx, i;
  136.     P_SW2 |= 0x80;                //使能 XFR
  137.     P0M0 = 0x00; P0M1 = 0x00;
  138.     P1M0 = 0x00; P1M1 = 0x00;
  139.     P2M0 = 0x00; P2M1 = 0x00;
  140.     P3M0 = 0x00; P3M1 = 0x00;
  141.     P4M0 = 0x00; P4M1 = 0x00;
  142.     P5M0 = 0x00; P5M1 = 0x00;
  143.     P1M0 = 0x00;                  //P1.1 高阻输入(ADC)
  144.     P1M1 = 0x02;
  145.     P3M0 |= 0x20;                 //P3.5 推挽输出
  146.     P3M1 &= ~0x20;
  147.     bgv = BGV_Read();             //读取内部参考电压(mV)
  148.     ADCInit();
  149.     UartInit();
  150.     Timer0Init();
  151.     t0_count = 0;
  152.     print_flag = 0;
  153.     ES = 1;
  154.     EA = 1;
  155.     while (1)
  156.     {
  157.         if (print_flag)
  158.         {
  159.             print_flag = 0;
  160.             resbg = 0;
  161.             for (i=0; i<8; i++) resbg += ADCRead(0x0f);   //ADC15 内部1.19V
  162.             resbg >>= 3;
  163.             UartSendStr("BGV=");
  164.             UartSendInt(bgv);
  165.             UartSendStr(" resbg=");
  166.             UartSendInt(resbg);
  167.             UartSendStr(" RESbg=");
  168.             UartSendInt((int)g_res);
  169.             UartSendStr(" RESLbg=");
  170.             UartSendInt((int)g_resl);
  171.             UartSendStr("\r\n");
  172.             resx = 0;
  173.             for (i=0; i<8; i++) resx += ADCRead(0x01);    //ADC1 P1.1
  174.             resx >>= 3;
  175.             UartSendStr("resx=");
  176.             UartSendInt(resx);
  177.             UartSendStr(" RESx=");
  178.             UartSendInt((int)g_res);
  179.             UartSendStr(" RESLx=");
  180.             UartSendInt((int)g_resl);
  181.             UartSendStr("\r\n");
  182.             if (resbg == 0) resbg = 1;
  183.             vx = (int)((long)bgv * resx / resbg);   //Vx(mV)=BGV/resbg*resx
  184.             UartSendStr("VX=");
  185.             UartSendInt(vx);
  186.             UartSendStr("mV\r\n");
  187.         }
  188.     }
  189. }
复制代码



回复

使用道具 举报 送花

已绑定手机

11

主题

484

回帖

1362

积分

金牌会员

积分
1362
发表于 2026-9-19 19:58:42 | 显示全部楼层
测量VCC电压和读取ADC电压LCD1602显示

  1. #include "STC8H.H"
  2. #include "intrins.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define ulong unsigned long
  6. #define LCD1602_DB P4
  7. sbit  LCD1602_RS=P1^0;
  8. sbit  LCD1602_RW=P1^1;
  9. sbit  LCD1602_EN=P1^2;
  10. uchar data dis_buf[]="VCC=0.000VVIN=0.000V";
  11. int *BGV;//内部1.19V参考信号源值
  12. uint res;//读取内部第15通道ADC结果
  13. uint VCC;//电源电压
  14. uint VCA;//缓冲
  15. uint Vin;//被测电压
  16. uint VADC;//ADC转换结果
  17. uint count;//计数
  18. bit flag;//T0中断标志
  19. void Delay_ms(unsigned int t)        //@11.0592MHz
  20. {
  21.         unsigned char data i, j;
  22.         while (t--)
  23.         {
  24.                 i = 15;
  25.                 j = 90;
  26.                 do
  27.                 {
  28.                         while (--j);
  29.                 } while (--i);
  30.         }
  31. }
  32. //初始化ADC
  33. void ADC_Init(void)
  34. {
  35.         P_SW2 |= 0x80;
  36.         ADCTIM = 0x3f;         //设置ADC内部时序
  37.         P_SW2 &= 0x7f;
  38.         ADCCFG = 0x2f;         //12位结果右对齐,设置ADC时钟为系统时钟/2/16,
  39.         ADC_CONTR = 0x80;      //使能ADC模块
  40. }
  41. //读取ADC结果
  42. uint ADC_Read(uchar ch)
  43. {
  44.         ADC_CONTR = ch;                          //启动AD转换
  45.         _nop_();
  46.         _nop_();
  47.         while (!(ADC_CONTR & 0x20));                //查询ADC完成标志
  48.         ADC_CONTR &= ~0x20;                         //清完成标志
  49.         return ADC_RES << 8 | ADC_RESL;         //返回12位ADC结果
  50. }
  51. void Timer0_Init(void)                //10毫秒@11.0592MHz
  52. {
  53.         AUXR &= 0x7F;                        //定时器时钟12T模式
  54.         TMOD &= 0xF0;                        //设置定时器模式
  55.         TL0 = 0x00;                                //设置定时初始值
  56.         TH0 = 0xDC;                                //设置定时初始值
  57.         TF0 = 0;                                //清除TF0标志
  58.         TR0 = 1;                                //定时器0开始计时
  59.         ET0 = 1;                                //使能定时器0中断
  60.         EA  = 1;                          //使能总中断
  61. }
  62. void Read_Busy()           //忙检测函数,判断bit7是 0执行 1禁止
  63. {
  64.         unsigned char sta;      //
  65.         LCD1602_DB = 0xff;
  66.         LCD1602_RS = 0;
  67.         LCD1602_RW = 1;
  68.         do
  69.         {
  70.                 LCD1602_EN = 1;
  71.                 sta = LCD1602_DB;
  72.                 LCD1602_EN = 0;    //使能
  73.         }while(sta & 0x80);
  74. }
  75. void Lcd1602_Write_Cmd(unsigned char cmd)     //写命令
  76. {
  77.         Read_Busy();//忙检测函数,判断bit7是 0执行 1禁止
  78.         LCD1602_RS = 0;//RS数据命令选择RS=1数据 RS=0命令
  79.         LCD1602_RW = 0;//读写选择 RW=1读取 RW=0写
  80.         LCD1602_EN = 1;//使能预备
  81.         LCD1602_DB = cmd;//送命令
  82.         NOP20();
  83.         LCD1602_EN = 0; //下降沿使能
  84. }
  85. void Lcd1602_Write_Data(unsigned char dat)   //写数据
  86. {
  87.         Read_Busy();//忙检测函数,判断bit7是 0执行 1禁止
  88.         LCD1602_RS = 1;//RS数据命令选择RS=1数据 RS=0命令
  89.         LCD1602_RW = 0;//读写选择 RW=1读取 RW=0写
  90.         LCD1602_EN = 1;//使能预备
  91.         LCD1602_DB = dat;//送数据
  92.         NOP20();
  93.         LCD1602_EN = 0; //下降沿使能
  94. }
  95. void InitLcd1602()              //1602初始化 共5组初始化寄存器
  96. {
  97.         LCD1602_RS = 0;
  98.         LCD1602_RW = 0;
  99.         LCD1602_EN = 0;
  100.         Lcd1602_Write_Cmd(0x38);    //打开,5*8,8位数据   00111000
  101.         Lcd1602_Write_Cmd(0x0c);    //00001100后三位表示 开显示 不显光标 光标不闪烁
  102.         Lcd1602_Write_Cmd(0x06);    //00000110   //写一个字符后地址指针加一
  103.         Lcd1602_Write_Cmd(0x01);    //清屏   
  104. }
  105. void main()
  106. {
  107.         uchar i;
  108.         P0M0 = 0x00;
  109.         P0M1 = 0x00;
  110.         P1M0 = 0x00;
  111.         P1M1 = 0x80;       //设置P1.7为高阻 ADC口
  112.         P2M0 = 0x00;
  113.         P2M1 = 0x00;
  114.         P3M0 = 0x00;
  115.         P3M1 = 0x00;
  116.         P4M0 = 0x00;
  117.         P4M1 = 0x00;
  118.         P5M0 = 0x00;
  119.         P5M1 = 0x00;
  120.         Delay_ms(100);//等待系统稳定
  121.         BGV = (int idata *)0xef;//内部1.19V参考信号源值
  122.         ADC_Init();//初始化ADC
  123.         Timer0_Init();//初始化定时器
  124.         InitLcd1602();//初始化1602
  125.         while (1)
  126.         {
  127.                 if(flag)
  128.                 {
  129.                         flag=0;
  130.                         ADC_Read(0xcf);//丢掉两次检测
  131.                         ADC_Read(0xcf);
  132.                         res=ADC_Read(0xcf);   //读取第15通道ADC结果
  133.                         VCC = (int)(4096L * *BGV / res);//计算电源电压
  134.                         ADC_Read(0xc7);//丢掉两次检测
  135.                         ADC_Read(0xc7);
  136.                         VADC=ADC_Read(0xc7);   //读取第7通道ADC结果
  137.                         Vin=VCC*(ulong)VADC/4096;//计算输入电压
  138.                         dis_buf[4]=VCC/1000%10+'0';//千位
  139.                         dis_buf[6]=VCC/100%10+'0';//百位
  140.                         dis_buf[7]=VCC/10%10+'0';//十位
  141.                         dis_buf[8]=VCC%10+'0';//个位
  142.                         dis_buf[14]=Vin/1000%10+'0';//千位
  143.                         dis_buf[16]=Vin/100%10+'0';//百位
  144.                         dis_buf[17]=Vin/10%10+'0';//十位
  145.                         dis_buf[18]=Vin%10+'0';//个位
  146.                         Lcd1602_Write_Cmd(0x80);//第一行
  147.                         for(i=0;i<10;i++)
  148.                                 Lcd1602_Write_Data(dis_buf[i]);
  149.                         Lcd1602_Write_Cmd(0x80+0x40);//第二行
  150.                         for(i=0;i<10;i++)
  151.                                 Lcd1602_Write_Data(dis_buf[i+10]);
  152.                         while (1);
  153.                 }
  154.         }
  155. }
  156. //
  157. void Timer0_Isr(void) interrupt 1
  158. {
  159.         flag=1;
  160. }
复制代码


回复

使用道具 举报 送花

已绑定手机

11

主题

484

回帖

1362

积分

金牌会员

积分
1362
发表于 2026-9-19 20:17:53 | 显示全部楼层
测量VCC电压和ADC电压数码管显示并通过串口上传。
  1. #include "STC8H.H"
  2. #include "intrins.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define ulong unsigned long
  6. uchar code table[]={
  7.         0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  8.         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  9. uchar data dis_buf[8];
  10. int *BGV;//内部1.19V参考信号源值
  11. uint res;//读取内部第15通道ADC结果
  12. uint VCC;//电源电压
  13. uint VCA;//缓冲
  14. uint Vin;//被测电压
  15. uint VADC;//ADC转换结果
  16. uint count;//计数
  17. bit flag;//T0中断标志
  18. bit busy;//串口发送标志
  19. void Uart1_Init(void)        //115200bps@11.0592MHz
  20. {
  21.         SCON = 0x50;                //8位数据,可变波特率
  22.         AUXR |= 0x40;                //定时器时钟1T模式
  23.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  24.         TMOD &= 0x0F;                //设置定时器模式
  25.         TL1 = 0xE8;                        //设置定时初始值
  26.         TH1 = 0xFF;                        //设置定时初始值
  27.         ET1 = 0;                        //禁止定时器中断
  28.         TR1 = 1;                        //定时器1开始计时
  29.         ES = 1;                                //使能串口1中断
  30. }
  31. void UartSend(char dat)
  32. {
  33.     while (busy);//等待中断复位
  34.     busy = 1;
  35.     SBUF = dat;
  36. }
  37. //初始化ADC
  38. void ADC_Init(void)
  39. {
  40.         P_SW2 |= 0x80;
  41.         ADCTIM = 0x3f;         //设置ADC内部时序
  42.         P_SW2 &= 0x7f;
  43.         ADCCFG = 0x2f;         //设置ADC时钟为系统时钟/2/16,12位结果右对齐
  44.         ADC_CONTR = 0x80;      //使能ADC模块
  45. }
  46. //读取ADC结果
  47. uint ADC_Read(uchar ch)
  48. {
  49.         ADC_CONTR = ch;                          //启动AD转换
  50.         _nop_();
  51.         _nop_();
  52.         while (!(ADC_CONTR & 0x20));                //查询ADC完成标志
  53.         ADC_CONTR &= ~0x20;                         //清完成标志
  54.         return ADC_RES << 8 | ADC_RESL;         //返回12位ADC结果
  55. }
  56. void Timer0_Init(void)                //2毫秒@11.0592MHz
  57. {
  58.         AUXR |= 0x80;                        //定时器时钟1T模式
  59.         TMOD &= 0xf0;                        //设置定时器模式
  60.         TL0 = 0x9A;                                //设置定时初始值
  61.         TH0 = 0xA9;                                //设置定时初始值
  62.         TF0 = 0;                                //清除TF0标志
  63.         TR0 = 1;                                //定时器0开始计时
  64.         ET0 = 1;                                //使能定时器0中断
  65.         EA  = 1;                          //使能总中断
  66. }
  67. void main()
  68. {
  69.         uchar i;
  70.         P0M0 = 0xff;       //设置P0为推挽口
  71.         P0M1 = 0x00;
  72.         P1M0 = 0x00;       //设置P1.0为ADC口
  73.         P1M1 = 0x80;
  74.         P2M0 = 0x00;
  75.         P2M1 = 0x00;
  76.         P3M0 = 0x00;
  77.         P3M1 = 0x00;
  78.         P4M0 = 0x00;
  79.         P4M1 = 0x00;
  80.         P5M0 = 0x00;
  81.         P5M1 = 0x00;
  82.         BGV = (int idata *)0xef;//内部1.19V参考信号源值
  83.         ADC_Init();
  84.         Uart1_Init();
  85.         Timer0_Init();
  86.         while (1)
  87.         {
  88.                 if(flag)
  89.                 {
  90.                         flag=0;
  91.                         ADC_Read(0xcf);//丢掉两次检测
  92.                         ADC_Read(0xcf);
  93.                         res=ADC_Read(0xcf);   //读取第15通道ADC结果
  94.                         VCC = (int)(4096L * *BGV / res);//计算电源电压
  95.                         VCA=VCC;
  96.                         for(i=0;i<4;i++)//数据分解存入缓存地址前4
  97.                         {
  98.                                 dis_buf[3-i]=VCA%10;
  99.                                 VCA/=10;
  100.                         }
  101.                         ADC_Read(0xc7);//丢掉两次检测
  102.                         ADC_Read(0xc7);
  103.                         VADC=ADC_Read(0xc7);   //读取第7通道ADC结果
  104.                         Vin=VCC*(ulong)VADC/4096;//计算输入电压
  105.                         for(i=0;i<4;i++)//数据分解存入缓存地址后4
  106.                         {
  107.                                 dis_buf[7-i]=Vin%10;
  108.                                 Vin/=10;
  109.                         }
  110.                         for(i=0;i<8;i++)//串口发送数据
  111.                         {
  112.                                 UartSend(dis_buf[i]+'0');
  113.                         }                       
  114.                 }
  115.         }
  116. }
  117. //
  118. void Timer0_Isr(void) interrupt 1
  119. {
  120.         static uchar i;
  121.         P0=0x00;
  122.         P2=~(0x01<<i);
  123.         P0=table[dis_buf[i]];
  124.         i=++i%8;
  125.         if(++count>=500)
  126.         {
  127.                 count=0;
  128.                 flag=1;
  129.         }
  130. }
  131. void Uart1_Isr(void) interrupt 4
  132. {
  133.         if (TI)                                //检测串口1发送中断
  134.         {
  135.                 TI = 0;                        //清除串口1发送中断请求位
  136.                 busy = 0;
  137.         }
  138.         if (RI)                                //检测串口1接收中断
  139.         {
  140.                 RI = 0;                        //清除串口1接收中断请求位
  141.         }
  142. }
复制代码
回复

使用道具 举报 送花

12

主题

53

回帖

844

积分

高级会员

积分
844
 楼主| 发表于 2026-9-20 07:32:16 | 显示全部楼层
wul*** 发表于 2026-9-19 20:17
测量VCC电压和ADC电压数码管显示并通过串口上传。

多谢!我改来试试
回复

使用道具 举报 送花

已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25432
发表于 2026-9-20 08:58:14 | 显示全部楼层
截图202609200858098740.jpg
回复

使用道具 举报 送花

已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25432
发表于 2026-9-20 08:58:34 | 显示全部楼层

我已读到该帖的完整内容。这个问题非常典型——能正确测出内部参考(ADC15)和 VCC,但测不出 ADC1 外部通道。我从手册的角度为您系统梳理原因和解法。


一、问题现象分析

楼主用 STC8H1K08-36I-TSSOP20,代码中:

  • ADC 内部时序配置正确(ADCTIM = 0x3f)
  • ADCCFG = 0x2f:ADC 时钟 = 系统时钟/2/16,12 位结果右对齐
  • ADC_CONTR = 0x80 使能 ADC
  • 读取函数用 ADC_RES << 8 | ADC_RESL 取 12 位结果
  • 注释里写明 "AD通道为10位 ADC"

内部 1.19V(第 15 通道)和 VCC 测量正常,说明 ADC 模块本身、时钟、参考电压、时序都没问题。问题只出在外部通道 ADC1(P1.1) 上。


二、最可能的三个原因(按概率排序)

① 【最关键】ADC 通道号与 IO 口必须对应,且该 P1.1 必须被配置成高阻输入

代码里 ADC_Read(ch) 传入的 ch 只是通道号,并没有设置 P1.1 为高阻输入模式。ADC 采样外部通道时,对应的 IO 口必须工作在高阻输入模式,否则模拟电压会被 IO 口的数字输出/上拉结构"顶住",采样到的值就固定不对。

请在 ADC 初始化里加上(P1.1 对应通道 1):

P1M1 |= 0x02;    // P1.1 高阻输入
P1M0 &= ~0x02;

若您的板子上 P1.1 还接了 LED、上拉电阻或其它电路,也会影响采样,请确认该脚是"干净"的模拟输入。

② 【极易踩坑】TSSOP20 封装的 ADC1 通道未必在 P1.1!

STC8H1K08 的 TSSOP20 封装管脚复用和 LQFP/QFN 封装不同,同一通道号映射到的物理引脚可能不一样。楼主注释里写"11/12 脚串口1 P3.0/P3.1、16 脚 P3.5",说明引脚分配比较特殊。

请务必对照 STC8H 手册中"STC8H1K08 系列选型/管脚图"章节,确认 TSSOP20 封装下 ADC1 究竟对应哪个物理引脚。如果实际引脚是 P1.1 之外的脚,就会出现"测不到"的现象。

③ 参考电压 VRef 与输入范围

楼主注释写"9 脚 ADC_VRef+ 接到 VCC(5V)"。请确认:

  • ADC_VRef+ 引脚确实接到了稳定电压(如 5V),且与输入信号共地;
  • 被测量的外部电压在 0 ~ VRef 范围内。

三、建议楼主先做的一个快速验证

把 ADC_Read(1) 的通道号改成先扫一遍 P1 各通道对应的编码,或者直接用一个已知电压(如把 P1.1 用电阻分压到一个确定值)测,看数值是否随输入变化。

如果数值始终不动(例如固定 0 或满量程),基本可锁定是 ①IO 模式未设高阻 或 ②通道号与引脚不匹配 这两个原因。


四、我这边需要向您确认的信息

为了给您最准确的答案,请您补充:

  1. 您实际测量时,外部电压是接到哪个物理引脚(芯片第几脚)?
  2. 该引脚在您的电路上是直接接模拟信号,还是接了电阻/LED?
  3. 串口回传的 ADC1 具体数值是多少(是固定值还是乱跳)?

需要我帮您核对 STC8H1K08 TSSOP20 封装下 ADC1 对应的具体引脚,并给出一份完整的、正确配置 IO 高阻 + ADC 采样的可编译代码吗?请告诉我上面三个信息,我再为您精确到寄存器位给出方案。


信息来源说明:问题现象与代码来自论坛帖子 "用STC8H1K08-36I-TSSOP20检测ADC1通道电压,一直测不到是什么原因"(据论坛用户反馈);ADC 采样需将对应 IO 配置为高阻输入、通道号与封装引脚映射关系,属于 STC8H 手册 ADC 相关章节的通用要求,具体 TSSOP20 封装的引脚映射请以手册管脚图章节为准,待您补充信息后我再帮您逐条核对。


🔍 搜索 "STC 单片机 论坛 帖子"

⏱️ 查找用时 2.4s | 总回答用时 8.7s

回复

使用道具 举报 送花

12

主题

53

回帖

844

积分

高级会员

积分
844
 楼主| 发表于 2026-9-20 10:25:30 | 显示全部楼层
跟大家报告一下,代码没问题的,换过另外一块板子后,可以正确测量,应该是之前的板子线路有问题。
回复

使用道具 举报 送花

已绑定手机

2

主题

154

回帖

470

积分

中级会员

积分
470
发表于 2026-9-20 10:29:07 来自手机 | 显示全部楼层
电压稳定400mv左右,感觉是端口下拉为L了,检查外围电路有没有短路或其他拉低的情况。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-8 02:49 , Processed in 0.077357 second(s), 80 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表