PIC16F877单片机的ADC内部结构如图1所示。40引脚封装芯片与28引脚封装芯片的区别主要在于模拟口的数量不同,28引脚封装芯片没有AN5~AN7模拟量输入通道,其他各部分的功能和组成关系相同。PIC16F877单片机的ADC内部结构图如图2所示。
图1 主程序及中断程序流程
图2 PIC16F877单片机的ADC内部结构图
PIC16F877单片机内部嵌入的ADC模块具有10位数字量精度,共有8个模拟通道,与ADO模块有关的寄存器共有11个,其专用的4个寄存器分别为:ADCCON0、ADCCON1、ADRESH及ADRESL。
源阻抗(RS)和内部采样开关(RSS)阻抗直接影响所要求的充电电容CHOLD的时间,采样开关(RSS)阻抗在单片机电压上的变化,源阻抗在模拟输入时影响偏移电压(由于引脚漏电流)。所推荐的最大模拟源阻抗是101kΩ,在模块输入通道被选择后转换可以开始之前采集必须通过。
A/D转换器时间每位定义为TAD,A/D转换器每10位转换要求12TAD,A/D转换器时钟源是可以通过软件设定的,TAD的4种可能选择是:
· 2TOSC;
· 8TOSC;
· 32TOSC;
· 内部RC振荡器。
对于正确的A/D转换,A/D转换时钟(TAD)必须被选择以保证1.6μs的最小TAD时间。
ADCON1、TRISA和TRISE寄存器控制A/D端口引脚的操作。这个作为模拟输入的端口引脚必须有它们的相应位TRIS置1(输入)。如果TRIS位清0(输出),数字输出电平(VOH或VOL)将被转换。A/D操作是独立于(CHS(2∶0))位和TRIS位的状态之外的。
在睡眠期间A/D模块可以工作,这种A/D时钟要求对RC置1,(ARCS(1:0)=11), 当选择RC时钟源时,A/D模块在开始转换之前等待一个指令周期。这种允许执行的睡眠指令,可以消除在转换中产生的所有数字开关噪声。
当转换完成时,GO/DONE位将被清0,和转换结果一块装入ADRES寄存器,如果A/D中断使能,单片机将从睡眠中唤醒,如果A/D中断不使能,尽管ADON位仍保持置1,A/D模块仍将被关闭。
如果A/D时钟源是另一种时针选择(不是RC),尽管ADIN位仍保持1,睡眠指令将导致目前的转换中断和A/D模块被关闭。关闭A/D,把A/D模块放到它的最低电流消耗状态。
单片机复位强制所有寄存器复位到它们的复位状态,强制关闭A/D转换模块和进行的转换。在ADRESH、ADRESL寄存器的值在上电复位时不变,ADRESH、ADRESL寄存器在上电复位之后将包含未知数据。
1. 设计思路
将RA2引脚作为模拟电压输入,模拟量为连接在RA2引脚上的微调电阻提供,借此可以提供一个连续变化的模拟电压。端口D连接8个LED作为数据输出显示,并设置一个报警值。
本程序中将报警值设为2.5V,经A/D转换后对应十六进制数值为0x200H,当A/D转换的值未达到警戒值(0x200H)时,点亮8个发光二极管的低4个,表明系统运行正常;当A/D转换的值达到或超过警戒值(0x200H)时,发出报警信号,点亮与D口相连的LED显示报警信息。
2. 电路设计
单片机与LED的接口原理如图3所示。
图3 PIC16F877与LED的接线