1. LED闪烁控制

LED闪烁控制 学习卡片

任务说明

本案例要求编写CC2530裸机程序,控制开发板上的LED灯以1秒为周期闪烁(亮0.5秒、灭0.5秒)。核心目标是掌握CC2530通用IO(GPIO)作为输出模式时的寄存器配置方法,以及通过软件延时实现定时控制的基本方式。开发板LED通常连接在P1_0或P1_1引脚(以实际原理图为准),本案例以P1_0为例。

硬件连接与原理

CC2530的IO口通过三个特殊功能寄存器控制:P1SEL(功能选择,0为GPIO)、P1DIR(方向选择,1为输出)、P1INP(输入模式配置,输出时无需关注)。LED阳极经限流电阻接电源,阴极接P1_0引脚,因此输出低电平时LED点亮,输出高电平时熄灭。延时函数通过嵌套循环消耗CPU周期实现,系统时钟默认使用内部16MHz RC振荡器。

CC2530 P1_0 GPIO输出 R LED GND 限流电阻 330Ω 低电平点亮

代码实现


#include <iocc2530.h>

/* 软件延时函数:约延时n毫秒(基于16MHz主频) */
void delay_ms(unsigned int n)
{
    unsigned int i, j;
    for (i = 0; i < n; i++)
        for (j = 0; j < 535; j++);  /* 空循环消耗时间 */
}

/* LED初始化:P1_0配置为GPIO输出 */
void led_init(void)
{
    P1SEL &= ~0x01;   /* P1_0选择为GPIO功能 */
    P1DIR |= 0x01;    /* P1_0方向设为输出 */
    P1_0 = 1;         /* 初始状态:高电平,LED熄灭 */
}

/* 主函数 */
void main(void)
{
    led_init();
    while (1)
    {
        P1_0 = 0;         /* 输出低电平,LED点亮 */
        delay_ms(500);    /* 保持点亮500ms */
        P1_0 = 1;         /* 输出高电平,LED熄灭 */
        delay_ms(500);    /* 保持熄灭500ms */
    }
}

代码说明

程序首先通过led_init()完成GPIO初始化:将P1SEL的bit0清零使P1_0工作在通用IO模式,将P1DIR的bit0置1使该引脚为输出方向。主循环中交替向P1_0写入0和1,配合delay_ms()实现500ms间隔翻转。延时函数采用双层空循环,内层循环次数535为经验值,在16MHz系统时钟下可得到约1ms延时。若实际开发板LED接在P1_1,只需将代码中所有0x01替换为0x02即可。

编译与烧录

本程序基于IAR Embedded Workbench for 8051开发环境。新建工程后,将上述代码保存为main.c并加入工程。工程选项需设置:器件选择CC2530,编译器优化等级建议设为Low或None以保证延时准确性,连接器输出格式选择Intel HEX。编译通过后生成.hex文件,使用SmartRF Flash Programmer通过CC Debugger仿真器将HEX文件烧录到CC2530芯片。

验证方法

烧录完成后,给开发板上电并观察LED状态。判定标准:LED应以约1秒为周期连续闪烁(亮约0.5秒、灭约0.5秒),周期误差在视觉上不明显即可视为通过。若LED常亮或常灭,检查P1SEL/P1DIR寄存器配置是否正确以及LED硬件连接极性;若闪烁频率明显偏快或偏慢,调整delay_ms()内层循环次数535的数值。