ADC 模块
stc8g1k08a
芯片,内置了1个ADC模块,用于测量模拟信号。相关的数据手册位于: STC8G数据手册 的第 579
页。
ADC简介
ADC(Analog-to-Digital Converter)是模拟-数字转换器,用于将模拟信号转换为数字信号。STC8G系列单片机内置了10位高精度ADC模块1个,可以同时测量多个通道的信号,可以用于测量模拟电压、电流等信号。
ADC模块寄存器
- ADC_CONTR: ADC控制寄存器.
- ADCCFG: ADC配置寄存器.
- ADC_RES: ADC转换结果高8位.
- ADC_RESL: ADC转换结果低8位.
一. ADC模块同步转换方法
1.1 ADC模块同步转换方法简介
- 配置模块的的输入引脚.
- 配置模块的ADC通道.
- 配置模块的ADC触发源.
- 启动模块的ADC转换.
- 读取模块的ADC转换结果.
1.2 ADC模块同步转换方法代码
初始化ADC模块
c
// ADC相关寄存器定义
#define ADC_POWER 0x80 // ADC电源控制位
#define ADC_START 0x40 // ADC启动控制位
#define ADC_FLAG 0x20 // ADC完成标志位
// 初始化(p581)
void adc_init(void) {
//将ADC引脚设置为高阻输入
P3M0 &= ~(1 << 3); // 设置P33(ADC11)为高阻输入
P3M1 |= 1 << 3;
ADCCFG = 0x2F; // 设置ADC时钟为系统时钟/2/16,右对齐输出
ADC_CONTR = ADC_POWER | 0x03; // 开启ADC电源,选择通道5(P33)
Delay_us(100); // 等待ADC稳定
}
在这个初始化的过程中,包括: 引脚的模式的定义, ADC的配置, 以及ADC的电源启动(并不是开始转换).
ADC_CONTR
寄存器用于控制ADC的启动和停止,以及设置ADC的通道和触发源.

ADCCFG
寄存器用于配置ADC的时钟和输出格式.
启动ADC转换并读取结果
c
unsigned int adc_Read() {
ADC_CONTR |= ADC_START; // 启动ADC转换
while(!(ADC_CONTR & ADC_FLAG)); // 等待转换完成(若卡死,改用延时法)
ADC_CONTR &= ~ADC_FLAG; // 清除标志位
return (ADC_RES << 8) | ADC_RESL; // 合并10位结果
}
注意: 在返回结果时 return (ADC_RES << 8) | ADC_RESL;
ADC_RES
为高8位,ADC_RESL
为低8位。这种返回的原理,就是上图中 RESFMT=1的情况,因为我们设置了ADCCFG = 0x2F;
,也就是 RESFMT=1
。