久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1560|回復: 1
打印 上一主題 下一主題
收起左側

MSP430頻率顯示儀

[復制鏈接]
跳轉到指定樓層
樓主
ID:520780 發表于 2019-4-24 20:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#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

34.94 KB, 下載次數: 6, 下載積分: 黑幣 -5

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

使用道具 舉報

沙發
ID:1 發表于 2019-4-24 21:34 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人免费在线观看 | 91久色 | 日韩午夜电影 | 日韩精品 电影一区 亚洲 | 久久新 | 精品免费国产视频 | 国产激情视频在线 | 91成人 | 成人在线视频一区 | 久久久久久免费观看 | 91超碰在线 | 久久久久一区二区 | 久久99国产精一区二区三区 | 色网站在线免费观看 | 羞羞视频免费观看入口 | 97超碰站| 精品一区二区三区日本 | 久草免费在线视频 | 欧美成人一区二区三区片免费 | 在线91| 精产国产伦理一二三区 | 国产精品99久久久久久久久 | 欧美不卡一区二区 | 久久亚洲精品国产精品紫薇 | 日韩一区中文字幕 | 日韩一区二区在线视频 | 国产精品久久久乱弄 | 国产精品自拍av | 亚洲乱码国产乱码精品精的特点 | 欧美日韩亚洲国产 | 亚洲国产成人精品女人久久久 | 亚洲国产精品福利 | 久久久久国产精品 | 国产乱一区二区三区视频 | 欧美成人自拍视频 | 亚洲综合色视频在线观看 | 国产中文字幕在线 | 国产精品区二区三区日本 | 国产激情在线播放 | 久久性色| 中文字幕一区二区三区在线观看 |