物联网通信技术实验报告2(按键中断控制LED闪烁)

实验2 按键中断控制LED闪烁

实验目的

1. 掌握CC2530 的中断设置方法;

2. 掌握中断函数程序的编写方法。

实验设备

  1. CC2530实验节点
  2. SmartRF04EB仿真器
  3. PC机

实验原理

  1. ZigBee节点的上的KEY按键位于节点右下方,如图所示。

 KEY接CC2530的P0_7引脚。

 

  1. 端口0的中断处理函数格式如下:

#pragma vector=P0INT_VECTOR

__interrupt void P0_ISR(void){

...

...

...

}

实验内容

  1. 编程实现用按键KEY控制LED灯闪烁。
#include "ioCC2530.h"

#define uint unsigned int

#define uchar unsigned char



#define LED1 P1_0

#define LED2 P1_1

#define LED3 P1_4

#define LED4 P0_1

#define KEY P0_7

//延时子函数

void Delay(uint n)

{

 // uint tt;

  for(int i=n;i>0;i--)

    for(int i=n;i>0;i--);

}

void  led_init(void)

{

  //设置成通用IO口

  P1SEL &=~0X13;

  //P1SEL &=~0X02;

  //设置P1_0,P1_1,P1_4输出

  P1DIR |=0X13;

 // P0DIR |=0X02;

  

  //关闭LED1

  LED1=1;

  //关闭LED2

  LED2=1;

  //关闭LED3

  LED3=1;

  //关闭LED4

 // LED4=0;

}

void key_init(void)

{

  //设置成通用IO口

   P0SEL &=~0X80;

  //设置P0_7为输入模式

  P0DIR &=~0X80;

  //P0_7上拉模式

  P0INP &=~0X80;

  //P0_7,下降沿触发

 // PICTL |=0x01;

}





void key_interrupt_init(void)

{

  //开总中断

  EA=1;

  //P0中断标志清零

  P0IFG &=0x00;

  //端口0中断使能

  IEN1 |=0x20;

  //开端口0的第8位的(P0_7)中断使能

  P0IEN |=0X80;

}



//key不用中断控制LED

uchar key_flag=0;

void key_proc(void)

{

  if(KEY == 0 && key_flag == 0)

  {

    LED1 =0;

    key_flag=1;

  }

else if(KEY == 0 && key_flag==1)

{
 LED1 =0;

 key_flag=0;


}

}



#pragma vector = P0INT_VECTOR

__interrupt void P0_ISR(void)

{

  if(P0IFG>0)

  {

    LED1 = !LED1;

    LED2 = !LED2;

    P0IFG = 0;

    P0IF = 0;

  }

}



int main(void)

{

    //LED初始化

    led_init();

    //IO及外部中断初始化

    key_init();

    key_interrupt_init();

    //等待中断

    Delay(100);

  while(1)

  {

    //key_proc();

  }

  

}

上述代码实现了两种方式按键控制LED灯亮灭亮灭的功能,第一种方式是中断方式,第二种就是相当于轮询的方式,在while循环中不断地看按键KEY是否按下,如果按下则执行相应的功能,否则跳过.

运行代码,并且烧录到板子中,现象如图所示

 

实验结果以及分析:

1.首先通过原理图,判断按键是哪个引脚,所以是P0_7

 

  1. 1然后开始编程,查看编程手册
    1. 2有以下步骤
      • 首先将LED的引脚以及KEY的引脚设置成通用的I/O口
      • 然后将LED的引脚设置成输出模式,将KEY引脚设置成输入模式,同时将KEY这个模式设置成上拉模式(输入模式的两种选择,作用就是当引脚时浮空的状态,该引脚默认的状态,如果上拉就是高电平,如果下拉就是低电平)
      • LED:初始化LED灯为全灭,KEY:1.将P0的中断标志位清零,2.开总中断,3.开端口0的中断,4.开端口0的第八位(P0_7)的中断
      • 编写中断服务函数如果按键按下,那么此时的端口零的中断状态标志位就会置1,在中断函数中判断,该标志位是否为1,或者>0,然后编写功能函
      • 关于以上步骤可参考书面的代码,皆是模块化编程

实验心得:

本次实验时使用按键中断控制LED闪烁,主要学习到的模块就是定时中断,通过此次实验队寄存器操作变得更加熟练,理解也更加深刻。

首先需要了解cc2530的GPIO和中断控制,然后按照以下步骤进行: 1. 初始化GPIO,将LED控制引脚设置为输出模式,按键引脚设置为输入模式。 2. 配置按键引脚的中断响应函数,当按键被按下时触发中断,执行中断服务程序。 3. 在中断服务程序中,将LED控制引脚的电平翻转,即从高电平变为低电平,或从低电平变为高电平。 4. 在主函数中,使用循环结构来控制LED灯的闪烁,每次闪烁的时间可以通过延时函数来实现。 以下是一份示例代码: ```c #include "ioCC2530.h" #define LED P1_0 #define KEY P0_1 void InitGPIO() { // 将LED控制引脚设置为输出模式 P1SEL &= ~BIT0; P1DIR |= BIT0; // 将按键引脚设置为输入模式 P0SEL &= ~BIT1; P0DIR &= ~BIT1; P0INP |= BIT1; } #pragma vector = P0INT_VECTOR __interrupt void P0_ISR() { // 按键中断响应函数 if(KEY == 0) { LED = !LED; // 翻转LED控制引脚电平 } P0IFG = 0; // 清除中断标志位 } void Delay(unsigned int n) { while(n--); } int main() { InitGPIO(); P0IE |= BIT1; // 开启按键引脚中断 P0IES |= BIT1; // 按键中断触发方式为下降沿 EA = 1; // 全局中断使能 while(1) { LED = !LED; // 翻转LED控制引脚电平 Delay(50000); // 延时一段时间 } } ``` 以上代码实现了按键控制LED灯的闪烁,当按键被按下时,LED灯的亮灭状态会翻转一次。主函数中的循环结构控制LED灯的闪烁,每次闪烁的时间为50000个循环周期。你可以根据实际需要进行调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值