找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1486|回复: 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 单片机教程网

快速回复 返回顶部 返回列表