zoukankan      html  css  js  c++  java
  • CC2530定时器的应用

    【例1】利用定时器计数实现5中彩灯的变化形式,基于模模式的。两个标志位,一个是定时器计数,一个是彩灯的状态。

      1 #include "ioCC2530.h"
      2 
      3 #define D3  P1_0
      4 #define D4  P1_1
      5 #define D5  P1_3
      6 #define D6  P1_4
      7 
      8 unsigned char count = 0;      //长定时累计变量
      9 unsigned char led_stat = 0;   //彩灯状态标志
     10 
     11 /*=======================简单的延时函数========================*/
     12 void Delay(unsigned int t)
     13 {
     14   while(t--);
     15 }
     16 
     17 /*======================端口初始化函数========================*/
     18 void Init_Port()
     19 {
     20   P1SEL &= ~0x1b;    //P1_0、P1_1、P1_3和P1_4作为通用I/O端口
     21   P1DIR |= 0x1b;      //P1_0、P1_1、P1_3和P1_4端口输出
     22   
     23   D3 = 0;          
     24   D4 = 0;          
     25   D5 = 0;           
     26   D6 = 0;  //P1 &= ~0x1b   0001 1011->1110 0100 或者P1 &= 0xe4
     27 }
     28 
     29 /*=====================定时器1初始化函数======================*/
     30 void Init_Timer1()
     31 {
     32   T1CC0L = 0xd4;    //16MHz时钟128分频定时100ms
     33   T1CC0H = 0x30;    //设先填低8位,再填高8位
     34   T1CCTL0 |= 0x04;  //开启通道0的输出比较模式
     35   T1IE = 1;         //使能定时器1中断
     36   T1OVFIM = 1;      //使能定时器1溢出中断
     37   EA = 1;           //使能总中断
     38   T1CTL = 0x0e;     //分频系数是128,模模式
     39 }
     40 
     41 /*====================定时器1中断服务函数=====================*/
     42 #pragma vector = T1_VECTOR
     43 __interrupt void Timer1_Sevice()
     44 {
     45   T1STAT &= ~0x01;      //清除定时器1通道0中断标志
     46   count++;              //累加定时周期  定时器计数
     47   
     48   if(count == 50)       //定时5秒时间到
     49   {
     50     count = 0;
     51     led_stat++;
     52     if(led_stat == 5)    //设置了5种(0-4)彩灯变化方式
     53     {
     54       led_stat = 0;
     55     }
     56   }
     57 }
     58 
     59 /*=====================彩灯变换控制函数=======================*/
     60 void LED_Control()
     61 {
     62   switch(led_stat)
     63   {
     64     case 0:             //彩灯花式1   LED3闪烁
     65       D3 = ~D3;
     66       Delay(60000);
     67     break;
     68     case 1:             //彩灯花式2  1010—>0101
     69       D3 = 1;
     70       D4 = 0;
     71       D5 = 1;
     72       D6 = 0;
     73       Delay(60000);
     74       D3 = 0;
     75       D4 = 1;
     76       D5 = 0;
     77       D6 = 1;
     78       Delay(60000);
     79     break;
     80     case 2:             //彩灯花式3   依次点亮依次熄灭
     81       D3 = 1;
     82       Delay(60000);
     83       D4 = 1;
     84       Delay(60000);
     85       D5 = 1;
     86       Delay(60000);
     87       D6 = 1;
     88       Delay(60000);
     89       D3 = 0;
     90       Delay(60000);
     91       D4 = 0;
     92       Delay(60000);
     93       D5 = 0;
     94       Delay(60000);
     95       D6 = 0;
     96       Delay(60000);
     97     break;
     98     case 3:               //彩灯花式4 LED6闪烁
     99       D6 = ~D6;
    100       Delay(60000);
    101     break;
    102     case 4:               //彩灯花式5 依次点亮反向熄灭
    103       D3 = 1;
    104       Delay(60000);
    105       D4 = 1;
    106       Delay(60000);
    107       D5 = 1;
    108       Delay(60000);
    109       D6 = 1;
    110       Delay(60000);
    111       D6 = 0;
    112       Delay(60000);
    113       D5 = 0;
    114       Delay(60000);
    115       D4 = 0;
    116       Delay(60000);
    117       D3 = 0;
    118       Delay(60000);
    119     break;
    120   }
    121 }
    122 
    123 /*==========================主函数============================*/
    124 void main()
    125 {
    126   Init_Port();        //端口初始化
    127   Init_Timer1();       //初始化定时器1
    128   while(1)
    129   {
    130     LED_Control();
    131   }
    132 }
    View Code

    【例2】利用定时器实现按键的长按与短按,分别显示不同的效果。同样需要两个标志位。一个是按键按下的标志,一个是记录按下的时间的变量。

     1 #include "ioCC2530.h"
     2 
     3 #define D3  P1_0
     4 #define D4  P1_1
     5 #define D5  P1_3
     6 #define D6  P1_4
     7 #define SW1 P1_2
     8 
     9 unsigned char count_t = 0;    //长定时累计变量
    10 unsigned char K_Press = 0;    //按键按下标志
    11 /*=======================简单的延时函数========================*/
    12 void Delay(unsigned int t)
    13 {
    14   while(t--);
    15 }
    16 /*======================端口初始化函数========================*/
    17 void Init_Port()
    18 {
    19   //初始化LED灯的I/O端口
    20   P1SEL &= ~0x1b;   //P1_0、P1_1、P1_3和P1_4作为通用I/O端口
    21   P1DIR |= 0x1b;    //P1_0、P1_1、P1_3和P1_4端口输出
    22   //关闭所有的LED灯
    23   P1 &= ~0x1b;
    24   //初始化按键
    25   P1SEL &= ~0x04;     //P1_2作为通用I/O端口
    26   P1DIR &= ~0x04;     //P1_2端口输入
    27   P1INP &= ~0x04;     //P1_2设置为上拉/下拉模式
    28   P2INP &= ~0x40;     //P1_2设置为上拉
    29 }
    30 
    31 /*=====================定时器1初始化函数======================*/
    32 void Init_Timer1()
    33 {
    34   T1CC0L = 0xd4;    //16MHz时钟128分频定时100ms
    35   T1CC0H = 0x30;    //设先填低8位,再填高8位
    36   T1CCTL0 |= 0x04;  //开启通道0的输出比较模式
    37   T1IE = 1;         //使能定时器1中断
    38   T1OVFIM = 1;      //使能定时器1溢出中断
    39   EA = 1;           //使能总中断
    40   T1CTL = 0x0e;     //分频系数是128,模模式
    41 }
    42 
    43 /*====================定时器1中断服务函数=====================*/
    44 #pragma vector = T1_VECTOR
    45 __interrupt void Timer1_Sevice()
    46 {
    47   T1STAT &= ~0x01;      //清除定时器1通道0中断标志
    48   if(K_Press != 0)      //按键按下
    49   {
    50     count_t++;          //计算按下按下的时间值
    51   }
    52 }
    53 
    54 /*====================按键扫描处理函数========================*/
    55 
    56 void Scan_Keys()
    57 
    58 {
    59   if(SW1 == 0)
    60   {
    61     Delay(100);         //去抖动处理
    62     if(SW1 == 0)
    63     {
    64       K_Press = 1;      //标志按键正在按下
    65       while(SW1 == 0);  //等待按键松开
    66       K_Press = 0;      //标志按键已经松开
    67       
    68       if(count_t > 10)  //按键长按
    69       {
    70         D6 = ~D6;
    71       }
    72       else              //按键短按
    73       {
    74         D4 = ~D4;
    75       }
    76       count_t = 0;      //按键计数值清零
    77     }
    78   }
    79 }
    80 
    81 /*==========================主函数============================*/
    82 void main()
    83 {
    84   Init_Port();          //端口初始化
    85   Init_Timer1();        //初始化定时器1
    86   while(1)
    87   {
    88     Scan_Keys();        //扫描按键
    89   }
    90 }
    View Code
  • 相关阅读:
    HDU 3081 Marriage Match II
    HDU 4292 Food
    HDU 4322 Candy
    HDU 4183 Pahom on Water
    POJ 1966 Cable TV Network
    HDU 3605 Escape
    HDU 3338 Kakuro Extension
    HDU 3572 Task Schedule
    HDU 3998 Sequence
    Burning Midnight Oil
  • 原文地址:https://www.cnblogs.com/yuling520/p/12694256.html
Copyright © 2011-2022 走看看