单片机高手请看:中断中的中断,麻烦中的麻烦。 怎一个难字了得?挑战高手

wt13 2002-04-01 12:05:04
我现在要写这么一个小程序,希望实现以下功能:希望各位高手帮我分析一下

1.有两个小灯L1, L2; 还有一控制开关Vt。
2.当Vt第一次打开的时候,首先L1亮72秒,然后L1和L2都熄灭18秒,再L2亮72秒。再L1和L2熄灭18秒,再继续L1亮72秒。如此循环。
2.当Vt关闭的时候,L1和L2都熄灭,但是要记住前面亮的是L1还是L2,假设为L1亮,且已经亮了Ta1秒.这时如果Vt又打开,则L1继续亮,假设再亮Ta2秒以后,又Vt关闭,则熄灭,又Vt打开,继续亮Ta3,…… 要满足一个条件:Ta1 + Ta2 + Ta3 + ...+ Tan = 72秒。 也就是说,其中的一个灯,它亮的总时间必须是72秒,再开始亮另一个灯。
3.假设Vt关闭前亮的灯是L2,则L2和L1一样,亮的总时间必须72秒
4.如果Vt关闭前正处于L1和L2都熄灭的休息时间,则Vt再次打开的时候,将从L1开始亮的起点重新循环。



我自己的分析:因为Vt关闭后,要保存前面的灯亮的时间,所以不能用Vt控制单片机芯片的电源,把延时部分独立出来,暂不考虑。

2.把Vt信号作为一个中断,假设为INT1; 再将Vt信号反相作为一个中断(响应Vt关闭),假设为INT0。当Vt打开的时候,就开始灯亮的过程。在响应INT1中断的过程中,设置INT0为高优先级,所以当Vt关闭的时候能及时响应。在响应INT0的过程中,这时设置INT1为高优先级,所以当Vt打开的时候又能及时响应。



疑问:因为在响应一个中断的时候,另一个中断来了,必须响应,这样中断得不到返回。那样岂不是会造成内存泄漏(借用C/C++的概念,我不知道是不是这么一个说法)
举例吧:假如正在响应中断INT1 ------>这是来了INT0,必须响应,所以转入INTO的响应中 ----->这时又来了INT1, 又是必须响应的,所以转入INT1的响应中 ------->假设又来了INT0, 又必须响应 ………………于是中断永远也不能返回。

请各位高手,高高手, 牛哥牛姐,牛弟牛妹帮我分析分析。 不胜感激!
...全文
88 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
81739649 2002-04-02
  • 打赏
  • 举报
回复
我想知道单片机是什么一个东西,
哪位愿说呀?
sjg20010414 2002-04-01
  • 打赏
  • 举报
回复
以下言论针对mcs51系列:
将需要查询的信号线挂接在p0或p2口上似乎不太好
单片机运行时修改中断优先级的做法不妥
不反对楼上兄弟的做法,因为单片机中查询(或中断查询)比中断更普遍
"把延时部分独立出来,暂不考虑",你的延时是如何实现的?你必须准实时的读取
时间,(满足你的实际需要为准),延时过长违反题意.当然,小灯的余辉时间也够长的,没要求那么精确.
wt13 2002-04-01
  • 打赏
  • 举报
回复
your_friend(你的朋友)

太谢谢你了,这个问题如果不用中断的话确实很容易。

我前面只想到中断,走入了死胡同
Your_friend 2002-04-01
  • 打赏
  • 举报
回复
我对单片机不是很熟悉,不过我认为你这个功能不难实现。
你可以把Vt开关,L1及L2小灯分别接到P0,P1,P2三个I/O端口上,不需要使用INT引脚,程序循环检测Vt开关(P0端口),逻辑1为开点亮L1小灯,然后开始计时和循环检测Vt开关。(兄弟,72秒的延时不算短的一段时间吧,在这段时间中你的程序除了读时间计数器还干什么呢?空操作呀!所以不需要INT引脚)当时间到或Vt变为逻辑0时,将计数数值清0或保存计数数值,熄灭L1灯并设置标志位,标志先前的状况是L1灯亮。熄灭的18秒时间也是读记数器和循环检测Vt开关,时间到或Vt变为逻辑1时点亮L1灯。以此类推,循环反复。
系统功能: 1.OPA2134+LM1876两声道功放 2.内置MP3播放器,支持mp3、wma、wav、midi格式 3.通道选择(可选外部音源或内部MP3音源) 4.FFT频谱变换 5.红外摇控 6.电子书、游戏、时间 功放部分: 功放部分是很早之前已经做好的了。前级放大用的是OPA2143双运放,末级功率放大用LM1876集成功放,它内部相当于两个LM1875。关于几款流行的功放IC比较,可以看一下附件的文章。 前级放大一般来说是比较讲究的,我尝试了几种运放,一个是经典的NE5532,一个是AD827,另一个就是现在用的OPA2134,三者之,感觉最好的是OPA2134,高低音分辨清晰,其次是AD827,许多发烧友都说AD827比OPA2134要好,可能是我不太懂分辨吧,又或者AD827就是搭配更强的LM3886才会发挥出更强效果了。其实上面的三个芯片用起来都差不多的了,就连在赛格几块钱买来的5532听起来也不比现在用的OPA2134差多少。 至于末级功放,以前一直对LM3886有好感,但现在用了LM1876才发现其实这也不失为一个很好的选择啊,一来是它是两声道,二来就是它的音质确实了得,特别是重低音方面性能相当可观。我自己也不属于发烧友一族,所以大可接受了。 MP3部分: 主控仍然是用熟悉的STM32,为了节省成本、空间和方便做板,这回用的是48脚的STM32f103C8T6,才64K flash,太可怜了,一不小心用爆了,不得不向SRAM借空间用。音频解码用VS1003(便宜实用)。 控制部分: 两种方式,第一种是红外摇控,一直都比较喜欢用的,因为只占用一个IO口,而且是全管理,很方便。 而另一种是面板上的按键控制。这次又拿出了“杀手锏”——74HC148优先编码器,8个按键8种编码器,恰到好处哈哈。同样是用管理按键,而且只须一个就可以管理全部的按键,性价比高吧。 FFT部分: 又用上FFT了,哈哈,这程序叫做“一劳永逸”,因为艰苦写过一次之后,以后就是简单的移植。全世界最好移植的程序莫过于FFT程序了,不过首先还是得懂它的原理。以前做过这部分,不过当时是用AVR单片机做的,受SRAM限制仅做64点FFT,现在用STM32,SRAM足够大了,于是就做个128点的FFT,这样的话显示起来也好看很多。采样率设置成44KHz。128点,只需取其前64点显示,变换后前64点和后64点是对称的。 其他部分: 文件系统,用STM32读取SD卡的文件系统。现在用的是FAT32。程序是直接移植之前做的PDA程序。游戏,移植来的,但有些要修改的地方未弄好。系统时间,用STM32内部实时时钟。外壳,在赛格花20块钱买来的,然后再钻呀,锯呀,DIY出来了。 有兴趣的话可以到这里下载源码和PCB原理图。

21,496

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧