找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2137|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

我這個(gè)msp430f169測頻率一直顯示65535Hz,怎么改,大佬幫忙看一下

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:593810 發(fā)表于 2019-8-5 16:54 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
10黑幣

/***********************************************************
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    //數(shù)據(jù)口方向設(shè)置為輸入
#define LCD_DataOut   P5DIR=0xff    //數(shù)據(jù)口方向設(shè)置為輸出
#define LCD2MCU_Data  P5IN
#define MCU2LCD_Data  P5OUT

#define LCD_CMDOut    P4DIR|=0x0F     //P3口的低三位設(shè)置為輸出
#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]; //==用于存放頻率顯示數(shù)據(jù)==
uint pd[7]; //==用于存放周期顯示數(shù)據(jù)==
uint wh[6]; //==用于存放脈寬顯示數(shù)據(jù)==
const unsigned char zhouqi[]={"周期為:(us) "};
const unsigned char us[]={"us "};
const unsigned char pinlv[]={"頻率為:(Hz) "};
const unsigned char hz[]={"HZ "};

void process(void);

/***************************主函數(shù)*************************/
void main( void )
{

   WDTCTL = WDTPW + WDTHOLD; //==關(guān)狗==   
  InitSys(); //==初始化時(shí)鐘,SMCLK,MCLK均為8M==
  P1DIR&=~BIT2;
  P1SEL = BIT2; //==設(shè)置P1.2端口為功能模塊使用,即:做捕獲源==
  TACTL = TASSEL_2+ID_3+TACLR+TAIE+MC_1;//==定時(shí)器A時(shí)鐘信號選擇SMCLK,8分頻,同時(shí)設(shè)置定時(shí)器A計(jì)數(shù)模式為連續(xù)增計(jì)模式==
  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; //==清除振蕩器失效標(biāo)志==
     for (i = 0xFF; i > 0; i--); //==延時(shí),等待XT2起振==
   }
  while ((IFG1 & OFIFG) != 0); //==判斷XT2是否起振==
  BCSCTL2 =SELM_2+SELS; //==選擇MCLK、SMCLK為XT2,8M==
  //ADC12CTL0 |=ENC+ADC12SC;//使能轉(zhuǎn)換;開始轉(zhuǎn)換
}
void process(void)
{
  while(end<start);
   //while(end<start)的話就讓其一直等待下去,直到end>start
    //width =10000/(end-start); //實(shí)際脈沖寬度的計(jì)算
    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 //==定時(shí)器A中斷處理==
__interrupt void timer_A1(void)
{
  uint temp;
  switch(TAIV) //==向量查詢==
  { case 2: //==捕獲中斷==
       if(CCTL1&CM0) //==捕獲到上升沿==
         {
            CCTL1=(CCTL1&(~CM0))|CM1; //==更變設(shè)置為下降沿觸發(fā)==
            temp=TAR; //==記錄初始時(shí)間==
            period=temp-start;
            start=temp;      
         }
       else if (CCTL1&CM1) //==捕獲到下降沿==
        {
           CCTL1=(CCTL1&(~CM1))|CM0; //==更變設(shè)置為上升沿觸發(fā)==
           end=TAR; //==用start,end,overflow計(jì)算脈沖寬度==
           width =end-start;

        }
        break;                 
    default:break;
  }
}
/********************************************
函數(shù)名稱:Delay_1ms
功    能:延時(shí)約1ms的時(shí)間
參    數(shù):無
返回值  :無
********************************************/
void Delay_1ms(void)
{
        uchar i;

        for(i = 150;i > 0;i--)  _NOP();
}
/*******************************************
函數(shù)名稱:Delay_Nms
功    能:延時(shí)N個(gè)1ms的時(shí)間
參    數(shù):n--延時(shí)長度
返回值  :無
********************************************/
void Delay_Nms(uint n)
{
    uint i;

    for(i = n;i > 0;i--)    Delay_1ms();
}
/*******************************************
函數(shù)名稱:Write_Cmd
功    能:向液晶中寫控制命令
參    數(shù):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;
}
/*******************************************
函數(shù)名稱:Write_Data
功    能:向液晶中寫顯示數(shù)據(jù)
參    數(shù):dat--顯示數(shù)據(jù)
返回值  :無
********************************************/
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;
}  
/*******************************************
函數(shù)名稱:Ini_Lcd
功    能:初始化液晶模塊
參    數(shù):無
返回值  :無
********************************************/
void Ini_Lcd(void)
{                  
    LCD_CMDOut;    //液晶控制端口設(shè)置為輸出

    Delay_Nms(500);
    Write_Cmd(0x30);   //基本指令集
    Delay_1ms();
    Write_Cmd(0x02);   // 地址歸位
    Delay_1ms();
        Write_Cmd(0x0c);   //整體顯示打開,游標(biāo)關(guān)閉
    Delay_1ms();
        Write_Cmd(0x01);   //清除顯示
    Delay_1ms();
        Write_Cmd(0x06);   //游標(biāo)右移
    Delay_1ms();
        Write_Cmd(0x80);   //設(shè)定顯示的起始地址
}
/*******************************************
函數(shù)名稱:Disp_HZ
功    能:控制液晶顯示漢字
參    數(shù):addr--顯示位置的首地址
          pt--指向顯示數(shù)據(jù)的指針
          num--顯示字符個(gè)數(shù)
返回值  :無
********************************************/
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;                   //清除震蕩標(biāo)志
      for(i=0;i<100;i++)
      _NOP();                      //延時(shí)等待
     }
  while((IFG1&OFIFG)!=0);           //如果標(biāo)志為1,則繼續(xù)循環(huán)等待
  IFG1&=~OFIFG;
}


void delay(void)
{
  unsigned int i,j;
  for(i=0;i<100;i--)
  {
    for(j=0;j<100;j--);
  }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

樓主
ID:290305 發(fā)表于 2019-8-6 17:00 | 只看該作者
因?yàn)槟愣xfrequency時(shí)用的是uint,而你的uint是用unsigned int宏定義的,他的取值范圍為0—65536,所以你最大的顯示數(shù)為65536,你可以把frequency用u32定義就可以了
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表