《蓝桥杯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单片机竞赛板》:中断模块的主要内容,如果未能解决你的问题,请参考以下文章