CC2530定时器的应用

Posted yuling520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于CC2530定时器的应用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用串口调试工具收发cc2530串口数据?

cc2530控制两个LED灯交替闪烁,闪烁周期为0.5左右.其中p1_2连LED1p1-3连2

cc2530芯片定时器1的输出比较模式怎么用?

CC2530强化实训03定时器间隔定时实现按键N连击

CC2530强化实训03定时器间隔定时实现按键长按与短按

CC2530定时器使用