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]