芯启元 发表于 2026-6-29 16:05:17

20-利用P5.0做比较器正极输入源,内部1.19V或P5.1口做负极输入源,STC32G144K246实验

20-利用P5.0做比较器正极输入源,内部1.19V或P5.1口做负极输入源,STC32G144K246实验箱演示程序
主程序main.C代码如下(汇编版本在附件中):


/*---------------------------------------------------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com-----------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序      */
/*---------------------------------------------------------------------*/

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

本例程基于STC32G144K246为主控芯片的实验箱进行编写测试。

使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。

edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。

比较器的正极可以是 P3.7、P5.0、OP1O、ADCIN、DAC1O、DAC2O 端口,

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

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

下载时, 选择时钟 48MHz (用户可自行修改频率)。

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

#include "..\..\comm\STC32G144K246.h"

typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

/****************用户定义宏****************/

#define   MAIN_Fosc   48000000UL

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

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

/********************* 主函数 *************************/
void main(void)
{
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出
    P4M1 = 0x00;   P4M0 = 0xc0;   //设置为推挽输出
    PAM1 = 0x00;   PAM0 = 0xff;   //设置为推挽输出

//CMP1_6P6N_CR1 &= ~0x20;   //禁止比较器上升沿中断
    CMP1_6P6N_CR1 |= 0x20;      //使能比较器上升沿中断
//CMP1_6P6N_CR1 &= ~0x10;   //禁止比较器下降沿中断
    CMP1_6P6N_CR1 |= 0x10;      //使能比较器下降沿中断

    CMP1_6P6N_CR1 &= ~0x0c;   //比较器中断最低优先级
//CMP1_6P6N_CR1 |= 0x04;      //比较器中断较低优先级
//CMP1_6P6N_CR1 |= 0x08;      //比较器中断较高优先级
//CMP1_6P6N_CR1 |= 0x0c;      //比较器中断最高优先级

//CMP1_6P6N_CR1 &= ~0x02;   //禁止比较结果输出
    CMP1_6P6N_CR1 |= 0x02;      //使能比较结果输出

    CMP1_6P6N_CR2 &= ~0x80;   //比较器结果正向输出
//CMP1_6P6N_CR2 |= 0x80;      //比较器结果反向输出

//CMP1_6P6N_CR2 &= ~0x40;   //关闭0.1us模拟滤波功能
    CMP1_6P6N_CR2 |= 0x40;      //使能0.1us模拟滤波功能

    CMP1_6P6N_CR2 &= ~0x3f;   //关闭数字滤波
    CMP1_6P6N_CR2 |= 0x10;      //使能(n+2)个系统时钟数字滤波

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

    CMP1_6P6N_CR3 &= ~0x3f;   //CMP1+: P3.7, CMP1-: P3.6
    CMP1_6P6N_CR3 |= 0x01;      //CMP1+: P5.0
//CMP1_6P6N_CR3 |= 0x02;      //CMP1+: OP1O
//CMP1_6P6N_CR3 |= 0x03;      //CMP1+: ADCIN
//CMP1_6P6N_CR3 |= 0x04;      //CMP1+: DAC1O
//CMP1_6P6N_CR3 |= 0x05;      //CMP1+: DAC2O

//CMP1_6P6N_CR3 |= 0x08;      //CMP1-: P5.1
//CMP1_6P6N_CR3 |= 0x10;      //CMP1-: OP2O
    CMP1_6P6N_CR3 |= 0x18;      //CMP1-: BGV(1.19V)
//CMP1_6P6N_CR3 |= 0x20;      //CMP1-: DAC1O
//CMP1_6P6N_CR3 |= 0x28;      //CMP1-: DAC2O

    CMP1_6P6N_CR4 &= ~0x03;   //CMP1O: P3.4
//CMP1_6P6N_CR4 |= 0x01;      //CMP1O: P4.1

//CMP1_6P6N_CR1 &= ~0x80;   //关闭比较器1模块
    CMP1_6P6N_CR1 |= 0x80;      //使能比较器1模块

    EA = 1;

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


页: [1]
查看完整版本: 20-利用P5.0做比较器正极输入源,内部1.19V或P5.1口做负极输入源,STC32G144K246实验