LED Blinking

实操部分
实验目的
1. 掌握CC2530的IO口寄存器设置;
2. 掌握LED自动闪烁的编程方法;
实验内容
在IAR集成开发环境中编写LED自动闪烁程序,配合节点板实现LED的自动闪烁;
预备知识
1. 了解C语言的基本知识;
2. 了解IAR中编写和调试程序的方法;
实验需求
安装IAR和相关驱动的个人PC1台
mini USB线1根
仿真器CC Debugger1根
ZigBee通用节点板1块
实验现象
节点板右下角两个绿色LED灯循环闪烁
实验步骤
1.创建IAR工作空间;
2.创建基于C的IAR工程;
3.编辑代码并调试;可参考提供的源码,调试应无差错、无告警;
4.试验箱上电;使用mini USB分别连接CC Debugger和PC;并将仿真器CC Debugger的另外一端和ZigBee通用节点板上的JTAG插座相连;
5.按下仿真器CC Debugger的复位按钮RESET,绿灯常亮表示模块连接成功,可以往芯片中烧写程序;每次烧写程序都需要复位,确保仿真器是绿灯状态;
6.在IAR中点击下载并调试按钮download and debug(CTRL+D)烧写程序;
7.在IAR的调试窗口中,点击[全速]运行:观察LED的亮、灭变化;
开发过程中,请注意CTRL+S保存项目!
参考源码

/*******************************************************************************
*  OSC = Default (reset)  16MHz RC 
********************************************************************************
* 编译器:
* IAR Assembler for 8051 7.51A/W32 
* IAR C/C++ Compiler for 8051  7.51A
*
* 文 件 名:     main.c
* 目标器件:     cc2530
* 编    写:     DaTai ban
* 修    订:     2010-9-15
* 版    本:     1.0
* 描    述:
*         DTD253_EMK. 开发板例程。
*         让开发板上的四个LED闪烁。
* 
*******************************************************************************/

#include "ioCC2530.h"      // 申明该文件中用到的头文件

void delay(void);   
/******************************************************************************
* @fn  main
*
* @brief
*      Main function of application example. Flash 4 LEDs
*
* Parameters:
* @param  void
* @return void
******************************************************************************/
void main( void )
{
  P0DIR |= 0x01;  // 设置P0.0为输出方式
  P2DIR |= 0x01;  // 设置P2.0为输出方式
  
  while(1)
  {
     P0_0 = 0;  // 点亮LED
     P2_0 = 0;
     
     delay();   // 延时
     
     P0_0 = 1;  // 熄灭LED
     P2_0 = 1;
     
     delay(); 
  }
}

/******************************************************************************
* @fn  delay
*
* @brief
*      延时函数.
*
* Parameters:
*
* @param  void
*
* @return void
*
******************************************************************************/
void delay(void)   //延时时间约400ms
{
  unsigned int i;
  unsigned char j;

  for(i=0;i <1500;i++)
  {
    for(j=0;j<200;j++)
    {
      asm("NOP");
      asm("NOP");
      asm("NOP");
    }
  }
}                 
实验阶段
体验阶段:利用提供的源码,完成编译、烧写、执行,观察实验现象;
提升阶段:请使用宏和函数优化代码,使其符合模块化开发,同时可读性更强;
实验报告
1. 根据实操部分的内容,完成点灯项目;
2. 以纸质的形式提交实验报告;
3. 论文格式请参照范文[点击下载]
优化代码参考
主文件main.c

    /**************************************************************************
    * Title       LED blinking
    * Name        cnplaman
    * Unit        pla54414
    * Date        2022-05-10
    * Tips        函数的封装
    *************************************************************************/
    #include "ioCC2530.h"
    #include "./config.h"
    #include "../lib/delay.h"
    #include "./led.h"
    
    void main( void )
    {
        initLED();
        LED();
    }                    
                
配置文件config.h[注意文件路径]

    #ifndef _config_h
    #define _config_h

    #define BV(n) (1<<(n))
    #define LED1 P0_0
    #define LED2 P2_0
    #define ON 0
    #define OFF 1

    #endif
                
头文件delay.h[注意文件路径]

    #ifndef _delay_h
    #define _delay_h
    
    void delay( unsigned int duration )
    {
        unsigned int i, j;
        for( i = 0; i < duration; i++ )
        {
            for( j = 0; j < 200; j++ );
        }
    }
    
    #endif
                
头文件led.h[注意文件路径]

    #ifndef _led_h
    #define _led_h

    void initLED( void )
    {
        //  P0DIR |= 0x01;
        //  P2DIR |= 0x01;
        P0DIR |= BV( 0 );   //0 for input;1 for output
        P2DIR |= BV( 0 );
        P0SEL &= ~BV( 0 );  //0 for GPIO;1 for peripheral
        P2SEL &= ~BV( 0 );
    }
    void LED( void )
    {
        while( 1 )
        {
            LED1 = ON;      //led is on
            LED2 = OFF;     //led is off
            delay( 2000 );
            LED1 = OFF;     //led is off
            LED2 = ON;      //led is on
            delay( 2000 );
        }
    }

    #endif