×
嵌入式 > 技术百科 > 详情

LPC900 FLASH单片机比较器使用实例

发布时间:2024-05-19 发布时间:
|

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 下面为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 联系。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ADI 高精度低功耗精密放大器