打印

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

[复制链接]
2472|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
北京户口|  楼主 | 2009-12-16 13:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 联系。

相关帖子

沙发
年轻不在| | 2009-12-16 13:32 | 只看该作者
汇编看不懂啊!有没有LPC的汇编指令集 啊!

使用特权

评论回复
板凳
NXP_PLC| | 2009-12-22 22:09 | 只看该作者
LPC900是80C51架构

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

107

主题

521

帖子

1

粉丝