STC8比较器功能案例介绍

STC8比较器功能案例介绍


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

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

STC8比较器功能案例介绍_第1张图片
STC8比较器功能案例介绍_第2张图片

实验说明

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

相关寄存器配置

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

‍注意事项

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

目前市面上在售的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作为比较器输出脚。
    STC8比较器功能案例介绍_第6张图片
  • 当P11引脚电压低于内部参考电压1.186V时,接在P34引脚上的状态指示led亮起;当P11引脚电压高于内部参考电压1.186V时,接在P34引脚上的状态指示led熄灭;
    STC8比较器功能案例介绍_第7张图片
    STC8比较器功能案例介绍_第8张图片
    STC8比较器功能案例介绍_第9张图片
//测试工作频率为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系列,单片机)