2.3外部中断方式按键控制交通信号灯 课件(共94张PPT)-《单片机技术与C语言基础 》同步教学(电子工业版)

资源下载
  1. 二一教育资源

2.3外部中断方式按键控制交通信号灯 课件(共94张PPT)-《单片机技术与C语言基础 》同步教学(电子工业版)

资源简介

(共94张PPT)
单片机与C语言技术应用
第二单元 任务3
2.3 外部中断方式按键控制交通信号灯
学习目标
01
知识储备
03
任务工单
05
任务要求与任务分析
02
任务实施
04
任务小结
06
知识与技能提升
07
延伸阅读
08
学习目标
01
掌握if-else条件语句的基本用法;
掌握判断条件标志位进行逻辑控制;
掌握单片机按键检测的基本原理;
掌握按键控制相关端口寄存器设置方法;
掌握查询方式按键处理的编程方法;
掌握按键外部中断寄存器设置方法;
掌握外部中断方式按键处理的编程方法。
学习目标
01
能对CC2530单片机按键进行端口设置;
能使用查询方法进行按键有效判断和按键处理;
能对CC2530单片机外部中断寄存器进行设置;
能使用外部中断方法进行按键有效判断和按键处理。
学习目标
01
知识储备
03
任务工单
05
任务要求与任务分析
02
任务实施
04
任务小结
06
知识与技能提升
07
延伸阅读
08
2.3 外部中断方式按键控制交通信号灯
任务要求与任务分析
02
任务要求:
①黑板通电后,D5绿色LED点亮(绿灯亮);
②按一次SW1按键,D5绿色LED熄灭(绿灯灭);
③再按一次SW1按键, D5绿色LED点亮(绿灯亮);
④按键效果可循环。
任务分析:
中断方式SW1按键输入检测;每次按键操作,D5绿色LED由亮变灭或由灭变亮。
学习目标
01
知识储备
03
任务工单
05
任务要求与任务分析
02
任务实施
04
任务小结
06
知识与技能提升
07
延伸阅读
08
2.3 外部中断方式按键控制交通信号灯
什么是中断
中断源
1
2
3
4
中断向量
中断服务函数
03
知识储备
在生活中经常会遇到这样的情况:正在书房看书时,突然客厅的电话响了,人们往往会暂停看书,转而去接电话,接完电话后又回书房接着看书。这种暂停当前工作,转而去做其他事,做完后返回暂停处继续往下执行的现象称为中断。
知识储备
03
知识储备
03
单片机也有类似的中断现象,当单片机正在执行main主程序时,突然出现一个中断请求;
在中断请求允许的情况下,CPU会暂停正在执行的程序,对中断请求做出响应并执行中断服务程序;
中断处理完毕后返回暂停处继续往下执行。这个暂停的地方称作断点。
什么是中断
中断源
1
2
03
3
4
中断向量
中断服务函数
知识储备
能发出中断请求且引起中断的装置或事件称为中断源。
CC2530单片机共有18个不同类型的中断源,包括外部I/O口中断、定时器中断、串口发送和接收中断等。
每个中断源都有一系列寄存器进行控制,且每个中断源对应一个中断,可以分别使能和控制。
知识储备
03
什么是中断
中断源
1
2
03
3
4
中断向量
中断服务函数
3
3
知识储备
中断源发出的中断请求被CPU检测到之后,如果允许响应中断,则CPU会自动转移,执行某一个固定程序空间地址的指令。这个固定的地址称作中断入口地址,也称作中断向量。
不同中断源有不同的中断入口地址,即不同的中断向量。
CC2530单片机的18个中断源对应18个不同的中断向量,在头文件“ioCC2530.h”中已对这些中断向量进行宏定义,形成中断向量表。
03
知识储备
当开启某一类型的中断源时,必须编写中断服务函数,并为这中断服务函数指定中断向量,也就是告诉CPU这一类型的中断源触发时,将去执行哪一个中断服务函数。不同的中断源具有不同的中断服务函数。
本任务采用P1_2引脚连接SW1按键,对应P1端口中断源,其中断服务入口地址为0x7B,已在头文件“ioCC2530.h”中定义,具体如下:
03
知识储备
#define P1INT_VECTOR VECT( 15, 0x7B )
什么是中断
中断源
1
2
03
3
4
中断向量
中断服务函数
知识储备
中断服务函数与一般自定义函数不同,有特定的书写格式,具体如下:
03
知识储备
__interrupt void <函数名称> (void)
{
/*开始编写代码*/
}
“__interrupt”关键字表示该函数是一个中断服务函数,“函数名称”可以自定义。
但为了识别方便,“函数名称”通常与中断源相关联,如P1端口的中断服务函数名称叫“P1_ISR”、定时器1的中断服务函数名称叫“T1_ISR”、串口1的中断服务函数名称叫“UART1_ISR”。
函数体不能带有参数,也不能有返回值。
03
知识储备
在每一个中断服务函数之前,都要加上下面这条宏指令用于指定该中断服务函数对应哪个中断向量,具体如下:
该语句有两种写法,可以直接将“中断向量”用具体数值表示,或者用“ioCC2530.h”文件中的数值宏定义代替。如P1端口中断服务函数前面的宏指令编写方法为:
1. #pragma vector=0x7B或1. #pragma vector=P1INT_VECTOR
0x7B是P1端口中断源的入口地址,在头文件“ioCC2530.h”中已将数值0x7B宏定义为P1INT_VECTOR,也就是P1INT_VECTOR等效于0x7B数值。
03
知识储备
#pragma vector=<中断向量>
“__”为两个下划线“_”,编写代码时要注意,不要弄错。
03
知识储备
系统中断总开关
通用I/O中断触发条件
5
6
知识储备
03
7
8
通用I/O中断处理流程
通用I/O中断服务函数
EA作为CC2530单片机中断的总开关,可以控制单片机是否响应所有中断。EA置1开启中断总开关,EA置0关闭中断总开关。只有中断总开关开启且中断源触发中断标志都满足的条件下,单片机才会暂停当下的主程序而去执行中断源对应的中断服务函数。
配置代码举例:
03
知识储备
1. EA=1; //使能总中断
2. EA=0; //关闭总中断
EA置0后,全部中断都停止响应;当要屏蔽某一确定的中断源时,一定要专门屏蔽这一确定中断源的中断响应开关,而不是使用EA来屏蔽;只有需要关闭全部中断时才将EA置0。
03
知识储备
系统中断总开关
通用I/O中断触发条件
5
6
03
7
8
通用I/O中断处理流程
通用I/O中断服务函数
知识储备
CC2530单片机的P0、P1和P2端口中的每个引脚都具有外部中断输入功能,在使用之前,需要完成以下设置:
(1)将通用I/O引脚设置为输入上拉模式
通过对PxSEL、PxDIR、PxINP寄存器进行配置,将对应的I/O引脚设置为输入上拉模式。
(2)选择I/O引脚中断的触发方式
通过对PICTL寄存器进行配置,分组选择I/O引脚为上升沿或下降沿中断触发。
03
知识储备
PICTL中断控制寄存器:
03
知识储备
位 位名称 复位值 操作 描述
7 PADSC 0 RO 控制I/O引脚在输出模式下的驱动能力,选择输出驱动能力来补偿引脚DVDD的低I/O电压(为了确保在较低电压下的驱动能力和较高电压下的驱动能力相同)
设置为0:最小驱动能力增强,DVDD1/2等于或大于2.6V;
设置为1:最大驱动能力增强,DVDD1/2小于2.6V。
6:4 — 000 RO 保留
03
知识储备
位 位名称 复位值 操作 描述
3 P2ICON 0 R/W 端口2的P2_4~P2_0输入模式下的中断配置,该位为端口2的输入P2_4~P2_0选择中断请求条件
设置0:输入的上升沿引起中断;
设置1:输入的下降沿引起中断。
2 P1ICONH 0 R/W 端口1的P1_7~P1_4输入模式下的中断配置,同上
设置0:输入的上升沿引起中断;
设置1:输入的下降沿引起中断。
03
知识储备
位 位名称 复位值 操作 描述
1 P1ICONL 0 R/W 端口1的P1_3~P1_0输入模式下的中断配置,同上
设置0:输入的上升沿引起中断;
设置1:输入的下降沿引起中断。
0 P0ICON 0 R/W 端口0的P0_7~P0_0输入模式下的中断配置,同上
设置0:输入的上升沿引起中断;
设置1:输入的下降沿引起中断。
PICTL寄存器的复位值为0x00,即复位后P0、P1、P2端口的所有引脚默认为上升沿中断触发。
配置代码举例:
(3)I/O引脚的中断使能
通过对PxIEN寄存器进行配置,将端口对应的I/O引脚中断使能。
03
知识储备
PICTL |= 0x02; //设置P1端口的P1_3~P1_0引脚为下降沿中断触发
PxIEN寄存器:
03
知识储备
位 位名称 复位值 操作 描述
7 PxIEN[7] 0 R/W 设置为0:Px_7中断禁止
设置为1:Px_7中断使能
6 PxIEN[6] 0 R/W 设置为0:Px_6中断禁止
设置为1:Px_6中断使能
5 PxIEN[5] 0 R/W 设置为0:Px_5中断禁止
设置为1:Px_5中断使能
4 PxIEN[4] 0 R/W 设置为0:Px_4中断禁止
设置为1:Px_4中断使能
03
知识储备
位 位名称 复位值 操作 描述
3 PxIEN[3] 0 R/W 设置为0:Px_3中断禁止
设置为1:Px_3中断使能
2 PxIEN[2] 0 R/W 设置为0:Px_2中断禁止
设置为1:Px_2中断使能
1 PxIEN[1] 0 R/W 设置为0:Px_1中断禁止
设置为1:Px_1中断使能
0 PxIEN[0] 0 R/W 设置为0:Px_0中断禁止
设置为1:Px_0中断使能
表中的“x”是指要使用的端口组编号,例如要设置P1_2引脚中断使能,则选择P1IEN寄存器。PxIEN寄存器的复位值为0x00,即复位后各端口组内所有引脚中断禁止。
配置代码举例:
(4)I/O引脚对应的端口中断使能
涉及P0端口引脚输入触发中断时,需要将P0端口中断使能,即将寄存器IEN1的P0IE置1;涉及P1端口引脚输入触发中断时,需要将P1端口中断使能,即将寄存器IEN2的P1IE置1;涉及P2端口引脚输入触发中断时,需要将P2端口中断使能,即将寄存器IEN2的P2IE置1。
03
知识储备
P1IEN |= 0x04; //使能P1_2引脚中断
IEN1寄存器:
03
知识储备
位 位名称 复位值 操作 描述
7:6 - 00 R0 不使用,读出来为0
5 P0IE 0 R/W 端口0中断使能
0:中断禁止
1:中断使能
4 T4IE 0 R/W 定时器4中断使能
0:中断禁止
1:中断使能
3 T3IE 0 R/W 定时器3中断使能
0:中断禁止
1:中断使能
IEN1寄存器:
03
知识储备
位 位名称 复位值 操作 描述
2 T2IE 0 R/W 定时器2中断使能
0:中断禁止
1:中断使能
1 T1IE 0 R/W 定时器1中断使能
0:中断禁止
1:中断使能
0 DMAIE 0 R/W DMA传输中断使能
0:中断禁止
1:中断使能
IEN1寄存器的复位值为0x00,即复位后P0端口中断禁止。
配置代码举例:
03
知识储备
IEN1 |= 0x20; //设置P0端口中断使能
IEN2中断使能寄存器:
03
知识储备
位 位名称 复位值 操作 描述
7:6 — 00 RO 保留
5 WDTIE 0 R/W 看门狗定时器中断使能
设置为0:禁止 设置为1:使能
4 P1IE 0 R/W P1端口中断使能
设置为0:禁止 设置为1:使能
3 UTX1IE 0 R/W 串口1发送中断使能
设置为0:禁止 设置为1:使能
03
知识储备
位 位名称 复位值 操作 描述
2 UTX0IE 0 R/W 串口0发送中断使能
设置为0:禁止 设置为1:使能
1 P2IE 0 R/W 端口2中断使能
设置为0:禁止 设置为1:使能
0 RFIE 0 R/W RF一般中断使能
设置为0:禁止 设置为1:使能
IEN2寄存器的复位值为0x00,即复位后P1端口、P2端口中断禁止。
配置代码举例:
(5)系统中断总开关使能
前面4个条件配置完成后,最后还需要将系统中断总开关使能,即将EA置1。
03
知识储备
IEN2 |= 0x10; //设置P1端口中断使能
系统中断总开关
通用I/O中断触发条件
5
6
03
3
8
通用I/O中断处理流程
通用I/O中断服务函数
3
7
知识储备
I/O引脚触发中断时,引脚中断状态标志以及引脚所对应的端口中断标志位将由硬件自动置1。
当P0端口某个引脚触发中断时,P0IFG寄存器中对应的引脚中断状态位和IRCON寄存器中的P0端口中断标志位P0IF将被硬件自动置1;
当P1端口某个引脚触发中断时,P1IFG寄存器中对应的引脚中断状态位和IRCON2寄存器中的P1端口中断标志位P1IF将被硬件自动置1;
当P2端口某个引脚触发中断时,P2IFG寄存器中对应的引脚中断状态位和IRCON2寄存器中的P2端口中断标志位P2IF将被硬件自动置1。
单片机检测到P0IF、P1IF、P2IF中的其中某一个或多个同时为1,将会调用通用I/O中断服务函数。
知识储备
03
PxIFG寄存器:
知识储备
03
位 位名称 复位值 操作 描述
7 PxIF[7] 0 R/W Px_7引脚中断状态标志
读取为0:未发生中断
读取为1:发生中断
6 PxIF[6] 0 R/W Px_6引脚中断状态标志
读取为0:未发生中断
读取为1:发生中断
PxIFG寄存器:
知识储备
03
位 位名称 复位值 操作 描述
5 PxIF[5] 0 R/W Px_5引脚中断状态标志
读取为0:未发生中断
读取为1:发生中断
4 PxIF[4] 0 R/W Px_4引脚中断状态标志
读取为0:未发生中断
读取为1:发生中断
知识储备
03
位 位名称 复位值 操作 描述
3 PxIF[3] 0 R/W Px_3引脚中断状态标志
读取为0:未发生中断
读取为1:发生中断
2 PxIF[2] 0 R/W Px_2引脚中断状态标志
读取为0:未发生中断
读取为1:发生中断
知识储备
03
位 位名称 复位值 操作 描述
1 PxIF[1] 0 R/W Px_1引脚中断状态标志
读取为0:未发生中断
读取为1:发生中断
0 PxIF[0] 0 R/W Px_0引脚中断状态标志
读取为0:未发生中断
读取为1:发生中断
表中的“x”是指要使用的端口组编号,例如要确认是不是P1_2引脚触发中断,则读取P1IFG寄存器的值。PXIFG寄存器的复位值为0x00,即复位后各端口内所有引脚未发生中断。
配置代码举例:
知识储备
03
1. P1IFG &= ~(1<<2); //清除P1_2引脚中断状态标志位
IRCON寄存器:
知识储备
03
位 位名称 复位值 操作 描述
7 STIF 0 R/W 睡眠定时器中断标志
0:无中断未决 1:中断未决
6 - 0 R/W 必须写为0,写入1总是使能中断源
5 P0IF 0 R/W 端口0中断标志
0:无中断未决 1:中断未决
4 T4IF 0 R/W 定时器4中断标志。当定时器4中断发生CPU指向中断向量服务例程时清除
0:无中断未决 1:中断未决
知识储备
03
位 位名称 复位值 操作 描述
3 T3IF 0 R/W 定时器3中断标志。当定时器3中断发生时设为1并且CPU指向中断向量服务例程时清除
0:无中断未决 1:中断未决
2 T2IF 0 R/W 定时器2中断标志。当定时器2中断发生时设为1并且CPU指向中断向量服务例程时清除
0:无中断未决 1:中断未决
知识储备
03
位 位名称 复位值 操作 描述
1 T1IF 0 R/W 定时器1中断标志。当定时器1中断发生时设为1并且CPU指向中断向量服务例程时清除
0:无中断未决 1:中断未决
0 DMAIF 0 R/W DMA完成中断标志
0:无中断未决 1:中断未决
IRCON寄存器的复位值为0x00,即复位后P0端口无中断未决。
配置代码举例:
知识储备
03
1. IRCON &= ~(5<<1); //清除P0端口中断标志
2. IRCON &= ~(1<<1); //清除定时器1中断标志
3. P0IF=0; //直接位操作清除P0端口中断标志
4. T1IF=0; //直接位操作清除定时器1中断标志
IRCON2寄存器:
知识储备
03
位 位名称 复位值 操作 描述
7:5 - 000 R/W 不使用,读出来为0
4 WDTIF 0 R/W 看门狗定时器中断标志
0:无中断未决 1:中断未决
3 P1IF 0 R/W 端口1中断标志
0:无中断未决 1:中断未决
IRCON2寄存器:
知识储备
03
位 位名称 复位值 操作 描述
2 UTX1IF 0 R/W UXART1 TX中断标志
0:无中断未决 1:中断未决
1 UTX0IF 0 R/W UXART0 TX中断标志
0:无中断未决 1:中断未决
0 P2IF 0 R/W 端口2中断标志
0:无中断未决 1:中断未决
IRCON2寄存器复位值为0x00,即复位后P0端口、P2端口无中断未决。
配置代码举例:
知识储备
03
1. IRCON2 &= ~(1); //清除P2端口中断标志
2. IRCON2 &= ~(<<1); //清除P1端口中断标志
3. P2IF=0; //直接位操作清除P2端口中断标志
4. P1IF=0; //直接位操作清除P1端口中断标志
系统中断总开关
通用I/O中断触发条件
5
6
知识储备
03
7
8
通用I/O中断处理流程
通用I/O中断服务函数
P0端口的I/O引脚触发中断时,P0端口中断标志P0IF置1,单片机执行P0端口中断服务函数;
P1端口的I/O引脚触发中断时,P1端口中断标志P1IF置1,单片机执行P1端口中断服务函数;
P2端口的I/O引脚触发中断时,P2端口中断标志P0IF置1,单片机执行P2端口中断服务函数。
因此,针对不同端口需要构建不同的端口中断服务函数,并在端口中断服务函数之前通过宏指令指向不同的中断向量。
知识储备
03
P0以及P1端口中断服务函数配置代码举例:
知识储备
03
1. #pragma vector=P0INT_VECTOR //指向P0端口中断向量
2. __interrupt void P0INT_ISR(void) //定义P0端口中断服务函数
3. {
4. ……
5. }
1. #pragma vector=P1INT_VECTOR //指向P1端口中断向量
2. __interrupt void P1INT_ISR(void) //定义P1端口中断服务函数
3. {
4. ……
5. }
P2端口中断服务函数配置代码举例:
同一端口的不同引脚触发中断时,单片机都会执行该端口中断服务函数。因此在端口中断服务函数里,需要对端口中已配置为具有中断触发功能的I/O引脚进行逐一判断、清除及执行相应的中断处理。端口中断服务函数处理流程如下:
知识储备
03
1. #pragma vector=P2INT_VECTOR //指向P2端口中断向量
2. __interrupt void P2INT_ISR(void) //定义P2端口中断服务函数
3. {
4. ……
5. }
(1)读取中断状态标志寄存器PxIFG,判断端口中哪个引脚触发中断;
(2)清除PxIFG寄存器中对应引脚的中断状态标志位,并根据对应引脚执行不同的中断处理;
(3)需要对端口中已配置为具有中断触发功能的I/O引脚按照步骤(1)和(2)进行逐一判断、清除及执行相应的中断处理
(4)清除端口中断标志PxIF;
(5)中断返回。
知识储备
03
假设P1端口中P1_0~P1_7都设置为中断触发功能,其端口中断服务函数配置代码如下:
知识储备
03
1. #pragma vector=P0INT_VECTOR //指向P0端口中断向量
2. __interrupt void P0INT_ISR(void) //定义P0端口中断服务函数
3. {
4. if( (P1IFG & 0x01) == 0x01 ) //判断是否为P1_0引脚产生中断
5. {
6. P1IFG &= ~0x01; //清除P1_0引脚中断状态标志位
7. //执行P1_0引脚对应的中断处理
8. }
9. if( (P1IFG & 0x02) == 0x02 ) //判断是否为P1_1引脚产生中断
10. {
11. P1IFG &= ~0x02; //清除P1_1引脚中断状态标志位
12. //执行P1_1引脚对应的中断处理
13. }
知识储备
03
14. if( (P1IFG & 0x04) == 0x04 ) //判断是否为P1_2引脚产生中断
15. {
16. P1IFG &= ~0x04 //清除P1_2引脚中断状态标志位
17. //执行P1_2引脚对应的中断处理
18. }
19. if( (P1IFG & 0x04) == 0x04 ) //判断是否为P1_3引脚产生中断
20. {
21. P1IFG &= ~0x04; //清除P1_3引脚中断状态标志位
22. //执行P1_3引脚对应的中断处理
23. }
24. if( (P1IFG & 0x10 == 0x10 ) //判断是否为P1_4引脚产生中断
25. {
26. P1IFG &= ~0x10 //清除P1_4引脚中断状态标志位
27. //执行P1_4引脚对应的中断处理
28. }
29.
知识储备
03
29. if( (P1IFG & 0x20 == 0x20 ) //判断是否为P1_5引脚产生中断
30. {
31. P1IFG &= ~0x20 //清除P1_5引脚中断状态标志位
32. //执行P1_5引脚对应的中断处理
33. }
34. if( (P1IFG & 0x40 == 0x40 ) //判断是否为P1_6引脚产生中断
35. {
36. P1IFG &= ~0x40 //清除P1_6引脚中断状态标志位
37. //执行P1_6引脚对应的中断处理
38. }
39. if( (P1IFG & 0x80 == 0x80 ) //判断是否为P1_7引脚产生中断
40. {
41. P1IFG &= ~0x80 //清除P1_7引脚中断状态标志位
42. //执行P1_7引脚对应的中断处理
43. }
44. P1IF=0; //清除P1端口中断标志位
45. }
在P1端口的中断服务函数里,当P1端口的某些引脚没有中断触发功能时,则对应的引脚判断、清除及中断处理可以删除掉。本任务中,P1_2引脚连接SW1按键,当SW1按键按下时触发中断执行动作,因此本任务中只需保留P1_2引脚的判断、清除及中断处理。
知识储备
03
学习目标
01
知识储备
03
任务工单
05
任务要求与任务分析
02
任务实施
04
任务小结
06
知识与技能提升
07
延伸阅读
08
2.3 外部中断方式按键控制交通信号灯
任务实施
04
● 任务实施前必须先准备好以下设备和资源:
序号 设备/资源名称 数量 是否准备到位(√)
1 计算机(已安装好IAR软件) 1台
2 NEWLab实训平台 1套
3 CC-Debugger 仿真器 1套
4 黑板 1块
1
2
任务实施
04
打开工程
编写代码
3
编译工程
4
下载代码
打开本书配套源代码文件夹中的“中断方式按键控制交通信号灯.ewp”工程。
04
任务实施
1
2
打开工程
编写代码
3
编译工程
4
下载代码
任务实施
● 步骤1:头文件包含
04
任务实施
#include
● 步骤2:I/O引脚宏定义
04
任务实施
1. #define Led_Green P1_3 //P1_3引脚宏定义
2. #define SW1 P1_2 //P1_2引脚宏定义
本任务选择SW1按键作为输入,D5绿色LED作为输出,其中SW1按键连接P1_2引脚,D5绿色LED连接P1_3引脚,两个引脚宏定义的参考代码如下:
步骤3:编写I/O引脚初始化函数
本任务的I/O引脚初始化函数主要完成将P1_2和P1_3引脚设置为通用I/O口,将P1_2引脚设置为输入上拉引脚,将P1_3设置为输出引脚,具体实现代码如下:
void InitIO(void)
{
P1SEL &= ~0x0C; //设置P1_2和P1_3引脚为通用I/O引脚
P1DIR |= 0x08; //设置P1_4为输出引脚
P1DIR &= ~0x04; //设置P1_2为输入引脚
P1INP &= ~0x04; //设置P1_2引脚使用上拉或下拉
P2INP |= 0x40; //设置P1_2引脚为上拉模式
}
04
任务实施
步骤4:编写延时函数
该延时函数的输入参数为n,对应的延时时长为n毫秒。
1. void Delay(unsigned int n)
2. {
3. unsigned int i,j;
4. for(i=0;i5. {
6. for(j=0;j<600;j++);
7. }
8. }
04
任务实施
步骤5:编写按键中断初始化函数
1)使能P1端口中断;
2)使能P1_2引脚中断;
3)设置P1_2引脚下降沿触发中断;
4)使能总中断。
1. Void InitKeyINT(void) //按键中断初始化函数
2. {
3. IEN2 |= 0x10; //使能P1端口中断源
4. P1IEN |= 0x04; //使能P1_2引脚中断
5. PICTL |= 0x02; //设置P1_2引脚为下降沿中断触发
6. EA=1; //使能总中断
7. }
04
任务实施
步骤6:编写按键中断处理函数
04
任务实施
1. #pragma vector=P1INT_VECTOR //只要是P1端口外部中断都会进入此程序
2. __interrupt void P1_ISR(void)
3. {
4. if( (P1IFG & 0x04) == 0x04 ) //判断是否为P1_2引脚产生中断
5. {
6. Delay(10); //延时10毫秒软件去抖
7. if( SW1==0 ) //再次检测SW1按键是否按下
8. {
9. Led_Green = ~ Led_Green ; //D5绿色LED状态翻转
10. while(SW1==0); //等待按键松开
11. }、
12. P1IFG &= ~(1<<2); //清除P1_2中断标志位
13. }
14. P1IF=0; //清除P1端口中断标志位
15. }
1. #pragma vector=P1INT_VECTOR //只要是P1端口外部中断都会进入此程序
2. __interrupt void P1_ISR(void)
3. {
4. if( (P1IFG & 0x04) == 0x04 ) //判断是否为P1_2引脚产生中断
5. {
6. Delay(10); //延时10毫秒软件去抖
7. if( SW1==0 ) //再次检测SW1按键是否按下
8. {
9. Led_Green = ~ Led_Green ; //D5绿色LED状态翻转
10. while(SW1==0); //等待按键松开
11. }、
12. P1IFG &= ~(1<<2); //清除P1_2中断标志位
13. }
14. P1IF=0; //清除P1端口中断标志位
15. }
04
任务实施
1)通过宏指令“#pragma vector= P1INT_VECTOR”指定P1端口中断服务入口地址,该指令之后开始编写P1端口中断服务函数;
2)用关键字“__interrupt”定义一个P1端口中断处理函数“void P1_ISR(void)”,无输入参数和返回值;
3)将寄存器P1IFG与0x04相与,相与的结果为0x04表示按键SW1触发中断,反之则不是。
4)确认按键SW1按下触发中断后,软件延时消抖,再次读取SW1对应的电平值,判断是否为0;电平值为0表示当前按键按下有效,D5绿色LED状态翻转,等待按键松开;反之则表示按键动作无效;
5)最后清除P1IFG寄存器中的P1_2引脚触发中断标志位P1IFG.PxIF[2]和P1端口中断标志位P1IF,中断返回。
04
任务实施
本任务为了实现与本单元任务1相似的功能在中断服务函数里加入软件延时去抖,而实际工程应用则要求中断处理过程要要快进快出,通常CPU内部会集成硬件去抖功能,而不用在中断处理过程中通过软件延时去抖。
04
任务实施
步骤7:编写main主函数
1)调用I/O引脚初始化函数,完成I/O引脚输入输出以及上拉配置;
2)调用按键中断初始化函数, 设置P1_2引脚下降沿触发中断、P1_2引脚中断使能、P1端口中断使能、总中断使能;
3)点亮D5绿色LED;
4)进入无限循环,等待按键触发中断。
04
任务实施
1. void main(void)
2. {
3. InitIO(); //调用I/O口初始化函数
4. InitKeyINT(); //调用中断配置函数
5. Led_Green =1; //点亮D5绿色LED
6. while(1) ; //进入循环工作
7. }
1. void main(void)
2. {
3. InitIO(); //调用I/O口初始化函数
4. InitKeyINT(); //调用中断配置函数
5. Led_Green =1; //点亮D5绿色LED
6. while(1) ; //进入循环工作
7. }
04
任务实施
1
2
打开工程
编写代码
3
编译工程
4
下载代码
04
任务实施
对工程进行编译,观察是否提示编译成功。如果出现错误或警告,需要认真检查修改,重新编译链接,直到没有错误和警告为止。
04
任务实施
1
2
打开工程
编写代码
3
编译工程
4
下载代码
04
任务实施
(1)用CC-Debugger仿真器的下载线连接黑板;
(2)完成代码下载;
(3)SW1按键松开时,观察D5绿色LED状态是否翻转,即亮变灭或灭变亮。
04
任务实施
学习目标
01
知识储备
03
任务工单
05
任务要求与任务分析
02
任务实施
04
任务小结
06
知识与技能提升
07
延伸阅读
08
2.3 外部中断方式按键控制交通信号灯
05
任务工单
本次任务关键知识引导:
1.停止当前工作,转而去做其他工作,做 完后又返回原来暂停处继续执行的现象称为( )。
2.单片机正在执行主程序时,突然出现中断请求,需要停止当前正在执行的程序,转而去执行( ),行业内把暂停的位置叫做( )。
3.要让单片机的CPU暂停当下的程序转而去执行中断服务,需要向CPU发出( ),能发出中断请求、引起中断的装置或事件称为( )。
4.“ioCC2530.h”文件中定义了( ),用来指定中断服务程序的入口地址。
5. 将P1_2引脚配置为输入上拉模式,需要对( )、( )、( )、( )四个寄存器进行配置。
6.I/O引脚的中断触发方式包括( )和( ),( )寄存器用来配置I/O引脚的中断触发方式,( )寄存器用来配置P1_2引脚的中断使能,( )寄存器用来配置P1端口的中断使能。
7.P1端口某个引脚触发中断时,( )寄存器对应引脚的中断标志位和P1端口中断标志位( )都会被置( ),在中断服务程序里,都需要通过软件将它们置( )。
8.EA置( )后,全部中断都停止响应。
任务工单
05
各组选派代表分析本组任务实施经验;
01
添加标题
请参照评价标准完成自评;
02
完成对其他小组的评价。
03
互评
经验分享
自评
评价方式 可采用自评、互评、老师评价等方式 说明 主要评价学生在项目学习过程中的操作技能、理论知识、学习态度、课堂表现、学习能力等。 序号 评价内容 评价标准 分值 得分
1 知识运用(20%) 掌握相关理论知识,完成本次任务关键知识的作答准确率(20分) 20分
2 专业技能(40%) 工程编译通过,SW1按键按下时,D5绿色LED状态翻转正常。(40分) 40分
工程编译通过,SW1按键按下时,D5绿色LED状态翻转异常。(30分)
完成代码的输入,工程没有编译通过。(15分)
建立工程错误,或者部分输入代码。(5分)
3 核心素养(20%) 具有良好的自主学习、分析解决问题、帮助他人的能力、整个任务过程中有指导他人并解决他人问题(20分) 20分
具有较好的学习能力和分析解决问题的能力,任务过程中无指导他人(15分)
具有主动学习并收集信息的能力,遇到问题有请教他人并得以解决(10分)
不主动学习(0分)
4 职业素养(20%) 实验完成后,设备无损坏、设备摆放整齐、工位区域内保持整洁、无干扰课堂秩序(20分) 20分
实验完成后,设备无损坏、无干扰课堂秩序(15分)
无干扰课堂秩序(10分)
干扰课堂秩序(0分)
总得分
学习目标
01
知识储备
03
任务工单
05
任务要求与任务分析
02
任务实施
04
任务小结
06
知识与技能提升
07
延伸阅读
08
2.3 外部中断方式按键控制交通信号灯
任务小结
06
学习目标
01
知识储备
03
任务工单
05
任务要求与任务分析
02
任务实施
04
任务小结
06
知识与技能提升
07
延伸阅读
08
2.3 外部中断方式按键控制交通信号灯
任务拓展
请思考下中断服务函数执行时间的长短对整个任务的性能是否有影响?本任务中在中断服务函数里采用延时函数是否合理?
07
动动脑
任务拓展
07
动动手
请在本任务代码基础上进行修改,常态下D5绿色LED处于点亮状态,SW1按键按下时,D5绿色LED处于熄灭状态,SW1按键松开时,又恢复常态下D5绿色LED点亮状态。
任务拓展
07
拓展练习
有些工业生产应用场合,需要长按按键达到一定时间才执行动作,请在本任务代码基础上进行修改,实现SW1按键长按1秒以上才执行D5绿色LED状态翻转。
具体实现方案参考如下:
(1)启动一计数器,初始化为0;
(2)SW1按键按下时,CPU执行SW1按键中断服务函数;
任务拓展
07
拓展练习
(3)在中断服务函数里,通过延时函数延时10毫秒,每10毫秒对SW1按键的状态进行检测,如果检测到SW1按键保持按下,计数器加1;如果检测到SW1按键松开,计数器清零并退出中断服务函数;
(4)计数器每次加1后,都对计数器进行数值判断,当计数器的值大于100时,表示SW1按键已长按超过1秒,执行D5绿色LDE状态翻转,计数器清0并进入无限循环等待SW1按键松开;待SW1按键松开后退出中断服务函数。
学习目标
01
知识储备
03
任务工单
05
任务要求与任务分析
02
任务实施
04
任务小结
06
知识与技能提升
07
延伸练习
08
2.3 外部中断方式按键控制交通信号灯
延伸练习
08
有些工业生产应用场合,需要长按按键达到一定时间才执行动作,请在本任务代码基础上进行修改,实现SW1按键长按1秒以上才执行D5绿色LED状态翻转。
具体实现方案参考如下:
(1)启动一计数器,初始化为0;
(2)SW1按键按下时,CPU执行SW1按键中断服务函数;
延伸练习
08
(3)在中断服务函数里,通过延时函数延时10毫秒,每10毫秒对SW1按键的状态进行检测,如果检测到SW1按键保持按下,计数器加1;如果检测到SW1按键松开,计数器清零并退出中断服务函数;
(4)计数器每次加1后,都对计数器进行数值判断,当计数器的值大于100时,表示SW1按键已长按超过1秒,执行D5绿色LDE状态翻转,计数器清0并进入无限循环等待SW1按键松开;待SW1按键松开后退出中断服务函数。

展开更多......

收起↑

资源预览