资源简介 (共94张PPT)单片机与C语言技术应用第二单元 任务32.3 外部中断方式按键控制交通信号灯学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读08学习目标01掌握if-else条件语句的基本用法;掌握判断条件标志位进行逻辑控制;掌握单片机按键检测的基本原理;掌握按键控制相关端口寄存器设置方法;掌握查询方式按键处理的编程方法;掌握按键外部中断寄存器设置方法;掌握外部中断方式按键处理的编程方法。学习目标01能对CC2530单片机按键进行端口设置;能使用查询方法进行按键有效判断和按键处理;能对CC2530单片机外部中断寄存器进行设置;能使用外部中断方法进行按键有效判断和按键处理。学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读082.3 外部中断方式按键控制交通信号灯任务要求与任务分析02任务要求:①黑板通电后,D5绿色LED点亮(绿灯亮);②按一次SW1按键,D5绿色LED熄灭(绿灯灭);③再按一次SW1按键, D5绿色LED点亮(绿灯亮);④按键效果可循环。任务分析:中断方式SW1按键输入检测;每次按键操作,D5绿色LED由亮变灭或由灭变亮。学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读082.3 外部中断方式按键控制交通信号灯什么是中断中断源1234中断向量中断服务函数03知识储备在生活中经常会遇到这样的情况:正在书房看书时,突然客厅的电话响了,人们往往会暂停看书,转而去接电话,接完电话后又回书房接着看书。这种暂停当前工作,转而去做其他事,做完后返回暂停处继续往下执行的现象称为中断。知识储备03知识储备03单片机也有类似的中断现象,当单片机正在执行main主程序时,突然出现一个中断请求;在中断请求允许的情况下,CPU会暂停正在执行的程序,对中断请求做出响应并执行中断服务程序;中断处理完毕后返回暂停处继续往下执行。这个暂停的地方称作断点。什么是中断中断源120334中断向量中断服务函数知识储备能发出中断请求且引起中断的装置或事件称为中断源。CC2530单片机共有18个不同类型的中断源,包括外部I/O口中断、定时器中断、串口发送和接收中断等。每个中断源都有一系列寄存器进行控制,且每个中断源对应一个中断,可以分别使能和控制。知识储备03什么是中断中断源120334中断向量中断服务函数33知识储备中断源发出的中断请求被CPU检测到之后,如果允许响应中断,则CPU会自动转移,执行某一个固定程序空间地址的指令。这个固定的地址称作中断入口地址,也称作中断向量。不同中断源有不同的中断入口地址,即不同的中断向量。CC2530单片机的18个中断源对应18个不同的中断向量,在头文件“ioCC2530.h”中已对这些中断向量进行宏定义,形成中断向量表。03知识储备当开启某一类型的中断源时,必须编写中断服务函数,并为这中断服务函数指定中断向量,也就是告诉CPU这一类型的中断源触发时,将去执行哪一个中断服务函数。不同的中断源具有不同的中断服务函数。本任务采用P1_2引脚连接SW1按键,对应P1端口中断源,其中断服务入口地址为0x7B,已在头文件“ioCC2530.h”中定义,具体如下:03知识储备#define P1INT_VECTOR VECT( 15, 0x7B )什么是中断中断源120334中断向量中断服务函数知识储备中断服务函数与一般自定义函数不同,有特定的书写格式,具体如下: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_VECTOR0x7B是P1端口中断源的入口地址,在头文件“ioCC2530.h”中已将数值0x7B宏定义为P1INT_VECTOR,也就是P1INT_VECTOR等效于0x7B数值。03知识储备#pragma vector=<中断向量>“__”为两个下划线“_”,编写代码时要注意,不要弄错。03知识储备系统中断总开关通用I/O中断触发条件56知识储备0378通用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中断触发条件560378通用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 不使用,读出来为05 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中断触发条件560338通用I/O中断处理流程通用I/O中断服务函数37知识储备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中断服务函数。知识储备03PxIFG寄存器:知识储备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,即复位后各端口内所有引脚未发生中断。配置代码举例:知识储备031. 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端口无中断未决。配置代码举例:知识储备031. IRCON &= ~(5<<1); //清除P0端口中断标志2. IRCON &= ~(1<<1); //清除定时器1中断标志3. P0IF=0; //直接位操作清除P0端口中断标志4. T1IF=0; //直接位操作清除定时器1中断标志IRCON2寄存器:知识储备03位 位名称 复位值 操作 描述7:5 - 000 R/W 不使用,读出来为04 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端口无中断未决。配置代码举例:知识储备031. IRCON2 &= ~(1); //清除P2端口中断标志2. IRCON2 &= ~(<<1); //清除P1端口中断标志3. P2IF=0; //直接位操作清除P2端口中断标志4. P1IF=0; //直接位操作清除P1端口中断标志系统中断总开关通用I/O中断触发条件56知识储备0378通用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端口中断服务函数。因此,针对不同端口需要构建不同的端口中断服务函数,并在端口中断服务函数之前通过宏指令指向不同的中断向量。知识储备03P0以及P1端口中断服务函数配置代码举例:知识储备031. #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引脚进行逐一判断、清除及执行相应的中断处理。端口中断服务函数处理流程如下:知识储备031. #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都设置为中断触发功能,其端口中断服务函数配置代码如下:知识储备031. #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. }知识储备0314. 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.知识储备0329. 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延伸阅读082.3 外部中断方式按键控制交通信号灯任务实施04● 任务实施前必须先准备好以下设备和资源:序号 设备/资源名称 数量 是否准备到位(√)1 计算机(已安装好IAR软件) 1台 2 NEWLab实训平台 1套 3 CC-Debugger 仿真器 1套 4 黑板 1块 12任务实施04打开工程编写代码3编译工程4下载代码打开本书配套源代码文件夹中的“中断方式按键控制交通信号灯.ewp”工程。04任务实施12打开工程编写代码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绿色LED6. while(1) ; //进入循环工作7. }1. void main(void)2. {3. InitIO(); //调用I/O口初始化函数4. InitKeyINT(); //调用中断配置函数5. Led_Green =1; //点亮D5绿色LED6. while(1) ; //进入循环工作7. }04任务实施12打开工程编写代码3编译工程4下载代码04任务实施对工程进行编译,观察是否提示编译成功。如果出现错误或警告,需要认真检查修改,重新编译链接,直到没有错误和警告为止。04任务实施12打开工程编写代码3编译工程4下载代码04任务实施(1)用CC-Debugger仿真器的下载线连接黑板;(2)完成代码下载;(3)SW1按键松开时,观察D5绿色LED状态是否翻转,即亮变灭或灭变亮。04任务实施学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读082.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延伸阅读082.3 外部中断方式按键控制交通信号灯任务小结06学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读082.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延伸练习082.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按键松开后退出中断服务函数。 展开更多...... 收起↑ 资源预览