找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 60506|回复: 20
打印 上一主题 下一主题
收起左侧

使用51单片机的中断功能!(绝对很简单的教程)

  [复制链接]
跳转到指定楼层
楼主
ID:102668 发表于 2016-1-11 01:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我是电子设计小杨,上次,小编给大家写了一个液晶显示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<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);               //让程序就停在这儿
}

好了,我们这一讲就到此结束吧,你们可以把我的程序拷贝回去改一改变成自己想要的中断操作模式,要是有不懂的地方多翻翻书本,如果还不理解的话可以加小编的微信提问。



评分

参与人数 1黑币 +8 收起 理由
keneng + 8 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶5 踩
回复

使用道具 举报

沙发
ID:130231 发表于 2017-10-17 19:11 | 只看该作者
delay(10);    跟这  void Delay(uint del)     “delay”与“Delay”要相同才对。注意大小写。
回复

使用道具 举报

板凳
ID:317676 发表于 2018-4-27 11:48 来自手机 | 只看该作者
楼主想问一下,如果我只是想用串口中断,是不是就不用设置定时器的初值或是工作方式啥的
回复

使用道具 举报

地板
ID:318909 发表于 2018-4-29 19:13 | 只看该作者
如果共阴控制一列小灯,需求是按下按键进入中断服务函数以后所有灯都亮,再次按下恢复原状,那应该怎么处理中断函数呢
回复

使用道具 举报

5#
ID:302241 发表于 2018-7-2 21:27 | 只看该作者
学习一个
回复

使用道具 举报

6#
ID:363696 发表于 2018-7-8 20:15 | 只看该作者
simple799 发表于 2018-4-27 11:48
楼主想问一下,如果我只是想用串口中断,是不是就不用设置定时器的初值或是工作方式啥的

要设置的,因为串口中断需要定时器来产生一个时钟,来产生波特率
回复

使用道具 举报

7#
ID:374198 发表于 2018-7-19 09:40 | 只看该作者
为啥一定要是P3^2
回复

使用道具 举报

8#
ID:374198 发表于 2018-7-19 09:42 | 只看该作者
不是要满足一个条件才能进入中断的吗,为什么楼主历程中没有给出就可以》?
回复

使用道具 举报

9#
ID:376237 发表于 2018-8-24 08:23 | 只看该作者
中断服务函数要放在主函数后面,在前面是大忌
回复

使用道具 举报

10#
ID:93625 发表于 2018-8-24 09:40 | 只看该作者
学习一下
回复

使用道具 举报

11#
ID:387733 发表于 2018-8-25 07:31 | 只看该作者

因为P3^2是外部中断0的输入脚,只有这个引脚变化才能产生外部中断0
回复

使用道具 举报

12#
ID:387733 发表于 2018-8-25 07:38 | 只看该作者
七九六 发表于 2018-7-19 09:42
不是要满足一个条件才能进入中断的吗,为什么楼主历程中没有给出就可以》?

外部中断进入中断需要满足的条件,就是相应的外部中断引脚电平发生变化,在这里使用的是外部中断0,相对应的引脚是P3.2,当连接在这个引脚的按键被按下时,引脚电平发生变化,因而触发进入中断服务程序
回复

使用道具 举报

13#
ID:387733 发表于 2018-8-25 07:41 | 只看该作者
jiror 发表于 2018-4-29 19:13
如果共阴控制一列小灯,需求是按下按键进入中断服务函数以后所有灯都亮,再次按下恢复原状,那应该怎么处理 ...

可以设置一个亮灯标志,在按下按键进入中断服务程序后,反转标志,再根据标志亮灯或者熄灯。
回复

使用道具 举报

14#
ID:56002 发表于 2018-8-25 10:30 | 只看该作者
楼主,我做了一个51单片机电子时钟,里面加入了音乐,每当闹钟响起时单片机开时唱歌,但显示屏上的时钟就停止了,闹钟结束时钟又开始正常走时,请问有什么办法解决边放音乐和时钟显示正常,谢谢!
回复

使用道具 举报

15#
ID:318629 发表于 2018-9-10 23:26 | 只看该作者
oplink 发表于 2018-8-25 10:30
楼主,我做了一个51单片机电子时钟,里面加入了音乐,每当闹钟响起时单片机开时唱歌,但显示屏上的时钟就停 ...

我也做过类似的,播放音乐的同时1602进行动态显示,可我用的是while里加了一个for循环就可以了,不知你是用什么方法解决的。
回复

使用道具 举报

16#
ID:406748 发表于 2019-12-31 15:23 | 只看该作者
主函数和中断函数中写的有TH0=....和TL0=....这是什么意思诶
回复

使用道具 举报

17#
ID:406748 发表于 2019-12-31 15:27 | 只看该作者
1650599047 发表于 2018-9-10 23:26
我也做过类似的,播放音乐的同时1602进行动态显示,可我用的是while里加了一个for循环就可以了,不知你是 ...

中断函数和主函数不是运行的时候不是只能有其中一个正在运行吗
回复

使用道具 举报

18#
ID:688460 发表于 2020-7-3 06:41 | 只看该作者
好好学习,天天向上!
回复

使用道具 举报

19#
ID:953405 发表于 2021-7-15 13:34 来自手机 | 只看该作者
楼主 能不能写个单片机语言给我 P1.0按下执行p2.0输出半个小时关掉 P1.2按下执行p2.1输出1个小时关掉    p1.3按下执行P2.2输出 P1.4按下关掉所有程序 输出为高电平
回复

使用道具 举报

20#
ID:953405 发表于 2021-7-15 13:35 来自手机 | 只看该作者
楼主 能不能写个单片机语言给我 P1.0按下执行p2.0输出半个小时关掉 P1.2按下执行p2.1输出1个小时关掉    p1.3按下执行P2.2输出 P1.4按下关掉所有程序 输出为高电平
回复

使用道具 举报

21#
ID:950257 发表于 2021-7-16 11:25 来自手机 | 只看该作者
simple799 发表于 2018-4-27 11:48
楼主想问一下,如果我只是想用串口中断,是不是就不用设置定时器的初值或是工作方式啥的

需要设置波特率
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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