STC 单片机比较器原理及实现 主讲 : 何宾 Email:hebin@mail.buct.edu.cn 2016.03
STC 单片机比较器结构 STC15W 系列单片机内置了模拟比较器 对于 STC15W201S STC15W404S, 以及 STC15W1K16S 系列单片机的比较器内部结 构
STC 单片机比较器结构 从图中可以看出, 比较器正端输入 CMP+ 的输入电压来自单片机的 P5.5 引脚, 而比较器的负端输入 CMP- 的输入电压来自单片机的 P5.4 引脚或者是内部的 BandGap 参考电压 (1.27V) 当: VCMP+>VCMP- 时, 比较器输出逻辑高 (1) VCMP+<VCMP- 时, 比较器输出逻辑低 (0) 对于内部集成 ADC 的 STC15W401AS, 以及 STC15W4K32S4 系列单片机的比较器内部结构
STC 单片机比较器结构 从图中可以看出, 比较器正端输入 CMP+ 的输入电压来自单片机的 P5.5 引脚或者 ADCIN 的输入, 而比较器的负端输入 CMP- 的输入电压来自单片机的 P5.4 引脚或者是内部的 BandGap 参考电压 (1.27V) VCMP+>VCMP- 时, 比较器输出逻辑高 (1) VCMP+<VCMP- 时, 比较器输出逻辑低 (0)
STC 单片机比较器寄存器组 -- 比较控制寄存器 1 本节介绍比较控制寄存器 CMPCR1, 该寄存器位于特殊功能寄存器 地址为 0xE6 的位置 当复位后, 该寄存器的值为 00000000 比特 B7 B6 B5 B4 B3 B2 B1 B0 名字 CMPEN CMPIF PIE NIE PIS NIS CMPOE CMPRE S 其中 : CMPEN 比较器模块使能位 当该位为 1 时, 使能比较器模块 ; 当该位为 0 时, 禁止比较器模块, 即 : 关闭比较器的电源 CMPIF 比较器中断标志位
STC 单片机比较器寄存器组 -- 比较控制寄存器 1 当比较器的输出由逻辑低变成逻辑高时, 如果 PIE 设置为 1, 则将单片机中内 建的一个称为 CMPIF_P 的寄存器置 1; 当比较器的输出由逻辑高变成逻辑低时, 如果 NIE 设置为 1, 则将单片机中内 建的一个称为 CMPIF_N 的寄存器置 1; 当 CPU 读取 CMPIF 时, 会同时读 CMPIF_P 和 CMPIF_N, 只要有一个为 1, 则 CMPIF 就置为 1 当软件对该位写 0 时, 将 CMPIF_P 和 CMPIF_N 标志清零 PIE 比较器上升沿中断使能控制位 当该位为 1 时, 使能比较器上升沿中断 ; 当该位为 0 时, 禁止比较器上升沿中断
NIE 比较器下降沿中断使能控制位 当该位为 1 时, 使能比较器下降沿中断 ; 当该位为 0 时, 禁止比较器下降沿中断 PIS 比较器正端选择位 当该位为 1 时, 选择 ADCIS[2:0] 所选择到的 ADCIN 作为比较器的正端输入 ; 当该位为 0 时, 选择外部 P5.5 引脚的输入作为比较器的正端输入 NIS STC 单片机比较器寄存器组 -- 比较控制寄存器 1 比较器负端选择位 当该位为 1 时, 选择外部 P5.4 引脚的输入作为比较器的负端输入 ; 当该位为 0 时, 选择内部 BandGap 电压 BGV 为比较器的负端输入
STC 单片机比较器寄存器组 -- 比较控制寄存器 1 CMPOE 比较器结果输出控制位 当该位为 1 时, 使能将比较器的结果输出到单片机的 P1.2 引脚 ; 当该位为 0 时, 禁止比较器的比较结果输出 CMPRES 比较器比较结果标志位 当该位为 1 时,VCMP+>VCMP-; 当该位为 0 时,VCMP+<VCMP-
STC 单片机比较器寄存器 -- 比较控制寄存器 2 本节介绍比较控制寄存器 CMPCR2, 该寄存器位于特殊功能寄存器 地址为 0xE7 的位置 当复位后, 该寄存器的值为 00001001 比特 B7 B6 B5 B4 B3 B2 B1 B0 名字 INVCM PO DISFLT LCDTY[5:0]
其中 : INVCMPO 比较器输出取反控制位 当该位为 1 时, 将比较器的输出取反后再输出到单片机的 P1.2 引脚 ; 当该位为 0 时, 比较器正常输出 注 : 比较器输出, 采用经过 ENLCCTL 控制后的结果, 而不是模拟比较器直接的输出结果 DISFLT STC 单片机比较器寄存器 -- 比较控制寄存器 2 去除比较器输出的 0.1µS 过滤器控制位 当该位为 1 时, 关掉比较器输出的 0.1µS 过滤器 ; 当该位为 0 时, 比较器的输出经过 0.1µS 过滤器
LCDTY[5:0] STC 单片机比较器寄存器 -- 比较控制寄存器 2 比较器输出端用于控制电平变化过滤器长度的设置位 当比较器的输出结果变化的脉宽时间小于 LCDTY[5:0] 所设置的时钟周期的值, 则该脉冲的变化不能被输出, 也就是被过滤掉
STC 单片机比较器应用 在 STC 学习板上提供了标记为 W1 的可变电位器, 用于将单片机供电电压分压后, 通过单片机的 P5.5 引脚送到比较器的正端 CMP+ 在该设计中, 将 CMP+ 的电压和 STC15 系列单片机内的 BandGap 电压 ( 大约为 +1.27V) 进行比较
STC 单片机比较器应用 当不断调整 STC 学习板上的可变电位器 W1 时, 送到 P5.5 引脚 当 VP5.5<VBandGap 时,STC 学习板上标记为 LED9 的 LED 灯会闪烁, 用于提示电压过低 在调整电位器 W1 的过程中, 每当电压 VP5.5>VBandGap 时, 标记为 LED10 的灯会闪烁一下, 表示 VP5.5 当前电压高于 VBandGap
STC 单片机比较器应用 例 19-1 低电压比较检测 C 语言描述的例子 代码清单 19-1 main.c 文件 #include "reg51.h" sfr CMPCR1 =0xE6; sfr CMPCR2 =0xE7; // 声明 CMPCR1 寄存器的地址 0xE6 // 声明 CMPCR2 寄存器的地址 0xE7 #define CMPEN 0x80 #define CMPIF 0x40 // 定义 CMPEN 的值为 0x80, 使能位 // 定义 CMPIF 的值为 0x40, 中断标志位
STC 单片机比较器应用 #define PIE 0x20 // 定义 PIE 的值为 0x20, 上升沿中断使能位 #define NIE 0x10 // 定义 NIE 的值为 0x10, 下降沿中断使能位 #define PIS 0x08 // 定义 PIS 的值为 0x08, 比较器正端选择位 #define NIS 0x04 // 定义 NIS 的值为 0x04, 比较器负端选择位 #define CMPOE 0x02 // 定义 CMPOE 的值为 0x02, 比较器结果输出控制位 #define CMPRES 0x01 // 定义 CMPRES 的值为 0x01, 比较器比较结果标志位
STC 单片机比较器应用 #define INVCMPO 0x80 // 定义 INVCMPO 的值为 0x80, 比较结果反向输出控制位 #define DISFLT 0x40 // 定义 DISFLT 的值为 0x40, 比较器输出端滤波使能控制位 #define LCDTY 0x3F // 定义 LCDTY 的值为 0x3F, 比较器输出区抖时间控制 void cmp_int() interrupt 21 // 定义比较器中断服务程序 cmp_int { P46=!P46; // 单片机引脚 P4.6 取反 CMPCR1 &=~CMPIF; // 清除比较器中断标志位 }
STC 单片机比较器应用 void main() { unsigned int j=0; P46=0; // 引脚 P4.6 初值为 0 CMPCR1=0; //CMPCR1 寄存器清零 CMPCR2=0; //CMPCR2 寄存器清零 CMPCR1&=~PIS; // 选择外部引脚 P5.5 作为比较器的正端输入 CMPCR1&=~NIS; // 选择单片机内的 BandGap 电压作为比较器的负端输入 CMPCR1&=~CMPOE; // 禁止输出比较器的比较结果 CMPCR2&=~INVCMPO; // 比较器的比较结果正常输出到单片机引脚 P1.2
STC 单片机比较器应用 CMPCR2&=~DISFLT; // 使能比较器输出端的 0.1μS 滤波电路 CMPCR2&=~LCDTY; // 比较器结果不去抖动直接输出 CMPCR2 =(DISFLT & 0x10); // 比较器结果在经过 16 个时钟周期后输出 CMPCR1 =PIE; // 使能比较器的上升沿中断 CMPCR1 =CMPEN; // 使能比较器 EA=1; //CPU 允许响应中断请求 while(1) { if((cmpcr1 & 0x01)==0) // 如果比较结果为低
STC 单片机比较器应用 { } for(j=0;j<30000;j++); // 延迟一段时间 P47=!P47; else P46=1; } } //P4.7 引脚取反 // 否则当比较结果为高时, 将 P4.6 引脚拉高 注 : 读者可以进入本书所提供资料的 stc_program_example\ 例子 19-1 目录下, 打开并参考该设计
STC 单片机比较器应用 下载和分析设计的步骤主要包括 : 打开 STC-ISP 软件, 在该界面内, 选择硬件选项 将 输入用户程序运行时的 IRC 频率设置为 12.0000MHz 单击 下载 / 编程 按钮, 将设计下载设计到 STC 单片机 用小螺丝刀旋转 STC 学习板上标记为 W1 的电位器旋钮