《蓝桥杯CT107D单片机竞赛板》:中断模块

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《蓝桥杯CT107D单片机竞赛板》:中断模块相关的知识,希望对你有一定的参考价值。

中断模块

实验简介

外部中断控制LED亮灭,蜂鸣器是否发声,继电器是否吸附。

实验原理图

注:原理图取自普中51单片机攻略

实验原理

声明:部分实验原理取自普中51单片机攻略和《“蓝桥杯”全国软件和信息技术专业人才大赛(电子类)实训指导书》

  • 中断概念:中断是为了使单片机具有实时处理内部随机或者外部随机事件的能力,能够提高单片机可靠性,实时性,以及计算机的资源使用效率。对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B,请求 CPU 迅速去处理(中断发生); CPU 暂时停止当前的工作(中断响应), 转去处理事件 B(中断服务); 待 CPU 将事件 B 处理完毕后, 再回到原来事件 A 被中断的地方继续处理事件 A(中断返回), 这一过程称为中断。中断可以嵌套。中断的开启与关闭、 设置启用哪一个中断等都是单片机内部的一些特殊功能寄存器决定的。
  • 中断举例:生活中,你打开火,烧上一壶水。 然后去洗衣服, 在洗衣服的过程中, 突然听到水壶发出水开的报警声, 这时, 你停止洗衣服动作, 立即去关掉火, 然后将开水灌入暖水瓶中, 灌完开水后, 你又回去继续洗衣服。 这个过程中实际上就发生了一次中断。
  • 中断介绍:IAP15F2K61S2 系列单片机提供了 14 个中断请求源。常用51 单片机一定有的 5 个中断INT0、 INT1、 定时器 0/1, 串口中断。中断有优先级/优先级别,需要注意的是,低优先级中断可被高优先级中断所中断,反之不能。任何一种中断(不管是高级还是低级),一旦得到响应,就不会再被它的同级中断所中断。当两个相同优先级的中断同时产生时, 将由中断查询次序来决定系统先响应哪个中断。 中断号(全称中断查询次序), 中断号在编程时非常重要, 当中断来临时, 只有中断号正确才能进入中断。一些特殊寄存器名称及其作用可以去参考《“蓝桥杯”全国软件和信息技术专业人才大赛(电子类)实训指导书》在此就不赘述了。

  • 当触发中断后即会进入中断服务函数,中断服务函数的一般形式为:void 函数名() [interrupt n] ,n代表中断号
  • 外部中断配置:51单片机系列中内部框图,下图示,以外部中断INT0为例。由定时器/计数器控制寄存器 TCON中外部中断 0 中断源类型选择位IT0选择其为低电平有效还是下降沿有效。当 CPU 检测到出现有效的中断信号时, 外部中断 0( INT0/P3.2)中断请求标志IE0置 1(内部检测,无需我们软件操作置1), 向 CPU 申请中断。接下来再到中断允许寄存器 IE中外部中断0允许位EX0将其置为1,打开总中断允许位EA置 1,中断优先级控制寄存器 IP单片机内部已经符合要求,不需要我们手动调节。

  • 实现须知:由于本实验独立按键需要控制LED,故锁存端LE得为高电平,即得控制Y4C为高电平,下图知Y4C,受Y4控制,WR输入固定为低电平(0),了解数字电路中或非门知识,我们得使得Y4输出低电平,才能使的Y4C输出高电平,而Y4为74HC138芯片(38译码器)的一个管脚,查阅对应芯片手册可知,其真值表满足C = 1,B = 0,A = 0,(对应管脚P27,P26,P25),才能使得Y4输出低电平,同时代码实现时要保证管脚P2的其他的管脚(0~4)保持原来的状态 。

  • 注意:①按键功能选择BTN(J5上的跳线2与3相连,此时切换至S7,S6,S5,S4独立按键模块)②外设访问方式选择跳线J13选择2,3短接,即选择I/O直接控制方式③复位选择条线J15选择1,2短接,即选择51系列单片机

实验程序

外部中断控制L1与L2的状态反转

//config.h--用于声明头文件,声明函数,声明一些经常使用的变量或难书写的语句
#ifndef _CONFIG_H
#define _CONFIG_H
#include <STC15F2K60S2.H>//对应芯片函数头文件,定义了一些特殊功能寄存器
#include<intrins.h>
//typedef unsigned char uchar;
#define uchar unsigned char
void Delay10ms();		//@12.000MHz

#endif
//main.c--外部中断0,1分别控制L1,L2亮灭,其中需要注意的是,P32为外部中断0控制,P33为外部中断1控制 

//main.c--外部中断0,1分别控制L1,L2亮灭,其中需要注意的是,P32是由外部中断0控制,P33是由外部中断1控制 

#include "config.h"

uchar ucled;//全局变量,系统自动初始化为0


void close_peripheral()//关闭外设--LED初始化熄灭,蜂鸣器不发声,继电器不吸附

	P2 = (P2 & 0x1f) | 0x80;//打开Y4C
	P0 = 0xff;
	P2 &= 0x1f;
	
	P2 = (P2 & 0x1f) | 0xa0;
	P0 = 0;
	P2 &= 0x1f;



void Int0_init()

	IT0 = 1;//外部中断0的外部中断源类型选择位设置为下降沿触发
	EX0 = 1;//外部中断0的中断允许位EX0置为1
	EA = 1;//打卡总中断


void Int1_init()

   	IT1 = 1;//INT1的中断源类型选择位设置位下降沿触发
   	EX1 = 1;//INT1的中断允许位EX1设置为1
	EA = 1;//打卡总中断


void main()										  	

	close_peripheral();
	Int0_init();
	Int1_init();
	while(1);


void Delay10ms()		//@12.000MHz

	unsigned char i, j;

	i = 117;
	j = 184;
	do
	
		while (--j);
	 while (--i);



void Int0() interrupt 0

	if (0 == P32)
	
		Delay10ms();//S5键消抖
		if (0 == P32)
		
			ucled ^= 1;//异或操作符,只改变最低位的状态,相异为1,相同为0
			P0 = ~ucled;
			P2 = (P2 & 0x1f) | 0x80;
			P2 &= 0x1f;
		
	



void Int1() interrupt 2

  if (0 == P33)
  
   	 Delay10ms();//S4键消抖
	 if (0 == P33)
	 
	 	 ucled ^= 2;//异或操作符,只改变倒数第二位的状态,相异为1,相同为0
		 P0 = ~ucled;
		 P2 = (P2 & 0x1f) | 0x80;
		 P2 &= 0x1f;
	 
  



外部中断控制蜂鸣器和继电器

//config.h--用于声明头文件,声明函数,声明一些经常使用的变量或难书写的语句
#ifndef _CONFIG_H
#define _CONFIG_H
#include <STC15F2K60S2.H>//对应芯片函数头文件,定义了一些特殊功能寄存器
#include<intrins.h>
//typedef unsigned char uchar;
#define uchar unsigned char
void Delay20ms();		//@12.000MHz

#endif

//main.c--外部中断0,1分别控制蜂鸣器是否发声,继电器是否吸附,其中需要注意的是,P32是由外部中断0控制,P33是由外部中断1控制 

#include "config.h"

uchar ucled;//全局变量,系统自动初始化为0

void close_peripheral()//关闭外设--LED初始化熄灭,蜂鸣器不发声,继电器不吸附

	P2 = (P2 & 0x1f) | 0x80;//打开Y4C
	P0 = 0xff;
	P2 &= 0x1f;
	
	P2 = (P2 & 0x1f) | 0xa0;
	P0 = 0;
	P2 &= 0x1f;



void Int_init()

	IT0 = 1;//外部中断0的外部中断源类型选择位设置为下降沿触发
	IT1 = 1;//INT1的中断源类型选择位设置位下降沿触发
	EX0 = 1;//外部中断0的中断允许位EX0置为1
	EX1 = 1;//INT1的中断允许位EX1设置为1
	EA = 1;//打卡总中断



void main()										  	

	close_peripheral();
	Int_init();
	while(1);


void Delay20ms()		//@12.000MHz

	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 1;
	j = 234;
	k = 113;
	do
	
		do
		
			while (--k);
		 while (--j);
	 while (--i);



void Int0() interrupt 0

	if (0 == P32)
	
		Delay20ms();//S5键消抖
		if (0 == P32)
		
			ucled ^= 0x40;//P06位,控制蜂鸣器是否发声
			P0 = ~ucled;
			P2 = (P2 & 0x1f) | 0xa0;
			P2 &= 0x1f;
		
	


void Int1() interrupt 2

  if (0 == P33)
  
   	 Delay20ms();//S4键消抖
	 if (0 == P33)
	 
	 	 ucled ^= 0x10;//P04位,控制继电器是否吸附
		 P0 = ~ucled;
		 P2 = (P2 & 0x1f) | 0xa0;
		 P2 &= 0x1f;
	 
  


以上是关于《蓝桥杯CT107D单片机竞赛板》:中断模块的主要内容,如果未能解决你的问题,请参考以下文章

《蓝桥杯CT107D单片机竞赛板》:蜂鸣器模块

《蓝桥杯CT107D单片机竞赛板》:独立按键模块

《蓝桥杯CT107D单片机竞赛板》:LED模块

《蓝桥杯CT107D单片机竞赛板》:数码管模块

《蓝桥杯CT107D单片机竞赛板》:定时器模块

《蓝桥杯CT107D单片机竞赛板》:赛前准备工作