1、概述
STC8系列单片机内部集成了一个12位15通道的高速ADC转换器。ADC的时钟为系统时钟的2分频的16分频的32分频到系统时钟的2分频的16分频的512分频。转换结果有2种格式:左对齐和右对齐。
注:ADC不能多通道同时进行,一次只能检测一个通道!
2、ADC相关的寄存器:
ADC_CONTR:ADC控制寄存器
低4位(ADC_CHS):ADC通道选择位。
第6位(ADC_FLAG):ADC转换标志位。当完成一次AD转换后硬件会自动将这位置1并触发ADC中断,必须手动清零。
第7位(ADC_START):ADC转换启动控制位。写入1开始转换,转换完成后硬件自动置0.为0时无影响,即使ADC正在进行转换也不会停止。
第8位(ADC_POWER):ADC电源控制位。写入1ADC芯片开始供电,写入0停止供电。
ADC_CFG:ADC配置寄存器
低4位(SPEED):ADC时钟控制位。ADC时钟=SYSClk/2/16/SPEED.
第6位(RESFMT):ADC转换结果控制位。为0时,转换结果左对齐。ADC_RES储存转换结果的高8位,ADC_RESL的高4位存储转换结果的低4位,ADC_RESL的低4位为0;为1时转换结果右对齐。ADC_RES的高4位为0,低4位储存转换结果的高4位。ADC_RESL储存转换结果的低8位。
ADC_RES和ADC_RESL:转换结果储存寄存器。
3、转换步骤:
首先ADC通道设置为高阻输入模式。
eg:P1M0=0X00;P1M1=0X01;//配置P1.0为高阻输入模式。
然后开启AD转换器的电源、并且选定ADC转换通道。通过配置ADC_CONTR的值来控制。
eg:ADC_CONTR=0x80;//开启ADC电源,同时选定转换通道为P1.0;
配置ADC转换的时钟、数据储存格式。通过配置ADC_CFG的值来控制。
eg:ADC_CFG=0x0f;//设置转换结果左对齐,同时ADC时钟为系统时钟的2分频的16分频的512分频;
开始进行ADC转换。将ADC_CONTR寄存器的第7位置1即可。
eg:ADC_CONTR=ADC_CONTR|0x40;//通过或运算将ADC_CONTR寄存器的第7位置1而不改变其它位的值。
等待转换ADC完成。通过ADC_CONTR寄存器的第6位来判断是否转换完成。转换完成时这个位为1;
eg:while(!(ADC_CONTR&0X20));//转换未完成时,第6位为0,与运算后结果为0,取反后为1。转换完成后,第6位为1,与运算后结果为0x20,取反后为0;
清除转换标志位。将ADC_CONTR寄存器的第6位置0。
eg:ADC_CONTR=ADC_CONTR&0x9f;//进行与运算,0xdf的第6位和第7位为0,与运算以后的值第6位和第7位一定为0。其余6位如果原来为1依旧为1,原来为0依旧为0。
读取转换结果。保存ADC_RES和ADC_RESL寄存器的值,保存操作为ADCH_Value=ADC_RES ; ADCL_Value=ADC_RESL; 保存后可以根据个人对寄存器清0,清零操作为:ADC_RES=0;ADC_RESL=0。
至此一次ADC转换就进行完成了。
注:在开始进入等待ADC转换结束之前可以先进行一段延时,如延时两个机器周期(_nop_();)!
4、范例程序:
#include"main.h"
#include "intrins.h"
unsigned char ADCH_Value;
unsigned char ADCL_Value;
void main(void)
{
P1M0 = 0x00; //设置P1.1为ADC口
P1M1 = 0x02;
ADC_CONTR = 0x81; //使能ADC模块
ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16/16,右对齐
ADC_CONTR |= 0x40; //启动AD转换
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
ADC_CONTR = ADC_CONTR & 0x9f; //清除ADC完成标志
ADCH_Value=ADC_RES; //保存ADC转换的值
ADCL_Value=ADC_RESL;
ADC_RES=0; //寄存器清零
ADC_RESL=0;
while(1);
}