| 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 联系。           |
- 海尔空调制冷故障维..
- 2008-1-25
- 大尺寸TFT显示器..
- 2008-1-27
- 利用DC/DC转换..
- 2008-1-27
- 电动车铅酸蓄电池的..
- 2008-1-27
- 大型搅拌站自动配料..
- 2008-1-27
- 城市和工业污水处理..
- 2008-1-27
- 开关电源的数字控制..
- 2008-1-27
- 精密的智能电池使充..
- 2008-1-27
- 基于DSP控制的2..
- 2008-1-27
- 增强型运营商级多服..
- 2008-1-27
- 高效CCD数码相机..
- 2008-1-27
- Atheros 单..
- 2008-1-27
- Philips 推..
- 2008-1-27
- Fujitsu 数..
- 2008-1-27
- 如何给PCI卡选用..
- 2008-1-27
- A/D转换芯片的测..
- 2008-1-27
- 基于CTl技术的交..
- 2008-1-27
- MMIC和RFIC..
- 2008-1-27
- 利用皮弹服务器进行..
- 2008-1-27
- 白色发光二极管及其..
- 2008-1-27



