您的位置 首页 基础

msp430单片机丈量频率

/*******************************************************Author:MadebyXuraDate:2008.8.28程序描述:利用Timer_

/*******************************************************

Author: Made by Xura
Date: 2008.8.28
程序描绘:运用Timer_A捕获脉冲宽度
运用MSP430单片机定时器A和捕获/比较功能模块结合运用,完成脉冲宽度的丈量
程序用到了定时器A的CCI1A端口(MSP430F14X的P1.2引脚)作捕获外部输入
的脉冲电平跳变,start,end,两个个变量来核算脉冲宽度
*******************************************************/
#include “msp430x14x.h”
#include “lcd12864.h”
uint start,end;
uint width; //==用于寄存脉宽==
uint period; //==用于寄存周期==
uint frequency; //==用于寄存频率==
uint fy[7]; //==用于寄存频率显现数据==
uint pd[7]; //==用于寄存周期显现数据==
uint wh[6]; //==用于寄存脉宽显现数据==
const unsigned char zhouqi[]={“周期为:(us) “};
const unsigned char us[]={“us “};
const unsigned char pinlv[]={“频率为:(Hz) “};
const unsigned char hz[]={“HZ “};
void process(void); //==函数声明==
void delay(); //==延时函数==
voidInitSys(); //==初始化时钟==
/******************************************************************
主函数
******************************************************************/
int main( void )
{
WDTCTL = WDTPW + WDTHOLD; //==关狗==

InitSys(); //==初始化时钟,SMCLK,MCLK均为8M==

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(); //==开大局中止答应==

Ini_Lcd(); //==初始化液晶==
Clear_GDRAM(); //==清屏==
Disp_HZ(0x80,zhouqi,8);
Disp_HZ(0x88,pinlv,8);

while(1)
{
process();

Write_Cmd(0x90);//==写地址==
Write_Data(0x30+pd[6]);
Write_Data(0x30+pd[5]);
Write_Data(0x30+pd[4]);
Write_Data(0x30+pd[3]);
Write_Data(0x30+pd[2]);
Write_Data(0x30+pd[1]);
Write_Data(0x30+pd[0]);

Write_Cmd(0x98);//==写地址==
Write_Data(0x30+fy[6]);
Write_Data(0x30+fy[5]);
Write_Data(0x30+fy[4]);
Write_Data(0x30+fy[3]);
Write_Data(0x30+fy[2]);
Write_Data(0x30+fy[1]);
Write_Data(0x30+fy[0]);

delay();
}

}

/*******************************************************
初始化时钟
*******************************************************/
voidInitSys()
{
unsignedinti;
//— 运用XT2振荡器 —
BCSCTL1&=~XT2OFF;//==翻开XT2振荡器==
do
{
IFG1&=~OFIFG;//==铲除振荡器失效标志==
for(i=0xFF;i>0;i–);//==延时,等候XT2起振==
}
while((IFG1&OFIFG)!=0);//==判别XT2是否起振==
BCSCTL2=SELM_2+SELS;//==挑选MCLK、SMCLK为XT2,8M==
}
/*******************************************************
延时函数
*******************************************************/
voiddelay()
{
unsignedinti;
unsignedintj=10;
for(i=10;i>0;i–)
{
while(j–);
}
}
/********************************************************************
数据处理
********************************************************************/
void process(void)
{
while(end//while(endstart
width = end-start; //==实践脉冲宽度的核算==
period = 2* width;
frequency=1000000/period;

pd[6]=period/1000000;
pd[5]=(period-1000000*pd[6])/100000;
pd[4]=(period-1000000*pd[6]-100000*pd[5])/10000;
pd[3]=(period-1000000*pd[6]-100000*pd[5]-10000*pd[4])/1000;
pd[2]=(period-1000000*pd[6]-100000*pd[5]-10000*pd[4]-1000*pd[3])/100;
pd[1]=(period-1000000*pd[6]-100000*pd[5]-10000*pd[4]-1000*pd[3]-100*pd[2])/10;
pd[0]=period%10;

fy[6]=frequency/1000000;
fy[5]=(frequency-1000000*fy[6])/100000;
fy[4]=(frequency-1000000*fy[6]-100000*fy[5])/10000;
fy[3]=(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4])/1000;
fy[2]=(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4]-1000*fy[3])/100;
fy[1]=(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4]-1000*fy[3]-100*fy[2])/10;
fy[0]=frequency%10;
}
/*******************************************************************
中止处理函数
*******************************************************************/
#pragma vector=TIMERA1_VECTOR //==定时器A中止处理==
__interrupt void timer_a(void)
{
switch(TAIV) //==向量查询==
{ case 2: //==捕获中止==
if(CCTL1&CM0) //==捕获到上升沿==
{
CCTL1=(CCTL1&(~CM0))|CM1; //==更变设置为下降沿触发==

start=TAR; //==记载初始时刻==
}

else if (CCTL1&CM1) //==捕获到下降沿==
{
CCTL1=(CCTL1&(~CM1))|CM0; //==更变设置为上升沿触发==
end=TAR; //==用start,end,overflow核算脉冲宽度==

}
break;

default:
break;
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/274312.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部