实验共用到P1,P1DIR,T1CTL,T1CCTL0,T1CC0H,T1CC0L,IEN0,IEN1,CLOKCON、SLEEP、PERCFG、U0CSR、U0GCR、U0BAUD、IEN0、U0BUF、ADCCON1、ADCCON3、ADCH和ADCL几个个寄存器。其中其中CLOKCON为时钟控制寄存器,SLEEP为睡眠模式控制寄存器,PERCFG为外设控制寄存器,U0CSR为串口0控制状态寄存器,U0CSR为串口0常规控制寄存器,U0BAUD为串口0波特率控制寄存器,U0BUF为串口0收发缓冲。IEN0和IEN1分别为中断使能寄存器0和1,T1CCTL0为T1通道0捕获/比较寄存器,T1CC0H为T1通道0捕获/比较值高字节寄存器,T1CC0L为T1通道0捕获/比较值低字节寄存器。
首先看一下初始化时钟程序
void InitClock(void)
{
CLKCON = 0X38; //TICKSPD = 101 定时器计数时钟源 CLKSPD = 000 和波特率有关
//两个时钟源选用晶振
while(!(SLEEP&0X40)); //等晶振稳定
}
这个程序段是用来设置系统时钟为晶振,同时将计数器始终设为0.25M。晶振稳定后退出函数(这个是实验书上的原话,我这个硬件白痴基本不是很懂),接着来看一下T1的初始化程序
void InitT1(void)
{
T1CCTL0 = 0X44; //T1 ch0 中断使能 比较模式
T1CC0H = 0x04;
T1CC0L = 0x00; //0x1fbd = 250D)
T1CTL |= 0X02; //start count 在这里没有分频。 使用比较模式 MODE = 10(B)
IEN1 |= 0X02;
IEN0 |= 0X80; //开T1中断
}
这个函数是打开T1中断,T1为比较模式。因为T1的计数时钟是0.25M,而T1CC0 = 0X038E = 1000,所以250次中断溢出1s。
现在看一下T1的ISR,这个程序段很简单的,大家应该能够自己看明白的。
#pragma vector = T1_VECTOR
__interrupt void T1_ISR(void)
{
IRCON &= ~0x02;//清中断标示
counter++;
if(counter == 250)
{
counter = 0;
timetemp = 1; //second ++
led1 = ~led1; // for test
}
}
主程序的部分其实我觉得没有什么研究的价值,这个实验说的是读取串口时钟,实际上个人认为只不过是T1计数器的一个实际的应用。用计数器的中断来模拟时钟,通过一个数组上各个元素的一系列的变化,生成一个所谓的时间(其实是一个数组),然后通过串口向PC机上发送。就是这么简单的了。我觉得这个实验我们还是好好的学习计时器的使用比较好,顺便熟悉一下串口的使用问题。
文章评论(0条评论)
登录后参与讨论