#ifndef TIMERA_H
#define TIMERA_H
void IO_CLR();//初始化IO
void InittimerA();//定时器A初始化
//void KeeptimerA(unsigned char flag);//控制捕获模式运行
unsigned int Getcyc();//返回周期值函数
void delay();//延时函数
#endif
#include <msp430x14x.h>
#include "timerA.h"
#define uchar unsigned char
#define uint unsigned int
uint cyc; //信号周期返回值
uint LastCCR0; //上一次CCR0的值
/*******************************************************************************
定时器A初始化
*******************************************************************************/
void InittimerA()
{
TACTL = TASSEL_1 + MC_2+TACLR + TAIE; //时钟ACLK,连续计数模式
CCTL0 = CCIS_1 + CM_2 + SCS + CAP + CCIE; //下降沿沿捕获,P2.2为信号输入端
P2SEL |= BIT2; //使用P2.2IO第二功能
}
/*******************************************************************************
定时器A中断函数
*******************************************************************************/
#pragma vector = TIMERA0_VECTOR
__interrupt void timerA0()
{
cyc = CCR0 - LastCCR0; //计算周期
LastCCR0 = CCR0; //保存CCR0的值
TACTL = TASSEL_1 + MC_2+TACLR + TAIE; //时钟ACLK,连续计数模式
CCTL0 = CCIS_1 + CM_2 + SCS + CAP + CCIE; //下降沿沿捕获,P2.2为信号输入端
}
/*******************************************************************************
返回周期值函数
*******************************************************************************/
unsigned int Getcyc()
{
return cyc;
}
/*******************************************************************************
初始化IO
*******************************************************************************/
void IO_CLR()
{
P1DIR = 0XFF; P1OUT = 0XFF;
P2DIR = 0X00; P2OUT = 0XFF;
P3DIR = 0XFF; P3OUT = 0XFF;
P4DIR = 0XFF; P4OUT = 0XFF;
P5DIR = 0XFF; P5OUT = 0XFF;
P6DIR = 0XFF; P6OUT = 0XFF;
}
/*******************************************************************************
延时函数
*******************************************************************************/
void delay()
{
uchar x,y;
for(x=110;x>0;x--)
for(y=100;y>0;y--);
}
#include <msp430x14x.h>
#include "TIMERAC.H"
#define uchar unsigned char
#define uint unsigned int
#define wei_h (P5OUT |= BIT5)
#define wei_l (P5OUT &= ~BIT5)
#define duan_l (P6OUT &= ~BIT6)
#define duan_h (P6OUT |= BIT6)
uchar f[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar a[8]={0};
uchar wei[]= {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
int temp;
void init_sys();
int main(void)
{
WDTCTL = WDTHOLD + WDTPW;
IO_CLR();
init_sys();
Getcyc();
temp = cyc*32768*2; //计算信号频率计算
a[0]= temp / 10000000;
a[1]= temp / 1000000%10;
a[2]= temp / 100000 % 10;
a[3]= temp / 10000 % 10;
a[4]= temp / 1000 % 10;
a[5]= temp / 100 % 10;
a[6]= temp / 10 % 10;
a[7]= temp % 10;
uchar i;
for(i=0;i<7;i++)
{
P4OUT = f[a];
duan_h;
duan_l;
P4OUT = 0xff;
P4OUT = wei;
wei_h;
wei_l;
delay();
}
while(1);
}
/*******************************************************************************
初始化系统时钟
*******************************************************************************/
void init_sys()
{
uchar i;
BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡器
do
{
IFG1 &= ~OFIFG; //清除晶振失败标志
for(i = 0; i < 0xff; i++); //等待8MHz晶体起振
}
while(IFG1 & OFIFG); //MCLK和SMCLK选择高频晶振
BCSCTL2 = SELM_2 + SELS; //主系统时钟和子系统时钟都选择8M
InittimerA(); //初始化定时器A
//KeeptimerA(100); //打开捕获模式
_EINT();
}
|