历史上的今天
今天是:2025年03月26日(星期三)
2020年03月26日 | 中断的理解
2020-03-26 来源:eefocus
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 #define uchar unsigned char //宏定义 #define uint unsigned int sbit led=P1^0; // void Delay(uint del) //10毫秒带参量延时函数 { uint i,j; for(i=0; i } void interrupt_0()interrupt 0 //外部中断0的序号是0 { led=~led; //将led的状态取反 delay(10); //延时10X10=100ms } //现在你试试,按一下P3^2的按键,看看led有没有闪一下,注意噢,这是用外部中断来实现led灯亮灭的噢,虽然也是用按键,但是开头我没有对任何一个按键KEY进行定义噢。 void main() { EA=1; //打开总中断 EX0=1; //打开外部中断0 IT0=0; //让外部中断0用电平触发方式 while(1); //让程序就停在这儿 } for(j=0; j<1827; j++);
史海拾趣
|
我想用一个红外对射开关控制欧姆龙MY2NJ继电器工作,对射开关的型号见图片 我用黄颜色的线接到继电器,继电器不能工作,继电器都是好的,我用12V电压直接控制继电器,是可以工作的,但用感应的不知道怎么接法。 红外对射开关工作电压是5V,继电器 ...… 查看全部问答> |
|
想在动车组两个车厢中实现数据的无线传输。 也考虑到一些实现方法,但是由于动车组有屏蔽大,速度快特点,造成无线数据包传输难度很大。 请问各位高手,用什么方式能达到这个目的呢?前提是不对车厢作出改造,比如车体外安装天线等 … 查看全部问答> |
|
Fluke 27-II 工业多用表 新型 Fluke 27 II数字多用表树立了在困难情况下进行测量的新标准,它具有优异的功能和准确度,可以轻松解决大多数电气故障。 这款多用表均符合 IP 67(防水和防尘)规格,正在接受 MSHA 的认证审批,并且拥有更广的工作温 ...… 查看全部问答> |
|
首先在这里要提一下Keil的网页转换工具FCARM.exe的使用,花费了我好几个小时。TI也有一个类似的程序,是Makefsfile,并且源码公开的。 这个FCARM.exe,一直认为只要这个custom arguments里边设置好了FCarm.exe的路径就可以在勾 ...… 查看全部问答> |
|
我写了一个简单的求正旋值的c程序: #include<math.h> #define NX 180 #define pi 3.14159 short i; double x[NX]; double r[NX]; void main(void) { for(i=0;i<NX;i++) {x=pi*i/180; r=sin(x); ...… 查看全部问答> |




