《蓝桥杯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;
	 }
  }

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ct107d单片机是一种常见的单片机类型,广泛应用于各种电子设备中。蓝桥杯是中国著名的计算机及信息技术竞赛,矩阵键盘是一种常见的输入设备。下面我将介绍ct107d单片机如何与蓝桥杯矩阵键盘配合使用。 首先,ct107d单片机具有输入输出接口,可以与外部设备进行数据交互。蓝桥杯矩阵键盘通常采用矩阵排列的按钮形式,可以通过多个引脚与单片机相连。我们需要在单片机上配置对应的引脚,使其与蓝桥杯矩阵键盘的按键相对应。 然后,我们需要编写程序来读取输入的按键信息。在ct107d单片机上,可以使用GPIO口中断来实现按键的检测功能。当按键被按下时,引脚电平发生变化,触发GPIO口中断单片机会执行相应的中断服务程序。我们可以在中断服务程序中读取按键的状态,并根据不同按键进行不同的处理。 在程序设计过程中,我们可以利用矩阵键盘的特性,将按键映射为矩阵的行和列。通过循环扫描的方式,逐一检测矩阵中的每个按键,并根据按键的状态进行相应的操作。例如,当按键按下时,可以执行一些特定的功能,如发送数据、改变显示内容等。 总结起来,ct107d单片机蓝桥杯矩阵键盘的配合使用,需要在单片机上配置引脚连接,编写相应的程序来读取按键信息,并根据按键状态进行相应的处理。这样,就能够实现方便的按键输入功能,在蓝桥杯竞赛及其他实际应用中发挥作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值