ZigBee1-1 练习 IO控制

本文档介绍了如何使用CC2530微控制器进行GPIO操作,实现LED灯的交替闪烁、流水灯效果以及按键控制LED亮灭。通过修改原代码,实现了LED1和LED3交替闪烁,以及按键S1控制LED1和LED3的500毫秒亮灭。同时,展示了按键扫描和消抖的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


理论部分学习: 无线传感网络 --ZigBee1-1 硬件相关,IO操作

1-1 IO控制Led亮灭

要求:
(1)在《1-1 IO控制Led灯亮灭》实验中完成了对Led1的控制,请大家添加代码,完成对Led3的控制,要求:Led3与Led1交替闪烁,即,Led1点亮时,Led3熄灭;Led3点亮时,Led1熄灭。

原代码:

/****************************************************************************
* 描    述: GPIO输出控制实验1 操作IO口控制LED灯的亮和灭
****************************************************************************/
#include <ioCC2530.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define LED1 P1_0                //定义P1.0口为LED1控制端

/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
****************************************************************************/
void DelayMS(uint msec)
{ 
    uint i,j;
    
    for (i=0; i<msec; i++)
        for (j=0; j<535; j++);
}

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x01;               //P1.0定义为输出口
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{     
    InitLed();                   //设置LED灯相应的IO口

    while(1)                     //死循环
    {
        LED1 = 1;                //点亮LED1      
        DelayMS(1000);           //延时1秒

        LED1 = 0;                //LED1熄灭
        DelayMS(1000);           //延时1秒
    }    
}

分析:

由图可知,LED1对应P1.0口,LED3对应P1.4口
定义

#define LED1 P1_0                //定义P1.0口为LED1控制端
#define LED3 P1_4                //定义P1.4口为LED3控制端

在这里插入图片描述
定义输出口

 P1DIR |= 0x11;               //P1.0,P1.4定义为输出口
                              //0x 0001 0001

修改后代码

/****************************************************************************
* 文 件 名: main.c

* 描    述: GPIO输出控制实验1 操作IO口控制LED灯的亮和灭
****************************************************************************/
#include <ioCC2530.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define LED1 P1_0                //定义P1.0口为LED1控制端
#define LED3 P1_4                //定义P1.4口为LED3控制端

/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{ 
    uint i,j;
    
    for (i=0; i<msec; i++)
        for (j=0; j<535; j++);
}

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x11;               //P1.0,P1.4定义为输出口
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{     
    InitLed();                   //设置LED灯相应的IO口

    while(1)                     //死循环
    {
        LED1 = 1;                //点亮LED1
        LED3 = 0;                //LED3熄灭
        DelayMS(1000);           //延时1秒

        LED1 = 0;                //LED1熄灭
        LED3 = 1;                //点亮LED3 
        DelayMS(1000);           //延时1秒
    }    
}

1-2 流水灯

/****************************************************************************
* 文 件 名: main.c
* 作    者: Andy
* 修    订: 2013-01-08
* 版    本: 1.0
* 描    述: 操作IO口控制4盏LED灯的全亮和全灭、闪烁、流水灯
****************************************************************************/
#include <ioCC2530.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define LED1 P1_0       //定义P1.0口为LED1控制端

#define LED3 P1_4       //定义P1.4口为LED3控制端


/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{ 
    uint i,j;
    
    for (i=0; i<msec; i++)
        for (j=0; j<535; j++);
}

/****************************************************************************
* 名    称: LedOnOrOff()
* 功    能: 点亮或熄灭所有LED灯    
* 入口参数: mode为0时LED灯亮  mode为1时LED灯灭
* 出口参数: 无
****************************************************************************/
void LedOnOrOff(uchar mode)
{
    LED1 = mode;

    LED3 = mode; 

}

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x11;      //P1.0、P1.1、P1.4定义为输出
    LedOnOrOff(0);      //使所有LED灯默认为熄灭状态
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    uchar i;
    
    InitLed();               //设置LED灯相关IO口
    
    while(1)                 //死循环
    {  
        LED1 = !LED1;         //流水灯,初始化时LED为熄灭执行后则点亮
        DelayMS(200);         
            
        LED3 = !LED3;        
        DelayMS(200); 
  
        
        for (i=0; i<2; i++)  //所有灯闪烁2次
        {
           LedOnOrOff(1);    //关闭所有LED灯
           DelayMS(200);
           LedOnOrOff(0);    //打开所有LED灯
           DelayMS(200);
        }
        
        LedOnOrOff(0);       //使所有LED灯熄灭状态
        DelayMS(1000);
    }
}

1-3 按键控制LED亮灭

要求:
在《1-2 流水灯》中完成了流水灯的功能,在《1-3 按键控制LED灯》实验中使用扫描的方法完成按键检测,结合这两个实验,完成按键控制LED流水灯的功能,即按键S1按下时,分别点亮Led1与Led3,各保持500毫秒。

原代码:

/****************************************************************************
* 文 件 名: main.c
* 描    述: 按下按键S1控制LED1灯亮和灭
****************************************************************************/
#include <ioCC2530.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define LED1 P1_0       // P1.0口控制LED1
#define KEY1 P0_1       // P0.5口控制S2

/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{ 
    uint i,j;
    
    for (i=0; i<msec; i++)
        for (j=0; j<535; j++);
}

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x01;      // P1.0定义为输出
    LED1 = 0;           // LED1灯熄灭     
}

/****************************************************************************
* 名    称: InitKey()
* 功    能: 设置按键相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitKey(void)
{
    P0SEL &= ~0x02;     //设置P0.1为普通IO口  
    P0DIR &= ~0x02;     //按键接在P0.1口上,设P0.1为输入模式 
    P0INP &= ~0x02;     //打开P0.1上拉电阻
}

/****************************************************************************
* 名    称: KeyScan()
* 功    能: 读取按键状态
* 入口参数: 无
* 出口参数: 0为抬起   1为按键按下
****************************************************************************/
uchar KeyScan(void)
{
    if (KEY1 == 1)
    {
        DelayMS(10);
        if (KEY1 == 1)
        {
            while(!KEY1); //松手检测
            return 1;     //有按键按下
        }
        
    }

    return 0;             //无按键按下
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    InitLed();		      //设置LED1相应的IO口
    InitKey();            //设置S1相应的IO口
    
    while(1)
    {
        if (KeyScan())    //按键按下则改变LED状态
            LED1 = ~LED1; 
    }
}

分析:

由图可知按键s1基本构造,故使用s1时,设该口为普通口,输入模式,上拉模式

void InitKey(void)
{ 
    P0SEL &= ~0x02;     //设置P0.1为普通IO口  按位与 取反  
    P0DIR &= ~0x02;     //按键接在P0.1口上,设P0.1为输入模式 
    P0INP &= ~0x02;     //打开P0.1上拉电阻
}

在这里插入图片描述

修改后代码

/****************************************************************************
* 文 件 名: main.c
* 作    者: Andy
* 修    订: 2013-01-08
* 版    本: 1.0
* 描    述: 按下按键S1控制LED1灯亮和灭
****************************************************************************/
#include <ioCC2530.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define LED1 P1_0       // P1.0口控制LED1
#define LED3 P1_4       // P1.4口控制LED3

#define KEY1 P0_1       // P0.1口控制S2

/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{ 
    uint i,j;
    
    for (i=0; i<msec; i++)
        for (j=0; j<535; j++);
}

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x11;      // P1.0定义为输出
    LED3 = 0; 
    LED1 = 0;           // LED1灯熄灭     
}

/****************************************************************************
* 名    称: InitKey()
* 功    能: 设置按键相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitKey(void)
{ 
    P0SEL &= ~0x02;     //设置P0.1为普通IO口  按位与 取反  
    P0DIR &= ~0x02;     //按键接在P0.1口上,设P0.1为输入模式 
    P0INP &= ~0x02;     //打开P0.1上拉电阻
}

/****************************************************************************
* 名    称: KeyScan()
* 功    能: 读取按键状态
* 入口参数: 无
* 出口参数: 0为抬起   1为按键按下
****************************************************************************/
uchar KeyScan(void)                     
{
    if (KEY1 == 1)
    {
        DelayMS(10);      //延时消抖
        if (KEY1 == 1)
        {
            while(!KEY1); //松手检测
            return 1;     //有按键按下
        }
        
    }

    return 0;             //无按键按下
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)//扫描
{
    InitLed();		      //设置LED1相应的IO口
    InitKey();            //设置S1相应的IO口
    
    while(1)
    {
        if (KeyScan())    //按键按下则改变LED状态
        { 
          LED1 = 1; 
          LED3 = 0;
          DelayMS(500);
          
          LED1 = 0; 
          LED3 = 1;
          DelayMS(500);
        }
    }
}

TensorRT是NVIDIA推出的一个用于高性能深度学习推理的优化器和运行时库。而YOLO(You Only Look Once)则是一种非常流行的目标检测算法。如果你想在Jetson Nano上使用TensorRT和YOLO,你可以按照以下步骤进行: 1. 首先,确保你已经安装了Jetson Nano Developer Kit的软件环境。你可以参考NVIDIA官方的文档来获取Jetson Nano的入门指南。 2. 接下来,你需要安装PyTorch for Jetson。你可以在NVIDIA开发者论坛上找到关于PyTorch for Jetson的相关信息。根据论坛上的说明,你可以下载并安装适用于Jetson Nano的PyTorch版本。 3. 由于Jetson Nano的架构是aarch64,与Windows和Linux不同,因此不能直接安装Anaconda。但你可以安装一个替代品,如archiconda,来管理和使用Python环境。 4. 一旦你完成了Python环境的设置,你就可以开始使用TensorRT和YOLO了。你可以使用TensorRT API来优化和部署YOLO模型。具体的实现方法可以参考NVIDIA的官方文档和示例代码。 总结一下,要在Jetson Nano上使用TensorRT和YOLO算法,你需要先安装Jetson Nano软件环境,然后安装PyTorch for Jetson,并使用替代品archiconda来管理Python环境。最后,你可以使用TensorRT API来优化和部署YOLO模型。希望这些信息对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Jetson nano部署Yolov5目标检测 + Tensor RT加速(超级详细版)](https://blog.youkuaiyun.com/qq_67381784/article/details/130638235)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值