视频讲解:比较器,STC8H系列数据手册 比较器 内容
视频讲解,比较器https://www.stcaimcu.com/forum.p ... 3184&extra=page%3D1
17 比较器,掉电检测,内部1.19V参考信号源(BGV)
STC8H系列单片机内部集成了一个比较器。比较器的正极可以是P3.7端口或者ADC的模拟输入通道(新版比较器的正极可以是P3.7端口、P5.0端口、P5.1端口或者ADC的模拟输入通道),而负极可以P3.6端口或者是内部BandGap经过OP后的REFV电压(内部固定比较电压)。通过多路选择器和分时复用可实现多个比较器的应用。
比较器内部有可程序控制的两级滤波:模拟滤波和数字滤波。模拟滤波可以过滤掉比较输入信号中的毛刺信号,数字滤波可以等待输入信号更加稳定后再进行比较。比较结果可直接通过读取内部寄存器位获得,也可将比较器结果正向或反向输出到外部端口。将比较结果输出到外部端口可用作外部事件的触发信号和反馈信号,可扩大比较的应用范围。
17.1比较器内部结构图
17.2 比较器输出功能脚切换
17.3比较器相关的寄存器
17.3.1 比较器控制寄存器1(CMPCR1)
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_POWER和ADC通道选择位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是经过数字滤波后的输出信号,而不是比较器的直接输出结果。
17.3.2比较器控制寄存器2(CMPCR2)
INVCMPO:比较器结果输出控制0:比较器结果正向输出。若CMPRES为0,则P3.4/P4.1输出低电平,反之输出高电平。1:比较器结果反向输出。若CMPRES为0,则P3.4/P4.1输出高电平,反之输出低电平。DISFLT:模拟滤波功能控制0:使能0.1us模拟滤波功能1:关闭0.1us模拟滤波功能,可略微提高比较器的比较速度。LCDTY:数字滤波功能控制数字滤波功能即为数字信号去抖动功能。当比较结果发生上升沿或者下降沿变化时,比较器侦测变化后的信号必须维持LCDTY所设置的CPU时钟数不发生变化,才认为数据变化是有效的;否则将视同信号无变化。注意:当使能数字滤波功能后,芯片内部实际的等待时钟需额外增加两个状态机切换时间,即若LCDTY设置为0时,为关闭数字滤波功能;若LCDTY设置为非0值n(n=1~63)时,则实际的数字滤波时间为(n+2)个系统时钟
17.3.3 比较器扩展配置寄存器(CMPEXCFG)
CHYS:比较器DC迟滞输入选择
CMPNS:比较器负端输入选择0:P3.61:选择内部BandGap经过OP后的电压REFV作为比较器负极输入源 (芯片在出厂时,内部参考电压调整为1.19V)
CMPPS:比较器正端输入选择
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.7为CMP+输入脚// CMPCR1 |= 0x08; //ADC输入脚为CMP+输入脚// CMPCR1 &= ~0x04; //内部1.19V参考信号源为CMP-输入脚 CMPCR1 |= 0x04; //P3.6为CMP-输入脚// CMPCR1 &= ~0x02; //禁止比较器输出 CMPCR1 |= 0x02; //使能比较器输出 CMPCR1 |= 0x80; //使能比较器模块 EA = 1; while (1);}
汇编代码
;测试工作频率为11.0592MHz P_SW2 DATA 0BAH CMPCR1 DATA 0E6HCMPCR2 DATA 0E7H P1M1 DATA 091HP1M0 DATA 092HP0M1 DATA 093HP0M0 DATA 094HP2M1 DATA 095HP2M0 DATA 096HP3M1 DATA 0B1HP3M0 DATA 0B2HP4M1 DATA 0B3HP4M0 DATA 0B4HP5M1 DATA 0C9HP5M0 DATA 0CAH ORG 0000H LJMP MAIN ORG 00ABH LJMP CMPISR ORG 0100HCMPISR: PUSH ACC ANL CMPCR1,#NOT 40H ;清中断标志 MOV A,CMPCR1 JB ACC.0,RSINGFALLING: CPL P1.0 ;下降沿中断测试端口 POP ACC RETIRSING: 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.7为CMP+输入脚; ORL CMPCR1,#08H ;ADC输入脚为CMP+输入脚; ANL CMPCR1,#NOT 04H ;内部1.19V参考信号源为CMP-输入脚 ORL CMPCR1,#04H ;P3.6为CMP-输入脚; ANL CMPCR1,#NOT 02H ;禁止比较器输出 ORL CMPCR1,#02H ;使能比较器输出 ORL CMPCR1,#80H ;使能比较器模块 SETB EA JMP $ END
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.7为CMP+输入脚// CMPCR1 |= 0x08; //ADC输入脚为CMP+输入脚// CMPCR1 &= ~0x04; //内部1.19V参考信号源为CMP-输入脚 CMPCR1 |= 0x04; //P3.6为CMP-输入脚// CMPCR1 &= ~0x02; //禁止比较器输出 CMPCR1 |= 0x02; //使能比较器输出 CMPCR1 |= 0x80; //使能比较器模块 while (1) { P10 =CMPCR1 & 0x01; //读取比较器比较结果 }}
汇编代码
;测试工作频率为11.0592MHz P_SW2 DATA 0BAH CMPCR1 DATA 0E6HCMPCR2 DATA 0E7H P1M1 DATA 091HP1M0 DATA 092HP0M1 DATA 093HP0M0 DATA 094HP2M1 DATA 095HP2M0 DATA 096HP3M1 DATA 0B1HP3M0 DATA 0B2HP4M1 DATA 0B3HP4M0 DATA 0B4HP5M1 DATA 0C9HP5M0 DATA 0CAH ORG 0000H LJMP MAIN ORG 0100HMAIN: 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.7为CMP+输入脚; ORL CMPCR1,#08H ;ADC输入脚为CMP+输入脚; ANL CMPCR1,#NOT 04H ;内部1.19V参考信号源为CMP-输入脚 ORL CMPCR1,#04H ;P3.6为CMP-输入脚; 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
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.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; //比较器反向输出 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 0BAHCMPCR1 DATA 0E6HCMPCR2 DATA 0E7H P1M1 DATA 091HP1M0 DATA 092HP0M1 DATA 093HP0M0 DATA 094HP2M1 DATA 095HP2M0 DATA 096HP3M1 DATA 0B1HP3M0 DATA 0B2HP4M1 DATA 0B3HP4M0 DATA 0B4HP5M1 DATA 0C9HP5M0 DATA 0CAH CMPEXCFG XDATA 0FEAEH ORG 0000H LJMP MAIN ORG 00ABH LJMP CMPISR ORG 0100HCMPISR: PUSH ACC ANL CMPCR1,#NOT 40H ;清中断标志 MOV A,CMPCR1 JB ACC.0,RSINGFALLING: CPL P1.0 ;下降沿中断测试端口 POP ACC RETIRSING: 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.7为CMP+输入脚; ORL A,#01H ; P5.0为CMP+输入脚; ORL A,#02H ; P5.1为CMP+输入脚; ORL A,#03H ;ADC输入脚为CMP+输入脚 ANL A,#NOT 04H ; P3.6为CMP-输入脚; 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
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.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; //比较器反向输出 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 0BAHCMPCR1 DATA 0E6HCMPCR2 DATA 0E7H P1M1 DATA 091HP1M0 DATA 092HP0M1 DATA 093HP0M0 DATA 094HP2M1 DATA 095HP2M0 DATA 096HP3M1 DATA 0B1HP3M0 DATA 0B2HP4M1 DATA 0B3HP4M0 DATA 0B4HP5M1 DATA 0C9HP5M0 DATA 0CAH CMPEXCFG XDATA 0FEAEH ORG 0000H LJMP MAIN ORG 0100HMAIN: 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.7为CMP+输入脚; ORL A,#01H ; P5.0为CMP+输入脚; ORL A,#02H ; P5.1为CMP+输入脚; ORL A,#03H ;ADC输入脚为CMP+输入脚 ANL A,#NOT 04H ; P3.6为CMP-输入脚; 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
17.4.5 旧版比较器的多路复用应用(比较器+ADC输入通道)由于比较器的正极可以选择ADC的模拟输入通道,因此可以通过多路选择器和分时复用可实现多个比较器的应用。注意:当比较器正极选择ADC输入通道时,请务必要打开ADC_CONTR寄存器中的ADC电源控制位ADC_POWER和ADC通道选择位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.0为ADC输入脚 CMPCR2 = 0x00; CMPCR1 = 0x00; CMPCR1 |= 0x08; //ADC输入脚为CMP+输入脚 CMPCR1 |= 0x04; //P3.6为CMP-输入脚 CMPCR1 |= 0x02; //使能比较器输出 CMPCR1 |= 0x80; //使能比较器模块 while (1);}
汇编代码
;测试工作频率为11.0592MHz P_SW2 DATA 0BAH CMPCR1 DATA 0E6HCMPCR2 DATA 0E7HADC_CONTR DATA 0BCH P1M1 DATA 091HP1M0 DATA 092HP0M1 DATA 093HP0M0 DATA 094HP2M1 DATA 095HP2M0 DATA 096HP3M1 DATA 0B1HP3M0 DATA 0B2HP4M1 DATA 0B3HP4M0 DATA 0B4HP5M1 DATA 0C9HP5M0 DATA 0CAH ORG 0000H LJMP MAIN ORG 0100HMAIN: 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.0为ADC输入脚 MOV CMPCR2,#00H MOV CMPCR1,#00H ORL CMPCR1,#08H ;ADC输入脚为CMP+输入脚 ORL CMPCR1,#04H ;P3.6为CMP-输入脚 ORL CMPCR1,#02H ;使能比较器输出 ORL CMPCR1,#80H ;使能比较器模块 LOOP: JMP LOOP END