STC8比较器功能案例介绍

这篇具有很好参考价值的文章主要介绍了STC8比较器功能案例介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STC8比较器功能案例介绍


  • 📌相关篇《STC8功能脚切换相关寄存器P_SW1和P_SW2以及MCLKOCR介绍》
📋基于内部参考电压源,使用外部端口P3.7作为比较器正极输入源,比较器结果输出到P3.4 或者P4.1(由P_SW2 中的CMPO_S 进行设定)上。

STC8比较器功能案例介绍
STC8比较器功能案例介绍

📑实验说明

  • 🌿采用10K电位器,0 - 5V可调电压范围,可调端接到P37外部端口引脚上,当调节电位器,使电压在1.2V左右时,接在在外部端口引脚P3.4 或者P4.1上的led灯状态有变化,也就是可以看到比较器输出结果。

🛠相关寄存器配置

  • 🍁比较器输出功能脚切换
    STC8比较器功能案例介绍
    P_SW2 &= ~0x08;                             //选择P3.4作为比较器输出脚
//		P_SW2 |= 0x08;                              //选择P4.1作为比较器输出脚
  • 🌴比较器输出结果
    STC8比较器功能案例介绍
    CMPCR2 &= ~0x80;                            //比较器正向输出
//  CMPCR2 |= 0x80;                             //比较器反向输出

🏳‍🌈注意事项

  • 👉🏻STC8H8K64U 的B 版本芯片,比较器不能选择ADC 通道作为正极输入。(这一点坑了我好久,多注意看芯片手册中附录内容:注意事项,留意版本信息)
    STC8比较器功能案例介绍

🔖目前市面上在售的LQFP48以及LQFP64封装的STC8H8K64U单片机大部分都是B版本的,LQFP32封装的有C、D版本的,如果默写功能的使用有特定要求的,在购买前最好和商家确认芯片具体的版本信息。文章来源地址https://www.toymoban.com/news/detail-483024.html

📝示例程序

  • 🔖参考代码来源于STC8实验箱。
  • 🖋本代码通过比较器功能,将结果不仅输出到对应的P34/P41引脚上,还将结果赋值给了P47口。
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- Web: www.STCMCUDATA.com  ---------------------------------------*/
/* --- BBS: www.STCAIMCU.com  -----------------------------------------*/
/* --- QQ:  800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
/*---------------------------------------------------------------------*/


/*************  功能说明    **************

本例程基于STC8H8K64U为主控芯片的实验箱9进行编写测试,STC8H系列支持新版本比较器芯片可通用参考.

比较器的正极可以是 P3.7、P5.0、P5.1 端口或者 ADC 的模拟输入通道,

而负极可以是 P3.6 端口或者是内部 BandGap 经过 OP 后的 REFV 电压(1.19V内部固定比较电压)。

通过中断或者查询方式读取比较器比较结果,CMP+的电平低于CMP-的电平P47口输出低电平(LED10亮),反之输出高电平(LED10灭)。

******************************************/

#include "stc8h.h"       //包含此头文件后,不需要再包含"reg51.h"头文件
#include "intrins.h"

void CMP_Isr() interrupt 21
{
    CMPCR1 &= ~0x40;                         //清中断标志
    P47 = CMPCR1 & 0x01;                     //中断方式读取比较器比较结果
}

void main()
{
    P_SW2 |= 0x80;  //扩展寄存器(XFR)访问使能

    P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P1M1 = 0x30;   P1M0 = 0x30;   //设置P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P2M1 = 0x3c;   P2M0 = 0x3c;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P3M1 = 0x50;   P3M0 = 0x50;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
    P4M1 = 0x3c;   P4M0 = 0x3c;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P5M1 = 0x0c;   P5M0 = 0x0c;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
    P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
	

    CMPEXCFG = 0x00;
//  CMPEXCFG |= 0x40;                           //比较器DC迟滞输入选择,0:0mV; 0x40:10mV; 0x80:20mV; 0xc0:30mV

//  CMPEXCFG &= ~0x04;                          //P3.6为CMP-输入脚
    CMPEXCFG |= 0x04;                           //内部1.19V参考电压为CMP-输入脚

    CMPEXCFG &= ~0x03;                          //P3.7为CMP+输入脚
//  CMPEXCFG |= 0x01;                           //P5.0为CMP+输入脚
//  CMPEXCFG |= 0x02;                           //P5.1为CMP+输入脚
//  CMPEXCFG |= 0x03;                           //ADC输入脚为CMP+输入脚

    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 &= ~0x02;                            //禁止比较器输出
    CMPCR1 |= 0x02;                             //使能比较器输出

    P_SW2 &= ~0x08;                             //选择P3.4作为比较器输出脚
//		P_SW2 |= 0x08;                              //选择P4.1作为比较器输出脚
    CMPCR1 |= 0x80;                             //使能比较器模块

    EA = 1;

    while (1)
    {
//      P50 = CMPCR1 & 0x01;  //查询方式读取比较器比较结果
    }
}

📝比较器选择ADC 通道作为比较器正极(CMP+)输入端程序示例

  • ✨本程序注意所使用的芯片版本信息,必须大于B版本。
  • 经测试,使用查询方式可以获取比较器结果,使用中断方式不行。
  • 🌿使用ADC 输入脚作为CMP+输入脚,将P11作为ADC通道输入脚,P3.4作为比较器输出脚。
    STC8比较器功能案例介绍
  • 📋当P11引脚电压低于内部参考电压1.186V时,接在P34引脚上的状态指示led亮起;当P11引脚电压高于内部参考电压1.186V时,接在P34引脚上的状态指示led熄灭;
    STC8比较器功能案例介绍
    STC8比较器功能案例介绍
    STC8比较器功能案例介绍
//测试工作频率为11.0592MHz
#include "stc8h.h"
#include "intrins.h"

//void CMP_Isr() interrupt 21
//{
//    CMPCR1 &= ~0x40; //清中断标志
//		P21 = !(CMPCR1 & 0x01);  //中断方式读取比较器比较结果
//}

void main()
{
    P_SW2 |= 0x80; //使能访问XFR
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

//    P1M0 &= 0xfe; //设置P1.0 为输入口
    P1M0 &= 0xfd; //设置P1.1 为输入口
//		    P1M0 &= 0xfb; //设置P1.3 为输入口
    P1M1 |= 0x02;//设置P1.1 为输入口
//	P1M1 |= 0x03;//设置P1.3 为输入口
//    P1M0 = 0x00;
//    P1M1 = 0xff;

    ADC_CONTR = 0x81; //使能ADC 模块并选择P1.1 为ADC 输入脚

    CMPEXCFG = 0x00;
// CMPEXCFG &= ~0x03; //P3.7 为CMP+输入脚
// CMPEXCFG |= 0x01; //P5.0 为CMP+输入脚
// CMPEXCFG |= 0x02; //P5.1 为CMP+输入脚
    CMPEXCFG |= 0x03; //ADC 输入脚为CMP+输入脚
//    CMPEXCFG &= ~0x04; //P3.6 为CMP-输入脚
    CMPEXCFG |= 0x04; //内部1.19V 参考电压为CMP-输入脚

    CMPCR2 = 0x00;
    //    CMPCR2 &= ~0x80;                            //比较器正向输出
    CMPCR2 |= 0x80;                             //比较器反向输出
    
//  CMPCR1 &= ~0x02;  //禁止比较器输出
    CMPCR1 = 0x00;
    P_SW2 &= ~0x08;                             //选择P3.4作为比较器输出脚
//		P_SW2 |= 0x08;                              //选择P4.1作为比较器输出脚

    CMPCR1 |= 0x02; //使能比较器输出
    CMPCR1 |= 0x80;
//    EA = 1;
    while(1)
    {
			P21 = (CMPCR1 & 0x01);  //查询方式读取比较器比较结果
    }
}

到了这里,关于STC8比较器功能案例介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 认识比较器

    Java中比较器是排序、加入有序数组等操作的时候必须要有的,没有的话会报错,例如下面这段代码: 运行时会发生下面的异常 Exception in thread \\\"main\\\" java.lang.ClassCastException: dataStructure.heap.Student cannot be cast to java.lang.Comparable     at java.util.ComparableTimSort.countRunAndMakeAscending(Compar

    2023年04月25日
    浏览(53)
  • Java ---比较器

          我们知道基本数据类型的数据(除 boolean 类型外)需要比较大小的话,之间使用比较运算符即可,但是引用数据类型是不能直接使用比较运算符来比较大小的。那么,如何解决这个问题呢?      在 Java 中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比

    2024年02月03日
    浏览(43)
  • 8.2 电压比较器(1)

    电压比较器是对输入信号进行鉴幅与比较的电路,是组成非正弦波发生电路的基本单元电路,在测量和控制中有着相当广泛的应用。 1、电压比较器的电压传输特性 电压比较器的输出电压 u O u_{scriptscriptstyle O} u O ​ 与输入电压 u I u_{scriptscriptstyle I} u I ​ 的函数关系 u O = f

    2024年02月11日
    浏览(50)
  • 一位比较器【模电实验】

    一位比较器,数值比较器的作用和原理是什么? 一、数值比较器的定义及功能 在数字系统中,特别是在计算机中都具有运算功能,一种简单的运算就是比较两个数A和B的大小。数值比较器就是对两数A、B进行比较,以判断其大小的逻辑电路。比较结果有A>B、A<B以及

    2024年02月05日
    浏览(60)
  • Verilog | 4位数值比较器

    牛客上的一道题,记录一下 这道题有两种思路: 第一种是按位比较,列举出所有情况: 第二种方法是,使用同或的方式获取一个标志位,进而获得判断依据: 关于比较器还有另外一道题 问题描述 给定8个数,以及若干二输入的比较器(可以将两个输入排序)。要求在单周期

    2024年02月11日
    浏览(39)
  • JAVA语言-比较器Comparator

    目录 一、什么是Comparator 二、Java compare方法和compareTo方法 三、java中Comparable和Comparator的区别 Comparator的例子 Comparator 是javase中的接口,位于java.util包下。 数组工具类和集合工具类中提供的工具方法sort方法都给出了含有Comparator接口的重载方法。 List实例调sort方法 demo如下: 使

    2024年02月06日
    浏览(47)
  • Java比较器(Comparator接口)

    1.当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序 2.重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回

    2024年02月15日
    浏览(48)
  • Java中的比较器(Comparator)

    Java中的比较器(Comparator)是一种对象,用于定义两个对象之间的比较规则。它是一个独立的类,实现了Comparator接口,通常用于对集合中的元素进行排序。Comparator接口中有一个compare()方法,它接受两个对象作为参数,并返回一个int值,表示它们的顺序。 下面是一个简单的例

    2024年02月11日
    浏览(48)
  • 【Verilog基础】二进制比较器

    1、1、一位数值比较器(是多位比较器的基础) 1、真值表: 2、由真值表推逻辑表达式: 3、逻辑电路:

    2024年02月05日
    浏览(51)
  • 运算放大器和比较器的区别

    前言   鄙人不才,数模电没学好,一直以为比较器就是用运算放大器来设计的,直到今天,才意识到运算放大器(Op-Amp)和比较器(Comparator)在功能特性上是有区别的,在器件选型时候要根据具体应用场景来选择。 下面讲解一下区别: 1、 运算放大器的作用是放大输入之

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包