STC8比较器功能案例介绍
- 📌相关篇《STC8功能脚切换相关寄存器P_SW1和P_SW2以及MCLKOCR介绍》
📋基于内部参考电压源,使用外部端口P3.7作为比较器正极输入源,比较器结果输出到P3.4 或者P4.1(由P_SW2 中的CMPO_S 进行设定)上。
📑实验说明
- 🌿采用10K电位器,0 - 5V可调电压范围,可调端接到P37外部端口引脚上,当调节电位器,使电压在1.2V左右时,接在在外部端口引脚P3.4 或者P4.1上的led灯状态有变化,也就是可以看到比较器输出结果。
🛠相关寄存器配置
- 🍁比较器输出功能脚切换
P_SW2 &= ~0x08; //选择P3.4作为比较器输出脚
// P_SW2 |= 0x08; //选择P4.1作为比较器输出脚
- 🌴比较器输出结果
CMPCR2 &= ~0x80; //比较器正向输出
// CMPCR2 |= 0x80; //比较器反向输出
🏳🌈注意事项
- 👉🏻STC8H8K64U 的B 版本芯片,比较器不能选择ADC 通道作为正极输入。(这一点坑了我好久,多注意看芯片手册中附录内容:注意事项,留意版本信息)
🔖目前市面上在售的LQFP48以及LQFP64封装的STC8H8K64U单片机大部分都是B版本的,LQFP32封装的有C、D版本的,如果默写功能的使用有特定要求的,在购买前最好和商家确认芯片具体的版本信息。
📝示例程序
- 🔖参考代码来源于STC8实验箱。
- 🖋本代码通过比较器功能,将结果不仅输出到对应的P34/P41引脚上,还将结果赋值给了P47口。
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- Web: www.STCMCUDATA.com ---------------------------------------*/
/* --- BBS: www.STCAIMCU.com -----------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了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; //查询方式读取比较器比较结果
}
}
📝比较器选择ADC 通道作为比较器正极(CMP+)输入端程序示例
- ✨本程序注意所使用的芯片版本信息,必须大于B版本。
- ⚡经测试,使用查询方式可以获取比较器结果,使用中断方式不行。
- 🌿使用ADC 输入脚作为CMP+输入脚,将P11作为ADC通道输入脚,P3.4作为比较器输出脚。
- 📋当P11引脚电压低于内部参考电压1.186V时,接在P34引脚上的状态指示led亮起;当P11引脚电压高于内部参考电压1.186V时,接在P34引脚上的状态指示led熄灭;
//测试工作频率为11.0592MHz
#include "stc8h.h"
#include "intrins.h"
//void CMP_Isr() interrupt 21
//{
// CMPCR1 &= ~0x40; //清中断标志
// P21 = !(CMPCR1 & 0x01); //中断方式读取比较器比较结果
//}
void main()
{
P_SW2 |= 0x80; //使能访问XFR
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
// P1M0 &= 0xfe; //设置P1.0 为输入口
P1M0 &= 0xfd; //设置P1.1 为输入口
// P1M0 &= 0xfb; //设置P1.3 为输入口
P1M1 |= 0x02;//设置P1.1 为输入口
// P1M1 |= 0x03;//设置P1.3 为输入口
// P1M0 = 0x00;
// P1M1 = 0xff;
ADC_CONTR = 0x81; //使能ADC 模块并选择P1.1 为ADC 输入脚
CMPEXCFG = 0x00;
// CMPEXCFG &= ~0x03; //P3.7 为CMP+输入脚
// CMPEXCFG |= 0x01; //P5.0 为CMP+输入脚
// CMPEXCFG |= 0x02; //P5.1 为CMP+输入脚
CMPEXCFG |= 0x03; //ADC 输入脚为CMP+输入脚
// CMPEXCFG &= ~0x04; //P3.6 为CMP-输入脚
CMPEXCFG |= 0x04; //内部1.19V 参考电压为CMP-输入脚
CMPCR2 = 0x00;
// CMPCR2 &= ~0x80; //比较器正向输出
CMPCR2 |= 0x80; //比较器反向输出
// CMPCR1 &= ~0x02; //禁止比较器输出
CMPCR1 = 0x00;
P_SW2 &= ~0x08; //选择P3.4作为比较器输出脚
// P_SW2 |= 0x08; //选择P4.1作为比较器输出脚
CMPCR1 |= 0x02; //使能比较器输出
CMPCR1 |= 0x80;
// EA = 1;
while(1)
{
P21 = (CMPCR1 & 0x01); //中断方式读取比较器比较结果
}
}