首页 > 其他 > 详细

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

时间:2019-12-07 18:38:45      阅读:279      评论:0      收藏:0      [点我收藏+]

说明:此源码转至欧老师所写的小蜜蜂笔记,本人对代码加了一些注解,同时做了一些小的修改。

任务要求

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

参考源码

 

#include <ioCC2530.h>  //引用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<240; j++)
    {
      asm("NOP"); //asm用来在c代码中嵌入汇编语言操作
      asm("NOP"); //汇编命令nop是空操作,消耗一个指令周期
      asm("NOP");
    
    }
  
  }

}

/*=======端口初始化函数initPort()============*/
void initPort(void)
{
  /*========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; //设置端口1所有的引为上拉
}

/*========定时器1初始化函数initTimer1()===========*/
void initTimer1(void)
{
  T1CTL = 0x0e; //T1定时器采取128分频,模模式
  T1CC0L = 0xd4; //采用16Mhz系统时钟定时为0.1秒,低字节
  T1CC0H = 0x30; //采用16Mhz系统时钟定时为0.1秒,高字节
  T1CCTL0 |= 0x04; //开启通道0的输出比较模式
  T1IE = 1;// 开启T1定时器中断
  EA = 1; //开启总中断
  
}

/*======定时器1的中断服务函数service_Timer1()======*/
#pragma vector = T1_VECTOR
__interrupt  void server_Timer1()
{
  T1STAT &= ~0x20; //清除定时器1的中断标志位
  if(k_num !=0 && SW1 !=0)
  {
    count_t++; //计算机按键生命周期
    /*====对这句话我个人理解为定时器每0.1秒产生一次中断。
    这时检查SW1按键状态和统计SW1键按下的次数,如果SW1为0,说明SW1
    按键正处于被按下的状态,这时不统计它的生命周期,如果生命周期达
    到了0.5秒,就开始判断,换句话说,就是松开SW1键0.5秒内没有再按下
    去的话,单片机就认为你不会再按下去了, 我要判断,你按了几次,
    然后根据SW1按下的次数按照题的要求去处理相应的操作。====== */
  }
  if(F_LED ==1)
  {
    count_s++;
     if(count_s >=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();
  }
}

 

 

 

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

原文:https://www.cnblogs.com/xrp1974/p/12002849.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!