一、实验目的:
掌握LPC2138微控制器的中断管理并使用它控制外围电路。
二、实验设备:
预装了keil及proteus的PC机。
三、实验内容:
LPC2138微控制器的中断管理是由向量中断控制器VIC操作的,向量中断控制器具有32个中断请求输入(32个中断通道,但LPC2138只使用了19个通道号0~18)可将它们设置为FIQ、向量IRQ和非向量IRQ,通过编程不同外设的向量IRQ的中断优先级,可以实现动态分配调整。
定义蜂鸣器的输出端口,运用寄存器PINSEL0、PINSEL1设置EINT3唤醒芯片,清除EINT3中断标志。运用while、if-else循环语句设置定时器、蜂鸣器。将定时器、RTC、串口功能关闭,在掉电模式下运用IO0SET、IO0CLR寄存器控制蜂鸣器的蜂鸣。
电路原理图如下图所示:
四、实验步骤:
使用keil5编辑程序,生成hex文件,打开DSN文件,把hex文件加入到微控制器中,运行仿真,按下KEY1按键,观察LED灯的暗灭变化。
五、实验要求:
- 根据实验任务要求,编写源程序;
- 上机调试程序。
六、实验程序
#include "Config.h"
#include "Target.h"
#define BEEP (1<<7)
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{
uint32 i;
for(; dly>0; dly--)
for(i=0; i<3000; i++);
}
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :演示外部中断唤醒掉电的CPU,但不产生中断
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
int main(void)
{ PINSEL0 = 0x00000000; // 设置所有管脚连接GPIO*/
PINSEL1 = 0x00000300; // 设置管脚连接,P0.20设置为EINT3
IO0DIR = BEEP;
/* 打开EINT0中断(使用非向量IRQ) */
EXTWAKE = 0x08; // 外部中断3唤醒芯片
EXTINT = 0x08; // 清除EINT3中断标志
IO0CLR = BEEP;
while (1)
{
PCONP = 0x00; // 关闭定时器、RTC、UART等功能部件
PCON = 0x02; // 系统进入掉电模式
/* 当系统被唤醒后,取反BEEP控制 */
if((IO0SET&BEEP)==0)
IO0SET = BEEP;
else
IO0CLR = BEEP;
while((EXTINT&0X08)!=0)
EXTINT=0X08;
}
}