当前位置:网站首页>【STC8G2K64S4】比较器介绍以及比较器掉电检测示例程序
【STC8G2K64S4】比较器介绍以及比较器掉电检测示例程序
2022-04-23 14:26:00 【perseverance52】
【STC8G2K64S4】比较器介绍以及比较器掉电检测示例程序
STC8GK2比较器简介
STC8G 系列单片机内部集成了一个比较器。比较器的正极可以是 P3.7 端口或者 ADC 的模拟输入通道,而负极可以 P3.6 端口或者是内部 BandGap 经过 OP 后的 REFV 电压(内部固定比较电压)。通过多路选择器和分时复用可实现多个比较器的应用.
比较器内部有可程序控制的两级滤波:模拟滤波和数字滤波。模拟滤波可以过滤掉比较输入信号中的毛刺信号,数字滤波可以等待输入信号更加稳定后再进行比较。比较结果可直接通过读取内部寄存器位获得,也可将比较器结果正向或反向输出到外部端口。将比较结果输出到外部端口可用作外部事件的触发信号和反馈信号,可扩大比较的应用范围。
- 比较器内部结构图

- 比较器相关的寄存器

- 比较器控制寄存器 1(CMPCR1)


- 比较器控制寄存器 2(CMPCR2)



- 接线说明

比较器的使用(中断方式)
/*STC8G2单片机中断方式获取P36引脚电压值与内部1.19V电压进行比较,将结果输出到P10, 当P36引脚电压高于1.19v时,则P10输出高电平,低于1.19V则触发中断,P10输出低电平*/
#include "reg51.h"
#include "intrins.h"
sfr CMPCR1 = 0xe6;
sfr CMPCR2 = 0xe7;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
sbit P10 = P1^0;
sbit P11 = P1^1;
void cmp() interrupt 21 using 1
{
CMPCR1 &= 0xbf;//手动清除清除中断标志,1011,1111
P10 = (CMPCR1 & 0x01); //将比较器结果CMPRES输出到测试口显示
}
void main()
{
P0M0 = 0x00;//设置个IO端口为准双向口
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P10 =0;//初始P10端口为低电平
CMPCR2 = 0x00;
CMPCR2 &= ~0x80; //比较器正向输出
// CMPCR2 |= 0x80; //比较器反向输出
CMPCR2 &= ~0x40; //使能 0.1us 滤波
// CMPCR2 |= 0x40; //禁止 0.1us 滤波
// CMPCR2 &= ~0x3f; //比较器结果直接输出
CMPCR2 |= 0x10; //比较器结果经过 16 个去抖时钟后输出
CMPCR1 = 0x00;
CMPCR1 |= 0x30; //使能比较器边沿中断
// CMPCR1 &= ~0x20; //禁止比较器上升沿中断
// CMPCR1 |= 0x20; //使能比较器上升沿中断
// CMPCR1 &= ~0x10; //禁止比较器下降沿中断
// CMPCR1 |= 0x10; //使能比较器下降沿中断
CMPCR1 &= ~0x08; //P3.7 为 CMP+输入脚
// CMPCR1 |= 0x08; //ADC 输入脚为 CMP+输入脚
CMPCR1 &= ~0x04; //内部 1.19V 参考信号源为 CMP-输入脚
// CMPCR1 |= 0x04; //P3.6 为 CMP-输入脚
// CMPCR1 &= ~0x02; //禁止比较器输出
CMPCR1 |= 0x02; //使能比较器输出
CMPCR1 |= 0x80; //使能比较器模块
EA =1;
while (1)
{
}
}
比较器的使用(查询方式)
查询方式的话,就是在while循环里面不断查询对应寄存器的状态来确定当前比较器输入引脚(P37口)的电压值。
/*STC8G2单片机中断方式获取P36引脚电压值与内部1.19V电压进行比较,将结果输出到P10, 当P36引脚电压高于1.19v时,则P10输出高电平,低于1.19V则触发中断,P10输出低电平*/
#include "reg51.h"
#include "intrins.h"
sfr CMPCR1 = 0xe6;
sfr CMPCR2 = 0xe7;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
sbit P10 = P1^0;
sbit P11 = P1^1;
//void cmp() interrupt 21 using 1
//{
// CMPCR1 &= 0xbf;//手动清除清除中断标志,1011,1111
// P10 = (CMPCR1 & 0x01); //将比较器结果CMPRES输出到测试口显示
//}
void main()
{
P0M0 = 0x00;//设置个IO端口为准双向口
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P10 =0;//初始P10端口为低电平
CMPCR2 = 0x00;
CMPCR2 &= ~0x80; //比较器正向输出
// CMPCR2 |= 0x80; //比较器反向输出
CMPCR2 &= ~0x40; //使能 0.1us 滤波
// CMPCR2 |= 0x40; //禁止 0.1us 滤波
// CMPCR2 &= ~0x3f; //比较器结果直接输出
CMPCR2 |= 0x10; //比较器结果经过 16 个去抖时钟后输出
CMPCR1 = 0x00;
CMPCR1 |= 0x30; //使能比较器边沿中断
// CMPCR1 &= ~0x20; //禁止比较器上升沿中断
// CMPCR1 |= 0x20; //使能比较器上升沿中断
// CMPCR1 &= ~0x10; //禁止比较器下降沿中断
// CMPCR1 |= 0x10; //使能比较器下降沿中断
CMPCR1 &= ~0x08; //P3.7 为 CMP+输入脚
// CMPCR1 |= 0x08; //ADC 输入脚为 CMP+输入脚
CMPCR1 &= ~0x04; //内部 1.19V 参考信号源为 CMP-输入脚
// CMPCR1 |= 0x04; //P3.6 为 CMP-输入脚
// CMPCR1 &= ~0x02; //禁止比较器输出
CMPCR1 |= 0x02; //使能比较器输出
CMPCR1 |= 0x80; //使能比较器模块
// EA =1;
while (1)
{
// CMPCR1 &= 0xbf;//手动清除清除中断标志,1011,1111
P10= (CMPCR1 & 0x01); //将比较器结果CMPRES输出到测试口显示
}
}
作为掉电检测的话,最好使用中断方式,来处理事件,将P37作为外部电压检测口,如果使用内部电压进行比较的话,就是1.19V作为比较值。建议使用P36作为CMP-输入脚,接到3.3V电压上,单片机采用5V供电,P37引脚检测5V电压值,当检测电压低于3.3V时,就会触发中断,相当于将比较的基准电压提高到了3.3V,实现相关代码如下:CMPCR1 |= 0x04; //P3.6 为 CMP-输入脚
- P36 作为CMP-输入脚代码
/*STC8G2单片机中断方式获取P36引脚电压值与内部1.19V电压进行比较,将结果输出到P10, 当P36引脚电压高于1.19v时,则P10输出高电平,低于1.19V则触发中断,P10输出低电平*/
#include "reg51.h"
#include "intrins.h"
sfr CMPCR1 = 0xe6;
sfr CMPCR2 = 0xe7;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
sbit P10 = P1^0;
sbit P11 = P1^1;
void cmp() interrupt 21 using 1
{
CMPCR1 &= 0xbf;//手动清除清除中断标志,1011,1111
P10 = (CMPCR1 & 0x01); //将比较器结果CMPRES输出到测试口显示
}
void main()
{
P0M0 = 0x00;//设置个IO端口为准双向口
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P10 =0;//初始P10端口为低电平
CMPCR2 = 0x00;
CMPCR2 &= ~0x80; //比较器正向输出
// CMPCR2 |= 0x80; //比较器反向输出
CMPCR2 &= ~0x40; //使能 0.1us 滤波
// CMPCR2 |= 0x40; //禁止 0.1us 滤波
// CMPCR2 &= ~0x3f; //比较器结果直接输出
CMPCR2 |= 0x10; //比较器结果经过 16 个去抖时钟后输出
CMPCR1 = 0x00;
CMPCR1 |= 0x30; //使能比较器边沿中断
// CMPCR1 &= ~0x20; //禁止比较器上升沿中断
// CMPCR1 |= 0x20; //使能比较器上升沿中断
// CMPCR1 &= ~0x10; //禁止比较器下降沿中断
// CMPCR1 |= 0x10; //使能比较器下降沿中断
CMPCR1 &= ~0x08; //P3.7 为 CMP+输入脚
// CMPCR1 |= 0x08; //ADC 输入脚为 CMP+输入脚
// CMPCR1 &= ~0x04; //内部 1.19V 参考信号源为 CMP-输入脚
CMPCR1 |= 0x04; //P3.6 为 CMP-输入脚
// CMPCR1 &= ~0x02; //禁止比较器输出
CMPCR1 |= 0x02; //使能比较器输出
CMPCR1 |= 0x80; //使能比较器模块
EA =1;
while (1)
{
// P10= (CMPCR1 & 0x01); //将比较器结果CMPRES输出到测试口显示
}
}
版权声明
本文为[perseverance52]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_42880082/article/details/124360835
边栏推荐
- Some little records~
- 分分钟掌握---三目运算符(三元运算符)
- 浅谈skiplist在LevelDB的应用
- 51 MCU flowers, farmland automatic irrigation system development, proteus simulation, schematic diagram and C code
- JumpServer
- Sed learning for application
- 一篇博客让你学会在vscode上编写markdown
- Proteus simulation design of DC adjustable regulated power supply (with simulation + paper and other data)
- Redis源码分析之PSYNC同步
- JS parabola motion packaging method
猜你喜欢

asp.net使用MailMessage发送邮件的方法

四层和八层电梯控制系统Proteus仿真设计,51单片机,附仿真和Keil C代码

Electronic perpetual calendar of DS1302_ 51 single chip microcomputer, month, day, week, hour, minute and second, lunar calendar and temperature, with alarm clock and complete set of data

单片机的函数信号发生器,输出4种波形,频率可调,原理图,仿真和C程序

c语言在结构体传参时参数压栈问题

setcontext getcontext makecontext swapcontext

Processing MKDIR: unable to create directory 'AAA': read only file system

八路抢答器系统51单片机设计【附Proteus仿真、C程序、原理图及PCB文件、元器件清单和论文等】

flannel 原理 之 TUN模式

SHT11传感器的温度湿度监控报警系统单片机Proteus设计(附仿真+论文+程序等)
随机推荐
Redis cluster 原理
555定时器+74系列芯片搭建八路抢答器,30s倒计时,附Proteus仿真等
Proteus simulation design of four storey and eight storey elevator control system, 51 single chip microcomputer, with simulation and keil c code
Gif to still image processing
Qt界面优化:鼠标双击特效
8.2 文本预处理
循环队列的基本操作,你学会了吗?
tcp_diag 内核相关实现 1 调用层次
Uni app message push
After entering the new company, the operation and maintenance engineer can understand the deployment of the system from the following items
1分钟看懂执行流程,永久掌握for循环(附for循环案例)
8.3 语言模型与数据集
【Servlet】Servlet 详解(使用+原理)
JS key value judgment
LLVM - 生成for循环
Golang 对分片 append 是否会共享数据
C语言知识点精细详解——初识C语言【1】
C语言知识点精细详解——数据类型和变量【2】——整型变量与常量【1】
First acquaintance with STL
Redis源码分析之HSET流程与ziplist