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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:286064 發表于 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;      //系統時鐘倍頻達到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");  //該顯示函數自動從第0列開始 ,所以會被后來的數據覆蓋,有待解決
  37.    _EINT();   //開總中斷
  38.   Preset_gate();         //預置閘門
  39.   Cap_signal();          //捕獲被測信號
  40.    while(1)
  41.   {
  42.    if(flag_Capend==2)
  43.    {
  44.    _DINT();               //此處關總中斷防止計數值改變
  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函數將兩個字符數組連接起來
  51.     strcat(str1,str3);   
  52.     Display_string(0,0,str1);   //直接將數組內的內容顯示
  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();        //此處關總中斷無用,在中斷發生時,主函數中的SR入棧保存,
  92.                      //在中斷函數中用的新的SR,退出中斷后,這個SR是要被主函數以前的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實際閘門,增計數模式
  104.               TAR=0;              //標準信號計數清零,標準信號開始計數
  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++;      //被測信號計數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, 下載次數: 13)


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜午夜精品一区二区三区文 | 国产精品 亚洲一区 | 欧美综合国产精品久久丁香 | 一级在线观看 | 久久三区 | 日本三级在线视频 | 波多野结衣二区 | 麻豆久久久9性大片 | 亚洲精品视频在线观看免费 | 日韩国产中文字幕 | 国产精品久久久久久久久久 | 一级黄色毛片 | 视频一区二区在线观看 | 国产香蕉视频在线播放 | 玖玖精品视频 | 欧美日韩一区二区在线观看 | 亚洲精品一区国产精品 | 欧美日韩国产中文 | 国产美女精品视频 | 欧美一区二区成人 | 久久亚洲国产精品 | 成人免费淫片aa视频免费 | 999精品视频 | 欧美福利| 欧美成视频 | 国产美女特级嫩嫩嫩bbb片 | 久久久久久成人 | 亚洲成av| 国产一区二区视频在线观看 | 国产午夜精品久久久 | 国产精品久久久久久影院8一贰佰 | 噜啊噜在线 | 欧美久久久久久 | 狠狠综合久久av一区二区小说 | 国产精品亚洲综合 | caoporn地址 | 国产欧美日韩在线一区 | 亚洲精品99久久久久久 | 一区二区三区高清在线观看 | 久久男人| 国产精品久久久久国产a级 欧美日本韩国一区二区 |