【23物联网国赛样题第二套】单片机,CC2530单片机呼吸灯与按键控制--单击双击长按、呼吸灯与亮度维持,物联网竞赛今年历年国赛样题真题代码

这篇具有很好参考价值的文章主要介绍了【23物联网国赛样题第二套】单片机,CC2530单片机呼吸灯与按键控制--单击双击长按、呼吸灯与亮度维持,物联网竞赛今年历年国赛样题真题代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

任务要求:

  • ZigBee节点盒通电或重置,节点盒的LED1、LED2灯都不亮。
  • 长按SW1键不松开,LED1灯亮,LED2灯熄灭。
  • 松开SW1键,LED1、LED2亮灯都常亮。
  • 双击SW1可以控制LED1灯实现呼吸灯效果,LED2灯保持熄灭状态。
  • 再次双击SW1可以控制LED1维持当前亮度不再发生变化,LED2继续保持熄灭状态。
  • 将编写好的程序发布到蓝色ZigBee节点盒中。

cc2530呼吸灯,物联网竞赛,物联网,单片机,嵌入式硬件,c语言

任务分析:

这道题其实并不难,主要考的是思维逻辑,这边我们只写平常常用的按键与呼吸灯,通过变量控制来达到想要的效果,不用定时器,只在循环中完成任务。我们按照任务步骤一步一步开发,先写初始化,然后编写按键触发代码,最后在相应位置加入灯的效果。

代码实现:

 ※本次代码使用library版竞赛工程

在工程app目录下新建Breath.c与.h文件,该呼吸灯代码是从别的工程移植过来的,有明显bug,建议动手修改,改不来留言

以下为Breath.c文件,

#include "iocc2530.h"
#include "Breath.h"

#define false 0
#define true 1
unsigned char levelCount = 8;
unsigned char led_levet_timer = 2;
unsigned char devideCount = 16;
unsigned char level = 1;
unsigned char timeTic = 0;
unsigned char isUprise = 1;


void _pwmLevelUp() {
    static unsigned long led_level_tick = 0;
    led_level_tick++;
    if (led_level_tick > led_levet_timer) {
        led_level_tick = 0;
        if (isUprise)
            level++;
        else
            level--;
        if (level > levelCount) {
            level = levelCount;
            isUprise = false;
        } else if (level == 0) {
            isUprise = true;
        }
    }
}

void _pwm() {
    timeTic++;
    if (timeTic > level) {
         P1_0  = 1;
    }
    if (timeTic > levelCount) {
        timeTic = 0;
        P1_0  = 0;
    }
}

unsigned char timeDevice = 0;
void _breathLed() {
    timeDevice++;
    if (timeDevice >= devideCount) {
        timeDevice = 0;
        _pwmLevelUp();
    }
    _pwm();
}



以下为Breath.h文件

#ifndef _BREATH_H_
#define _BREATH_H_
#endif


void _pwm(void);
void _breathLed(void);


以下为Main.c内容

引入头文件,定义所需变量

#include "Breath.h"

#define Sw1 P1_2
#define Led1 P1_0
#define Led2 P1_1

unsigned int keyTime=0, keyCnt=0, bFlag=0;
//keyTime长按时间,keyCnt按键次数,bFlag是否呼吸1呼吸0暂停

初始化函数,基本io最简化版

void Init()
{
  P1DIR = 0X1B;
  P1=0X00;
}

以下为按键功能,比较简单,不理解就自己断点跑一跑

void key()
{
  if(Sw1==0)
  {
    keyTime = 0;
    while(Sw1==0)
    {
      halMcuWaitMs(1);
      //按下时间大于300ms视为长按,
      if(++keyTime>300)
      {
        Led1 = 1;
        Led2 = 0;
      }
    }
    if(Sw1==1)
    {
      //长按后灯全部亮起,短按则计算按键次数
      if(keyTime>300)
        Led1 = Led2 = 1;
      else
        keyCnt+=1;
    }
  }
  //0.3s内没有第二次点击按钮则失效当前次数
  //短时间内连续触发即为连击
  if(keyCnt>1)
  {
     halMcuWaitMs(1);
    if(++keyTime>300)
    {
      if(bFlag==0)
        bFlag=1;
      else if(bFlag==1)
        bFlag=2;
      else if(bFlag==2)
        bFlag=1;
      keyCnt=0;
    }
  }
}

以下为呼吸灯控制代码

void BreathLed()
{
  //几连击就填几
  if(keyCnt==2)
  {
    Led2=0;
    bFlag=!bFlag;
    keyCnt=0;
  }
  if(bFlag==1)
    _breathLed();
  else if(bFlag==2)
    _pwm();
}

以下为main函数

void main(void)
{
  Init();
  while(1)
  {
    halMcuWaitMs(1);
    key();
    BreathLed();
  }
}

main.c源代码

/**
  ******************************************************************************
  * File Name          : main.c
  * Description        : Main program body
  * By                 :Azhuo
  ******************************************************************************
  */
#include <string.h>
#include <stdio.h>
#include "basic_rf.h"
#include "hal_defs.h"
#include "hal_cc8051.h"
#include "hal_int.h"
#include "hal_mcu.h"
#include "hal_board.h"
#include "hal_led.h"
#include "hal_rf.h"
#include "hal_uart.h" 
#include "Breath.h"

#define Sw1 P1_2
#define Led1 P1_0
#define Led2 P1_1

unsigned int keyTime=0, keyCnt=0, bFlag=0;
//keyTime长按时间,keyCnt按键次数,bFlag是否呼吸1呼吸0暂停
void Init()
{
  P1DIR = 0X1B;
  P1=0X00;
}
void key()
{
  if(Sw1==0)
  {
    keyTime = 0;
    while(Sw1==0)
    {
      halMcuWaitMs(1);
      //按下时间大于300ms视为长按,
      if(++keyTime>300)
      {
        Led1 = 1;
        Led2 = 0;
      }
    }
    if(Sw1==1)
    {
      //长按后灯全部亮起,短按则计算按键次数
      if(keyTime>300)
        Led1 = Led2 = 1;
      else
        keyCnt+=1;
    }
  }
  //0.3s内没有第二次点击按钮则失效当前次数
  //短时间内连续触发即为连击
  if(keyCnt>1)
  {
     halMcuWaitMs(1);
    if(++keyTime>300)
    {
      if(bFlag==0)
        bFlag=1;
      else if(bFlag==1)
        bFlag=2;
      else if(bFlag==2)
        bFlag=1;
      keyCnt=0;
    }
  }
}
void BreathLed()
{
  //几连击就填几
  if(keyCnt==2)
  {
    Led2=0;
    bFlag=!bFlag;
    keyCnt=0;
  }
  if(bFlag==1)
    _breathLed();
  else if(bFlag==2)
    _pwm();
}

/**
 * Main application entry point.
 */
void main(void)
{
  Init();
  while(1)
  {
    halMcuWaitMs(1);
    key();
    BreathLed();
  }
}

今天的训练就到这,下了鬼泣5所以比较急,代码是有些bug的,不过如果这点bug都解决不了就别比了,加油各位,奥利给。文章来源地址https://www.toymoban.com/news/detail-719263.html

到了这里,关于【23物联网国赛样题第二套】单片机,CC2530单片机呼吸灯与按键控制--单击双击长按、呼吸灯与亮度维持,物联网竞赛今年历年国赛样题真题代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第二套区块链系统部署与运维

    第二套区块链系统部署与运维题目 环境 : ubuntu20 fisco : 2.8.0 docker: 20.10.21 webase-deploy : 1.5.5 mysql: 8.0.34 使用 build_chain.sh 脚本文件进行搭建区块链 ,要求: 四节点,默认配置,单机,docker

    2024年02月08日
    浏览(110)
  • 2023国赛数学建模A题第二问解题思路 - 定日镜场的优化设计(详细过程,小白读完就会)

    2.1.1基础布局 在塔式太阳能热发电领域,由 Laurence等人提出的辐射网格布局是一种应用较广泛的排布方式。此布局方式是将定日镜沿等方位线交替放置在各恒定半径处,且随着径向距离的增加,镜场排布也呈现出由密到疏的趋势。为定量表示定日镜与吸热塔的位置关系,还引

    2024年02月09日
    浏览(50)
  • 区块链国赛第一套样题(关于运维)

    基于给定服务器环境以及软件(地址\\\"/root/tools\\\"),搭建一条4节点的区块链系统并验证,具体工作内容如下: 1. 采用默认配置搭建区块链网络; 2. 通过命令验证区块链节点进程运行状况; 3. 通过命令验证区块链连接状态和共识状态日志输出。 前置准备工作:下载依赖(op

    2024年03月23日
    浏览(47)
  • 区块链国赛第四套样题(关于运维)

    通过给定区块链项目需求,进行区块链系统部署,包括系统部署、控制台部署等。通过监控工具完成对网络、节点服务的监控。最终利用业务需求规范,完成系统日志、网络参数、节点服务等系统结构的维护。 部署区块链服务器,配置管理平台参数及访问端口; 部署项目节

    2024年04月22日
    浏览(33)
  • 2022数模国赛B题无人机第一题第一小问的简单编程

    2022年国赛B题是关于无人机定位的抽象模型,总体难度不大。接下来简单介绍一下第一题第一小问的程序实现,当时国赛仓促,写的比较简略,仅供参考。 无源定位 第一个是无源定位,无源定位可以理解为需要通过计算才能求解出具体位置,位置不能直接测出。具备隐

    2024年02月06日
    浏览(56)
  • 2023国赛数学建模A题第一问解题思路 - 定日镜场的优化设计

    A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统, 是我国实现“碳达峰”“碳中和”目标的一项重要 措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件,其底座由 纵向

    2024年02月09日
    浏览(38)
  • 【C++刷题】经典简单题第二辑

    回文排列 URL化 配对交换 递归乘法 阶乘尾数 二进制链表转整数 从链表中删去总和值为零的连续节点 括号的最大嵌套深度 整理字符串 奇偶树 将句子排序 最长和谐子序列

    2024年02月09日
    浏览(45)
  • 蓝桥杯刷题第二十五天

    题目描述 你有一张某海域 NxN 像素的照片,\\\".\\\"表示海洋、\\\"#\\\"表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. ....... 其中\\\"上下左右\\\"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。 由于全球变暖导致了海面上升,科学家预测未来几十年,岛

    2023年04月09日
    浏览(38)
  • 蓝桥杯刷题第二十三天

    题目描述 小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。 小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。 这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小

    2023年04月22日
    浏览(49)
  • 2023国赛数学建模A题第一问解题思路 - 定日镜场的优化设计(详细过程,小白读完就会)

    补充知识点: 定日镜是反射聚焦太阳辐射的单元,聚光子系统由成千上万面的定日镜组成,聚光子系统的投资成本约占了电站总投资成本的 50%[39]。由于太阳光线的发散性和太阳位置的变化,入射的太阳光线并不能完全被定日镜反射聚焦到吸热器上,系统存在的能量损失约为

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包