STC15比较器介绍以及比较器中断方式作为掉电检测示例程序
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC15比较器介绍以及比较器中断方式作为掉电检测示例程序相关的知识,希望对你有一定的参考价值。
【STC15】比较器介绍以及比较器中断方式作为掉电检测示例程序
比较器介绍
STC15W201S
系列、STC15W404S
系列及STC15W1K16S
系列的比较器内部规划如下图所示:
- 有ADC的单片机
STC15W401AS
系列及STC15W4K32S4
系列的比较器内部规划如下图所示:
- 比较器正极输入端CMP+电平可以与比较器负极输入端CMP-的电平进行比较,也可以与内
部BandGap参考电压(1.27V附近)进行比较。 - STC15W系列与比较器相关的特殊功能寄存器(STC15W SFRs associated with comparator)
比较器控制寄存器1:CMPCR1
比较器控制寄存器2:CMPCR2
实验对象
使用的芯片型号:
STC15W408AS
单片机,使用可调电位器接入到P5.5口,作为单片机电压检测口,P5.5口的输入电压与内部BandGap参考电压(1.27V附近)进行比较,当外部输入的电压P5.5口低于内部参考电压1.27V时将产生中断,让P 1.0口的led灯点亮。
示例代码
结合上面的比较器内部结构图看代码就比较直接容易理解。
#include "reg51.h"
#include "intrins.h"
sfr CMPCR1 = 0xE6; //比较器控制寄存器1
#define CMPEN 0x80 //CMPCR1.7 : 比较器模块使能位
#define CMPIF 0x40 //CMPCR1.6 : 比较器中断标志位
#define PIE 0x20 //CMPCR1.5 : 比较器上升沿中断使能位
#define NIE 0x10 //CMPCR1.4 : 比较器下降沿中断使能位
#define PIS 0x08 //CMPCR1.3 : 比较器正极选择位
#define NIS 0x04 //CMPCR1.2 : 比较器负极选择位
#define CMPOE 0x02 //CMPCR1.1 : 比较结果输出控制位
#define CMPRES 0x01 //CMPCR1.0 : 比较器比较结果标志位
sfr CMPCR2 = 0xE7; //比较器控制寄存器2
#define INVCMPO 0x80 //CMPCR2.7 : 比较结果反?输出控制位
#define DISFLT 0x40 //CMPCR2.6 : 比较器输出端虑波使能控制位
#define LCDTY 0x3F //CMPCR2.[5:0] : 比较器输出的区抖时间控制
sbit LED = P1^0; //测试脚
void cmp_isr() interrupt 21 using 1 //比较器中断向量入口
CMPCR1 &= ~CMPIF; //清除完成标志
LED = (CMPCR1 & CMPRES); //将比较器结果CMPRES输出到测试口显示
void main()
CMPCR1 = 0; //初始化比较器控制寄存器1
CMPCR2 = 0; //初始化比较器控制寄存器2
CMPCR1 &= ~PIS; //选择外部管脚P5.5(CMP+)为比较器的正极输入源
// CMPCR1 |= PIS; //选择ADCIS[2:0]所选的ADCIN为比较器的正极输入源
CMPCR1 &= ~NIS; //选择内部BandGap电压BGV为比较器的负极输入源
// CMPCR1 |= NIS; //选择外部管脚P5.4(CMP-)为比较器的负极输入源
CMPCR1 &= ~CMPOE; //禁用比较器的比较结果输出
// CMPCR1 |= CMPOE; //使能比较器的比较结果输出到P1.2
CMPCR2 &= ~INVCMPO; //比较器的比较结果正常输出到P1.2
// CMPCR2 |= INVCMPO; //比较器的比较结果取反后输出到P1.2
CMPCR2 &= ~DISFLT; //不禁用(使能)比较器输出端的0.1uS虑波电路
// CMPCR2 |= DISFLT; //禁用比较器输出端的0.1uS虑波电路
CMPCR2 &= ~LCDTY; //比较器结果不去抖动,直接输出
// CMPCR2 |= (DISFLT & 0x10); //比较器结果在经过16个时钟后再输出
CMPCR1 |= PIE;
//使能比较器的上升沿中断
// CMPCR1 |= NIE; //使能比较器的下降沿中断
CMPCR1 |= CMPEN; //使能比较器
EA = 1;
while (1);
- 使用STC15头文件程序示例
#include "STC15Wxx.H"
//#include "STC15Fxxxx.H"
sbit Led =P1^0;
void main()
CMPCR1 = 0xb0;//1011,0000 开启比较器中断
CMPCR2 = 0x00;//0000 0000 比较器只延时0.1us
EA =1;
while(1);
void cmp() interrupt 21 using 1
CMPCR1 &= 0xbf;//清除中断标志,1011,1111
Led = (CMPCR1 & 0x01); //将比较器结果CMPRES输出到测试口显示
以上是关于STC15比较器介绍以及比较器中断方式作为掉电检测示例程序的主要内容,如果未能解决你的问题,请参考以下文章