MSP430输入频率(c语言)

/*******************************************************
Author: Made by Xura
Date: 2008.8.28
程序描述:利用Timer_A捕获脉冲宽度
利用MSP430单片机定时器A和捕获/比较功能模块结合使用,实现脉冲宽度的测量
程序用到了定时器A的CCI1A端口(MSP430F14X的P1.2引脚)作捕获外部输入
的脉冲电平跳变,start,end,两个个变量来计算脉冲宽度
*******************************************************/
#include "msp430x22x4.h"
#include"1602 LCD.h"
#define uchar unsigned char
#define uint unsigned int

uint start,end,a;
uint width; //==用于存放脉宽==
uint period; //==用于存放周期==
uint frequency; //==用于存放频率==
uint fy[7]; //==用于存放频率显示数据==
uint pd[7]; //==用于存放周期显示数据==
uint wh[6]; //==用于存放脉宽显示数据==
signed char i,j,temp,num;
unsigned char overflow;
const unsigned char zhouqi[]={"周期为:(us) "};
const unsigned char us[]={"us "};

const unsigned char pinlv[]={"频率为:(Hz) "};
const unsigned char hz[]={"HZ "};

void process(void); //==函数声明==
void delay1(); //==延时函数==
void InitSys(); //==初始化时钟==
void keyscan();

/******************************************************************
主函数
******************************************************************/

int main( void )
{
WDTCTL = WDTPW + WDTHOLD; //==关狗==
a=0; overflow=0;
InitSys(); //==初始化时钟,SMCLK,MCLK均为8M==
P1DIR |=0x01;
P1OUT=0;
P1DIR&=~BIT2;
P1SEL = BIT2; //==设置P1.2端口为功能模块使用,即:做捕获源==

TACTL = TASSEL_2+ID_3+TACLR+TAIE+MC1;//==定时器A时钟信号选择SMCLK,8分频,同时设置定时器A计数模式为连续增计模式==

CCTL1 = CM_1+SCS+CAP+CCIE; //==输入上升沿捕获,CCI0A为捕获信号源==

_EINT(); //==开全局中断允许==

inot();
lcd_init();
lcd_wcmd(0x04);
lcd_pos(0x0f);
lcd_wdat('a');






while(1)
{
keyscan();
if(num==1)
{
lcd_wcmd(0x04);
lcd_pos(0x00);
lcd_wdat('R');
}
else if(num==2)
{
lcd_wcmd(0x04);
lcd_pos(0x00);
lcd_wdat('C');
}
process();




}

}

/*******************************************************
初始化时钟
*******************************************************/
void InitSys()
{



uchar i;
BCSCTL1 =CALBC1_8MHZ; //设定DCO为1MHZ
DCOCTL =CALBC1_8MHZ;
BCSCTL1 |=DIVA_3; //ACLK输入八分频
do //等待晶振稳定
{
IFG1 &=~OFIFG;
for(i=5000;i>0;i--);
} while(OFIFG&IFG1);
}

/*******************************************************
延时函数
************************************************

*******/
void delay1()
{
unsigned int i;
unsigned int j=10;
for(i=10;i>0;i--)
{
while(j--);
}
}
/********************************************************************
数据处理
********************************************************************/
void process(void)
{
while(end//while(endstart
// if(end// else

width = end-start; //==实际脉冲宽度的计算==
if(width!=0)
{
P1OUT=0x01;
period = width;
frequency=1000000/period;
frequency=frequency+0.04*frequency;


lcd_wcmd(0x04);
lcd_pos(0x4f);

do
{
lcd_wdat(0x30+frequency%10);
frequency=frequency/10;
}
while(frequency!=0);
lcd_wdat(' ');
lcd_wdat(' ');
lcd_wdat(' ');

}
}

/*******************************************************************
中断处理函数
*******************************************************************/

#pragma vector=TIMERA1_VECTOR //==定时器A中断处理==

__interrupt void timer_a(void)
{
switch(TAIV) //==向量查询==

{ case 2: //==捕获中断==

if(CCTL1&CM0) //==捕获到上升沿==

{
/* CCTL1=(CCTL1&(~CM0))|CM1; //==更变设置为下降沿触发==*/
a++;
if(a==1) start=TAR; //==记录初始时间==
else if(a==2)
{
end=TAR; //==用start,end,overflow计算脉冲宽度==
a==0;
}

// width=abs(end-start);
/* if(width<100)width=32768-start+end;*/

}


break;

case 10: //定时器溢出中断
overflow++;
break; //溢出计数加1*/

default:
break;
}

}

//....................... 键盘扫描程序..............
void keyscan()
{
int j=0;//是否有按键//
//***************扫描键盘***************//
P2OUT=0xf7;
if((P4IN&0x0f)!=0x0f)
{
delay(5); //延迟20ms
if((P4IN&0x0f)!=0x0f)
{ j=1;
temp=P4IN&0x0f;
switch(temp)
{
case 0x0e: num=0;break;case 0x0d: num=14;break;
case 0x0b: num=13;break;case 0x07: num=15;break;
}
}
}
P2OUT=0xfb;
if((P4IN&0x0f)!=0x0f)
{
delay(5); //延迟20ms
if((P4IN&0x0f)!=0x0f)
{ j=1;
temp=P4IN&0x0f;
switch(temp)
{
case 0x0e: num=7;break;case 0x0d: num=8;break;
case 0x0b: num=9; break;case 0x07: num=16;break;
}
}
}

P2OUT=0xfd;
if((P4IN&0x0f)!=0x0f)
{
delay(5); //延迟20ms
if((P4IN&0x0f)!=0x0f)
{ j=1;
temp=P4IN&0x0f;
switch(temp)
{
case 0x0e: num=4;brea

k;case 0x0d: num=5;break;
case 0x0b: num=6;break;case 0x07: num=17;break;
}
}

}
P2OUT=0xfe;
if((P4IN&0x0f)!=0x0f)
{
delay(5); //延迟20ms
if((P4IN&0x0f)!=0x0f)
{ j=1;
temp=P4IN&0x0f;
switch(temp)
{
case 0x0e: num=1;break;case 0x0d: num=2;break;
case 0x0b: num=3;break;case 0x07: num=18;break;
}
}
}
}



相关主题
相关文档
最新文档