找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1939|回复: 9
收起左侧

从计时器的使用入手理解单片机中断的概念与编程

  [复制链接]
ID:266429 发表于 2023-3-21 12:04 | 显示全部楼层 |阅读模式
前面既然已经讲了定时器中计时器的使用,刚脆还是把定时器中断给讲一下。
先打个比方说吧,比如说,你是个超级奶爸,在家招呼读书的孩子,将孩子送到学校去之后,你回家得买菜洗菜煮饭烧菜,你先把上午的菜给备好了,然后计划11点钟煮饭,11点半开始烧菜,你怎么做?象前面的计时器的使用一样盯着时钟看?也不是不行,但是那你这段时间别的事算是做不成了,下午的菜备不备?你心爱单片机玩不玩?想看的小说是不是让你心痒痒?怎么办?买个闹钟呗,然后上好闹钟呗,然后就去干你想干的别的事。
然后闹钟响了,你自然会起身,去做这个时候该做的重要的事件了。等等,该做什么?我怎么忘了?怎么办?让我想想,哦想起来了,煮饭。不行,不能这样,这次能想起来,下回万一想不起来怎么办?好办,在闹钟上贴个条子,上面写上这个闹钟响后要做的事:你呀的快去煮饭。
嗯不错,饭煮上了,接下来干什么呢?继续做之前在做的事是个不错的主意,哦你个卖糕滴,上次做的是什么事?做到哪一步了?我怎么又给忘了?这样不行,下次在闹钟响的时候,得把手头正在做的事记一下并放在一个固定的地方,煮完饭后回到这个地方找到记录,真好,我真聪明,虽然我的记性非常感人。
以上事件中,最主要的是你手头正在做的事,被闹钟打断,因为你得立即去处理闹钟上写的事。你把这个闹钟上写的事处理完之后,还得回头继续做前面做的事。这些事,反正现有的教材称之为中断和中断处理。
引起中断的事件当然不止是闹钟,还有可能是另外的事,比如说,你玩单片机玩得正高兴,突然你那位喊你去买菜,你也不得不放下自己的心爱,乖乖地买菜去先。买完菜之后,你不见得就能去继续玩机器了,说不定你那位又给你一个中断,让你去拖地。地还没拖完,孩子回来了找你要钱买玩具。真是中断事件一件接一件,怎么处理?
你怎么处理我不管,咱们现在管管单片机怎么处理中断,其实跟上面说的差不多,你把中断后要做的事,写在一段程序中(就如上面说的挂在闹钟上的那个小纸条)C语言中叫中断函数。这个函数的开头记录现场(将一些数据推入指定的单元中如堆栈),末尾则写上程序据此恢复现场。
为什么写一段中断函数就行了,而不是在主函数中写一段中断处理程序,也不用在主程序中写调用函数?又是一个疑问点不是?因为单片机在芯片设计上是这样设计的:程序在运行中,一旦被中断,则程序的运行是直接跳转到程序存储器中的一个固定地址单元中,并把这个单元中的数据当作操作码来执行。一个单片机是至少有几个中断的,如每个定时器都具备中断功能。如何区分不同的中断?靠的就是每个中断分配有不同的跳转固定地址,这个在教材中称之为中断的入口地址,具体地址分配表称之为中断向量表。定时器0的中断入口地址为000BH,也就是说定时器0在发生溢出后,如果你打开了其中断功能,则程序立即跳转到程序存储器中地址编号为000BH的单元处开始运行程序,用不着你专门写调用指令。在51单片机的设计中,紧随其后的一个中断入口地址为0013H,所以,0013H这个单元中,你不能写入其它程序,否则编译会乱套,而在000BH0012H之间你也只能写入定时器0的溢出中断后要执行的程序,除非这个中断在你的程序中永远用不到。这个空间太少了,一般是不够用的,所以,编程中都是只写个跳转命令,让其跳转到后面,这个跳转幅度,一般要完全避开所有的中断入口地址,以免影响中断功能的使用。

回复

使用道具 举报

ID:301191 发表于 2023-3-27 23:25 | 显示全部楼层
顶一下
回复

使用道具 举报

ID:301191 发表于 2023-4-18 04:25 | 显示全部楼层
顶一下
回复

使用道具 举报

ID:155507 发表于 2023-4-18 07:54 | 显示全部楼层
单片机中断是指在单片机执行主程序的过程中,由于某个事件的发生,导致单片机跳转到固定的地址单元中执行中断程序。中断是一种异步事件,它可以打破程序的顺序执行,使得单片机可以在主程序运行的同时,处理一些紧急或时间敏感的事件。

在单片机中,中断通常是由外部设备触发的,比如定时器、串口、IO口等。当这些设备产生信号时,单片机就会暂停正在执行的主程序,跳转到中断程序中执行相应的处理,处理完后再返回主程序继续执行。

在编程中,首先需要设置中断的优先级和中断向量。中断向量是指单片机内部预留的一段地址空间,用来存放中断服务程序的入口地址。当中断发生时,单片机会跳转到相应的中断向量地址,执行中断服务程序。中断优先级则用于决定多个中断同时发生时,处理的先后顺序。

接着,需要编写中断服务程序。中断服务程序通常是一个短小精悍的程序,主要用于处理中断事件,保存相关的寄存器状态,执行相应的操作,并恢复现场。在程序开头需要将一些寄存器状态保存到堆栈中,以便在中断服务程序执行完毕后,恢复这些寄存器的状态,然后使用 RETI(Return from Interrupt)指令返回主程序。

在使用中断时,还需要注意一些细节问题,比如中断的开关、中断的嵌套、中断服务程序的执行时间等等。在编写中断程序时,需要考虑这些问题,以确保程序的正确性和可靠性。

总之,中断是单片机编程中非常重要的一个概念,它可以使单片机具有更高的实时性和响应性,提高程序的灵活性和可靠性。掌握中断的原理和编程方法,对于单片机编程人员来说是非常必要的。
回复

使用道具 举报

ID:291668 发表于 2023-4-18 08:49 | 显示全部楼层
讲得很清楚了,感谢分享
回复

使用道具 举报

ID:689425 发表于 2023-5-4 09:30 | 显示全部楼层
不错不错,受益匪浅
回复

使用道具 举报

ID:641483 发表于 2023-5-11 10:51 | 显示全部楼层
楼主这样介绍通俗易懂,像我这类小白就容易理解很多了,希望楼主出更多的好文章。
回复

使用道具 举报

ID:284491 发表于 2023-5-12 22:18 | 显示全部楼层
不错不错 理解生动
回复

使用道具 举报

ID:1057928 发表于 2023-11-2 15:20 | 显示全部楼层
很形象
回复

使用道具 举报

ID:1111542 发表于 2024-3-2 09:26 | 显示全部楼层
非常好的帖子,新人学习了,谢谢楼主!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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