国学芯用 发表于 2026-6-29 15:17:40

22-利用P3.7做比较器正极输入源,内部1.19V或P3.6口做负极输入源,STC8H8K64U实验箱演

22-利用P3.7做比较器正极输入源,内部1.19V或P3.6口做负极输入源,STC8H8K64U实验箱演示程序, STC8H2K32U, STC8H2K12U, STC8H
主程序main.C代码如下(汇编版本在附件中):

/*---------------------------------------------------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com-----------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了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;//查询方式读取比较器比较结果
    }
}


页: [1]
查看完整版本: 22-利用P3.7做比较器正极输入源,内部1.19V或P3.6口做负极输入源,STC8H8K64U实验箱演