最近在做用msp430f149做一个频率计,不能正确显示,各位大手帮下忙

2019-07-17 15:56发布

网上找的代码,经过自己修改还是不能显示频率
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
18380593018
1楼-- · 2019-07-17 16:23
 精彩回答 2  元偷偷看……
18380593018
2楼-- · 2019-07-17 19:26
上代码:
#include <msp430x14x.h>
#include "LCD1602.c"
#include "delay.c"
#include "delay.h"

unsigned int old_cap=0;//捕获的旧值
unsigned long int period=0;//信号周期
unsigned char TA_ov_num=0;//定时器计数溢出次数


/*****系统时钟配置****/
void init_MCLK()
{ uchar i;
  WDTCTL = WDTPW + WDTHOLD;                 // 关闭看门狗

  BCSCTL1&=~ XT2OFF;                //msp430f149 选择XT2频率,一般为8MHz
  do//do这个循环不能删除,否则下载到硬件电路上没法实现测温功能
    {
        IFG1 &= ~OFIFG;                 //清除晶振失败标志
        for (i = 0xFF; i > 0; i--);     //等待8MHz晶体起振
    }
    while ((IFG1 & OFIFG));             //晶振失效标志仍然存在?
   BCSCTL2 |= (SELM_2 + DIVM_0 + SELS+DIVS_0);      // SMCK=MCLK=8MHz
}
/*********/


/****捕获方式设置****/
void cap_init()
{
   P1SEL|=BIT2;                             // 设置 P1.2为第二功能引脚TA1
   P1DIR&=~BIT2;                             // 设置P1.2为输入引脚
   //TACTL=TACLR;   //定时器清零
   TACTL = TASSEL_2 + MC_2+ID_3+TAIE;     //计数时钟为1MHz,计数方式为连续计数
   CCTL1 |= CAP+CM_1 + SCS + CCIS_0+ CCIE;
   // 上升沿捕获,同步,CCI0A(P1.2信号源),捕获功能,中断允许
  TACCR1=0;
}


/****频率计算及显示****/
void display_freq()
{
  uchar lcdbuf[8];
  unsigned long temp;
  temp=period;
   if(temp>1000)//表示频率小于1KHz
   {
     temp=1000000/temp;//定时器的计数时钟为1MHz,且以Hz为单位只显示整数部分
     lcdbuf[0]=temp/100+0x30;
     lcdbuf[1]=(temp%100)/10+0x30;
     lcdbuf[2]=temp%10+0x30;
     lcdbuf[3]='H';
     lcdbuf[4]='z';
     lcdbuf[5]=' ';
     lcdbuf[6]=' ';
     lcdbuf[7]=' ';
     if(lcdbuf[0]==0x30)
     {
        if(lcdbuf[1]==0x30)
           LCD_Write_String(5,2,&lcdbuf[2]);
         else
           LCD_Write_String(5,2,&lcdbuf[1]);
           
        }
       else
      
         LCD_Write_String(5,2,&lcdbuf[0]);        
     }
  else//表示频率大于1KHz
   {
     temp=10000/temp;//定时器的计数时钟为1MHz,以KHz为单位显示,且显示2位小数
                         //1000/period再扩大10倍以显示小数
     lcdbuf[0]=temp/1000+0x30;
     lcdbuf[1]=(temp%1000)/100+0x30;
     lcdbuf[2]=(temp%1000)%100/10+0x30;  
     lcdbuf[3]='.';      
     lcdbuf[4]=(temp%1000)%10+0x30;;
     lcdbuf[5]='K';
     lcdbuf[6]='H';
     lcdbuf[7]='z';
      if(lcdbuf[0]==0x30)
     {
         if(lcdbuf[1]==0x30)
         {
           LCD_Write_String(5,2,&lcdbuf[2]);
           LCD_Write_String(11,2,"  ");
         }
         else
          {
           LCD_Write_String(5,2,&lcdbuf[1]);
           LCD_Write_String(12,2," ");
          }
      }
     else
     LCD_Write_String(5,2,&lcdbuf[0]);
     
   }
}

/****主程序*******/
void main(void)
{

volatile unsigned int i;

   init_MCLK();//初始化系统时钟
   for (i=0; i<20000; i++);                 // 延时等待晶振稳定
  
  cap_init();//捕获初始化
  _EINT();                 // 开总中断
  LCD_Init();//液晶初始化
  



  LCD_Write_String(0,1,"freq:");//从第一行第0列开始显示
while(1)
{
   display_freq();//脉宽计算及显示
}   
}


#pragma vector=TIMERA1_VECTOR//捕获中断子程序
__interrupt void TimerA1(void)
{
  switch(TAIV)
   {
     case 2://比较/捕获模块1中断
         period=TA_ov_num*65536+TACCR1-old_cap;
         old_cap=TACCR1;
         TA_ov_num=0;
         break;
  case 4:break;//比较/捕获模块2中断未用
  case 10:TA_ov_num++;
           break;
   }
  
  }
dirtwillfly
3楼-- · 2019-07-17 22:22
估计是1602的驱动不正确,或者背光电压不合适。
建议单独调试1602的显示,调试没问题再和其他部分的程序一起调试。
fentianyou
4楼-- · 2019-07-18 02:36
楼主上图看一下显示是结果有什么不一样的。
fentianyou
5楼-- · 2019-07-18 05:28
18380593018 发表于 2017-5-2 15:36
上代码:
#include
#include "LCD1602.c"

LCD显示的是字符串,需要转换为字符串才能显示。
isseed
6楼-- · 2019-07-18 08:35
 精彩回答 2  元偷偷看……

一周热门 更多>