- 打卡等级:常住居民I
- 打卡总天数:78
- 最近打卡:2026-07-21 13:27:09
已绑定手机
版主
- 积分
- 1069
|
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); //查询方式读取比较器比较结果
}
}
//========================================================================
|
|