单片机
返回首页

基于ARM的流水灯仿真示例

2020-01-28 来源:eefocus

本设计使用的仿真工具是Proteus 7.4,IDE是ADS 1.2,芯片是LPC2134


在Proteus中的电路图如下图所示: 

本设计使用的是周立功的LPC2131的工程模板。LPC2131的RAM为8K,而LPC2134的为16K,因此在使用工程模板时必须修改mem_a.scf、mem_b.scf和men_c.scf文件中的RAM最高端地址,即把“0x40002000”改为“0x40004000”。


本设计中的四个按钮对应着四个外部中断,用于控制流水灯的工作方式。


PS:本设计中的电路图只限用于仿真,在实际应用中还应加上晶振、复位电路等 。


源代码及注释如下:  


  1 #include 'config.h'

  2 

  3  int DelayTime=50; //延时参数

  4  int ModeSel=0;  //流水灯控制

  5 

  6  //延时函数原型声明

  7  void delay(int dly);

  8 

  9  //中断服务程序原型声明

 10  void __irq IRQ_Eint0(void);

 11  void __irq IRQ_Eint1(void);

 12  void __irq IRQ_Eint2(void);

 13 void __irq IRQ_Eint3(void);

 14 

 15 //流水灯工作模式定义

 16 int LED_Mode[2][8]=

 17 {

 18 

 19  {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f},

 20  {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}

 21 };

 22 

 23 int ModeIndex;  //工作模式索引

 24 

 25 //********************************************************************************************************

 26 //主函数

 27 int main (void)

 28 {

 29  //配置引脚功能

 30  PINSEL0=0x000cc0cc; 

 31  PINSEL1=0x00000000;  

 32  

 33  IO1DIR=0xff<<16; //设P1.16-P1.23为输出

 34 

 35  EXTMODE=0x00;  //设置外部中断为电平触发

 36  

 37  IRQEnable();  //使能IRQ中断

 38  

 39  VICIntSelect=0x00000000; //设置所有分配为IRQ中断

 40  

 41  VICVectCntl0=0x20|0x0e;  //分配外部中断0到向量中断0

 42  VICVectCntl1=0x20|0x0f;  //分配外部中断1到向量中断0

 43  VICVectCntl2=0x20|0x10;  //分配外部中断2到向量中断0

 44  VICVectCntl3=0x20|0x11;  //分配外部中断3到向量中断0

 45  

 46  

 47  //设置中断服务程序地址

 48  VICVectAddr0=(uint32)IRQ_Eint0;

 49  VICVectAddr1=(uint32)IRQ_Eint1;

 50  VICVectAddr2=(uint32)IRQ_Eint2;

 51  VICVectAddr3=(uint32)IRQ_Eint3;

 52  

 53  EXTINT=0x0f; //清除所有外部中断标志

 54  

 55  VICIntEnable=(1<<0x0e)|(1<<0x0f)|(1<<0x10)|(1<<0x11); //使能外部中断

 56  

 57  while(1)

 58  {

 59   for(ModeIndex=0; ModeIndex<8; ModeIndex++)

 60   {

 61    IO1SET=LED_Mode[ModeSel][ModeIndex]<<16; //点亮LED灯

 62    delay(DelayTime);       //延时

 63    IO1CLR=LED_Mode[ModeSel][ModeIndex]<<16; //熄灭LED灯

 64   }

 65  }

 66     return 0;

 67 }

 68 

 69 //********************************************************************************************************

 70 //延时函数

 71 void delay(int dly)

 72 {

 73  int i,j;

 74  for(i=0; i 75   for(j=0; j<25000; j++);

 76   

 77 }

 78 

 79 //********************************************************************************************************

 80 //外部中断0服务程序

 81 void __irq IRQ_Eint0(void)

 82 {

 83  ModeSel=0;   //设置LED工作模式

 84  while((EXTINT&0x01)!=0)

 85  {

 86   EXTINT=0x01; //清除中断标志

 87  }

 88  VICVectAddr=0;

 89 }

 90 

 91 //********************************************************************************************************

 92 //外部中断1服务程序

 93 void __irq IRQ_Eint1(void)

 94 {

 95  ModeSel=1;   //设置LED工作模式

 96  while((EXTINT&0x02)!=0)

 97  {

 98   EXTINT=0x02; //清除中断标志

 99  }

100  VICVectAddr=0;

101 }

102 

103 //********************************************************************************************************

104 //外部中断2服务程序

105 void __irq IRQ_Eint2(void)

106 {

107  if(DelayTime>30)

108   DelayTime=DelayTime-10;  //减少延时

109  

110  while((EXTINT&0x04)!=0)

111  {

112   EXTINT=0x04;   //清除中断标志

113  }

114  VICVectAddr=0;

115 }

116 

117 //********************************************************************************************************

118 //外部中断3服务程序

119 void __irq IRQ_Eint3(void)

120 {

121  if(DelayTime<80)

122   DelayTime=DelayTime+10;  //增加延时

123  

124  while((EXTINT&0x08)!=0)

125  {

126   EXTINT=0x08;   //清除中断标志

127  }

128  VICVectAddr=0;

129 }

130 

131 


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章