目录
[1. 概述](#1. 概述)
[2. ADC 介绍](#2. ADC 介绍)
[2.1 ADC 简介](#2.1 ADC 简介)
[2.2 ADC 转换原理](#2.2 ADC 转换原理)
[2.2.1 逐次逼近型 ADC](#2.2.1 逐次逼近型 ADC)
[2.2.2 双积分型 ADC](#2.2.2 双积分型 ADC)
[2.3 XPT2046 芯片](#2.3 XPT2046 芯片)
[2.3.1 介绍](#2.3.1 介绍)
[2.3.2 芯片管脚说明](#2.3.2 芯片管脚说明)
[2.3.3 功能选择遥控器](#2.3.3 功能选择遥控器)
[2.3.4 工作时序](#2.3.4 工作时序)
1. 概述
在前面,学习的都是对数字信号的操作,即对 0 和 1 的操作,现在学习如何检测外部模拟信号
51单片机内部不含 ADC 接口,开发板上集成了一个 ADC 模数转换电路
选用的 ADC 芯片是12位的 ADC 芯片-XPT2046
【理解:
① 数字信号、模拟信号
模拟信号:就是现实中 "慢慢变、无间断" 的信号,比如:
✅ 拧水龙头,水流从细到粗(连续变);
✅ 调空调温度,从 20℃到 26℃(连续升);
✅ 手机音量从 0 到 100%,背后的电压也是一点点涨(连续变);
这些信号的特点是 "没有台阶,平滑变化",像一条弯曲的线
数字信号:就是 "有台阶、跳着变" 的数字,比如 0、1、2、3... 或者 0001、0010(二进制),是单片机 / 电脑能直接看懂的 "语言",像楼梯一样,一步一个台阶。
② 51 单片机就像个只认数字的小机器人------ 它只能看懂 0、1、2、3 这种 "数字信号",比如收到 "2047" 就知道是某个值,但现实中很多东西是 "慢慢变" 的:
你拧音量旋钮(电位器),电压是一点点升 / 降的;
温度从 20℃升到 25℃,传感器的电压也是慢慢变的;这些 "慢慢变" 的信号叫 "模拟信号",这个小机器人完全看不懂。
② XPT2046 就是专门给它配的 "翻译官":
这个翻译官的核心活:把旋钮、温度传感器那些 "慢慢变的电压",精准翻译成数字(比如 1.65V 的电压,翻译成 2047);
说它是 12 位的:就是这个翻译官 "翻译得很细"------ 比如测 0~3.3V 的电压,能分成 4096 个小档位(就像尺子刻度越细量得越准,比 8 位的 "粗尺子" 准多了);
怎么沟通:单片机不用复杂的线,就用几根普通的引脚(像打电话一样),喊一声 "翻译官,帮我测下那个旋钮的电压",翻译官测完就把数字报给它。】
2. ADC 介绍
51单片机内部运算时用的全是数字量(一系列 0 和 1 组成的二进制表示某个信号大小的量)
用数字量表示同一个模拟量时,数字位数可以多也可以少
位数越多则表示的精度越高,位数越低则表示的精度就越低
2.1 ADC 简介
ADC是"模数转换器",是专门给单片机、手机、电脑这些 "只认数字的设备" 配的 "翻译官"。
ADC的主要技术指标:
① 分辨率:翻译的细不细
比如测 0~3.3V 的电压:
8 位 ADC:把 3.3V 分成 256 个小格子(台阶),每个格子≈0.0129V(12.9 毫伏);
12 位 ADC(比如 XPT2046):分成 4096 个小格子,每个格子≈0.0008V(0.8 毫伏);
就像用尺子量东西:1 厘米刻度的尺子(8 位)测不准小物件,1 毫米刻度的尺子(12 位)能测更细,分辨率越高,翻译越精准。
② 转换误差
通常以输出误差的最大值形式给出,表示 A/D转换器实际输出的数字量和理论上的输出数字量之间的差别。
常用有效最低位的倍数表示,例如给出相对误差 <= LSB/2,这表明实际输出的数字量和理论上应得到的输出量之间的误差小于最低位的半个字
③ 转换速率
ADC 的转换速率是能够重复进行数据转换的速度,即每秒转换的次数。
而完成一次 A/D 转换所需的时间,则是转换速率的倒数
④ 为啥有的设备自带 ADC,有的要外接?
比如手机、高级点的单片机(如 STM32),内部就集成了 ADC(自带翻译官);
使用的新手款 51 单片机,成本低、设计简单,没带这个翻译官,所以开发板就额外焊了 XPT2046(外接翻译官),专门给它用。
2.2 ADC 转换原理
AD 转换器(ADC)将模拟量转换为数字量通常要经过四个步骤:采样、保持、量化、编码
采样:将一个时间连续变化的模拟量转换为时间上离散变化的模拟量
如下图所示:

保持:将采样结果存储起来,直到下次采样
量化:将采样电平归化为与之接近的离散数字电平
编码:将采样电平(模拟值)转换为数字值,主要有两类方法:直接比较型、间接比较型
直接比较型:将输入模拟信号直接与标准的参考电压比较,从而得到数字量。常见的有 并行ADC 和 逐次比较型 ADC
间接比较型:输入模拟量不是直接与参考电压比较,而是将二者变为中间的某种物理量再进行比较,然后将比较所得结果进行数字编码。常见的有双积分型 ADC、逐次逼近型 ADC
2.2.1 逐次逼近型 ADC
采用逐次逼近法的 AD 转换器是有一个比较器、DA转换器、缓冲寄存器和控制逻辑电路组成

基本原理:从高位到低位逐次试探比较,就像用天平秤物体,从重到轻逐级增减砝码进行试探。
转换过程:初始化时将逐次逼近寄存器各位清零;转换开始时,先将逐次逼近寄存器最高位置1 ,送入 DA转换器,经 DA转换 后生成的模拟量送入比较器,称为 U0。
与送入比较器的待转换的模拟量 Ux 进行比较,若U0<Ux,该位1被保留,否则被清除;
然后再将逐次逼近寄存器的次高位置1,将寄存器中新的数字量送到 DA转换器,输出的 U0 再与 Ux 比较,若U0<Ux,该位 1 被保留,否则被清除;
重复此过程,直至逼近寄存器最低位。
转换结束后,将逐次逼近寄存器中的数字量送入缓冲寄存器,得到数字量的输出。
逐次逼近的操作过程是在一个控制电路的控制下进行的
2.2.2 双积分型 ADC
采用双积分型的AD转换器有电子开关、积分器、比较器和控制逻辑等部件组成

基本原理:将输入电压变换成与其平均值成正比的时间间隔,再把此时间间隔转换成数字量
转换过程:先将开关接通待转换的模拟量 Vi,Vi 采样输入到积分器,积分器从零开始进行固定时间 T 的正向积分,时间 T 到后,开关再接通与 Vi 极型相反的基准电压 Vref,将 Vref 输入到积分器,进行反向积分,直到输出为 0V 时停止积分
Vi 越大,积分器输出电压越大,反向积分时间也越长。计数器在反向积分时间内所计的数值,就是输入模拟电压 Vi 所对应的数字量,实现了 AD 转换
2.3 XPT2046 芯片
2.3.1 介绍
XPT2046 是一款 4 线制电阻式触摸屏控制器( 控制触摸屏只需要 4 根线(比其他多线制的简单),开发板已经帮你接好了,不用管接线,直接用代码控制 "点屏幕哪个位置" 就行**)** ,内含 12 位分辨率 125KHz转换速率(每秒能完成 12.5 万次 "模拟→数字" 翻译) 的逐步逼近型 A/D 转换器。
XPT2046 不只是个 "ADC 翻译官",还是个 **"触摸屏 + 模拟量采集" 二合一的全能小助手 **------ 使用它既能玩触摸屏,又能测温度、电压,不用额外接一堆芯片。
XPT2046 支持从 1.5V 到 5.25V 的低电压 I/O 接口
【XPT2046 和 51 单片机 "说话"(传数据)时,用的电压很灵活 ------51 开发板常用 5V 或 3.3V 供电,它都能兼容,不用额外给它配特殊电源】
XPT2046 能通过执行两次 A/D 转换查出被按的屏幕位置,除此之外,还可以测量加在触摸屏上的压力。
【两次:你点触摸屏一下,它会做两件事:
① 第一次 ADC 转换:测 "X 轴" 的电压(比如点左边是 1V,点右边是 3V),翻译成数字;
② 第二次 ADC 转换:测 "Y 轴" 的电压(比如点上边是 1V,点下边是 3V),再翻译成数字;
单片机拿到这两个数字,就知道 "哦,你点的是屏幕(X=2000,Y=1500)这个位置"------ 两次转换才精准,不会点错。】
内部自带 2.5V 参考电压,可以作为辅助输入、温度测量和电池检测之用,电池检测的电压范围可以从 0V 到 6V。
【XPT2046 自带 2.5V 参考电压 → 相当于翻译官手里拿了一把 "0~2.5V 的尺子";
当它测到一个 1.25V 的模拟电压时,就会按尺子刻度算:1.25V ÷ 2.5V × 4095 = 204(12 位数字量);
单片机拿到 2047,就知道 "原来对应的电压是 1.25V"。】
片内集成有一个温度传感器(XPT2046 自己身上带了个 "测温小元件",不用你再花钱买温度传感器、接线,直接用代码读取它的 ADC 数据,就能算出当前温度)。在 2.7V 的典型工作状态下,关闭参考电压,功耗可小于 0.75mW。
XPT2046 采用微小的封装形式:TSSOP-16,QNF-16 和 VFBGA-48。
工作温度范围为 -40°C - +85°C,与 ADS7846,TSC2046,AK4182A 完全兼容。
【 耐冷耐热:冬天放室外(-40℃)、夏天放阳台(+85℃)都能正常工作,不用担心环境温度影响;② 兼容其他芯片:如果买不到 XPT2046,买 ADS7846、TSC2046 这些芯片也能直接用,接线、代码都不用改,维修替换很方便】
XPT2046 是一款 "宝藏芯片"
- 功能全:触摸屏控制 + ADC 采集 + 测温 + 电池检测,一个芯片顶好几个,不用接一堆元件;
- 好上手:电压兼容 51 开发板,接线简单(4 根线模拟 SPI),代码逻辑不复杂;
- 省成本:自带参考电压、温度传感器,不用额外买配件;
- 耐造:温度范围宽、功耗低、能替换,不用担心用坏或买不到。
2.3.2 芯片管脚说明
XPT2046 是一款典型的逐次逼近型模数转换器,包含了采样/保持,模数转换、串口数据输出等功能
同时芯片集成有一个 2.5V 的内部参考电压源、温度检测电路,工作时使用外部时钟

刚开始只需要知道 "和 51 通信的 4 个脚(DIN/DOUT/DCLK/CS)+ 触摸屏脚 + 电源脚" 就行
| 引脚名 | 功能(大白话) | 新手怎么用? |
|---|---|---|
| VCC | 芯片的工作电源(给 XPT2046 供电) | 接开发板的 5V/3.3V 电源 |
| GND | 芯片的接地引脚 | 接开发板的 GND(地线) |
| DIN | 51 单片机→XPT2046 的 "指令线" | 51 用这个引脚给 XPT2046 发 "测触摸屏 / 测电压" 的命令 |
| DOUT | XPT2046→51 单片机的 "数据线" | XPT2046 把测到的数字(比如触摸屏位置、电压值)通过这个引脚发给 51 |
| DCLK | 通信的 "时钟线" | 51 用这个引脚控制通信节奏(像 "打拍子",保证双方同步) |
| CS | 芯片的 "选中线"(低电平有效) | 51 拉低这个引脚,告诉 XPT2046 "现在和你通信";拉高则 "结束通信" |
| XP/YP/XN/YN | 触摸屏的 "接线脚" | 接电阻式触摸屏的 4 个电极(点屏时测 X/Y 轴电压) |
| AUX | 额外的 "模拟量输入脚" | 接电位器、温度传感器等,测这些设备的模拟电压 |
| VREF | 参考电压脚(之前讲的 "标尺") | 可以接外部参考电压,也可以用芯片内部的 2.5V(新手不用额外接) |

XPT2046 可以单电源供电,电源电压范围为 2.7-5.5V
参考电压值直接决定 ADC 的输入范围,参考电压可以使用内部参考电压,也可以从外部直接输入1V--VCC 范围内的参考电压(要求外部参考电压源输出阻抗低(电压不忽高忽低))
【① 不用接正、负两根电源,只需要接一根 "正极电源线(VCC)"+ 一根 "地线(GND)" 就能让 XPT2046 正常工作(像手机充电只插一根数据线 + 插头,不用额外接其他线);
② 举例
用 XPT2046 内部 2.5V 参考电压:ADC 只能测 0~2.5V 的模拟电压(比如测 2.6V 的电压,ADC 会当成 2.5V 算,结果不准);
若外接3.3V 参考电压(比如把 VCC=3.3V 接到 V_REF 引脚):ADC 就能测 0~3.3V 的电压,范围更宽。
③ 总结
- XPT2046 接一根电源(2.7-5.5V)就能工作,新手直接接开发板 5V/3.3V 即可;
- 参考电压是 ADC 测量电压的 "上限",0V 到参考电压之间的电压才能精准测量;】
X、Y、Z、VBAT、Temp 和 AUX 模拟信号经过片内的控制寄存器选择后进入ADC,ADC 可以配置为单端或差分模式。
① 选择 VBAT、Temp 和 AUX 时应配置为单端模式
② 作为触摸屏应用时,应该配置为差分模式
这可有效消除由于驱动开关的寄生电阻及外部的干扰带来的测量误差,提高转换精度
2.3.3 功能选择遥控器
这两张表是 XPT2046 的 "功能选择遥控器" ------ 通过设置 A2、A1、A0 这 3 个控制位(相当于遥控器的 "按键组合"),告诉芯片 "现在要做什么检测(测触摸屏位置 / 温度 / 电压)";
·A2、A1、A0:是 51 发给 XPT2046 的 "控制指令" 里的 3 个二进制位(比如000、001),不同组合对应不同功能。
表 3 是单端模式 (SER/DFR=1,控制指令里的一个 "开关位",设为 1 就用单端模式)------ 入门常用,直接测某一个引脚的电压;
| 芯片要做的事(大白话) | 新手用途 |
|-------------|---------------------------------|------------------------|
| 000 | 测芯片内部温度传感器(TEMP0) | 测环境温度(不用额外接传感器) |
| 001 | 测触摸屏Y 轴位置(驱动 Y 引脚,测 YP 的电压) | 点触摸屏时,获取 "上下位置" 的数字 |
| 010 | 测电池电压(VBAT) | 检测外接电池的剩余电量 |
| 011 | 测触摸屏Z1 压力(按屏幕的力度) | 进阶:按得越重,数字越大 |
| 100 | 测触摸屏Z2 压力(辅助 Z1 算更准的压力) | 进阶:让压力测量更精准 |
| 101 | 测触摸屏X 轴位置(驱动 X 引脚,测 XP 的电压) | 点触摸屏时,获取 "左右位置" 的数字 |
| 110 | 测外部模拟输入(AUXIN,比如电位器、温度传感器) | 测你外接的元件电压(比如拧电位器看数字变化) |
| 111 | 测芯片内部另一个温度传感器(TEMP1) | 备用测温(和 000 功能差不多) |

表 4 是差分模式 (SER/DFR=0)------ 进阶用,测两个引脚的电压差(抗干扰更准);
差分模式是测两个引脚之间的电压差(比如测 YP 和 YN 的差),好处是能减少外界干扰,让触摸屏位置 / 压力的测量更精准 ------ 但入门用表 3 的单端模式,已经能满足 "点触摸屏、测电压、测温" 的需求了,不用纠结这个模式。

2.3.4 工作时序
这张图是 XPT2046 和 51 单片机的 "聊天节奏表" ------ 规定了两者通信的 "步骤、时机、谁说话谁听",可以用 "两人对话" 的类比讲透(图里的每个信号对应 "聊天工具"):
图里的 "聊天工具"(对应引脚)
- CS:"呼叫线"------ 低电平 ="XPT2046,我要和你说话了";高电平 ="聊完了,你歇着吧";
- DCLK:"节奏拍"------ 单片机敲的 "拍子",每敲一下(一个脉冲),双方完成一个动作(说 / 听 1 位数据);
- DIN:"单片机的嘴"------ 单片机通过这里给 XPT2046 发 "指令"(比如 "帮我测触摸屏 X 轴位置");
- DOUT:"XPT2046 的嘴"------XPT2046 通过这里给单片机发 "测量结果"(比如测出来的数字);
- BUSY:"忙线"------XPT2046 拉高这条线 ="我正在算数据,别催我";拉低 ="算完了,结果给你";
- Drivers:"触摸屏开关"------ 测触摸屏时才打开(接通触摸屏电极),测完就关掉(省电)。
聊天全流程(对应图里的阶段)
整个过程像 "单片机下单→XPT2046 干活→交付结果":
-
Idle(空闲):一开始都安静(CS)是高电平,所有线都没动静 ------XPT2046 处于 "待机",等单片机呼叫。
-
单片机发起聊天:发指令
- 单片机先把 CS 拉低("XPT2046,醒醒,干活了");
- 然后通过DIN 发 8 位 "指令"(图里 DIN 上的
S+A2A1A0+MODE+...):S是 "开场白"(固定开头);A2A1A0是之前说的 "功能按键"(比如101= 测 X 轴);- 发指令时,DCLK 敲 8 下拍子(每拍发 1 位),保证双方同步。
-
Acquire(准备):XPT2046 准备工具 指令发完后,有个短暂的
tACQ时间 ------XPT2046 打开对应的Drivers(比如测触摸屏就接通 X/Y 电极),准备采集模拟信号(相当于 "拿出尺子准备量")。 -
Conversion(转换):XPT2046 干活 + 给结果
- XPT2046 开始把模拟信号转成数字,同时把BUSY 拉高("我忙着算呢,别打扰");
- 转换完成后,BUSY 拉低 ("算完了!"),然后通过DOUT 发 12 位数字结果(图里的
11~0位); - 发结果时,DCLK 再敲 12 下拍子(每拍发 1 位),单片机依次接收这 12 位数字。
-
聊完收工:回到 Idle结果发完后,单片机把 (CS} 拉高("谢了,你歇着吧"),所有线回到安静状态。
一次完整的转换需要24个串行时钟(DCLK)来完成

在对 XPT2046 进行控制时,控制字节由 DIN 输入的控制字命令格式如下所示:


注意:差分模式仅用于X坐标、Y坐标和触摸压力的测量,其他测量要求采用单端模式
这个表是 XPT2046 的 "省电 / 性能模式选择表" ------ 通过 PD1、PD0 这 2 个 "控制开关"(是单片机发给 XPT2046 指令里的两位),搭配 PENIRQ(触摸提示功能的开 / 关),选择芯片的 "工作状态"(省电还是全速运行)
背景介绍:
PD1、PD0:是指令里的两个 "开关位"(像遥控器的两个按键);$\overline{PENIRQ}$:可以理解为 "触摸提示功能"(使能 = 打开提示,禁止 = 关掉提示);- "功能说明" 是不同开关组合下,芯片的省电程度 和参考电压 / ADC 的开关状态。

上表可以通俗地如下表示:
| PD1 | PD0 | \(\overline{PENIRQ}\) | 功能(像电器的哪种模式?) |
|---|---|---|---|
| 0 | 0 | 使能(开提示) | 「智能省电模式」:两次测量之间芯片 "低功耗歇着"(掉电),但下次测量时立刻 "满血干活"(不用等);而且触摸屏的引脚一直接通,点屏响应更快。→ 既省电,又不耽误触摸 / 测量速度,新手常用。 |
| 0 | 1 | 禁止(关提示) | 「深度省电模式」:参考电压和 ADC(翻译功能)都彻底关掉,芯片几乎不耗电,但要用的时候得等它们重新打开(响应慢)。→ 适合长时间不用芯片时用。 |
| 1 | 0 | 使能(开提示) | 「轻省电模式」:参考电压和 ADC 都关掉,芯片省电,比 "深度省电" 灵活一点,但响应也会慢。 |
| 1 | 1 | 禁止(关提示) | 「性能模式」:芯片一直 "全速开机",参考电压和 ADC 永远开着,不省电,但测量 / 触摸时不用等(响应最快)。→ 追求速度、不担心耗电时用。 |
这个表就是选 "芯片是省电还是全速跑" 的 ------ 入门做实验时,选**PD1=0、PD0=0**(智能省电 + 快响应)就行,既不费电,点屏 / 测数据也不卡。