找回密码
 立即注册
查看: 1131|回复: 19

视频讲解:比较器,STC8H系列数据手册 比较器 内容

[复制链接]

该用户从未签到

551

主题

9299

回帖

1万

积分

管理员

积分
14049
发表于 2023-9-26 18:57:15 | 显示全部楼层 |阅读模式
视频讲解比较器
截图202310040848168161.jpg
https://www.stcaimcu.com/forum.p ... 3184&extra=page%3D1


17 比较器,掉电检测,内部1.19V参考信号源(BGV

截图202309261856525314.jpg

      STC8H系列单片机内部集成了一个比较器。比较器的正极可以是P3.7端口或者ADC的模拟输入通道
新版比较器的正极可以是P3.7端口、P5.0端口、P5.1端口或者ADC的模拟输入通道),而负极可以P3.6
端口或者是内部BandGap经过OP后的REFV电压(内部固定比较电压)。通过多路选择器和分时复用可实
现多个比较器的应用

比较器内部有可程序控制的两级滤波:模拟滤波和数字滤波。模拟滤波可以过滤掉比较输入信号中的毛刺
信号,数字滤波可以等待输入信号更加稳定后再进行比较。比较结果可直接通过读取内部寄存器位获得,
也可将比较器结果正向或反向输出到外部端口。将比较结果输出到外部端口可用作外部事件的触发信号和
反馈信号,可扩大比较的应用范围。

回复 送花

使用道具 举报

该用户从未签到

551

主题

9299

回帖

1万

积分

管理员

积分
14049
 楼主| 发表于 2023-9-26 19:00:49 | 显示全部楼层
17.1  比较器内部结构图
截图202309261859494487.jpg

截图202309261900149149.jpg

回复 支持 反对 送花

使用道具 举报

该用户从未签到

551

主题

9299

回帖

1万

积分

管理员

积分
14049
 楼主| 发表于 2023-9-26 19:02:50 | 显示全部楼层
17.2       比较器输出功能脚切换
截图202309261902446198.jpg

17.3  比较器相关的寄存器
截图202309261904257646.jpg


17.3.1          比较器控制寄存器1CMPCR1

截图202309261906233272.jpg

CMPEN:比较器模块使能位
0:关闭比较功能
1:使能比较功能
CMPIF:比较器中断标志位。当PIE或NIE被使能后,若产生相应的中断信号,硬件自动将CMPIF置1,并向CPU提出中断请求。此标志位必须用户软件清零。
(注意:没有使能比较器中断时,硬件不会设置此中断标志,即使用查询方式访问比较器时,不能查询此中断标志)
PIE:比较器上升沿中断使能位。
0:禁止比较器上升沿中断。
1:使能比较器上升沿中断。使能比较器的比较结果由0变成1时产生中断请求。
NIE:比较器下降沿中断使能位。
0:禁止比较器下降沿中断。
1:使能比较器下降沿中断。使能比较器的比较结果由1变成0时产生中断请求。
PIS:比较器的正极选择位(适用于旧版比较器,新版比较器使用CMPEXCFG中的CMPPS进行选择)
0:选择外部端口P3.7为比较器正极输入源。
1:通过ADC_CONTR中的ADC_CHS位选择ADC的模拟输入端作为比较器正极输入源。
(注意1:当比较器正极选择ADC输入通道时,请务必要打开ADC_CONTR寄存器中的ADC电源控制位ADC_POWERADC通道选择位ADC_CHS
(注意2:当需要使用比较器中断唤醒掉电模式/时钟停振模式时,比较器正极必须选择P3.7,不能使用ADC输入通道)
NIS:比较器的负极选择位(适用于旧版比较器,新版比较器使用CMPEXCFG中的CMPNS进行选择)
0:选择内部BandGap经过OP后的电压REFV作为比较器负极输入源。 (芯片在出厂时,内部参考信号源调整为1.19V)
1:选择外部端口P3.6为比较器负极输入源。
CMPOE:比较器结果输出控制位
0:禁止比较器结果输出
1:使能比较器结果输出。比较器结果输出到P3.4或者P4.1(由P_SW2中的CMPO_S进行设定)
CMPRES:比较器的比较结果。此位为只读。
0:表示CMP+的电平低于CMP-的电平
1:表示CMP+的电平高于CMP-的电平
CMPRES是经过数字滤波后的输出信号,而不是比较器的直接输出结果。

回复 支持 反对 送花

使用道具 举报

该用户从未签到

551

主题

9299

回帖

1万

积分

管理员

积分
14049
 楼主| 发表于 2023-9-26 19:11:02 | 显示全部楼层
17.3.2  比较器控制寄存器2CMPCR2

截图202309261909453469.jpg

INVCMPO:比较器结果输出控制
0:比较器结果正向输出。若CMPRES为0,则P3.4/P4.1输出低电平,反之输出高电平。
1:比较器结果反向输出。若CMPRES为0,则P3.4/P4.1输出高电平,反之输出低电平。
DISFLT:模拟滤波功能控制
0:使能0.1us模拟滤波功能
1:关闭0.1us模拟滤波功能,可略微提高比较器的比较速度。
LCDTY[5:0]:数字滤波功能控制
数字滤波功能即为数字信号去抖动功能。当比较结果发生上升沿或者下降沿变化时,比较器侦测变化后的信号必须维持LCDTY所设置的CPU时钟数不发生变化,才认为数据变化是有效的;否则将视同信号无变化。
注意:当使能数字滤波功能后,芯片内部实际的等待时钟需额外增加两个状态机切换时间,即若LCDTY设置为0时,为关闭数字滤波功能;若LCDTY设置为非0值n(n=1~63)时,则实际的数字滤波时间为(n+2)个系统时钟

截图202309261910521125.jpg

回复 支持 反对 送花

使用道具 举报

该用户从未签到

551

主题

9299

回帖

1万

积分

管理员

积分
14049
 楼主| 发表于 2023-9-26 19:14:16 | 显示全部楼层
17.3.3          比较器扩展配置寄存器(CMPEXCFG
截图202309261912212011.jpg

CHYS[1:0]:比较器DC迟滞输入选择
截图202309261913215974.jpg
CMPNS:比较器负端输入选择
0:P3.6
1:选择内部BandGap经过OP后的电压REFV作为比较器负极输入源 (芯片在出厂时,内部参考电压调整为1.19V

CMPPS[1:0]:比较器正端输入选择
截图202309261914123698.jpg


回复 支持 反对 送花

使用道具 举报

该用户从未签到

551

主题

9299

回帖

1万

积分

管理员

积分
14049
 楼主| 发表于 2023-9-26 19:15:55 | 显示全部楼层
17.4         范例程序17.4.1                 旧版比较器的使用(中断方式)
C语言代码

//测试工作频率为11.0592MHz
#include "stc8h.h"
#include "intrins.h"
void CMP_Isr() interrupt 21
{
         CMPCR1 &= ~0x40;                                                                    //清中断标志
         if (CMPCR1 &0x01)
         {
                   P10 = !P10;                                                                         //上升沿中断测试端口
         }
         else
         {
                   P11 = !P11;                                                                          //下降沿中断测试端口
         }
}
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;
         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 &= ~0x08;                                                                    //P3.7CMP+输入脚
//       CMPCR1 |= 0x08;                                                                        //ADC输入脚为CMP+输入脚
//       CMPCR1 &= ~0x04;                                                                    //内部1.19V参考信号源为CMP-输入脚
         CMPCR1 |= 0x04;                                                                        //P3.6CMP-输入脚
//       CMPCR1 &= ~0x02;                                                                    //禁止比较器输出
         CMPCR1 |= 0x02;                                                                        //使能比较器输出
         CMPCR1 |= 0x80;                                                                        //使能比较器模块
         EA = 1;
         while (1);
}

汇编代码

;测试工作频率为11.0592MHz
P_SW2                DATA                  0BAH
CMPCR1            DATA                  0E6H
CMPCR2            DATA                  0E7H
P1M1                  DATA                  091H
P1M0                  DATA                  092H
P0M1                  DATA                  093H
P0M0                  DATA                  094H
P2M1                  DATA                  095H
P2M0                  DATA                  096H
P3M1                  DATA                  0B1H
P3M0                  DATA                  0B2H
P4M1                  DATA                  0B3H
P4M0                  DATA                  0B4H
P5M1                  DATA                  0C9H
P5M0                  DATA                  0CAH
                            ORG                   0000H
                            LJMP                  MAIN
                            ORG                   00ABH
                            LJMP                  CMPISR
                            ORG                   0100H
CMPISR:
                            PUSH                 ACC
                            ANL                    CMPCR1,#NOT 40H                     ;清中断标志
                            MOV                   A,CMPCR1
                            JB                       ACC.0,RSING
FALLING:
                            CPL                     P1.0                                                 ;下降沿中断测试端口
                            POP                    ACC
                            RETI
RSING:
                            CPL                     P1.1                                                 ;上升沿中断测试端口
                            POP                    ACC
                            RETI
MAIN:
                            MOV                   SP, #5FH
                            ORL                    P_SW2,#80H                                  ;使能访问XFR
                            MOV                   P0M0, #00H
                            MOV                   P0M1, #00H
                            MOV                   P1M0, #00H
                            MOV                   P1M1, #00H
                            MOV                   P2M0, #00H
                            MOV                   P2M1, #00H
                            MOV                   P3M0, #00H
                            MOV                   P3M1, #00H
                            MOV                   P4M0, #00H
                            MOV                   P4M1, #00H
                            MOV                   P5M0, #00H
                            MOV                   P5M1, #00H
                            MOV                   CMPCR2,#00H
                            ANL                    CMPCR2,#NOT 80H                     ;比较器正向输出
;                           ORL                    CMPCR2,#80H                              ;比较器反向输出
                            ANL                    CMPCR2,#NOT 40H                     ;使能0.1us滤波
;                           ORL                    CMPCR2,#40H                              ;禁止0.1us滤波
;                           ANL                    CMPCR2,#NOT 3FH                    ;比较器结果直接输出
                            ORL                    CMPCR2,#10H                              ;比较器结果经过16个去抖时钟后输出
                            MOV                   CMPCR1,#00H
                            ORL                    CMPCR1,#30H                              ;使能比较器边沿中断
;                           ANL                    CMPCR1,#NOT 20H                     ;禁止比较器上升沿中断
;                           ORL                    CMPCR1,#20H                              ;使能比较器上升沿中断
;                           ANL                    CMPCR1,#NOT 10H                     ;禁止比较器下降沿中断
;                           ORL                    CMPCR1,#10H                              ;使能比较器下降沿中断
                            ANL                    CMPCR1,#NOT 08H                     ;P3.7CMP+输入脚
;                           ORL                    CMPCR1,#08H                              ;ADC输入脚为CMP+输入脚
;                           ANL                    CMPCR1,#NOT 04H                     ;内部1.19V参考信号源为CMP-输入脚
                            ORL                    CMPCR1,#04H                              ;P3.6CMP-输入脚
;                           ANL                    CMPCR1,#NOT 02H                     ;禁止比较器输出
                            ORL                    CMPCR1,#02H                              ;使能比较器输出
                            ORL                    CMPCR1,#80H                              ;使能比较器模块
                            SETB                  EA
                            JMP                    $
                            END


回复 支持 反对 送花

使用道具 举报

该用户从未签到

551

主题

9299

回帖

1万

积分

管理员

积分
14049
 楼主| 发表于 2023-9-26 19:16:52 | 显示全部楼层
17.4.2                 旧版比较器的使用(查询方式)
C语言代码

//测试工作频率为11.0592MHz
#include "stc8h.h"
#include "intrins.h"
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;
         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 &= ~0x08;                                                                    //P3.7CMP+输入脚
//       CMPCR1 |= 0x08;                                                                        //ADC输入脚为CMP+输入脚
//       CMPCR1 &= ~0x04;                                                                    //内部1.19V参考信号源为CMP-输入脚
         CMPCR1 |= 0x04;                                                                        //P3.6CMP-输入脚
//       CMPCR1 &= ~0x02;                                                                    //禁止比较器输出
         CMPCR1 |= 0x02;                                                                        //使能比较器输出
         CMPCR1 |= 0x80;                                                                        //使能比较器模块
         while (1)
         {
                   P10 =CMPCR1 & 0x01;                                                    //读取比较器比较结果
         }
}

汇编代码

;测试工作频率为11.0592MHz
P_SW2                DATA                  0BAH
CMPCR1            DATA                  0E6H
CMPCR2            DATA                  0E7H
P1M1                  DATA                  091H
P1M0                  DATA                  092H
P0M1                  DATA                  093H
P0M0                  DATA                  094H
P2M1                  DATA                  095H
P2M0                  DATA                  096H
P3M1                  DATA                  0B1H
P3M0                  DATA                  0B2H
P4M1                  DATA                  0B3H
P4M0                  DATA                  0B4H
P5M1                  DATA                  0C9H
P5M0                  DATA                  0CAH
                            ORG                   0000H
                            LJMP                  MAIN
                            ORG                   0100H
MAIN:
                            MOV                   SP, #5FH
                            ORL                    P_SW2,#80H                                  ;使能访问XFR
                            MOV                   P0M0, #00H
                            MOV                   P0M1, #00H
                            MOV                   P1M0, #00H
                            MOV                   P1M1, #00H
                            MOV                   P2M0, #00H
                            MOV                   P2M1, #00H
                            MOV                   P3M0, #00H
                            MOV                   P3M1, #00H
                            MOV                   P4M0, #00H
                            MOV                   P4M1, #00H
                            MOV                   P5M0, #00H
                            MOV                   P5M1, #00H
                            MOV                   CMPCR2,#00H
                            ANL                    CMPCR2,#NOT 80H                     ;比较器正向输出
;                           ORL                    CMPCR2,#80H                              ;比较器反向输出
                            ANL                    CMPCR2,#NOT 40H                     ;使能0.1us滤波
;                           ORL                    CMPCR2,#40H                              ;禁止0.1us滤波
;                           ANL                    CMPCR2,#NOT 3FH                    ;比较器结果直接输出
                            ORL                    CMPCR2,#10H                              ;比较器结果经过16个去抖时钟后输出
                            MOV                   CMPCR1,#00H
                            ORL                    CMPCR1,#30H                              ;使能比较器边沿中断
;                           ANL                    CMPCR1,#NOT 20H                     ;禁止比较器上升沿中断
;                           ORL                    CMPCR1,#20H                              ;使能比较器上升沿中断
;                           ANL                    CMPCR1,#NOT 10H                     ;禁止比较器下降沿中断
;                           ORL                    CMPCR1,#10H                              ;使能比较器下降沿中断
                            ANL                    CMPCR1,#NOT 08H                     ;P3.7CMP+输入脚
;                           ORL                    CMPCR1,#08H                              ;ADC输入脚为CMP+输入脚
;                           ANL                    CMPCR1,#NOT 04H                     ;内部1.19V参考信号源为CMP-输入脚
                            ORL                    CMPCR1,#04H                              ;P3.6CMP-输入脚
;                           ANL                    CMPCR1,#NOT 02H                     ;禁止比较器输出
                            ORL                    CMPCR1,#02H                              ;使能比较器输出
                            ORL                    CMPCR1,#80H                              ;使能比较器模块
LOOP:
                            MOV                   A,CMPCR1
                            MOV                   C,ACC.0
                            MOV                   P1.0,C                                             ;读取比较器比较结果
                            JMP                    LOOP
                            END


回复 支持 反对 送花

使用道具 举报

该用户从未签到

551

主题

9299

回帖

1万

积分

管理员

积分
14049
 楼主| 发表于 2023-9-26 19:17:41 | 显示全部楼层
17.4.3                 新版比较器的使用(中断方式)
C语言代码

//测试工作频率为11.0592MHz
#include "stc8h.h"
#include "intrins.h"
void CMP_Isr() interrupt 21
{
         CMPCR1 &= ~0x40;                                                                    //清中断标志
         if (CMPCR1 &0x01)
         {
                   P10 = !P10;                                                                         //上升沿中断测试端口
         }
         else
         {
                   P11 = !P11;                                                                          //下降沿中断测试端口
         }
}
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;
         CMPEXCFG = 0x00;
//       CMPEXCFG |= 0x40;                                                                  //比较器DC迟滞输入选择
                                                                                                                //0:0mV;0x40:10mV; 0x80:20mV; 0xc0:30mV
         CMPEXCFG &= ~0x03;                                                            //P3.7CMP+输入脚
//       CMPEXCFG |= 0x01;                                                                 //P5.0CMP+输入脚
//       CMPEXCFG |= 0x02;                                                                 //P5.1CMP+输入脚
//       CMPEXCFG |= 0x03;                                                                 //ADC输入脚为CMP+输入脚
         CMPEXCFG &= ~0x04;                                                            //P3.6CMP-输入脚
//       CMPEXCFG |= 0x04;                                                                 //内部1.19V参考电压为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;                                                                        //使能比较器输出
         CMPCR1 |= 0x80;                                                                        //使能比较器模块
         EA = 1;
         while (1);
}

汇编代码

;测试工作频率为11.0592MHz
P_SW2                DATA                  0BAH
CMPCR1            DATA                  0E6H
CMPCR2            DATA                  0E7H
P1M1                  DATA                  091H
P1M0                  DATA                  092H
P0M1                  DATA                  093H
P0M0                  DATA                  094H
P2M1                  DATA                  095H
P2M0                  DATA                  096H
P3M1                  DATA                  0B1H
P3M0                  DATA                  0B2H
P4M1                  DATA                  0B3H
P4M0                  DATA                  0B4H
P5M1                  DATA                  0C9H
P5M0                  DATA                  0CAH
CMPEXCFG      XDATA               0FEAEH
                            ORG                   0000H
                            LJMP                  MAIN
                            ORG                   00ABH
                            LJMP                  CMPISR
                            ORG                   0100H
CMPISR:
                            PUSH                 ACC
                            ANL                    CMPCR1,#NOT 40H                     ;清中断标志
                            MOV                   A,CMPCR1
                            JB                       ACC.0,RSING
FALLING:
                            CPL                     P1.0                                                 ;下降沿中断测试端口
                            POP                    ACC
                            RETI
RSING:
                            CPL                     P1.1                                                 ;上升沿中断测试端口
                            POP                    ACC
                            RETI
MAIN:
                            MOV                   SP, #5FH
                            ORL                    P_SW2,#80H                                  ;使能访问XFR
                            MOV                   P0M0, #00H
                            MOV                   P0M1, #00H
                            MOV                   P1M0, #00H
                            MOV                   P1M1, #00H
                            MOV                   P2M0, #00H
                            MOV                   P2M1, #00H
                            MOV                   P3M0, #00H
                            MOV                   P3M1, #00H
                            MOV                   P4M0, #00H
                            MOV                   P4M1, #00H
                            MOV                   P5M0, #00H
                            MOV                   P5M1, #00H
                            MOV                   DPTR,# CMPEXCFG
                            CLR                    A
                            ANL                    A,#NOT 03H                                  ; P3.7CMP+输入脚
;                           ORL                    A,#01H                                           ; P5.0CMP+输入脚
;                           ORL                    A,#02H                                           ; P5.1CMP+输入脚
;                           ORL                    A,#03H                                           ;ADC输入脚为CMP+输入脚
                            ANL                    A,#NOT 04H                                  ; P3.6CMP-输入脚
;                           ORL                    A,# 04H                                          ;内部1.19V参考信号源为CMP-输入脚
                            MOVX                @DPTR,A
                            MOV                   CMPCR2,#00H
                            ANL                    CMPCR2,#NOT 80H                     ;比较器正向输出
;                           ORL                    CMPCR2,#80H                              ;比较器反向输出
                            ANL                    CMPCR2,#NOT 40H                     ;使能0.1us滤波
;                           ORL                    CMPCR2,#40H                              ;禁止0.1us滤波
;                           ANL                    CMPCR2,#NOT 3FH                    ;比较器结果直接输出
                            ORL                    CMPCR2,#10H                              ;比较器结果经过16个去抖时钟后输出
                            MOV                   CMPCR1,#00H
                            ORL                    CMPCR1,#30H                              ;使能比较器边沿中断
;                           ANL                    CMPCR1,#NOT 20H                     ;禁止比较器上升沿中断
;                           ORL                    CMPCR1,#20H                              ;使能比较器上升沿中断
;                           ANL                    CMPCR1,#NOT 10H                     ;禁止比较器下降沿中断
;                           ORL                    CMPCR1,#10H                              ;使能比较器下降沿中断
;                           ANL                    CMPCR1,#NOT 02H                     ;禁止比较器输出
                            ORL                    CMPCR1,#02H                              ;使能比较器输出
                            ORL                    CMPCR1,#80H                              ;使能比较器模块
                            SETB                  EA
                            JMP                    $
                            END


回复 支持 反对 送花

使用道具 举报

该用户从未签到

551

主题

9299

回帖

1万

积分

管理员

积分
14049
 楼主| 发表于 2023-9-26 19:18:23 | 显示全部楼层
17.4.4                 新版比较器的使用(查询方式)
C语言代码

//测试工作频率为11.0592MHz
#include "stc8h.h"
#include "intrins.h"
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;
         CMPEXCFG = 0x00;
//       CMPEXCFG |= 0x40;                //比较器DC迟滞输入选择,0:0mV; 0x40:10mV; 0x80:20mV; 0xc0:30mV
         CMPEXCFG &= ~0x03;                                                            //P3.7CMP+输入脚
//       CMPEXCFG |= 0x01;                                                                 //P5.0CMP+输入脚
//       CMPEXCFG |= 0x02;                                                                 //P5.1CMP+输入脚
//       CMPEXCFG |= 0x03;                                                                 //ADC输入脚为CMP+输入脚
         CMPEXCFG &= ~0x04;                                                            //P3.6CMP-输入脚
//       CMPEXCFG |= 0x04;                                                                 //内部1.19V参考电压为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;                                                                        //使能比较器输出
         CMPCR1 |= 0x80;                                                                        //使能比较器模块
         while (1)
         {
                   P10 =CMPCR1 & 0x01;                                                    //读取比较器比较结果
         }
}

汇编代码

;测试工作频率为11.0592MHz
P_SW2                DATA                  0BAH
CMPCR1            DATA                  0E6H
CMPCR2            DATA                  0E7H
P1M1                  DATA                  091H
P1M0                  DATA                  092H
P0M1                  DATA                  093H
P0M0                  DATA                  094H
P2M1                  DATA                  095H
P2M0                  DATA                  096H
P3M1                  DATA                  0B1H
P3M0                  DATA                  0B2H
P4M1                  DATA                  0B3H
P4M0                  DATA                  0B4H
P5M1                  DATA                  0C9H
P5M0                  DATA                  0CAH
CMPEXCFG      XDATA               0FEAEH
                            ORG                   0000H
                            LJMP                  MAIN
                            ORG                   0100H
MAIN:
                            MOV                   SP, #5FH
                            ORL                    P_SW2,#80H                                  ;使能访问XFR
                            MOV                   P0M0, #00H
                            MOV                   P0M1, #00H
                            MOV                   P1M0, #00H
                            MOV                   P1M1, #00H
                            MOV                   P2M0, #00H
                            MOV                   P2M1, #00H
                            MOV                   P3M0, #00H
                            MOV                   P3M1, #00H
                            MOV                   P4M0, #00H
                            MOV                   P4M1, #00H
                            MOV                   P5M0, #00H
                            MOV                   P5M1, #00H
                            MOV                   DPTR,# CMPEXCFG
                            CLR                    A
                            ANL                    A,#NOT 03H                                  ; P3.7CMP+输入脚
;                           ORL                    A,#01H                                           ; P5.0CMP+输入脚
;                           ORL                    A,#02H                                           ; P5.1CMP+输入脚
;                           ORL                    A,#03H                                           ;ADC输入脚为CMP+输入脚
                            ANL                    A,#NOT 04H                                  ; P3.6CMP-输入脚
;                           ORL                    A,# 04H                                          ;内部1.19V参考信号源为CMP-输入脚
                            MOVX                @DPTR,A
                            MOV                   CMPCR2,#00H
                            ANL                    CMPCR2,#NOT 80H                     ;比较器正向输出
;                           ORL                    CMPCR2,#80H                              ;比较器反向输出
                            ANL                    CMPCR2,#NOT 40H                     ;使能0.1us滤波
;                           ORL                    CMPCR2,#40H                              ;禁止0.1us滤波
;                           ANL                    CMPCR2,#NOT 3FH                    ;比较器结果直接输出
                            ORL                    CMPCR2,#10H                              ;比较器结果经过16个去抖时钟后输出
                            MOV                   CMPCR1,#00H
                            ORL                    CMPCR1,#30H                              ;使能比较器边沿中断
;                           ANL                    CMPCR1,#NOT 20H                     ;禁止比较器上升沿中断
;                           ORL                    CMPCR1,#20H                              ;使能比较器上升沿中断
;                           ANL                    CMPCR1,#NOT 10H                     ;禁止比较器下降沿中断
;                           ORL                    CMPCR1,#10H                              ;使能比较器下降沿中断
;                           ANL                    CMPCR1,#NOT 02H                     ;禁止比较器输出
                            ORL                    CMPCR1,#02H                              ;使能比较器输出
                            ORL                    CMPCR1,#80H                              ;使能比较器模块
LOOP:
                            MOV                   A,CMPCR1
                            MOV                   C,ACC.0
                            MOV                   P1.0,C                                             ;读取比较器比较结果
                            JMP                    LOOP
                            END


回复 支持 反对 送花

使用道具 举报

该用户从未签到

551

主题

9299

回帖

1万

积分

管理员

积分
14049
 楼主| 发表于 2023-9-26 19:19:07 | 显示全部楼层
17.4.5                 旧版比较器的多路复用应用(比较器+ADC输入通道)
由于比较器的正极可以选择ADC的模拟输入通道,因此可以通过多路选择器和分时复用可实现多个比较器的应用。
注意:当比较器正极选择ADC输入通道时,请务必要打开ADC_CONTR寄存器中的ADC电源控制位ADC_POWERADC通道选择位ADC_CHS
C语言代码

//测试工作频率为11.0592MHz
#include "stc8h.h"
#include "intrins.h"
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为输入口
         P1M1 |= 0x01;
         ADC_CONTR = 0x80;                                                                 //使能ADC模块并选择P1.0ADC输入脚
         CMPCR2 = 0x00;
         CMPCR1 = 0x00;
         CMPCR1 |= 0x08;                                                                        //ADC输入脚为CMP+输入脚
         CMPCR1 |= 0x04;                                                                        //P3.6CMP-输入脚
         CMPCR1 |= 0x02;                                                                        //使能比较器输出
         CMPCR1 |= 0x80;                                                                        //使能比较器模块
         while (1);
}

汇编代码

;测试工作频率为11.0592MHz
P_SW2                DATA                  0BAH
CMPCR1            DATA                  0E6H
CMPCR2            DATA                  0E7H
ADC_CONTR    DATA                  0BCH
P1M1                  DATA                  091H
P1M0                  DATA                  092H
P0M1                  DATA                  093H
P0M0                  DATA                  094H
P2M1                  DATA                  095H
P2M0                  DATA                  096H
P3M1                  DATA                  0B1H
P3M0                  DATA                  0B2H
P4M1                  DATA                  0B3H
P4M0                  DATA                  0B4H
P5M1                  DATA                  0C9H
P5M0                  DATA                  0CAH
                            ORG                   0000H
                            LJMP                  MAIN
                            ORG                   0100H
MAIN:
                            MOV                   SP, #5FH
                            ORL                    P_SW2,#80H                                  ;使能访问XFR
                            MOV                   P0M0, #00H
                            MOV                   P0M1, #00H
                            MOV                   P1M0, #00H
                            MOV                   P1M1, #00H
                            MOV                   P2M0, #00H
                            MOV                   P2M1, #00H
                            MOV                   P3M0, #00H
                            MOV                   P3M1, #00H
                            MOV                   P4M0, #00H
                            MOV                   P4M1, #00H
                            MOV                   P5M0, #00H
                            MOV                   P5M1, #00H
                            ANL                    P1M0,#0FEH                                 ;设置P1.0为输入口
                            ORL                    P1M1,#01H
                            MOV                   ADC_CONTR,#80H                      ;使能ADC模块并选择P1.0ADC输入脚
                            MOV                   CMPCR2,#00H
                            MOV                   CMPCR1,#00H
                            ORL                    CMPCR1,#08H                              ;ADC输入脚为CMP+输入脚
                            ORL                    CMPCR1,#04H                              ;P3.6CMP-输入脚
                            ORL                    CMPCR1,#02H                              ;使能比较器输出
                            ORL                    CMPCR1,#80H                              ;使能比较器模块
LOOP:
                            JMP                    LOOP
                            END


回复 支持 反对 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-3 12:06 , Processed in 0.087396 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表