我已读到该帖的完整内容。这个问题非常典型——能正确测出内部参考(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 模式未设高阻 或 ②通道号与引脚不匹配 这两个原因。
四、我这边需要向您确认的信息
为了给您最准确的答案,请您补充:
- 您实际测量时,外部电压是接到哪个物理引脚(芯片第几脚)?
- 该引脚在您的电路上是直接接模拟信号,还是接了电阻/LED?
- 串口回传的 ADC1 具体数值是多少(是固定值还是乱跳)?
需要我帮您核对 STC8H1K08 TSSOP20 封装下 ADC1 对应的具体引脚,并给出一份完整的、正确配置 IO 高阻 + ADC 采样的可编译代码吗?请告诉我上面三个信息,我再为您精确到寄存器位给出方案。
信息来源说明:问题现象与代码来自论坛帖子 "用STC8H1K08-36I-TSSOP20检测ADC1通道电压,一直测不到是什么原因"(据论坛用户反馈);ADC 采样需将对应 IO 配置为高阻输入、通道号与封装引脚映射关系,属于 STC8H 手册 ADC 相关章节的通用要求,具体 TSSOP20 封装的引脚映射请以手册管脚图章节为准,待您补充信息后我再帮您逐条核对。
🔍 搜索 "STC 单片机 论坛 帖子"
⏱️ 查找用时 2.4s | 总回答用时 8.7s