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<del; i++)
for(j=0; j<1827; j++);
}
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); //让程序就停在这儿
}