|
#include <msp430x14x.h>
#include "config.h"
uint k=0,flag=0,overflow = 0; //溢出次數
ulong fre,period_star=0,period=0,freH =0,temp=0;//頻率值,中間變量
float freL;
float multi=0;
uchar unitL[]="Hz",unitH[]="kHz",a[]; //存放字符
uchar *x={'\0'},*unit={'\0'};
int i,point,len=0;
//*************************************************************************
// 初始化IO口子程序
//*************************************************************************
void Port_Init()
{
LCD_DATASEL = 0X00; //(P4)LCD的D7-D0端口普通IO模式,輸出模式
LCD_DATADIR = 0XFF;
LCD_CONSEL = 0X00; //(P5)LCD的控制管腳普通IO模式
LCD_CONDIR |= BIT0 + BIT1 + BIT5 + BIT6 + BIT7; //(P5)LCD控制管腳0(PSB)、1(RST)、5(RS)、6(RW)、7(EC)置1輸出模式
PSB_SET; //LCD串并腳PSB置高,并口方式
RST_SET; //LCD復位腳RST置高,復位
LED8DIR = 0xff; //設置LED指示燈
LED8 = 0xFF;
}
//***********************************************************************
// 顯示屏命令寫入函數
//***********************************************************************
void LCD_write_com(unsigned char com)
{
RS_CLR; //LCD的RS和RW置0,在EN下降沿時,指令從端口寫入
RW_CLR;
EN_SET;
LCD_DATAPORT = com;
delay_ms(5);
EN_CLR;
}
//***********************************************************************
// 顯示屏數據寫入函數
//***********************************************************************
void LCD_write_data(unsigned char data)
{
RS_SET; //LCD的RS置1,RW置0,在EN下降沿時,數據從端口寫入
RW_CLR;
EN_SET;
LCD_DATAPORT = data;
delay_ms(5);
EN_CLR;
}
//***********************************************************************
// 顯示屏清空顯示
//***********************************************************************
void LCD_clear(void)
{
LCD_write_com(0x01);
delay_ms(5);
}
//***********************************************************************
//函數名稱:DisplayCgrom(uchar hz)顯示CGROM里的漢字
//***********************************************************************
void DisplayCgrom(uchar addr,uchar *hz)
{
LCD_write_com(addr); //寫入地址
delay_ms(5);
while(*hz != '\0')
{
LCD_write_data(*hz); //寫入數據
hz++;
delay_ms(1);
}
}
//****************************************************************
//函數名稱:Display()顯示測試結果
//****************************************************************
void Display(void)
{
DisplayCgrom(0x80,"當前信號頻率為:");
DisplayCgrom(0x88,x);
DisplayCgrom(0x8d,unit);
}
//***********************************************************************
// 顯示屏初始化函數
//***********************************************************************
void LCD_init(void)
{
LCD_write_com(FUN_MODE); //工作模式:8位基本指令集
delay_ms(5);
LCD_write_com(DISPLAY_ON); //顯示開,顯示游標,且游標位置反白
delay_ms(5);
LCD_clear(); //清屏
delay_ms(5);
}
//***********************************************************************
// TIMERA初始化,用比較寄存器0,設置為增計數,閾值60000
//***********************************************************************
void TIMERA0_Init(void)
{
P1SEL |= BIT0; //計時器時鐘為TACLK,在P1.0,將其設為第二功能,輸入模式
P1DIR &= ~BIT0;
TACTL = TACLR;
TACCR0 = 60000-1; //寄存器0比較模式,閾值60000
TACCTL0 |= CCIE;
TACTL = MC0; //TACLK做時鐘源,增計數模式
//P6OUT &= ~BIT0 ;
}
//***********************************************************************
// TIMERA初始化,用捕獲寄存器1,設置為連續計數
//***********************************************************************
void TIMERA1_Init(void)
{
P1SEL |= BIT2; //捕獲寄存器的捕獲管腳在P1.2
P1DIR &= ~BIT2;
TACTL = TACLR;
TACCTL1 |= CM0 + SCS + CAP + CCIE; //寄存器1捕獲模式,上升沿,CCIxA,同步
TACTL |=TASSEL0 + MC1 + TAIE;
}
//***********************************************************************
// 寄存器0中斷服務程序,計數器達到60000將溢出次數+1
//***********************************************************************
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void)
{
overflow=overflow+1;
}
//***********************************************************************
// 寄存器1中斷服務程序,達到捕獲條件
//***********************************************************************
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1 (void)
{
switch(TAIV)
{
case 2:
{
k++;
if(k==1) period_star = 60000*overflow + TACCR1;
else if (k==2)
{
period = 60000*overflow + TACCR1-period_star;
freL=multi*32768/period;
temp=(ulong)freL; //計算長度
len=0;
while(temp)
{
len++;
temp/=10;
}
if (len<4) {len=4;point++;temp =(ulong)(10*freL);}
else {temp=(ulong)freL;}
for (i=len;i>=0;i--) //存入指針中
{
if(i!=(len-point))
{
a[i]=temp%10+48;
temp=temp/10;
}
else
{
a[i]='.';
}
}
a[len+1]='\0';
x=a;
}
}break;
case 4:break;
case 10:
{
overflow++;
break;
}
default:break;
}
}
//***********************************************************************
// WDT中斷服務程序,1s時間到,計算頻率,并轉換成字符
//***********************************************************************
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
flag++;
if(flag==2)
{
WDT_Init(); //5s到,關看門狗
P6OUT &= ~BIT7; //LED8亮作為提示
P6OUT |= BIT0;
freH=TAR+overflow*60000; //計算頻率(此時是5倍的值,因為看門狗走了五秒)
//判斷頻率的精度和位數
if (freH<20) { point=3;unit=unitL;multi=1000;} //頻率在10Hz 以內
else if (freH<200) { point=2;unit=unitL;multi=100; } //頻率在10-100Hz 之間
else if (freH<2000) { point=1;unit=unitL;multi=10; } //頻率在100-1kHz 之間
else if (freH<4000) { point=3;unit=unitH;multi=1; } //頻率在1k-2kHz 之間
else if (freH<20000) { point=4;unit=unitH; } //頻率在2-10kHz 之間
else if (freH<200000) { point=4;unit=unitH; } //頻率在10k-100k 之間
else if (freH<2000000) { point=4;unit=unitH; } //頻率在100k-1MHz之間
//判斷頻率高低頻,高頻脈沖測量輸出,低頻重新用周期法捕獲測量
if (freH>10000)
{
fre=5*freH; //得到10倍頻率
//將測出來的數值轉換成字符
temp=fre; //計算長度
len=0;
while(temp)
{
len++;
temp/=10;
}
for (i=len;i>=0;i--) //存入指針中
{
if(i!=(len-point))
{
a[i]=fre%10+48;
fre=fre/10;
}
else
{
a[i]='.';
}
}
a[len+1]='\0';
x=a;
}
else
{
TIMERA1_Init();
_EINT();
}
}
}
//***********************************************************************
// 主程序
//***********************************************************************
int main(void)
{
WDT_Init(); //關閉看門狗
Clock_Init_Ex32768(); //系統時鐘設置8M
Port_Init(); //LCD端口初始化
delay_ms(100); //延時100ms
LCD_init(); //液晶參數初始化設置
LCD_clear(); //清屏
TIMERA0_Init(); //比較寄存器0初始化
IE1 |= WDTIE; //打開開門狗中斷,全局中斷
_EINT();
WDTCTL = WDT_ADLY_1000; //看門狗計時1s
DisplayCgrom(0x80,"信號頻率測量中");
DisplayCgrom(0x88,"請稍等...");
delay_ms(3000);
LCD_clear();
delay_ms(200);
while(1)
{
Display(); //顯示漢字
/*//重新啟動
delay_ms(1000);
overflow = 0;
TIMERA0_Init();
IE1 |= WDTIE; //打開開門狗中斷,全局中斷
_EINT();
WDTCTL = WDT_ADLY_1000;*/
}
}
|
-
-
Frequency.rar
2019-4-24 19:59 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
34.94 KB, 下載次數: 6, 下載積分: 黑幣 -5
|