/***********************************
捕获方波信号,算出频率,占空比
**********************************/
#include <msp430x14x.h>
#include "1602.h"
#include "1602.c"
#define uint unsigned int
#define uchar unsigned char
uchar shuzi[] = {"0123456789.k"};
//uchar tishi[] = {"FZHzk"};
uint start=0;
uint end=0;
uint tem=0;
uint temp=0,overflow;
void chuli(uint a,uint b);
void Init_CLK(void);
/************************主函数****************************/
void main(void)
{
uint c,d;
WDTCTL = WDTPW+WDTHOLD; //关闭看门狗
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换
P5DIR|=BIT5;P5OUT&=~BIT5; //关闭数码管显示
P6DIR|=BIT6;P6OUT&=~BIT6; //半闭数码管显示
P6DIR|=BIT5;P6OUT&=~BIT5; //半闭数码管显示
LcdReset(); //复位1602液晶
// DispNChar(2,0,12,tishi); //显示提示信息
Disp1Char(0,0,'Z'); //显示电压单位
Disp1Char(1,0,':');
Disp1Char(0,1,'F');
Disp1Char(1,1,':');
Disp1Char(13,1,'H');
Disp1Char(14,1,'z');
Init_CLK();
P1SEL |= BIT2; //设置P1.2端口为功能模块使用
P1DIR &=~BIT2;
//TACTL |=TACLR;
TACTL = TASSEL_2+TAIE+MC_2+TACLR; //定时器A时钟信号选择SMCLK 8M,清计数寄存器,使能中断,同时设置定时器A计数模式为连续增计模式
TACCTL1 =CM_1+SCS+CAP+CCIE+CCIS_0; //输入上升沿捕获,同步,capture模式 CCI1A为捕获信号源(P1^2???),中断使能
//TACCTL0 &=~CCIFG; //清CCR2 的标志位
//中断允许
_EINT();
LPM0;
_NOP();
c=overflow*65535+temp-start;
d=overflow*65535+end-start;
chuli(c,d);
while(1);
}
void Init_CLK(void)
{
unsigned int index;
BCSCTL1&=~0X00; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (index = 0xFF; index > 0; index--)// 延时,等待XT2起振
{
;
}
} while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振
BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2 SMCLK 8分频
}
void chuli(uint a,uint b)
{
unsigned long ff,zg;
uchar j,i;
uchar ptr[5],ptr2[4];
ff=8000000/a;
zg=(b*1000)/a;
ptr2[0]=zg/100;
ptr2[1]=zg/10%10;
ptr2[3]=zg%10;
ptr2[2]=10;
if(ff>1000)
{
ptr[0]=ff/10000;
ptr[1]=ff/1000%10;
ptr[2]=10;
ptr[3]=ff/100%10;
ptr[4]=11;
}
else
{
ptr[0]=ff/100;
ptr[1]=ff/10%10;
ptr[2]=ff%10;
ptr[3]=10;
ptr[4]=0;
}
for(i = 0;i < 4;i++)
Disp1Char((3 + i),0,shuzi[ptr2[i]]);
for(j=0;j<5;j++)
Disp1Char((6 + j),1,shuzi[ptr[j]]);
}
/*******************************************************************
中断处理函数
*******************************************************************/
#pragma vector=TIMERA1_VECTOR //定时器A中断处理
__interrupt void timer_a(void)
{
switch(TAIV) //向量查询
{ case 2: //捕获中断
if(CCTL1&CM_1) //上升沿
{
tem++;
if(tem==1)
{
CCTL1=(CCTL1&(~CM_1))|CM_2; //更变设置为下降沿触发
start=TACCR1; //记录初始时间
overflow=0; //溢出计数变量复位
}
else if(tem==2)
{
temp=TACCR1;
TACTL &=~TAIE; //不使能中断
CCTL1 &=~CCIE;
P1SEL &=~BIT2;
_DINT();
LPM0_EXIT;
}
}
else if(CCTL1&CM_2) //下降沿
{
CCTL1=(CCTL1&(~CM_2))|CM_0; //更变设置为上升沿触发
end=TACCR1; //用start,end,overflow计算脉冲宽度
}
break;
case 10: //定时器溢出中断
overflow++;
break; //溢出计数加1
default:break;
}
}
谁能帮俺看看??? |