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 联系。 |