新闻  |   论坛  |   博客  |   在线研讨会
Zigbee基础实验(3)—定时器T1的使用
luker | 2016-02-24 16:12:05    阅读:327   发布文章
通过本次实验将会掌握定时器T1的一些简单用法。

本次实验学习到的新寄存器:

T1CTL:定时器1的控制,D1D0控制运行模式,D3D2设置分频划分值
D7
D6
D5
D4
D3D2
D1D0
未用
未用
未用 未用 00:不分频
01:8分频
10:32分频
11:128分频
00:暂停运行
01:自由运行,反复从0x0000到0xffff计数
10:模计数,从0x000到T1CC0反复计数
11:正计数/倒计数,从0x0000到T1CC0反复计数并且从T1CC0倒计数到0x0000

T1STAT:定时器1的状态寄存器,D4~D0为通道4~通道0的中断标志,D5为溢出标志位,当计数到最终技术值是自动置1。

D7
D6
D5
D4
D3
D2
D1
D0
未用
未用
溢出中断 通道4中断 通道3中断 通道2中断 通道1中断 通道0中断
   
T1CCTL0:D1D0为捕捉模式选择:00为不捕捉,01为上升沿捕获,10为下降沿捕获,11为上升或下降沿都捕获。
D2位为捕获或比较的选择,0为捕获模式,1为比较模式。D5D4D3为比较模式的选择:000为发生比较式输出端置1,001为发生比较时输出端清0,010为比较时输出翻转,其他模式较少使用。
D7
D6
D5D4D3
D2
D1D0
未用
未用
比较模式
捕获/比较 捕捉模式

IRCON:中断标志4,;0为无中断请求。1为有中断请求。
D7
D6
D5
D4
D3
D2
D1
D0
睡眠定时器
必须为0
端口0
定时器4
定时器3
定时器2
定时器1
DMA完成
   
源代码:
#include
#define uint   unsigned  int
#define uchar  unsigned  char

#define LED1   P1_0            //定义LED1为P10口控制
#define LED2   P1_1            //定义LED2为P11口控制
#define LED3   P1_4            //定义LED3为P14口控制

uint counter=0;                //统计溢出次数
uint LEDFlag;                //标志是否要闪烁

void InitialT1test(void);               //初始化函数声明
void InitialT1test(void)
{
    //初始化LED控制端口P1
    P1DIR = 0x13;              //P10 P11 P14为输出
        P0DIR = 0x02;
    LED1 = 1;
    LED2 = 1;        
    LED3 = 1;
    //初始化计数器1
    T1CTL = 0x05;        //通道0,中断有效,8分频;自动重装模式(0x0000-0xffff)  
}

void main()
{
    InitialT1test();      //调用初始化函数
           while(1)                
    {
                if(IRCON==0x02)   //查询溢出中断标志,是否有中断并且为定时器1发出的中断
                 {
                 IRCON = 0;                //清溢出标志     
                 counter++;
                 
                if(counter==30)            //中断计数,约0.25s
                 {
                  counter =0;
                  LED2 =  LED1;
                  LED3 = !LED2;
                  LED1 = !LED1;    
                 LEDFlag = !LEDFlag;
                    }
                 }
                
        if(LEDFlag)
        {
            LED2 =  LED1;
            LED3 = !LED2;
            LED1 = !LED1;       // 每 1s LED灯闪烁一下 
            LEDFlag = !LEDFlag; // 闪烁标志变量置0
                     
                         
        }

            
          }
    }

实验总结:
定时器1的工作原理:
这次实验中定时器1工作在自由运行方式下,定时器1开始工作后从0x0000开始做加1计算,一直到0xffff。0xffff再加1则溢出,发生溢出中断。此时定时器将发出一个溢出中断请求并将IRCON的D1为置1。此后,定时器自动重新计数,再次从0x0000计数到0xffff。

实验补充与拓展:

这次实验使用的是查询方式,CPU需要不停做状态检测,浪费了CPU资源。结合上一个实验,我们可以将这次实验改为中断方式,当发生溢出中断时停止执行main函数,转为执行中断服务子程序。具体源代码如下:

#include
#define uint   unsigned  int
#define uchar  unsigned  char

#define LED1   P1_0            //定义LED1为P10口控制
#define LED2   P1_1            //定义LED2为P11口控制
#define LED3   P1_4            //定义LED3为P14口控制
#define LED4   P0_1
uint counter=0;                //统计溢出次数
uint LEDFlag;                //标志是否要闪烁

void InitialT1test(void);               //初始化函数声明

void InitialT1test(void)
{
    //初始化LED控制端口P1
    P1DIR = 0x13;              //P10 P11 P14为输出
        P0DIR = 0x02;
    LED1 = 1;
    LED2 = 1;        
    LED3 = 1;
    //初始化计数器1
    T1CTL = 0x05;    
    IEN1|=0X02;  //定时器1中断使能
     EA=1;   //开总中断
}

#pragma vector = T1_VECTOR      //中断服务子程序
 __interrupt void T1_ISR(void)            
 {       
          counter++;
          if(counter30){
          counter=0;  
          LED2 =  LED1;
          LED3 = !LED2;
          LED1 = !LED1;    
          }
          T1IF=0;       
 }

void main()
{
    InitialT1test();      //调用初始化函数
           while(1) {
             LED4=!LED4;
             for(int i=1;i              for(int i=1;i              for(int i=1;i              for(int i=1;i              for(int i=1;i           }
    }
参与讨论
登录后参与讨论
推荐文章
最近访客