历史上的今天
返回首页

历史上的今天

今天是:2025年01月28日(星期二)

2020年01月28日 | 基于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 


推荐阅读

史海拾趣

南京绿芯(Grenergy)公司的发展小趣事

对于电子消毒柜电路,网友可能的问题涉及多个方面,包括故障排查、日常维护、使用注意事项等。以下是一些可能的问题及详细回答:

一、故障排查类问题

1. 消毒柜通电后跳闸怎么办?

回答
消毒柜通电后跳闸可能是由电路短路引起的。首先,检查电源插座的火线(L)、零线(N)、地线(E)是否接线正确。其次,按照消毒柜上的线路图检查柜内线路接线是否正确,以及线路绝缘层是否被破坏(如被螺丝钻破、被金属边角划破等)。如果以上检查均正常,可能是电源板或继电器等部件损坏,建议联系专业维修人员进行检查和更换。

2. 消毒柜插上电源后无法启动,指示灯不亮怎么办?

回答
消毒柜无法启动且指示灯不亮,可能是由以下原因造成:电源插座无电或接触不良、熔断器烧坏、电源线与机体接触不良或断路、变压器烧坏或断路、电路板烧坏、继电器失灵等。解决方法包括检查电源插座、更换熔断器、检查并修复线路、更换电路板或继电器等。如果问题依然存在,建议联系专业维修人员进行检查。

二、日常维护类问题

1. 消毒柜需要定期清洁哪些部位?

回答
消毒柜需要定期清洁的部位包括柜体内部、层架、门封条以及散热孔等。清洁时,应使用柔软的布或海绵,避免使用腐蚀性强的清洁剂。同时,要注意不要将水溅入电路板等电子元件区域,以免造成短路或损坏。

2. 消毒柜的电源线应该如何保养?

回答
消毒柜的电源线应定期检查是否老化或破损,如有发现应及时更换。在使用过程中,应避免电源线过度弯折或受到重物压迫,以免影响其使用寿命和安全性。此外,电源线应远离高温、潮湿和腐蚀性强的环境,以确保其绝缘性能不受影响。

三、使用注意事项类问题

1. 消毒柜在使用时需要注意哪些安全问题?

回答
消毒柜在使用时需要注意以下安全问题:

  • 确保电源插座接地良好,避免漏电危险。
  • 不要将易燃易爆物品放入消毒柜内,以免发生火灾或爆炸。
  • 在使用过程中,应避免频繁开关柜门,以免影响消毒效果和能耗。
  • 使用完毕后,应及时关闭电源并拔掉插头,以节约能源和延长设备使用寿命。

2. 消毒柜是否可以一直插电使用?

回答
消毒柜是否可以一直插电使用取决于用户的使用情况和需求。如果用户经常使用消毒柜且没有其他特殊需求,可以保持电源连接;如果用户不经常使用消毒柜或者有其他特殊需求(如节约能源、避免设备老化等),建议在使用前提前通电,并在非使用状态下拔掉电源。此外,为了确保安全,插座应具备防水、防漏电等功能。

综上所述,对于电子消毒柜电路的问题,网友可能关注故障排查、日常维护和使用注意事项等方面。通过了解这些问题的解决方法和注意事项,可以更好地使用和维护消毒柜,确保其正常运行和延长使用寿命。

BELDEN公司的发展小趣事

作为一家拥有百年历史的电子企业,BELDEN公司始终保持着持续创新和可持续发展的理念。公司不断投入研发资金,加强技术研发和创新能力,推出了一系列具有自主知识产权的新产品和技术。同时,公司还注重环保和可持续发展,积极采用环保材料和生产工艺,致力于降低生产过程中的能耗和排放。这些举措不仅提升了公司的竞争力和市场份额,还为公司的长期发展奠定了坚实的基础。

这五个故事从不同角度展示了BELDEN公司在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。这些事实性的描述旨在客观呈现BELDEN公司的历史与现状,不含任何褒贬之意。

Excelics [Excelics Semiconductor, Inc.]公司的发展小趣事

为了进一步拓展国际市场,Excelics Semiconductor积极寻求与国际知名企业的合作。他们与欧洲一家领先的芯片制造商签订了战略合作协议,共同开发新一代的智能芯片。这一合作不仅提升了Excelics Semiconductor的技术实力,也为其在国际市场上赢得了更多的份额。

CTS公司的发展小趣事

进入20世纪90年代,CTS公司迎来了重要的技术突破。随着Motorola通讯零件事业部的加入,CTS在无线通讯领域取得了显著进展,成为该领域的领先者。此外,CTS还积极投入研发,不断推出创新产品,进一步巩固了其在电子行业的地位。

Future Designs, Inc. (FDI)公司的发展小趣事

Future Designs, Inc.(FDI)成立于几十年前,最初由一群在电子设计领域拥有丰富经验的工程师创立。他们看到市场上对于高质量、快速响应的触摸屏LCD图形用户界面(GUI)解决方案的需求日益增长,于是决定成立一家公司,专注于提供此类产品和服务。初创时期,FDI面临诸多挑战,包括资金短缺、市场认可度低以及技术难关等。然而,凭借团队成员的坚持不懈和专业技术,他们逐步攻克难关,开发出了ELI™和罗德里格斯™GUI家族产品,为公司赢得了初步的市场地位。

Boundary Devices公司的发展小趣事

作为一家有社会责任感的企业,Boundary Devices始终关注环境保护和可持续发展。公司在生产过程中积极采用环保材料和技术,减少对环境的影响。同时,公司还积极参与社会公益活动,为社会的发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

以上五个故事基于Boundary Devices公司的发展背景和电子行业的一般趋势进行创作,旨在展示该公司在不同阶段的成长与发展。然而,实际的公司发展历程可能更加复杂和丰富,需要更多的资料和信息来深入了解。

问答坊 | AI 解惑

求,,万年历不知那里程序写错了。。请大虾门帮手看看。。。

万年历不知那里错了,,写入1302里的程序,读出来数码管显示的不是数字,只有见到秒数那里在跳动,请大家帮手看看那里错了。。谢谢 SCLK EQU P3.2 IO EQU P3.3 RST EQU P3.4 YEAR DATA 66H ...…

查看全部问答>

从12864C-1读数据到单片机的问题,卡了很多天

恳求各位前辈帮忙 从12864读数据,用现有的子程序调试,若给某地址(如0x80)写数据,下面一句紧跟着读数据的话,可以读出刚写数据的ASCII码(我把读回的数据用P1口LED灯显示)。但如果是先在不同地址写出多个数据,再对某一地址进行读数据操作,结 ...…

查看全部问答>

关于s3c2440的裸机i2c驱动问题

最近小弟写了一个基于s3c2440的裸机i2c驱动可是怎么都不好使,调试时能写入但是不能读出为什么 编译环境keil uvion 4.01b 代码 这个是ii2.h #include \"S3C2440.h\" //引脚配置+电源配置+频率配置+iic配置 //函数iic写一个数据 iic读一个数据 ii ...…

查看全部问答>

求一CE5.0下有开发经验的师傅一名,帮助小弟开发一个简单程序.重分相谢....急

小弟碰一项目,用pda扫描rfid. 小弟有程序开发经验.脑袋还算灵活 现求一高人在开发中指点一二. 重分相谢 留下QQ联系方式..谢谢.. 急,很急…

查看全部问答>

TI---LM3S的图形驱动库和触摸之间的关系

有几个问题没懂:        1-TouchScreenCallbackSet(WidgetpointMessage);        2-WidgetMessageQueuePrecess(); 这个两句到底是传递的什么?       讨论下 ...…

查看全部问答>

STM32最便宜的型号是什么?

                                 STM32最便宜的型号是什么? …

查看全部问答>

刚答完题,总结下答题心得

replyreload += \',\' + 1325359;今天是端午节放假第一天,正好有时间,就把LaunchPaD的题答了。刚把三个级别的题都答完。答题过程连猜带查资料,选择题都对了。不知道那几个填空题怎么样。 幸好是不限时,不然好多题肯定就做不对了。通过答题,觉 ...…

查看全部问答>

有关boost电路的迷惑?

大家好,我最近在学习boost电路,我有点不太明白,就是电感的两个峰值电流I1和I2,他们的平均电流IL到底是和输入电流相等,还是和输出电流相等啊?有的资料上是和输入,有的是和输出,希望大家帮忙指教。谢谢了……! 还有一个问题就是boost电路的 ...…

查看全部问答>

请教STM32F103ZET FSMC 访问MT9076失败

E:/9076时序.jpg --------------FSMC 总线 存储器参数配置------------------------------*/           p.FSMC_AddressSetupTime =0x0F;           //地址建立时间  ...…

查看全部问答>