小蜜蜂笔记
嵌入式开发与物联网应用教育践行者

【赛题详解】2020年物联网山东省赛任务三题1-亮灯系统(附完整源码)

任务要求

选用一个Zigbee节点盒(蓝色),新建IAR工程文件,实现板上LED灯的控制,考核选手Zigbee单片机基础知识的掌握,要求如下:
1、程序开始运行,LED1、LED2灯亮。
2、按键SW1单击,LED1灭、LED2亮。
3、按键SW1双击,LED1亮、LED2灭。
4、按键SW1三连击、LED1、LED2进入互相切换亮、灭状态,亮灭间隔为1秒,
5、能重复实现以上步骤。

参考源码

#include "ioCC2530.h"

#define LED1  P1_1
#define LED2  P1_0
#define SW1   P1_2

unsigned char count_t = 0;    //按键生命周期累计
unsigned char count_s = 0;    //1秒间隔定时累计
unsigned char K_Num = 0;      //按键连击状态记录
unsigned char F_LED = 0;      //LED灯状态切换标志
/*=======================简单的延时函数========================*/
void Delay(unsigned int t)
{
  while(t--);         //用于按键去抖动
}
/*======================端口初始化函数========================*/
void Init_Port()
{
  //LED灯的引脚初始化
  P1SEL &= ~0x03;     //P1_0、P1_1为通用I/O端口
  P1DIR |= 0x03;      //P1_0、P1_1为输出端口
  P1 |= 0x03;         //LED1和LED2点亮
  //按键SW1的引脚初始化
  P1SEL &= ~0x04;     //P1_2作为通用I/O端口
  P1DIR &= ~0x04;     //P1_2端口输入
  P1INP &= ~0x04;     //P1_2设置为上拉/下拉模式
  P2INP &= ~0x40;     //P1_2设置为上拉
}
/*=======================定时器1初始化========================*/
void Init_Timer1()
{
  T1CC0L = 0xd4;      
  T1CC0H = 0x30;        //16MHz时钟,128分频,定时0.1秒
  T1CCTL0 |= 0x04;      //开启通道0的输出比较模式
  T1IE = 1;             //开启定时器中断
  EA = 1;               //开启总中断
  T1CTL = 0x0e;         //分频系数是128,模模式
}
/*====================定时器1服务函数========================*/
#pragma vector = T1_VECTOR
__interrupt void Service_Timer1()
{
  T1STAT &= ~0x20;      //清除定时器1的溢出中断标志位
  if(K_Num != 0 && SW1 != 0)      
  {
    count_t++;        //计算按键的生命周期  
  }
  if(F_LED == 1)      //启动灯光相互切换
  {
    count_s++;
    if(count_s >= 10)
    {
      count_s = 0;
      LED1 = ~LED1;
      LED2 = ~LED2;
    }
  }
}
/*====================按键扫描处理函数========================*/
void Scan_Keys()
{
  if(SW1 == 0)
  {
    Delay(100);         //去抖动处理
    if(SW1 == 0)
    {
      while(SW1 == 0);  //等待按键松开
      count_t = 0;      //重新开始计算按键的生命周期
      K_Num++;          //改变按键状态
    }
  }
  
  if(count_t > 5)       //按键生命周期结束
  {    
    switch(K_Num)
    {
      case 1:           //按键单击
        F_LED = 0;
        LED1 = 0;
        LED2 = 1;
      break;
      case 2:           //按键双击
        F_LED = 0;
        LED1 = 1;
        LED2 = 0;
      break;
      case 3:           //按键三连击
        F_LED = 1;
        LED1 = 0;
        LED2 = 1;
      break;
    }
    K_Num = 0;     //每处理完一次按键,状态清零
    count_t = 0;   //计时清零
  }
}
/*==========================主函数============================*/
void main()
{
  Init_Port();      //初始化I/O端口
  Init_Timer1();    //初始化定时器1
  while(1)
  {
    Scan_Keys();    //按键扫描
  }
}
赞(25)
未经允许不得转载:小蜜蜂笔记 » 【赛题详解】2020年物联网山东省赛任务三题1-亮灯系统(附完整源码)

评论 3

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    源码呢?

    小井5年前 (2019-11-21)回复
  2. #2

    以下是我对这个源程序的理解改得:
    #include //引用cc2530头文件

    #define LED1 (P1_0) //宏定义LED1
    #define LED2 (P1_1) //宏定义LED2
    #define SW1 (P1_2) //宏定义SW1

    typedef unsigned char uchar; //自定义uchar数据类型
    typedef unsigned int uint ; //自定义uint数据类型

    uchar count_t = 0 ; //按键生命周期统计(超过0.5秒就判断)
    uchar k_num = 0; //按键连击统计
    uchar count_s =0 ;//累计1秒统计
    uchar F_LED = 0; //LED灯切换标志

    /*=======普通延时函数delay()约0.54毫秒默认为16MHZ RC振荡的话=======*/
    void delay(uint time)
    {
    uint i;
    uchar j;
    for (i=0; i<time; i++)
    {
    for (j=0; j=10)
    {
    count_s =0;
    LED1 = ~LED1;
    LED2 = ~LED2;

    }

    }

    }

    /*===========按键扫描处理函数scanKeys()============*/
    void scanKeys()
    {
    if (SW1 == 0 )
    {
    delay(100); //去抖处理
    if( SW1 ==1)
    {
    while(!SW1);//等待按键松开
    count_t = 0;
    k_num++;

    /*====注意:最好在0.5秒这内执行第二次按键操作,否则就要
    执行下面的判断操作了============*/
    }

    }
    if(count_t > 5) //按键生命周期结束(松开按键0.5秒到了,开始判断)

    {
    switch(k_num)
    {
    case 1: //按键单击
    F_LED = 0;
    LED1 = 0;
    LED2 = 1;
    break;
    case 2: //按键双击
    F_LED = 0;
    LED1 = 1;
    LED2 = 0;
    break;
    case 3: //招键三击
    F_LED =1;
    LED1 = 0;
    LED2 = 1;
    break;
    }
    k_num = 0 ;//每处理完一次按键,状态清零
    count_t =0;//计时清零
    }

    }

    /*========主函数========*/
    void main()
    {
    initPort();
    initTimer1();
    while(1)
    {
    scanKeys();
    }

    }

    奋斗终生4年前 (2019-12-07)回复
  3. #3

    程序写的非常好,看了两遍,并写了一遍,终于理解了,

    奋斗终生4年前 (2019-12-07)回复

小蜜蜂笔记 更专业 更方便 更高效

联系我们精品小店