找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5409|回复: 13
收起左侧

51单片机开中断问题,把EA=1放在主程序中?

[复制链接]
ID:100982 发表于 2021-10-9 09:52 | 显示全部楼层 |阅读模式
看别人写的程序,总是喜欢把EA = 1放在主程序中,我个人理解这样的话是开多个中断,防止忘记,同时也省的重复打开。是不是这样啊?
回复

使用道具 举报

ID:624769 发表于 2021-10-9 13:06 | 显示全部楼层
只要有中断,EA总要开的,就算不是放主程序,也是放在只调用一次的子函数里,所以……,有什么区别?而只调用一次的子函数,除了代码看起来好看点(所谓的可读性高一点),在实际应用上没有任何好处。

最后,反复 EA = 1; 除了浪费一点资源,对程序不会有任何影响,所以不必刻意回避多次EA = 1;的情况发生。
回复

使用道具 举报

ID:100982 发表于 2021-10-9 13:09 | 显示全部楼层
188610329 发表于 2021-10-9 13:06
只要有中断,EA总要开的,就算不是放主程序,也是放在只调用一次的子函数里,所以……,有什么区别?而只调 ...

这样啊,可能只是为了程序看上去简洁逻辑性更强吧
回复

使用道具 举报

ID:722595 发表于 2021-10-9 13:25 | 显示全部楼层
EA只是个总开关,既然要用到中断就先把总开关打开,后面看需求再打开对应定时器中断的开关,好像没什么问题吧
回复

使用道具 举报

ID:960157 发表于 2021-10-9 13:27 | 显示全部楼层
EA放在主程序是正路,汇编,C我都是这样做的。
回复

使用道具 举报

ID:57657 发表于 2021-10-9 13:31 | 显示全部楼层
不管是什么定时器、外部、串口等中断,必须打开EA才可以触发。
回复

使用道具 举报

ID:624769 发表于 2021-10-9 13:59 | 显示全部楼层
wifen 发表于 2021-10-9 13:09
这样啊,可能只是为了程序看上去简洁逻辑性更强吧


只是看上去,真正为了程序简洁的话,我一般连EA = 1都不会用,直接是IE = ??
看有些人 一个寄存器 反复的 &=   |= 的,看得脑壳疼,关键是,一个寄存器,在这个初始化子函数里操作一下,那个初始化子函数操作一下,看上去好像逻辑很清晰,每个功能的初始化分门别类,但是,宏观上看起来就会很累,所以我一般主程序里所有寄存器统一设置。

如下:
Maincode.png


别人怎么看,我不知道,至少事隔多年,回头自己看自己的程序,While(1) 前面的一扫,基本知道自己的程序要用哪些功能,是不是方便移植到另一款单片机,一目了然。
Maincode.png
回复

使用道具 举报

ID:123289 发表于 2021-10-9 14:01 | 显示全部楼层
你家有用电器若干,但总闸只有一个。
EA是CPU中,中断的总闸。上电时,这个总闸是打开的,未闭合。
明白这个道理,就应知道在何合闸拉闸比较合适了。
例如:
白天,只有电饭锅在用电,饭好了,切断电饭锅电源就可以了,总不至于要拉总闸吧。
一张灯坏了,修灯,为了安全,把总闸拉了,是合理的吧。当然只切断灯的电路,也可以。不过万一……,,这时就是安全第一了。
所以:根据需要,只要你认为是合理的,放哪里无所谓。
一般初化的最末一件事,就是开中断总闸。
如果某段程序对时序要求很高,不宜被中断干扰打断时,就切断EA,程序结束后恢复EA。当然这样做是有风险的。
回复

使用道具 举报

ID:790408 发表于 2021-10-9 14:11 | 显示全部楼层
只是个人写代码的习惯吧
回复

使用道具 举报

ID:100982 发表于 2021-10-9 16:22 | 显示全部楼层
188610329 发表于 2021-10-9 13:59
只是看上去,真正为了程序简洁的话,我一般连EA = 1都不会用,直接是IE = ??
看有些人 一个寄存器 反 ...

这个不错,很清晰
回复

使用道具 举报

ID:23640 发表于 2021-10-9 16:44 | 显示全部楼层
188610329 发表于 2021-10-9 13:59
只是看上去,真正为了程序简洁的话,我一般连EA = 1都不会用,直接是IE = ??
看有些人 一个寄存器 反 ...

独立成模块控制的好处是方便维护和下一任程序员修改,当然如果你的程序只用这一次就不用考虑模块化了,分多个子函数是要浪费点时间的。
回复

使用道具 举报

ID:57657 发表于 2021-10-9 21:00 | 显示全部楼层
188610329 发表于 2021-10-9 13:59
只是看上去,真正为了程序简洁的话,我一般连EA = 1都不会用,直接是IE = ??
看有些人 一个寄存器 反 ...

IE是字节寄存器,可以位寻址,
EA是IE寄存器里的一个位寄存器。
回复

使用道具 举报

ID:624769 发表于 2021-10-9 21:18 | 显示全部楼层
npn 发表于 2021-10-9 21:00
IE是字节寄存器,可以位寻址,
EA是IE寄存器里的一个位寄存器。

就简洁而言……

EX0 = 1;
EX1 = 1;
ET0 = 1;
ET1 = 1;
EA  = 1;
远不如,
IE = 0x8f;  来的简洁。
而要做到简洁加直观的话……
IE = B_1000_1111;   就能达到要求了。
回复

使用道具 举报

ID:401564 发表于 2021-10-9 23:24 | 显示全部楼层
EA是总开关,肯定是要放在一个显眼的地方呀
你要是放在别的函数中,要是刚开始写代码的时候,忘记打开了,到时候中断问是无法进入,你都不知道怎么回事
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表