MCS-51中断学习笔记-Jan12-‘21

声明:

  1. 本文章为作者学习中断时所作笔记,很大程度上引用了CSDN上已有文章,以此为基础进行整理、补充。所引文章皆在文末标出,若有不当之处恳请指正。
  2. 中断知识的学习难于上手,本文重在提供学习切入点和举例,希望能够对读者有所帮助。

中断的含义
CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。
中断示意图
编写中断程序的思路
STEP1. 在主程序中打开允许中断的各个开关
在这里插入图片描述

STEP2. 设置中断信号(有两种信号:1.内部计数器/计时器溢出;2.在相应端口提供电平/边沿信号,比如用外部按键进行输入)

STEP3. 编写中断过程中需执行的程序。
图3

对于中断需要了解的重点

  1. 一共有五种中断(即 有五种中断源):体现在定义中断函数的时候,interrupt 后面的标号 (0到4)

  2. 中断函数的优先级
    2.1 五种中断源分两类优先级(低级/高级);低级中断执行过程中可执行高级中断。
    2.2 同等级中断源若同时请求,也有固定的响应顺序,也就有了如下图示:在这里插入图片描述

  3. 中断函数不需在主函数中体现插入点,主函数中只需要把相应中断开关打开即可。换一种方法讲,不需要且不能直接调用中断函数。(详见文末例子)

下面是每秒LED状态反转的程序实现(引自 小白兔的编程世界 文章;这个例子在我学习的时候很有帮助,在此感谢原作者)
【本例子是用了计数器0 和 计数器1的中断;即端口1 端口3】

#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;

sbit LED1=P2^0;
sbit LED2=P2^1;

void timerInit()
{
	TMOD=0x11;
	EA=1;  
	ET0=1; 
	ET1=1;
	TR0=1;
	TR1=1;
	TH0=0xFC;
	TL0=0x6A;
	TH1=0xFC;
	TL1=0x6A;
}
void timer0() interrupt 1
{
	static u16 counter=0;
	if(counter==1000)
	{
		LED1=~LED1;
		counter=0;
	}
	counter++;
	TH0=0xFC;
	TL0=0x6A;
}
void timer1() interrupt 3
{
	static u16 counter=0;

	if(counter==1000)
	{
		LED2=~LED2;
		counter=0;
	}
	counter++;
	TH1=0xFC;
	TL1=0x6A;
}

void main()
{
	timerInit();
	while(1);
}

下面一个是流水灯加外部中断
【用了外部中断 即端口0】

#include <reg52.h>
#include <intrins.h>

#define FOSC 11059200L

sbit led1 = P1^7;

void DELAYms1(unsigned int ms)
{
	unsigned int i,j;
	for(i=0;i<ms;i++)
	#if FOSC == 11059200L
		for(j=0;j<114;j++);
	#elif FOSC == 12000000L/                                                                                              
	  for(j=0;j<123;j++);
	#endif
}

void lightsflow(){
	while(1){
	unsigned int k=0xfe;
	unsigned int i=0;
	P1 = k;
	while(i<4){
		DELAYms1(500);
		k=_crol_(k,1);
		if(i==3){
			P1 = 0xff;
			DELAYms1(500);
			k=0xfe;
			i=0;
		}
		P1=k;
		i++;
	}
}
	}

void interInit()
{
	EA = 1;
	EX0 = 1;
	IT0 = 1;
}

void int0() interrupt 0
{
	led1 = 0;
	DELAYms1(2000);
}

void main()
{	
	interInit();
	lightsflow();
	
}
	

所引用的文章链接(都是很用心写的文章,大力感谢各位原作者):

  1. https://blog.csdn.net/chenjinshuai/article/details/108530996?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161044052216780274138723%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=161044052216780274138723&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-2-108530996.pc_search_result_cache&utm_term=%E5%8D%95%E7%89%87%E6%9C%BA%20%E8%AE%A1%E6%95%B0%E5%99%A8%E4%B8%AD%E6%96%AD

  2. https://blog.csdn.net/weixin_41445387/article/details/80375908?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161044052216780274138723%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=161044052216780274138723&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-80375908.pc_search_result_cache&utm_term=%E5%8D%95%E7%89%87%E6%9C%BA%20%E8%AE%A1%E6%95%B0%E5%99%A8%E4%B8%AD%E6%96%AD

  3. https://blog.csdn.net/u013151320/article/details/49977813

  4. https://blog.csdn.net/weixin_42776111/article/details/84960932?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161043874016780257455979%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=161043874016780257455979&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-2-84960932.pc_search_result_cache&utm_term=%E5%8D%95%E7%89%87%E6%9C%BA%20%E4%B8%AD%E6%96%AD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值