STC8比较器功能案例介绍

news2024/10/6 8:38:57

STC8比较器功能案例介绍


  • 📌相关篇《STC8功能脚切换相关寄存器P_SW1和P_SW2以及MCLKOCR介绍》

📋基于内部参考电压源,使用外部端口P3.7作为比较器正极输入源,比较器结果输出到P3.4 或者P4.1(由P_SW2 中的CMPO_S 进行设定)上。

在这里插入图片描述
在这里插入图片描述

📑实验说明

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

🛠相关寄存器配置

  • 🍁比较器输出功能脚切换
    在这里插入图片描述
    P_SW2 &= ~0x08;                             //选择P3.4作为比较器输出脚
//		P_SW2 |= 0x08;                              //选择P4.1作为比较器输出脚
  • 🌴比较器输出结果
    在这里插入图片描述
    CMPCR2 &= ~0x80;                            //比较器正向输出
//  CMPCR2 |= 0x80;                             //比较器反向输出

🏳‍🌈注意事项

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

🔖目前市面上在售的LQFP48以及LQFP64封装的STC8H8K64U单片机大部分都是B版本的,LQFP32封装的有C、D版本的,如果默写功能的使用有特定要求的,在购买前最好和商家确认芯片具体的版本信息。

📝示例程序

  • 🔖参考代码来源于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作为比较器输出脚。
    在这里插入图片描述
  • 📋当P11引脚电压低于内部参考电压1.186V时,接在P34引脚上的状态指示led亮起;当P11引脚电压高于内部参考电压1.186V时,接在P34引脚上的状态指示led熄灭;
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
//测试工作频率为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);  //中断方式读取比较器比较结果
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/633302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle的最高认证并不是OCM,而是......

什么是Oracle数据库的最高认证呢?大家注意,不是Oracle OCM,而是Oracle高可用大师认证,全称叫:Maxium Availability Certified Master,要获得这一张证书,你需要同时有5个认证。 关于博主&#x…

Prompt 用法大全!让 ChatGPT 更智能的六种策略(中)

如果遵循以下六种策略来构建 Prompt 提示词,在和 ChatGPT 对话中我们将获得更好、更符合我们要求的回答。 这些策略,后几种更适合在编程调用 ChatGPT API 时使用,不过也适用直接和 ChatGPT 对话,让它更好的理解我们的意图。 1、写…

8.DIY可视化-拖拽设计1天搞定主流小程序-小程序首页幻灯片显示

小程序首页幻灯片显示 本教程均在第一节中项目启动下操作 小程序首页幻灯片显示前言一、添加组件: 图片轮播公告图文菜单二. 绑定幻灯片数据接口三:首页绑定接口数据:1.绑定字段 四.导出源码,解压后,导入hbulider,运行查看效果1.导出源码:2.解压,导入hbuilder 五.运行查看效果对…

Ae:蒙版插值面板

Ae菜单:窗口/蒙版插值 Mask Interpolation 蒙版插值Mask Interpolation面板可用于自动创建蒙版路径 Mask Path属性的关键帧,从而实现更平滑逼真的路径动画。 至少选择 2 个连续的蒙版路径关键帧后,智能蒙版插值将基于面板上的选项设置创建中间…

Qt5.12.6配置Android Arm开发环境(Linux)

1.安装jdk 2.安装android studio 3.安装sdk 与ndk 设置代理 安装SDK工具 安装SDK Platform 安装QT 选择JDK 1.8安装路径,SDK与NDK路径 如出现Platform SDK或者Platform Build Tools未安装,点击Update Installed 配置成功后可看到ARMv7与AMD-v8a kits Qt Version也可看到ARM…

既然有了HTTP,为什么还要RPC?

文章目录 HTTP和RPC区别RPC(Remote Procedure Call)服务流行的RPC框架 HTTP服务Restful RPC接口和HTTP接口的区别与联系传输协议传输效率性能消耗负载均衡服务治理(下游服务新增,重启,下线时如何不影响上游调用者&…

Java012——Java引用数据类型String的简单学习

回顾Java数据类型 本次要学习的是Java引用数据类型String 一、对String类简单说明 说明:String是Java中的一个类 二、String类的作用 作用:主要用来创建和操作字符串。 三、使用String类 3.1、创建字符串 注意: 1、字符串使用双引号&qu…

基于Springboot+vue+协同过滤+前后端分离+鲜花商城推荐系统(用户,多商户,管理员)+全套视频教程

基于Springbootvue协同过滤前后端分离鲜花商城推荐系统(用户,多商户,管理员)(毕业论文11000字以上,共33页,程序代码,MySQL数据库) 代码下载: 链接:https://pan.baidu.com/s/1mf2rsB_g1DutFEXH0bPCdA 提取码:8888 【运行环境】Idea JDK1.8 Maven MySQL…

【网络原理】TCP/IP协议五层模型

🥊作者:一只爱打拳的程序猿,Java领域新星创作者,CSDN、阿里云社区优质创作者。 🤼专栏收录于:计算机网络原理 本期讲解协议、OSI七层模型、TCP/IP五层模型、网络设备所在的分层、数据的封装和分佣。 目录 …

Linux基础内容(22)—— 信号

Linux基础内容(21)—— 进程消息队列和信号量_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130770830?spm1001.2014.3001.5501 目录 1.定义 1.介绍 2.解释 例子 操作系统信号 实现的大致思路 2.信号的产生方式 …

【C语言】计算含多种运算符的表达式

计算含多种运算符的表达式 引入运算符的优先级算术表达式的运算规则引例例题 引入 诸如下面这些表达式,它的计算过程,计算顺序是怎样的?计算结果为多少? 今天我们就一起来解决一下这个问题吧! 运算符的优先级 解决…

6.数据结构期末复习之查找和排序1

概念 静态查找: 无插入和删除 动态查找: 边插入删除边查找静态和动态查找的实现方式 1.线性表: 静态查 2.树表(二叉排序树)动态查 3.散列表 静态动态都可以查找: 集合中查找满足条件的数据关键码 1.主关键码:可以表标识数据唯一性 2.次关键码: 不能标识查找效率: 比较次数决定的…

八、进程程序替换

文章目录 一、进程程序替换(一)概念(二)为什么程序替换(三)程序替换的原理(四)如何进行程序替换1. execl2. 引入进程创建——子进程执行程序替换,会不会影响父进程呢? &…

PDF 内容替换器软件工具 PDF Replacer Pro Crack

PDF 内容替换器软件工具 批量查找和替换 PDF 中的指定文本 PDF Replacer 是一款 Windows 软件程序,可在 PDF 文件中查找指定的单词或短语文本并替换为新文本,并保持 PDF 布局不变。 Windows 7/Win 8/Win 10 或更高版本(32/64 位) …

devart ADO.NET Data Providers 2023

ADO.NET Data Providers 2023 dotConnect 开发与数据相关的 .NET 应用程序的终极解决方案,具有 ORM 支持的快速灵活综合功能丰富的 ADO.NET 提供程序 ADO.NET 数据提供者 高性能 ADO.NET 数据提供程序 dotConnect 是一个增强的数据连接解决方​​案,它建立在 ADO.N…

为什么齐次线性方程组有非零解的充要条件是D=0

下面是对这两个定理的解释: 定理1:如果是齐次线性方程组(方程个数未知量个数),且系数行列式D不等于0,则只有0解; 定理2:若齐次线性方程组(方程个数未知量个数&#xff…

C语言---形参所导致的段错误

前言 今天刷B站&#xff0c;无意之间看到一个宣称90%人都会错的嵌入式面试题。感兴趣就看了一下。卡了十多分钟才想明白&#xff0c;只是一个小知识点&#xff0c;但还是分享一下。 题目 #include <stdio.h> #include <stdlib.h> #include <string.h>void g…

如何将bootloader和APP程序一次性烧录到单片机中

在做单片机的IAP升级时&#xff0c;通常需要两个程序&#xff0c;一个bootloader程序&#xff0c;一个app程序。首先将bootloader程序烧写到单片机中&#xff0c;然后通过串口将app程序写入到单片机内容&#xff0c;在平时学习和测试的时候这种方法没啥问题&#xff0c;但是如果…

K8S 生态周报| Ingress-NGINX v1.8 发布,升级前请先检查

“ 「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s生态」[1]。 ” 大家好&#xff0c;我是张晋涛。 很抱歉&#xff0c;最近一段时间真的太忙了&#xff0c;写文章都断断续续的。主要在使用 Langchain 搭配 GPT-4 开发…

Nginx扩展篇之Location语法规则

1 Location语法规则 1.1 Location规则 语法规则&#xff1a; location [||*|^~] /uri/ {… } 首先匹配 &#xff0c;其次匹配^~,其次是按文件中顺序的正则匹配&#xff0c;最后是交给 /通用匹配。当有匹配成功时候&#xff0c;停止匹配&#xff0c;按当前匹配规则处理请求。 …