- 打卡等级:以坛为家I
- 打卡总天数:274
- 最近打卡:2026-07-21 08:44:27
已绑定手机
超级版主
- 积分
- 3313

|
21-利用P4.6做比较器正极输入源,内部1.19V做负极输入源,AI8051U实验箱演示程序
主程序main.C代码如下(汇编版本在附件中):
/*---------------------------------------------------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com -----------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
/************* 功能说明 **************
本例程基于AI8051U为主控芯片的实验箱进行编写测试。
使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
比较器的正极可以是 P4.6、P5.0、P5.1 端口或者 ADC 的模拟输入通道,
而负极可以是 P4.4 端口或者是内部 BandGap 经过 OP 后的 REFV 电压(1.19V内部固定比较电压)。
通过中断或者查询方式读取比较器比较结果,CMP+的电平低于CMP-的电平P43口输出低电平(LED10亮),反之输出高电平(LED10灭)。
下载时, 选择时钟 24MHz (用户可自行修改频率).
******************************************/
#include "..\..\comm\AI8051U.h"
#include "stdio.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define MAIN_Fosc 24000000UL
/*****************************************************************************/
void CMP_Isr() interrupt 21
{
CMPIF = 0; //清中断标志
P43 = CMPRES; //中断方式读取比较器比较结果
}
/********************* 主函数 *************************/
void main(void)
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
CMPEXCFG = 0x00;
// CMPEXCFG |= 0x40; //比较器DC迟滞输入选择,0:0mV; 0x40:10mV; 0x80:20mV; 0xc0:30mV
// CMPEXCFG &= ~0x04; //P4.4为CMP-输入脚
CMPEXCFG |= 0x04; //内部1.19V参考电压为CMP-输入脚
CMPEXCFG &= ~0x03; //P4.6为CMP+输入脚
// CMPEXCFG |= 0x01; //P5.0为CMP+输入脚
// CMPEXCFG |= 0x02; //P5.1为CMP+输入脚
// CMPEXCFG |= 0x03; //ADC输入脚为CMP+输入脚
CMPCR2 = 0x00;
INVCMPO = 0; //比较器正向输出
// INVCMPO = 1; //比较器反向输出
DISFLT = 0; //使能0.1us滤波
// DISFLT = 1; //禁止0.1us滤波
// CMPCR2 &= ~0x3f; //比较器结果直接输出
CMPCR2 |= 0x10; //比较器结果经过16个去抖时钟后输出
CMPCR1 = 0x00;
// PIE = 0; //禁止比较器上升沿中断
PIE = 1; //使能比较器上升沿中断
// NIE = 0; //禁止比较器下降沿中断
NIE = 1; //使能比较器下降沿中断
// CMPOE = 0; //禁止比较器输出
CMPOE = 1; //使能比较器输出
CMPO_S = 0; //选择P4.5作为比较器输出脚
// CMPO_S = 1; //选择P4.1作为比较器输出脚
CMPEN = 1; //使能比较器模块
EA = 1;
while (1)
{
// P43 = CMPRES; //查询方式读取比较器比较结果
}
}
//========================================================================
21-利用P4.6做比较器正极输入源,内部1.19V做负极输入源.zip
(15.61 KB, 下载次数: 2)
|
|