STC8H系列—9.比较器的控制教程

一、概述:

   STC8H系列带的比较器功能是传统C51单片机不具备的。单片机的比较器将一定范围的模拟电压值变换成数字量的一种方式,可以应用在工作电压检测、电池电压检测、低电压检测等多种场景情况下。STC8H虽然只提供了一个比较器、但提供了多路输入可以通过时分的方式模拟多个比较器的使用,同时比较器的负端提供了一组内部基准电压1.19V供单片机与外部输入电压进行比对,对于比对的结果可以通过端口直接输出,也可让其产生中断,中断不且有正向比较中断,同时还具备反向比较中断功能。STC公司由于产品设计先后不同出现了2P+2N和4P+2N,其主要区别在于输入端的数量的不同。

二、知识链接:

1、比较器内部结构图:

比较器的正向端选用P37,反向端选用内部1.19V,当P37输入高电平后,比较器输出,当p37输入低电平比较器反向输出。

2、比较器控制寄存器1(CMPCR1):

其中CMPEN置1,其功能为比较器使能端,CMPOE端,必须置1,将比较后的结果由P34端输出,NIE和PIE为正反向中断输出控制位,必须置1,其它位置0。

3、比较器的配置寄存器(CMPEXCFG)

这个寄存器用到的主要CMPNS这个两个位,功能为选择反向端的比较源,置0时则选择P36端口输入,置1时则选择内部1.19V。

CMPPS寄存器为选择正向端的输入,默认为P37

三、实验平台搭建:

   1、MCU:STC-打狗棒系列核心实验板 V2.3

   2、实验板平台:德飞莱LY-51s

   3、硬件连接表:

     K1------>P37    切换信号

      LED1----->P00   指示灯1,中断产生指示

      LED2----->P01   指示灯2,正向中断指示

      LED3----->P02   指示灯3,反向中断指示

      LED4----->P34   指示灯4,比较信号直接输出端指示

四、测试源代码:

#include <STC8H.h>

#include "intrins.h"

sbit Led1=P0^0;

sbit Led2=P0^1;

sbit Led3=P0^2;

sbit Led4=P0^3;

#define     CMPEXCFG                    (*(unsigned char volatile xdata *)0xFEAE)

#define CMPIF 0x40 //中断标志位

void Delay1ms(unsigned char x);//当主时钟频率为12M,1ms延时为基准

void init_IO();//初始化IO

void init_CMP();//比较器初始化

void main()

{

      P_SW2 |= 0x80;  //扩展寄存器XFR访问使能

      init_IO();

     init_CMP();

   while(1)

    {

       P37=~P37;

       Delay1ms(100);    

     

      }

}

void init_IO()

{

   RSTCFG=0x50;  //开启RST键进入ISP模式

   P0M1 = 0x00;   P0M0 = 0x00;   //设置P0口为准双向口

   P1M1 = 0x00;   P1M0 = 0x00;   //设置P0口为准双向口

   P2M1 = 0x00;   P2M0 = 0x00;   //设置P1口为准双向口

   P3M1 = 0x00;   P3M0 = 0x00;   //设置P3口为准双向口

   P4M1 = 0x00;   P4M0 = 0x00;   //设置P3口为准双向口

  

}

void Delay1ms(unsigned char x)    //@12.000MHz

{

   unsigned char i, j;

   i = 16;

   j = 147;

   while(x--)

   {

      do

      {

        while (--j);

      } while (--i);

   } 

}

void init_CMP()

{

   CMPCR1=0x00;

    CMPCR2=0x00;

    CMPEXCFG=0x00; 

    CMPCR1|=0x80;//比较器模块使能CMPEN=1

    CMPCR1|=0x10;//下降沿中断使能NIE=1

    CMPCR1|=0x20;//上升沿中断使能PIE=1

    CMPCR1|=0x02;//比较器结果输出CMPOE=1

    CMPCR2|=0x10;//数字滤波位

    CMPEXCFG|=0x04; //CMPNS=1 比较器负输入选择

    EA=1;//开总中断

}

void CMP_isr() interrupt 21//比较器中断

{

  CMPCR1&=~CMPIF;//清空中断标志位,CMPIF=0

   Led1=~Led1;

   if(CMPCR1&0x01)//下降沿中断CMPRES=1

   {

     Led2=~Led2;

   }

   else//上升沿中断CMPRES=0

   {

     Led3=~Led3;

   } 

}

猜你喜欢

转载自blog.csdn.net/qq_21082985/article/details/132116655
今日推荐