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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1684|回復: 0
收起左側

msp430測頻(ps:來自論壇大佬,但具體出處忘記了)

[復制鏈接]
ID:286064 發(fā)表于 2018-5-20 09:50 | 顯示全部樓層 |閱讀模式
測頻(ps:來自論壇大佬,但具體出處忘記了,若涉及侵權立馬刪)

單片機源程序如下:

  1. #include "msp430f449.h"
  2. #include "string.h"
  3. #include "stdio.h"
  4. #include "time.h"
  5. #include "lcd.c"
  6. #define CPUF ((double)7995392)
  7. #define delay_us(x) __delay_cycles((long)(CPUF*(double)x/1000000))
  8. #define delay_ms(x) __delay_cycles((long)(CPUF*(double)x/1000))
  9. #define delay_s(x) __delay_cycles(CPUF*x)

  10. long Cap_num=0;
  11. int Cap_star=0;
  12. int Cap_Ns=0;
  13. long OV_Ns=0;
  14. long Ns=0;
  15. long Nx=0;
  16. long f=0;
  17. int flag_Capend;
  18. /*char str1[20]={"頻率: "};
  19. char str2[];
  20. char str3[]={"  HZ"};*/
  21. uchar lcd_buf[6]={0,0,0,0,0,0};


  22. void initclk()
  23. {

  24.   SCFI0|=FN_4;      
  25.   SCFQCTL=121;      //系統(tǒng)時鐘倍頻達到8M
  26.   FLL_CTL0=DCOPLUS+OSCCAP1;
  27. }


  28. int main( void )
  29. {
  30.   // Stop watchdog timer to prevent time out reset
  31.   WDTCTL = WDTPW + WDTHOLD;
  32.   initclk();  //時鐘初始化
  33.   lcd_init();
  34.   //Display_string(0,0,"是");
  35.   Display_string(3,0,"頻率:"); //先列后行才是對的,上面一行地址是錯的;
  36.   //Display_string(10,1,"HZ");  //該顯示函數(shù)自動從第0列開始 ,所以會被后來的數(shù)據(jù)覆蓋,有待解決
  37.    _EINT();   //開總中斷
  38.   Preset_gate();         //預置閘門
  39.   Cap_signal();          //捕獲被測信號
  40.    while(1)
  41.   {
  42.    if(flag_Capend==2)
  43.    {
  44.    _DINT();               //此處關總中斷防止計數(shù)值改變
  45.     Ns=Ns+OV_Ns*500;
  46.     f=Nx/(Ns/3980000);    //理論上應是1/4M,但定時器的頻率達不到那么高
  47.    
  48.   /*  此種顯示方法會導致單片機運行崩潰,是軟件原因還是程序原因不明。
  49.     sprintf(str2,"%1.f",f); //%1.f確定f的精度即位寬,以至于不會將str1[]填滿,導致str3[]裝不進去
  50.     strcat(str1,str2);  //strcat函數(shù)將兩個字符數(shù)組連接起來
  51.     strcat(str1,str3);   
  52.     Display_string(0,0,str1);   //直接將數(shù)組內(nèi)的內(nèi)容顯示
  53. */
  54.     lcd_buf[0]=(uchar)(f/100000%10)+0x30;
  55.     lcd_buf[1]=(uchar)(f/10000%10)+0x30;
  56.     lcd_buf[2]=(uchar)(f/1000%10)+0x30;
  57.     lcd_buf[3]=(uchar)(f/100%10)+0x30;
  58.     lcd_buf[4]=(uchar)(f/10%10)+0x30;
  59.     lcd_buf[5]=(uchar)(f%10)+0x30;
  60.     Display_string(6,1,lcd_buf);
  61.   //  Display_char(7,1,'H');
  62. //   Display_char(8,1,'Z');
  63.     Cap_num=0;
  64.     OV_Ns=0;
  65.     flag_Capend=0;
  66.     TACCTL1|=CCIE;   
  67.     TACCTL2|=CCIE;
  68.     TACCTL2|=TAIE;
  69.     TBCCTL1|=TAIE;
  70.     _EINT();
  71.    }
  72.   }
  73.    
  74. }

  75. /****** 定時器 A1,2 中斷 處理 ***********/
  76. #pragma vector = TIMERA1_VECTOR
  77. __interrupt void Timer_A1 (void)
  78. {
  79. if(flag_Capend==1)                 //實際閘門關閉
  80.   {
  81.    lcd_buf[0]=0;lcd_buf[1]=0;lcd_buf[2]=0;lcd_buf[3]=0;lcd_buf[4]=0;lcd_buf[5]=0;
  82.    TACCTL1&=~CCIE;
  83.    TBCCTL1&=~TAIE;
  84.    flag_Capend=2;
  85.    Ns=TAR;
  86.    Nx=Cap_num-1;
  87.    TACCTL1&=~CCIE;
  88.    TACCTL2&=~CCIE;
  89.    TACCTL2&=~TAIE;
  90.    TBCCTL1&=~TAIE;
  91.     _DINT();        //此處關總中斷無用,在中斷發(fā)生時,主函數(shù)中的SR入棧保存,
  92.                      //在中斷函數(shù)中用的新的SR,退出中斷后,這個SR是要被主函數(shù)以前的SR出棧覆蓋的,
  93.                      //所以說在這個中斷里面改變GIE,并不能改變退出中斷以后的GIE。
  94.    //TACCR2=0;        
  95.   }
  96. else
  97.   {
  98.    switch(TAIV)
  99.    {
  100.      case 2: if(Cap_num==0)   //第一個被測信號上升沿  
  101.              {
  102.               TBR=0;
  103.               TBCTL|=MC_1;         //開啟1s實際閘門,增計數(shù)模式
  104.               TAR=0;              //標準信號計數(shù)清零,標準信號開始計數(shù)
  105.               TACTL|= TAIE;        //開中斷,
  106.               if(flag_Capend==0)
  107.               Cap_num++;     
  108.              }            
  109.             else
  110.              {
  111.             // Cap_Ns=TAR;
  112.              if(flag_Capend==0)
  113.              Cap_num++;      //被測信號計數(shù)Nx
  114.              }
  115.             break;

  116.     case 10: //TACCR2=0;
  117.              if(flag_Capend==0);
  118.              OV_Ns++;
  119.              break;
  120.     default:  break;     
  121.    }      
  122.   }
  123. }

  124. /****** 定時器 B 中斷 處理 ***********/
  125. #pragma vector = TIMERB0_VECTOR
  126. __interrupt void Timer_B (void)
  127. {
  128.    flag_Capend=1;
  129. }
復制代碼

所有資料51hei提供下載:
測頻.rar (33.08 KB, 下載次數(shù): 13)


回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产18久久久久久二百 | 激情国产在线 | 国产精品一区二区三区在线 | 性一交一乱一透一a级 | 天天射夜夜操 | 亚洲欧美激情精品一区二区 | 亚洲精品久久久9婷婷中文字幕 | 中文字幕a√ | 国产精品久久久精品 | 亚洲一区精品在线 | 亚洲欧洲在线看 | 久久精品国产v日韩v亚洲 | 香蕉婷婷 | 国产第一页在线观看 | av影音资源 | 久久久久国产精品一区二区 | 精品国产乱码久久久久久丨区2区 | 成人精品一区二区三区中文字幕 | 精品九九 | 91xxx在线观看 | 欧美男人天堂 | 欧美一区二区三区一在线观看 | 久久久久久一区 | 成人黄色三级毛片 | 亚洲高清久久 | 欧美在线一区二区三区 | 精品欧美乱码久久久久久1区2区 | 欧美精品一区在线 | 人人澡人人射 | 精品久久九九 | 国产精品视频一二三区 | 精品国产高清一区二区三区 | 日本网站免费在线观看 | 日韩一区二区不卡 | 亚洲中字在线 | 在线免费观看毛片 | 毛片入口 | 成人免费在线观看 | 国产欧美在线观看 | 久久国产精品-国产精品 | 欧美视频免费在线观看 |