5.外部中断

中断初始化配置步骤:

  1. IO口初始化配置

  2. 开启中断总允许EA

  3. 打开某个IO口的中断允许

  4. 打开IO口的某一位的中断允许

  5. 配置该位的中断触发方式

中断函数:

#pragma vector = PxINT_VECTOR
__interrupt void 函数名(void){
     
     }

#pragma vector = PxINT_VECTOR
__interrupt void 函数名(void){}

image-20230927151133992

中断配置寄存器

IENx中断使能寄存器

image-20230927151945997

image-20230927151707935

image-20230927151729874

如果使能P0口中断,可直接使用P0IE = 1,但是使能P1/P2口中断,不能直接对单独的某一位进行操作,需要进行或操作开启,如IEN2 |= 0x10; // 0001 0000 相当于P1IE=1

PxIEN 通用 I/O 中断

通用 I/O 引脚设置为输入后,可以用于产生中断。中断可以设置在外部信号的上升或下降沿触发。P0、P1或 P2 端口都有中断使能位

image-20230927152159630

PICTL 中断边缘寄存器

image-20230927152314064

PxIFG中断状态标志寄存器

当中断条件发生在 I/O 引脚之一上面,P0-P2 中断标志寄存器 P0IFG、P1IFG 或 P2IFG 中相应的中断状态标志将设置为 1。不管引脚是否设置了它的中断使能位,中断状态标志都被设置。当中断已经执行,中断状态标志被清除,该标志写入 0。

【硬件置1,软件清0】

image-20230927152543051

IO口中断状态标志

image-20230927155024657

image-20230927155039070

中断服务函数

#pragma vector = PxINT_VECTOR

PxINT_VECTOR:需要根据自己选择的中断口自行改动(0,1,2)

其他部分不要改动

__interrupt void 函数名(void){ //清除中断标志 PxIFG=0; PxIF=0;}

自己根据需求编写函数名,然后根据打开的中断IO口,进行标志位清零

中断样例

#include<iocc2530.h>

void main(){
    
    
  
   P0SEL &= ~0x20;//P0_5设置为通用I/O口 1101 1111
   P0DIR &= ~0x20;//P0_5设置为输入
   P0INP &= ~0x20;//P0_5设置为上下拉
   P2INP &= ~0X20;//P0_5设置为上拉  
   
   //1.打开中断总允许
   EA=1;
   //2.打开P0口中断允许
   P0IE = 1;
   
   /*
   P1IE如果要设置为1,不能直接用P1IE = 1,不能直接使用位操作
   应该使用 IEN2 |= 0x10; // 0001 0000 相当于P1IE=1
   */

   //3.打开组内的某一位中断允许
   P0IEN |= 0x20;//P0_5中断打开 0010 0000
   //4.设置触发方式
   PICTL |=0x01;//把P0这一组配置成下降沿触发

   while(1);
}

#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void){
    
     //P0_ISR为函数名,可自行定义
   if(P0IFG & 0x20)//判断P0_5是否发生中断
   {
    
    
   }
   //清除中断标志 
   P0IFG=0;
   P0IF=0;
}

#include<iocc2530.h>

void main(){

P0SEL &= ~0x20;//P0_5设置为通用I/O口 1101 1111
P0DIR &= ~0x20;//P0_5设置为输入
P0INP &= ~0x20;//P0_5设置为上下拉
P2INP &= ~0X20;//P0_5设置为上拉

//1.打开中断总允许
EA=1;
//2.打开P0口中断允许
P0IE = 1;

/*
P1IE如果要设置为1,不能直接用P1IE = 1,不能直接使用位操作
应该使用 IEN2 |= 0x10; // 0001 0000 相当于P1IE=1
*/

//3.打开组内的某一位中断允许
P0IEN |= 0x20;//P0_5中断打开 0010 0000
//4.设置触发方式
PICTL |=0x01;//把P0这一组配置成下降沿触发

while(1);
}

#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void){ //P0_ISR为函数名,可自行定义
if(P0IFG & 0x20)//判断P0_5是否发生中断
{
}
//清除中断标志
P0IFG=0;
P0IF=0;
}
Zigbee这个名字的灵感来源于蜂群的交流方式:蜜蜂通过Z字形飞行来通知发现的食物的位置、距离和方向等信息。Zigbee联盟便以此作为这个新一代无线通信技术的名称。 [2]
蜜蜂在发现花丛后会通过一种特殊的肢体语言来告知同伴新发现的食物源位置等信息,这种肢体语言就是ZigZag行舞蹈,是蜜蜂之间一种简单传达信息的方式。借此意义Zigbee作为新一代无线通讯技术的命名。在此之前ZigBee也被称为“HomeRF Lite”、“RF- EasyLink”或“fireFly”无线电技术,统称为ZigBee。
简单的说,ZigBee是一种高可靠的无线数传网络,类似于CDMA和GSM网络。ZigBee数传模块类似于移动网络基站。通讯距离从标准的75m到几百米、几公里,并且支持无限扩展。
ZigBee是一个由可多到65535个无线数传模块组成的一个无线数传网络平台,在整个网络范围内,每一个ZigBee网络数传模块之间可以相互通信,每个网络节点间的距离可以从标准的75m无限扩展。
与移动通信的CDMA网或GSM网不同的是,ZigBee网络主要是为工业现场自动化控制数据传输而建立,因而,它必须具有简单,使用方便,工作可靠,价格低的特点。而移动通信网主要是为语音通信而建立,每个基站价值一般都在百万元人民币以上,而每个ZigBee“基站”却不到1000元人民币。
每个ZigBee网络节点不仅本身可以作为监控对象,例如其所连接的传感器直接进行数据采集和监控,还可以自动中转别的网络节点传过来的数据资料。除此之外,每一个ZigBee网络节点(FFD)还可在自己信号覆盖的范围内,和多个不承担网络信息中转任务的孤立的子节点(RFD)无线连接。

猜你喜欢

转载自blog.csdn.net/qq_61228493/article/details/133354790
今日推荐