【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,1111P10 = (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,1111P10= (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,1111P10 = (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输出到测试口显示}
}

【STC8G2K64S4】比较器介绍以及比较器掉电检测示例程序相关推荐

  1. 新手必看!单片机掉电检测与数据掉电保存方案

    单片机在正常工作时,因某种原因造成突然掉电,将会丢失数据存储器(RAM)里的数据.在某些应用场合如测量.控制等领域,单片机正常工作中采集和运算出一些重要数据,待下次上电后需要恢复这些重要数据. 因此, ...

  2. 一种非常实用的系统掉电检测和保护电路---摘自:周立功单片机

    目录 本文导读 系统掉电保护的重要性和可行性 掉电检测保护电路功能框图 LM393比较器电路运用 MP1542升压电路运用 掉电检测保护电路的电源波形和工作过程 本文导读 可靠性是每一个产品的灵魂,如 ...

  3. 聊一聊芯片上电复位和掉电检测

    目录 1.上电复位的原理 2.掉电检测的原理 3.器件正确上电 许多IC都包含上电复位(POR)电路,其作用是保证在施加电源后,模拟和数字模块初始化至已知状态.基本上电复位(POR)功能会产生一个内部 ...

  4. 【转】巧用CAT706做掉电检测

    相信大家都会遇到这样的情况,当你正在敲一份文档或一段代码时,啪的一下停电啦,我擦--,我的代码--,我的图纸--,我刚写好的文章--.但是在嵌入式系统中也会遇到类似的情况,通常会导致嵌入式系统数据,程 ...

  5. 八.STM32F030C8T6 MCU开发之电源掉电检测案例

    八.STM32F030C8T6 MCU开发之电源掉电检测案例 0.总体功能概述 使用STD库–en.stm32f0_stdperiph_lib_v1.6.0. 单片机在正常工作时,因某种原因造成突然掉 ...

  6. 分享一个来自苏泊尔的超低成本隔离交流电压检测+掉电检测二合一电路

    作者:YJGQDD(阿莫论坛ID:hailing),整理:晓宇 微信公众号:芯片之家(ID:chiphome-dy) 最近修了一个苏泊尔的电高压锅,故障为开关电源板AC-DC芯片的启动电阻内部开路,导 ...

  7. 简易掉电触发电路的试验

    http://www.elecfans.com/d/782763.html 单片机掉电检测与数据掉电保存方案解读 说的很细,感谢前辈的好文 想借用一下,做个掉电触发的电路正好用上 引用原文 图纸 .. ...

  8. 【干货】STM32通过ADC模拟看门狗实现掉电保存

    1.前言 很多时候我们需要将程序中的一些参数.数据等存储在EEPROM或者Flash中,达到掉电保存的目的.但有些情况下,程序需要频繁的修改这些参数,如果每次修改参数都进行一次保存,那将大大降低存储器 ...

  9. quartus管脚分配后需要保存吗_掉电保存数据到EEPROM

    我想在掉电时保存数据(3 个字节)到 EEPROM 中,用 BOD掉电检测,不知怎样使用.望高手指点: 1. 在 BOOT 区设置好 BODEN,BODLEVEL,后软件还要怎样设置? 2. 掉电中断 ...

最新文章

  1. 第5章:可复用性的软件构建方法 5.2面向复用的构造
  2. 配置Fedora15 x86_32
  3. 借助液态金属传感器和AI,这次机械手可能真的找到感觉了
  4. python在化学方面的应用-用Python解析化学公式
  5. 写在园子里的第一篇BLOG
  6. linux 程序随命令窗口退出一起退出
  7. add git 指定类型文件夹_UE4 使用git配合远程仓库
  8. Python 打开文件注意事项
  9. 怎么进bios设置硬盘启动顺序|电脑bios硬盘启动设置方法
  10. mysql客户端备份数据库失败,mysqlhotcopy的使用和安装方法【快速备份mysql数据库】及错误解...
  11. 【工具推荐】个人本地 markdown 知识图谱软件 Obsidian
  12. java单词200个,请收藏!贼有用
  13. 浅谈批处理for命令中的变量扩展
  14. Unity实现鼠标控制摄像机围绕中心点的旋转和缩放
  15. 实名认证-身份证实名认证-身份证实名认证接口-身份证实名认证api-实名认证api接口-身份证实名认证api接口
  16. EDM数据之大数据是什么
  17. 开发技巧--发送手机验证码接口调用
  18. CUDA的Occupancy和Achieved Occupancy概念
  19. c++调用python详细教程
  20. unity软粒子softparticle仿真实现

热门文章

  1. 重要通知丨涂鸦安防SaaS产品 新版本发布!
  2. 【图像分割】基于迭代阙值选择、最大类间差、区域生长多种算法实现图像分割含Matlab源码
  3. Linux内核4.14版本——mmc core(7)——mmc core主模块(3)总线io setting相关(struct mmc_ios)
  4. [go游戏开发实践]游戏唯一id产生算法
  5. 《SMPLicit: Topology-aware Generative Model for Clothed People》论文解读
  6. 多媒体技术 第一章 多媒体技术概述
  7. 台式计算机硬盘的安装位置,台式主机扩大存储,7步教你完美安装机械硬盘
  8. latex 大于等于_Latex使用时的小技巧
  9. 牛客网赛码网 输入输出格式
  10. Unity VRAR Unity播放全景视频及优化极点变形twist问题