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 }

【例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 }

原文地址:https://www.cnblogs.com/yuling520/p/12694256.html

时间: 2024-11-01 21:50:56

CC2530定时器的应用的相关文章

CC2530定时器使用

?? 定时器学习   文件夹 说明...1 协议栈函数使用...2 设置初始化定时器...2 回调函数(中断服务函数)3 启动定时器...3 停止定时器...4 寄存器操作...4 查询方式...4 中断方式(使用定时器3)7 说明 依据数据手冊可知CC2530总共同拥有4个定时器,可是定时器2被系统占用,可用的仅仅有三个,分别为定时器1/3/4 Timer在协议栈的代码位置为hal_timer.c,hal_timer.h,4个定时器的ID分别为 /* Timer ID definitions

CC2530定时器

一.定时/技术器的基本原理 定时/计数器,是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提出中断处理请求,从而实现定时或者计数功能的外设.         定时/计数器的最基本工作原理是进行计数.不管是定时器还是计数器,本质上都是计数器,可以进行加1(减1)计数,每出现一个计数信号,计数器就会自动加1(自动减1),当计数值从0变成最大值(或从最大值变成0)溢出时,定时/计数器就会向CPU提出中断请求. 二.CC2530的定时/计数器 根据数据手册可知 CC253

TI CC2530基础实验(定时器3中断方式——自由运行模式)

本实验实现通过CC2530的定时器3(8位)查询方式控制LED1以1S的周期性闪烁,此实验使用有关定时器3的2个寄存器T3CTL(定时器3控制寄存器),IEN1(中断使能1寄存器). 有关CC2530的GPIO基本知识.普通GPIO操作有关寄存器的介绍.IAR Embedded Workbench IDE软件使用:TI CC2530基础实验(普通GPIO操作--点亮led灯) 原理图: 寄存器分析: 程序: #include <ioCC2530.h> /********************

TI CC2530基础实验(定时器1查询方式——自由运行模式)

本实验实现通过CC2530的定时器1(16位)查询方式控制LED1以1S的周期性闪烁,此实验使用的三个寄存器T1CTL(定时器1控制寄存器),T1STAT(定时器1状态寄存器),IRCON. 有关CC2530的GPIO基本知识.普通GPIO操作有关寄存器的介绍.IAR Embedded Workbench IDE软件使用:TI CC2530基础实验(普通GPIO操作--点亮led灯) 电路原理图: 寄存器分析: 1.定时器1控制寄存器 定时器1的T1CTL寄存器下的模式分析: [自由运行模式]:

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

[CC2530强化实训03]定时器间隔定时实现按键N连击 [题目要求]      2018年全国职业院校技能大赛"物联网技术应用"国赛(高职组)中关于感知层开发的难度陡然增大,三个题目均在Zigbee协议栈下完成.其中第一个题目"仓库温湿度智能控制系统"考查了按键单击.双击和三连击.为了让大家更好的掌握按键的复杂处理思路,在这里通过一个具体的实训案例,讲述通过间隔定时实现按键N连击的基本思路.      在新大陆国赛设备的黑色Zigbee模块上,或者小蜜蜂制作的XM

cc2530 T3定时器控制引脚P1_1的亮灭

/**************************************************************************** * 文 件 名: main.c * 作 者: Andy * 修 订: 2013-01-08 * 版 本: 1.0 * 描 述: 操作IO口控制3盏LED灯的全亮和全灭.闪烁.流水灯 ****************************************************************************/ #in

[ZigBee] 12、ZigBee之看门狗定时器——饿了就咬人的GOOD DOG

引言:硬件中的看门狗,不是门卫的意思,而是一只很凶的狗!如果你不按时喂它,它就会让系统重启!这反而是我们想要的功能~ 1.看门狗概述 看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗开始倒计数.如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始倒计数.如果看门狗减到0就认为程序没有正常工作,强制整个系统复位.因此可以用看门狗防止程序在跑飞的时候回不到正常模式. 看门狗可用于受到电气噪音.

[ZigBee] 11、ZigBee之睡眠定时器二

1.前言 上一节讲了Zigbee的睡眠定时器利用外部按键使系统从休眠态唤醒到工作态,其核心在于: 61 void SysPowerMode(uchar mode) 62 { 63 if(mode > 0 && mode < 4) 64 { 65 SLEEPCMD |= mode; //设置系统睡眠模式 66 PCON = 0x01; //进入睡眠模式 ,通过中断唤醒 67 } 68 else 69 PCON = 0x00; //主动/空闲模 通过中断唤醒系统 70 } 其中参数

【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-终端源码

[CC2530入门教程-增强版]基础技能综合实训案例(基础版)-终端源码 广东职业技术学院 欧浩源 一.关于硬件电路 关于这个综合实训案例,具体需求详见<[CC2530入门教程-增强版]基础技能综合实训案例(基础版)-题目需求>. 我自己实在"全国职业院校技能大赛--物联网技术应用赛项"的Zigbee模块上实现的.该模块的电路应该和TI公司官方评估板的推荐电路差不多,我想现在市面上很多开发板也是参考这样的电路设计,只要您使用的开发板上有LED灯.按键输入.串口输出和一路A/