定时器/计数器是单片机的几大重要资源之一,而cc2530的定时器/计数器与普通的51系列单片机相比,工作模式增加了。通过学习手册可知cc2530的定时器/计数器有三种工作模式,风别为自由模式、模模式和正计数/倒计数模式。无论哪种模式,均可以采用查询和中断两种方式使用定时器的。本专题讲述cc2530定时器/计数器处于模模式时的编程方法。
首先是用查询的方式来使用Timer1定时器。使用Timer定时器时,首先要对该定时器进行初始化,代码如下:
void INIT_Timer1()
{
T1CTL = 0x00; //1分频、停止运行
T1CTL = 0x0e; //128分频 模模式
T1CCTL0 |= 0x04; //设定timer1通道0输出比较模式
T1CC0L = 0x24;
T1CC0H = 0xF4;
IRCON &= ~0x02;
}
很容明显可以看出在使用Timer1时,我们要用到T1CTL、T1CCTL0、T1CC0L、T1CC0H及IRCON这五个寄存器。T1CTL是控制寄存器,用于①设置分频器划分值如f/8或f/128等,这里的f是标记频率。②定时器三种模式的选择。T1CC0L、T1CC0H这两个寄存器存放的是计数的终值(计数记到该值,设置中断标志位,或产生中断)IRCON中则为中断标志位。之所以写出代码
IRCON &= ~0x02;
是为了先清除Timer1对应的中断标志位。
T1CCTL0 |= 0x04; //设定timer1通道0输出比较模式
那么该行代码中的T1CCTL0做该赋值操作又有何意义?
模模式需要开启通道0的输出比较模式,否则计数器只有到了0XFF时才会产生溢出中断(相应的产生溢出标志),也就是如果没有设置通道0的输出比较模式,计数器的值到达T1CC0后,不会产生溢出中断(相应的溢出标志不会置1),这点需要特别注意。下面贴出整个该程序的代码:
#include #define LED1 P1_0 //定义LED1为P1.0 int count = 0; void INIT_LED(void) { P1SEL &= ~0x01; //设P1.0为普通I/O功能 P1DIR |= 0x01; //设P1.0为输出方向 LED1 = 0; //将LED1点亮 } void INIT_Timer1() { T1CTL = 0x00; //1分频、停止运行 T1CTL = 0x0e; //128分频 模模式 T1CCTL0 |= 0x04; //设定timer1通道0输出比较模式 T1CC0L = 0x24; T1CC0H = 0xF4; IRCON &= ~0x02; } void main( void ) { INIT_LED(); INIT_Timer1(); LED1 = 1 ; //int count = 0; while(1) { if(IRCON &= 0x02) { count++; if(count==1) { IRCON &= ~0x02 ; count = 0; LED1 = !LED1; } } } } 之所以称该程序的编写方式为查询方式就在于如下代码, if(IRCON &= 0x02) { count++; if(count==1) { IRCON &= ~0x02 ; count = 0; LED1 = !LED1; } } 在主程序中不断对中断标志位进行查询,若中断标致位被置位时需要软件清0。
上一篇:cc2530裸机编程系列笔记4--GPIO口的使用
下一篇:51单片机系列知识6--中断系统(1)
推荐阅读最新更新时间:2024-11-11 18:11
设计资源 培训 开发板 精华推荐
- 晶体管测试仪(带外壳版本)
- 用于荧光调光的 1 灯荧光灯驱动器
- LTC3335EUDC 锂亚硫酰氯一次电池供电应用的典型应用电路
- AR0238CSSC12SHRAH3-GEVB:2 MP Sunex DSL945D 1/3" iBGA CIS HB 评估板
- LTC3105EDD 演示板、250mV 启动、升压型 DC/DC 转换器,具有最大电源点控制
- AD8034ART-R2高速单位增益峰值检测器的典型应用电路
- 用于具有温度补偿阈值的单电源比较器的 TL431 可编程精密基准的典型应用
- 用于仪表的 ±18V 差动放大器
- LT8641IUDC 超低 EMI 5V、3.5A 降压转换器的典型应用电路
- LTC3564ES5 演示板、采用 ThinSOT 的 2.25MHz、1.2A 同步降压稳压器