好了,废话不多说,今天小编给大家讲讲如何来写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<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); //让程序就停在这儿
}
好了,我们这一讲就到此结束吧,你们可以把我的程序拷贝回去改一改变成自己想要的中断操作模式,要是有不懂的地方多翻翻书本,如果还不理解的话可以加小编的微信提问。
simple799 发表于 2018-4-27 11:48
楼主想问一下,如果我只是想用串口中断,是不是就不用设置定时器的初值或是工作方式啥的
七九六 发表于 2018-7-19 09:40
为啥一定要是P3^2
七九六 发表于 2018-7-19 09:42
不是要满足一个条件才能进入中断的吗,为什么楼主历程中没有给出就可以》?
jiror 发表于 2018-4-29 19:13
如果共阴控制一列小灯,需求是按下按键进入中断服务函数以后所有灯都亮,再次按下恢复原状,那应该怎么处理 ...
oplink 发表于 2018-8-25 10:30
楼主,我做了一个51单片机电子时钟,里面加入了音乐,每当闹钟响起时单片机开时唱歌,但显示屏上的时钟就停 ...
1650599047 发表于 2018-9-10 23:26
我也做过类似的,播放音乐的同时1602进行动态显示,可我用的是while里加了一个for循环就可以了,不知你是 ...
simple799 发表于 2018-4-27 11:48
楼主想问一下,如果我只是想用串口中断,是不是就不用设置定时器的初值或是工作方式啥的
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |