打造国内最大的IC交易平台
技术资料 行业资讯 PDF资料 IC价格 IC替换 缩略语 IC供应 IC采购
LPC900 FLASH单片机比较器使用实例
类别:电子综合  
 
        

    

     LPC900 FLASH单片机,是PHILIPS公司推出的一款高性能、微功耗51内核单片机,主要集成了字节方式的I2C总线、SPI总线、增强型UART接口、比较器、实时时钟、E2PROM、AD/DA转换器、ISP/IAP在线编程和应用中编程等一系列有特色的功能部件。LPC900系列单片机提供从8脚DIP到28脚的PLCC等丰富的封装形式,可以满足各种对成本、线路板空间有限制而又要求高性能、高可靠性的应用。且其具有高速率(6倍于普通51单片机),低功耗(完全掉电模式功耗低于1uA),高稳定性,小封装,多功能(内嵌众多流行的功能模块),多选择等特点(该系列有多款不同封装,不同价位,不同功能的型号供用户选择)。

    

     利用LPC900系列单片机自带的比较器模块,可以实现电压监控,AD转换等诸多功能,可以在一定程度上减少外围元器件,节省成本,增加系统稳定性为了减少用户在使用比较器时遇见未知问题,现以本文为例,演示LPC900单片机比较器的使用。

     以下为示例程序所运行的电路环境。

    

     图1 示例运行电路原理图

    

     电路板中采用常用的P89LPC931芯片作为主控芯片,选取P0.4(CIN1A)作为CMP1正向输入,选择内部比较器参考电压,通过P2.6,P2.7控制外部LED及蜂鸣器。

    

     首先,对比较器相关寄存器进行说明,见表1。

    

     表1 CMPn,地址:CMP1:ACH,CMP2:ADH

     VCCVCCVCCLEDRINGLEDRINGVCCVIN

    

     CMPn.7,6 保留将来之用

     CEn 比较器使能位。当置位时,对应的比较器使能。CEn置位10us后,比较器输出有效值

     CPn 比较器正向输入选择,为’0’时选择CINnA作为正向输入,为’1’时选择CINnB作为正向输入

     CNn 比较器反向输入选择,为’0’时选择CMPREF作为比较器反向输入,为’1’时选择内部比较器参考电压Vref作为比较器反向输入.

     OEn 输出使能,为’1’时,比较器输出连接到CMPn引脚。此输出和CPU时钟不同步。

     COn 比较器输出,和CPU同步以允许软件进行读取。

     CMFn 比较器中断标志。当比较器输出COn状态改变时由硬件置位。使能比较器中断时,该位置位可产生硬件中断。通过软件清0。

     1广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 下面为LPC900系列单片机比较器内部模块图。

    

     图2 比较器输入和输出的连接

     关于参考电压

    

     LPC900单片机的内部参考电压为1.23V±10%。使用内部参考电压可以节省引脚,减少外围电路,减少错误的发生几率,不过其有一定的误差(±10%),且被限定在 1.23V左右。而采用外部参考电压,可以有效地解决这个问题。

    

     关于比较器中断

    

     要进入比较器中断,需要对比较器进行正确的设置。

    

     //------------------------------------------------------------------

     PT0AD=0x10; //禁止CIN1A上的数字输入功能

     P0M1=0x00;

     P0M2=0x10; //设置P0.4为仅为输入

     P2M1=0xC0;

     P2M2=0xC0;

     CMP1=0x28; //0010 1000,使能CMP1,采用内部Ref,CIN1A

     Delay10us(); //比较器启动至少10us后,方可使用

     CMP1&=0xFE; //清0比较器1的中断标志

     EC=1; //使能比较器中断

     EA=1;

     //------------------------------------------------------------------

     曾经有不少用户向我反映过,他们的程序正确设置后,无法进入比较器中断,当我刚开始使用LPC900单片机的时候,也曾遇到过这种问题,总结原因,大都因为没有仔细看芯片的使用指南。“当每个比较器输出发生改变时,产生中断”,也就是说,如果您使用CMP1,如果初始化完成后CO1为0,只有当CO1变为1时,您的程序才能进入中断。要想再次进入中断,必须要保证中断标志位被清0,且CO1位再次发生变化。

     LPC900系列有的芯片具有两个比较器,因此在进入中断后,需对中断标志进行检测(如果需要的话),以判断是哪个比较器产生的中断。

     关于比较器稳定时间 在芯片的数据手册中,有个参数“comparator enable to output valid”,其字面意思为“比较器使能到数据有效(的稳定时间)”。一般这个值为10us。也就是说,使能的10us后,比较器才能稳定工作。

    

     关于掉电唤醒后,比较器无法使用的问题

     这个问题其实在《LPC900 Flash单片机低功耗详解》中已有说明,很多人使用完全掉电功能时,将PCONA设置为0xFF,停止了比较器的供电。但是在掉电唤醒以后,又没有将PCONA.5清0(恢复对内部比较器模块的供电),最后导致了比较器模块没有运行。

    

     以下为比较器使用的一些示例程序,请各位在进行开发时,尽量以下面为准,避免错误发生。

     /****************************************************************************

     *文件名: Comparator.C

     *版权: 周立功单片机研究所

     *功能: LPC900比较器演示程序

     *日期: 16:53 04-7-16

     *****************************************************************************/

     #include "reg932.h"

     #define uchar unsigned char

     sbit LED=P2^6;

     sbit RING=P2^7;

     uchar temp;

     void CMP_Init();

     void Delay10us();

     //----------------------------------

     //功能:比较器中断服务程序

     //----------------------------------

     void CMP_ISR() interrupt 8{

     EA=0; //关中断

     temp=CMP1&0x02; //判断CMP1.1

     if(temp==0x02) //如果CMP1.1为1(正向输入端大于反向输入端)

     {

     RING=~RING;

     }else if(temp==0x00) //如果CMP1.1为0

     {

     LED=~LED;

     }

     CMP1&=0xFE; //清0比较器中断标志位

     EA=1; //开中断

     }

     //----------------------------------

     //功能:主函数 //---------------------------------- void main()

     {

     CMP_Init(); //比较器初始化

     while(1);

     }

     //----------------------------------

     //功能:比较器初始化

     //----------------------------------

     void CMP_Init()

     {

     PT0AD=0x10; //禁止CIN1A上的数字输入功能

     P0M1=0x00;

     P0M2=0x10; //设置P0.4为仅为输入

     P2M1=0xC0;

     P2M2=0xC0; //设置P2.6,P2.7为开漏方式

     CMP1=0x28; //0010 1000,CMP1使能,内部Ref,CIN1A

     Delay10us(); //延迟10us,以等待比较器稳定

     CMP1&=0xFE; //清除比较器中断标志位

     EC=1; //比较器中断输出使能

     EA=1; //开中断

     }

     //----------------------------------

     //功能:延迟10us(7.373MHz下)

     //----------------------------------

     void Delay10us()

     {

     uchar i;

     for(i=0;i<10;i++);

     }

     //----------------------------------

     (ASM版)

     /*****************************************************************************

     *文件名: Comparator.Asm

     *版权: 周立功单片机研究所

     *功能: LPC900比较器演示程序

     *日期: 16:53 04-7-16

     *****************************************************************************/

     $NOMOD51

     $INCLUDE(REG932.INC)

     LED BIT P2.6

     RING BIT P2.7

     ORG 0000H AJMP MAIN

     ORG 0043H

     AJMP CMP_ISR

     ;---------------------------

     ORG 0080H

     MAIN:

     ACALL CMP_INIT ;比较器初始化

     AJMP $

     RET

     CMP_INIT:

     MOV PT0AD,#0x10 ;禁能CIN1A上的数字功能

     MOV P0M1,#0x00

     MOV P0M2,#0x10 ;设置P0.4为仅为输入功能

     MOV P2M1,#0xC0

     MOV P2M2,#0xC0 ;设置P2.6,P2.7为开漏输出功能

     MOV CMP1,#0x28 ;0010 1000,CMP1使能,内部Ref,CIN1A

     ACALL DELAY10US ;比较器启动至少10us后,方可使用

     ANL CMP1,#0xFE ;清0比较器1的中断标志

     SETB EC ;使能比较器中断

     SETB EA ;开启所有中断

     RET

     ;----------------------------

     ;功能:延时10us左右(7.373MHz下)

     ;----------------------------

     DELAY10US:

     MOV R7,#16

     LOOP1:

     DJNZ R7,LOOP1

     RET

     ;----------------------------

     ;功能:比较器中断服务程序

     ;----------------------------

     CMP_ISR:

     CLR EA ;关中断

     MOV A,CMP1

     ANL A,#0x02 ;判断CMP1.1,

     JZ LOOP2 ;如果CMP1.1为0(表示正向输入电压小于反向输入电压),跳至LOOP2

     CPL RING ;如果CMP1.1为1,取反RING

     AJMP LOOP3

     LOOP2:

     CPL LED

     LOOP3:

     ANL CMP1,#0xFE ;清除CMP1中断标志 SETB EA ;开中断 RETI

     ;----------------------------

     END

     ;----------------------------

     以上程序均在KEIL下调试通过,如有疑问,请与 LPC900@ZLGMCU.COM 联系。