/***********************************************************
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--);
}
}
|