定时器之基于模模式的间隔定时

 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 
10 /*======================端口初始化函数========================*/
11 void Init_Port()
12 {
13   //初始化LED灯的I/O端口
14   P1SEL &= ~0x1b;   //P1_0、P1_1、P1_3和P1_4作为通用I/O端口
15   P1DIR |= 0x1b;    //P1_0、P1_1、P1_3和P1_4端口输出
16   //关闭所有的LED灯
17   P1 &= ~0x1b;   //0001 1011->1110 0100 关闭所有灯
18 }
19 
20 /*=====================定时器1初始化函数======================*/
21 void Init_Timer1()
22 {
23   T1CC0L = 0xd4;    //16MHz时钟128分频定时100ms   
24   T1CC0H = 0x30;    //设先填低8位,再填高8位    最大定时周期  定时0.1s
25   T1CCTL0 |= 0x04;  //开启通道0的输出比较模式   0000 0100 模模式,需要开启通道0的比较模式
26   T1IE = 1;         //使能定时器1中断
27   T1OVFIM = 1;      //使能定时器1溢出中断
28   EA = 1;           //使能总中断
29   T1CTL = 0x0e;     //分频系数是128,模模式   0000 1110 
30 }
31 
32 /*====================定时器1中断服务函数=====================*/
33 #pragma vector = T1_VECTOR
34 __interrupt void Timer1_Sevice()
35 {
36   T1STAT &= ~0x01;      //清除定时器1通道0中断标志  重要
37   count++;              //累加定时周期
38   if(count%5 == 0)      //定时0.5秒时间到
39   {
40     D3 = ~D3;
41   }
42   if(count%10 == 0)     //定时1秒时间到
43   {
44     D4 = ~D4;
45   }
46   if(count == 50)       //定时5秒时间到
47   {
48     D5 = ~D5;
49     count = 0;
50   }
51 }
52 
53 /*==========================主函数============================*/
54 void main()
55 {
56   Init_Port();        //端口初始化
57   Init_Timer1();       //初始化定时器1
58   while(1);
59 }

此程序的现象是:内部系统时钟16MHz的RC振荡器128分频作为定时器1的计数信号,在模模式中实现0.1秒定时。在定时中断服务函数中对全局变量count进行累加,实现0.5秒定时,LED3亮,而1秒后LED4亮,而5秒后LED5亮……如此往复。

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