51单片机外部中断程序断

查看: 19792|回复: 5
使用51单片机的中断功能!(绝对很简单的教程)
大家好,我是电子设计小杨,上次,小编给大家写了一个液晶显示1602的程序,其实那个程序看起来虽然很长,但是本身是不难的,只要理解了数据手册中的内容,按照数据手册上的时序图还有要求照着写下来,很快可以写出来,不过那仅仅是一个静态显示而已,如果要写一个动态显示的,方法和数码管的写法基本相似,大家可以模仿写数码管动态显示的方法去写。
好了,废话不多说,今天小编给大家讲讲如何来写51单片机的中断功能,51单片机中断源有5个,分别是外部中断0,外部中断1,定时器0,定时器1,串行口中断。& &不管是大学里上课的书本,还是参考书也好,在单片机的书里面都是写了一系列密密麻麻的知识点,最后就敲个代码,然后很多初学者从头学到尾,好像知道怎么写,但是又不会写。进来看这篇文章的同伴们,不管您会也好,不会也罢,小编把我当时怎么学中断的经验分享给大家,好让更多的同伴们早日脱离书本,开启自写编程时代!!!
好了,我们进入正题,到底什么是中断??中断这个过程我们程序员需要去做什么??我们带着这两个问题来查找我们当时为什么不会中断的原因。首先:
1、你想使用的中断是哪个?选择相应的序号;2、你所希望触发的条件是什么?3、你希望在中断之后干什么?
中断是什么?说白一点就是,比如你正在家里看电视,然后准备用电磁炉煮水来喝茶。水还没有开的时候当然你还在看电视对不对,等到水开了,当然一般水开了都会有个信号让你知道,那么你就要想着要关掉电磁炉。这个关掉电磁炉的动作就是所谓的中断。而关掉电磁炉之后你进而就要喝茶,然后在看电视或者做其它事情,那么中断以后的这个过程就是我们上面问题的第三点:你希望在中断之后干什么?好了,大家也大概明白了什么是中断了吧?我们不要像书本写的内容那么复杂,我们来说,怎么样来让51单片机执行中断,然后,有需要的我们再去查书本。那么,我们如何来写一个51单片机的中断呢??
首先,我们在主函数中要有以下代码:以外部中断0为例子:void main(){&&EA=1;& && &//打开中断总开关,等于1表示打开,等于0表示关闭&&EX0=1;& & //打开外部中断0,如果是外部中断1则为EX1=1;&&IT0=0;& & //选择触发方式,0是表示电平触发,1表示下降沿触发&&//如果是外部中断1则为IT1=?}接着写中断服务函数void interrupt_0()interrupt 0& &//这后面的中断序号千万别写错{& && &........................}大概就是以上的两个步骤!接下来我们来看一个程序代码:感受一下中断的魅力!
#include&reg51.h&
#define uchar unsigned char& & //宏定义
#define uint unsigned int& &
sbit led=P1^0;& && && && && && && && & //
void Delay(uint del)& & //10毫秒带参量延时函数& &
& && &&&uint i,j;
& && &&&for(i=0; i& i++)
& && &&&for(j=0; j&1827; j++);
void interrupt_0()interrupt 0& &//外部中断0的序号是0
&&led=~& && && && && &&&//将led的状态取反& && && && && &&&
&&delay(10);& && && && && & //延时10X10=100ms
//现在你试试,按一下P3^2的按键,看看led有没有闪一下,注意噢,这是用外部中断来实现led灯亮灭的噢,虽然也是用按键,但是开头我没有对任何一个按键KEY进行定义噢。
void main()
&&EA=1;& && && && && && & //打开总中断
&&EX0=1;& && && && && &&&//打开外部中断0
&&IT0=0;& && && && && && &//让外部中断0用电平触发方式
while(1);& && && && && &//让程序就停在这儿
好了,我们这一讲就到此结束吧,你们可以把我的程序拷贝回去改一改变成自己想要的中断操作模式,要是有不懂的地方多翻翻书本,如果还不理解的话可以加小编的微信提问。
delay(10);& & 跟这&&void Delay(uint del)& &&&“delay”与“Delay”要相同才对。注意大小写。
楼主想问一下,如果我只是想用串口中断,是不是就不用设置定时器的初值或是工作方式啥的
如果共阴控制一列小灯,需求是按下按键进入中断服务函数以后所有灯都亮,再次按下恢复原状,那应该怎么处理中断函数呢
楼主想问一下,如果我只是想用串口中断,是不是就不用设置定时器的初值或是工作方式啥的
要设置的,因为串口中断需要定时器来产生一个时钟,来产生波特率
Powered by51单片机外部中断使用注意事项
我的图书馆
51单片机外部中断使用注意事项
在使用单片机外部中断1时,可定义电平或者下降沿触发。很多人在使用下降沿触发时,老是碰到这样的问题。同一个信号来触发时进入中断2次,或者多次进入中断函数。造成这样的原因:第一、可能是中断信号有抖动,导致多次进入中断。第二、软件设计中,当进行中断响应处理时,关闭外部中断,当处理程序结束后,采用软件延时,再次请求中断。保证中断响应的不被再次中断请求打断。&1.对信号进行处理,估计是信号下降沿出现抖动2.用单片机延时处理下降沿信号&2)&边沿触发方式时,中断标志寄存器锁存了中断请求。中断口线上一个从高到低的跳变将记录在标志寄存器中,直到CPU响应并转向该中断服务程序时,由硬件自动清除。因此当CPU正在执行同级中断(甚至是外部中断本身)或高级中断时,产生的外部中断(负跳变)同样将被记录在中断标志寄存器中。在该中断退出后,将被响应执行。如果你不希望这样,必须在中断退出之前,手工清除外部中断标志。3)&中断标志可以手工清除。一个中断如果在没有得到响应之前就已经被手工清除,则该中断将被CPU忽略。就如同没有发生一样。&1.& & 进入中断,关闭中断2.& & 把中断方式改为"电平"&&!!!!3.& &在主程序中循环扫描了N次4.& &把中断方式改为"边缘"&&!!!!5.& &开中断中断标志位 是不能软件控制的, 以下方法可把中断标志位清零:关中断 ---&&电平 ---- 边缘边缘: 下降沿触发方式&&setb it0& &&&|& &setb it1&&电平: 低电平触发方式&&clr& & it0& && &|& &clr& & it1
[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢51单片机的外部中断详解_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
51单片机的外部中断详解
&&下面是本人使用51单片机的一点经验,写出来分享,请批评指正
51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢51单片机之——外部中断0(INT0)
寄存器是干什么的?怎么配置它?配置完寄存器后,有什么作用呢?
寄存器是中央处理器内的组成部分。它是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。寄存器可以用来暂存指令、暂存数据、暂存地址。换而言之,我们配置寄存器,便是给寄存器中赋予一定的值,而这些值又要与我们的目的想对应,这样它便会有相应的作用。
例如,芯片的资料规定,当给芯片的 A 寄存器赋“0x11”时,它会出现 B 现象;赋“0x77”时,它会出现 C 现象。那么当我们目的是完成 B 现象时,我们就只需要配置 A 寄存器为“0x11”即可。
虽说看起来很简单,并且去完成目的时的流程并非这么容易。但是,实实在在而言,这些就是控制寄存器的根本!
这里以外部中断0(INT0)为例,使得外部中断0每发生一次,最后一位数码管的数值加1。
前一篇博文已经提到,要实现外部中断0,就必须要配置好两个寄存器IP、IE。而对于中断优先级寄存器IP,当我们使用默认优先级时(上篇博文的优先级表格所述),就不必要去配置IP。
接下来附上IE寄存器的每一位的作用:
首先,中断允许位寄存器 IE 是可位寻址的,意思是说,我们可以单独的对D0~D7每一位进行操作,而不需要对 IE 整个赋值(为什么可以这样,因为keil的头文件“reg52.h”已经对 IE 的地址进行了定义)。
在这里说明一点,对于51单片机的 I/O 口而言,上电时,默认输出为高电平。对于其寄存器而言,上电是,默认为0。可见,当要完成外部中断0的配置时,我们只需要配置中的EX0、EA,当然还有外部中断0的触发方式(产生方式),这里就要看到中断及控制寄存器TCON,其成员及意义如下:
可见外部中断0和外部中断1的设置方式雷同,跟据上表所述,我们通过设置IT0来设置外部中断0的触发方式(分别为:低电平触发、下降沿触发),其中 IE 位由硬件自身控制,不需要软件操作。
实例的核心代码如下:
void main()
display();
void INT0() interrupt 0
if( IE == 1)
dspbuf[0]++;
在上面可以看到配置外部中断0相关的寄存器时,我们先打开EX0=1,允许外部中断产生,再EA
= 1,打开总中断,这样就配置好了能产生外部中断0的先决条件,通过IT0 来配置中断的触发方式。在中断服务函数中,函数名“INT0”可自由编写,并且中单服务函数不需要声明,后面所加的“interrupt X”X为该中断对应的C语言序号。
值得注意的是,对于51单片机而言,上电之后,所有寄存器的值默认为“0”,所有 I/O 口的值默认为“1”。
通过外部中断的理解,很方便的能引出下一节的定时器/计数器中断。
未完待续……
没有更多推荐了,先锋游戏知道信息频道欢迎您
编程:51单片机外部中断0 跳出问题第一个函数,使用外部中断0,发现能进中断但是,执行到中断最后一句就停了,或者等好久才回到主函数,,,求问(下面有个程序可进可出,看不出两个程序有什么不
[Loading...... 9] [ 13:03:38] (<span id="tgd) (<span id="tfd) &&
问题详情51单片机外部中断0 跳出问题第一个函数,使用外部中断0,发现能进中断但是,执行到中断最后一句就停了,或者等好久才回到主函数,,,求问(下面有个程序可进可出,看不出两个程序有什么不一样)第二个函数,本意和上一个程序一样,这个可进可出,看不出两个程序有什么不一样)最佳答案第一个程序,使用的i,j,k是全局变量,而且中断是电平中断,在没有清中断标志位的情况下,在按下中断电路后,会产生多个中断信号,每个中断程序都在把他们清零,从而相互影响,导致很难达到计数终点,程序难以终止;而第二个程序使用的是局部变量,各中断程序相互独立进行不受干扰的延时,所以表现正常。其他答案你在中断的里面,调用了delay()延时,所以中断必须延时那么多时间后,才会继续往下走,然后才退出中断
昵称: 验证码:
评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述
编程相关知识
编程其他问题

我要回帖

更多关于 51单片机外部中断程序 的文章

 

随机推荐