/***********************************************************
msp430f169 测量频率
#include <msp430x16x.h>
#define uchar unsigned char
#define uint unsigned int
void delay(void);
void InitSys();
//void ClearLCD(void);
extern const unsigned char shuzi_table[];
#define LCD_DataIn P5DIR=0x00 //数据口方向设置为输入
#define LCD_DataOut P5DIR=0xff //数据口方向设置为输出
#define LCD2MCU_Data P5IN
#define MCU2LCD_Data P5OUT
#define LCD_CMDOut P4DIR|=0x0F //P3口的低三位设置为输出
#define LCD_RS_H P4OUT|=BIT0 //P3.0
#define LCD_RS_L P4OUT&=~BIT0 //P3.0
#define LCD_RW_H P4OUT|=BIT1 //P3.1
#define LCD_RW_L P4OUT&=~BIT1 //P3.1
#define LCD_EN_H P4OUT|=BIT2 //P3.2
#define LCD_EN_L P4OUT&=~BIT2 //P3.2
#define LCD_PSB_P P4OUT|=BIT3 //3.3
#define LCD_PSB_S P4OUT&=~BIT3 //3.3
void Delay_1ms(void);
void Delay(unsigned int n);
void Write_Cmd(unsigned char cod);
void Write_Data(unsigned char dat);
void Ini_Lcd(void);
void Disp_HZ(unsigned char addr,const unsigned char * pt,unsigned char num);
void Disp_ND(unsigned char addr,unsigned int thickness);
void Draw_TX(unsigned char Yaddr,unsigned char Xaddr,const unsigned char * dp) ;
void Draw_PM(const unsigned char *ptr);
//void ADC12(void);
void Clock_Init(void);
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 main( void )
{
WDTCTL = WDTPW + WDTHOLD; //==关狗==
InitSys(); //==初始化时钟,SMCLK,MCLK均为8M==
P1DIR&=~BIT2;
P1SEL = BIT2; //==设置P1.2端口为功能模块使用,即:做捕获源==
TACTL = TASSEL_2+ID_3+TACLR+TAIE+MC_1;//==定时器A时钟信号选择SMCLK,8分频,同时设置定时器A计数模式为连续增计模式==
CCTL1 = CM_1+SCS+CAP+CCIE; //==输入上升沿捕获,CCI0A为捕获信号源==
_EINT(); //==开全局中断允许==
//_BIS_SR(LPM0_bits+GIE);
Ini_Lcd(); //==初始化液晶==
//Clear_GDRAM(); //==清屏==
Disp_HZ(0x80,zhouqi,6);
Disp_HZ(0x88,pinlv,6);
while(1)
{
process();
Write_Cmd(0x90);//==写地址==
Write_Data(pd[6]+0x30);
Write_Data(pd[5]+0x30);
Write_Data(pd[4]+0x30);
Write_Data(pd[3]+0x30);
Write_Data(pd[2]+0x30);
Write_Data(pd[1]+0x30);
Write_Data(pd[0]+0x30);
Write_Cmd(0x98);//==写地址==
Write_Data(fy[6]+0x30);
Write_Data(fy[5]+0x30);
Write_Data(fy[4]+0x30);
Write_Data(fy[3]+0x30);
Write_Data(fy[2]+0x30);
Write_Data(fy[1]+0x30);
Write_Data(fy[0]+0x30);
delay();
}
}
void InitSys()
{
unsigned int i;
//--- 使用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==
//ADC12CTL0 |=ENC+ADC12SC;//使能转换;开始转换
}
void process(void)
{
while(end<start);
//while(end<start)的话就让其一直等待下去,直到end>start
//width =10000/(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_A1(void)
{
uint temp;
switch(TAIV) //==向量查询==
{ case 2: //==捕获中断==
if(CCTL1&CM0) //==捕获到上升沿==
{
CCTL1=(CCTL1&(~CM0))|CM1; //==更变设置为下降沿触发==
temp=TAR; //==记录初始时间==
period=temp-start;
start=temp;
}
else if (CCTL1&CM1) //==捕获到下降沿==
{
CCTL1=(CCTL1&(~CM1))|CM0; //==更变设置为上升沿触发==
end=TAR; //==用start,end,overflow计算脉冲宽度==
width =end-start;
}
break;
default:break;
}
}
/********************************************
函数名称:Delay_1ms
功 能:延时约1ms的时间
参 数:无
返回值 :无
********************************************/
void Delay_1ms(void)
{
uchar i;
for(i = 150;i > 0;i--) _NOP();
}
/*******************************************
函数名称:Delay_Nms
功 能:延时N个1ms的时间
参 数:n--延时长度
返回值 :无
********************************************/
void Delay_Nms(uint n)
{
uint i;
for(i = n;i > 0;i--) Delay_1ms();
}
/*******************************************
函数名称:Write_Cmd
功 能:向液晶中写控制命令
参 数:cmd--控制命令
返回值 :无
********************************************/
void Write_Cmd(uchar cmd)
{
uchar lcdtemp = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
LCD_DataOut;
LCD_RW_L;
MCU2LCD_Data = cmd;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:Write_Data
功 能:向液晶中写显示数据
参 数:dat--显示数据
返回值 :无
********************************************/
void Write_Data(uchar dat)
{
uchar lcdtemp = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
LCD_DataOut;
LCD_RS_H;
LCD_RW_L;
MCU2LCD_Data = dat;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:Ini_Lcd
功 能:初始化液晶模块
参 数:无
返回值 :无
********************************************/
void Ini_Lcd(void)
{
LCD_CMDOut; //液晶控制端口设置为输出
Delay_Nms(500);
Write_Cmd(0x30); //基本指令集
Delay_1ms();
Write_Cmd(0x02); // 地址归位
Delay_1ms();
Write_Cmd(0x0c); //整体显示打开,游标关闭
Delay_1ms();
Write_Cmd(0x01); //清除显示
Delay_1ms();
Write_Cmd(0x06); //游标右移
Delay_1ms();
Write_Cmd(0x80); //设定显示的起始地址
}
/*******************************************
函数名称:Disp_HZ
功 能:控制液晶显示汉字
参 数:addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值 :无
********************************************/
void Disp_HZ(uchar addr,const uchar * pt,uchar num)
{
uchar i;
Write_Cmd(addr);
for(i = 0;i < (num*2);i++)
Write_Data(*(pt++));
}
void Clock_Init(void)
{
uchar i;
BCSCTL1&=~XT2OFF; //打开XT振荡器
BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ
do{
IFG1&=~OFIFG; //清除震荡标志
for(i=0;i<100;i++)
_NOP(); //延时等待
}
while((IFG1&OFIFG)!=0); //如果标志为1,则继续循环等待
IFG1&=~OFIFG;
}
void delay(void)
{
unsigned int i,j;
for(i=0;i<100;i--)
{
for(j=0;j<100;j--);
}
}
|