找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2123|回复: 1
打印 上一主题 下一主题
收起左侧

我这个msp430f169测频率一直显示65535Hz,怎么改,大佬帮忙看一下

[复制链接]
跳转到指定楼层
楼主
ID:593810 发表于 2019-8-5 16:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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    //数据口方向设置为输入
#define LCD_DataOut   P5DIR=0xff    //数据口方向设置为输出
#define LCD2MCU_Data  P5IN
#define MCU2LCD_Data  P5OUT

#define LCD_CMDOut    P4DIR|=0x0F     //P3口的低三位设置为输出
#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]; //==用于存放频率显示数据==
uint pd[7]; //==用于存放周期显示数据==
uint wh[6]; //==用于存放脉宽显示数据==
const unsigned char zhouqi[]={"周期为:(us) "};
const unsigned char us[]={"us "};
const unsigned char pinlv[]={"频率为:(Hz) "};
const unsigned char hz[]={"HZ "};

void process(void);

/***************************主函数*************************/
void main( void )
{

   WDTCTL = WDTPW + WDTHOLD; //==关狗==   
  InitSys(); //==初始化时钟,SMCLK,MCLK均为8M==
  P1DIR&=~BIT2;
  P1SEL = BIT2; //==设置P1.2端口为功能模块使用,即:做捕获源==
  TACTL = TASSEL_2+ID_3+TACLR+TAIE+MC_1;//==定时器A时钟信号选择SMCLK,8分频,同时设置定时器A计数模式为连续增计模式==
  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; //==清除振荡器失效标志==
     for (i = 0xFF; i > 0; i--); //==延时,等待XT2起振==
   }
  while ((IFG1 & OFIFG) != 0); //==判断XT2是否起振==
  BCSCTL2 =SELM_2+SELS; //==选择MCLK、SMCLK为XT2,8M==
  //ADC12CTL0 |=ENC+ADC12SC;//使能转换;开始转换
}
void process(void)
{
  while(end<start);
   //while(end<start)的话就让其一直等待下去,直到end>start
    //width =10000/(end-start); //实际脉冲宽度的计算
    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 //==定时器A中断处理==
__interrupt void timer_A1(void)
{
  uint temp;
  switch(TAIV) //==向量查询==
  { case 2: //==捕获中断==
       if(CCTL1&CM0) //==捕获到上升沿==
         {
            CCTL1=(CCTL1&(~CM0))|CM1; //==更变设置为下降沿触发==
            temp=TAR; //==记录初始时间==
            period=temp-start;
            start=temp;      
         }
       else if (CCTL1&CM1) //==捕获到下降沿==
        {
           CCTL1=(CCTL1&(~CM1))|CM0; //==更变设置为上升沿触发==
           end=TAR; //==用start,end,overflow计算脉冲宽度==
           width =end-start;

        }
        break;                 
    default:break;
  }
}
/********************************************
函数名称:Delay_1ms
功    能:延时约1ms的时间
参    数:无
返回值  :无
********************************************/
void Delay_1ms(void)
{
        uchar i;

        for(i = 150;i > 0;i--)  _NOP();
}
/*******************************************
函数名称:Delay_Nms
功    能:延时N个1ms的时间
参    数:n--延时长度
返回值  :无
********************************************/
void Delay_Nms(uint n)
{
    uint i;

    for(i = n;i > 0;i--)    Delay_1ms();
}
/*******************************************
函数名称:Write_Cmd
功    能:向液晶中写控制命令
参    数: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;
}
/*******************************************
函数名称:Write_Data
功    能:向液晶中写显示数据
参    数:dat--显示数据
返回值  :无
********************************************/
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;
}  
/*******************************************
函数名称:Ini_Lcd
功    能:初始化液晶模块
参    数:无
返回值  :无
********************************************/
void Ini_Lcd(void)
{                  
    LCD_CMDOut;    //液晶控制端口设置为输出

    Delay_Nms(500);
    Write_Cmd(0x30);   //基本指令集
    Delay_1ms();
    Write_Cmd(0x02);   // 地址归位
    Delay_1ms();
        Write_Cmd(0x0c);   //整体显示打开,游标关闭
    Delay_1ms();
        Write_Cmd(0x01);   //清除显示
    Delay_1ms();
        Write_Cmd(0x06);   //游标右移
    Delay_1ms();
        Write_Cmd(0x80);   //设定显示的起始地址
}
/*******************************************
函数名称:Disp_HZ
功    能:控制液晶显示汉字
参    数:addr--显示位置的首地址
          pt--指向显示数据的指针
          num--显示字符个数
返回值  :无
********************************************/
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;                   //清除震荡标志
      for(i=0;i<100;i++)
      _NOP();                      //延时等待
     }
  while((IFG1&OFIFG)!=0);           //如果标志为1,则继续循环等待
  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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:290305 发表于 2019-8-6 17:00 | 只看该作者
因为你定义frequency时用的是uint,而你的uint是用unsigned int宏定义的,他的取值范围为0—65536,所以你最大的显示数为65536,你可以把frequency用u32定义就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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