新闻| 论坛| 博客| 在线研讨会
Zigbee基础实验(3)—定时器T1的使用
luker| 2016-02-24 16:12:05 阅读:5511 发布文章

通过本次实验将会掌握定时器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 }
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客