3583|13

39

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

MSP430F5529 [复制链接]

 
用MSP430F5529做一个超声波测距模块,用1602显示,可是显示测出来的数据是0cm,我检查了好几天,不知道是哪里出了问题,求大神告诉该咋办,或者那位有MSP430F5529的程序,发给我让我研究一下,感激不尽,

最新回复

楼主 ,解决了 可以贴下程序么  详情 回复 发表于 2016-7-10 14:17
 
点赞 关注(1)

回复
举报

527

帖子

1

TA的资源

一粒金砂(高级)

沙发
 
这个跟单片机型号关系不大吧,都是一个套路,你可以贴程序出来看看,还有你可以说说你的编程思想
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
supermiao123 发表于 2016-6-6 14:35
这个跟单片机型号关系不大吧,都是一个套路,你可以贴程序出来看看,还有你可以说说你的编程思想

这是我写的程序
#include
#define  CLR_RS  P2OUT&=~BIT0   //RS = P2.0
#define  SET_RS  P2OUT|=BIT0
#define  CLR_RW  P2OUT&=~BIT4
#define  SET_RW  P2OUT|=BIT4
#define  CLR_EN  P2OUT&=~BIT2
#define  SET_EN  P2OUT|=BIT2
#define  SET_Trig  P6OUT|=BIT0
#define  CLR_Trig  P6OUT&=~BIT0
#define  Echo    (P1IN&BIT2)    //回波引脚
#define  uchar   unsigned  char
#define  uint    unsigned  int
uchar distance[]="distance:    CM";
uint lastCCR1;
uint t,S;
void Delayms(unsigned int m);
void  check_busy(void);
void write_command(unsigned char com,unsigned char chk);
void  write_data(unsigned char  *dat);
void  LCD_initial(void);
void  string(unsigned char ad,unsigned  char  *s);
void  startmodule();
void  SetTIMEA();
void  Initclock();
void   ShowDistance();

void Delayms(unsigned int m)
  {
    unsigned int i, j;
    for(i=0; i       for(j=0; j<1000; j++);
  }




/*检测忙状态*/
void  check_busy(void)
{
    unsigned int m;
    P3DIR=0X00;//设置P3为输入
     CLR_EN ;
      __no_operation();
     CLR_RS;
      __no_operation();
     SET_RW;
      __no_operation();
     SET_EN;
    m=P3IN&BIT7;
    while(m);       
   CLR_EN;
   P3DIR|=0Xff;//将P3设置为输出
}

/*写命令*/
void write_command(unsigned char com,unsigned char chk)
{
   if(chk)
   check_busy();
  CLR_EN;
  CLR_RS;
   __no_operation();
  CLR_RW ;
   __no_operation();
  P3OUT=com;
  __no_operation();
  SET_EN;         
  __no_operation();
   CLR_EN;
   Delayms(30);
}

/*写数据*/
void  write_data(unsigned char  *dat)
{
  check_busy();
   CLR_EN ;
    __no_operation();
   SET_RS;
  __no_operation();  
   CLR_RW ;
    __no_operation();
   P3OUT=*dat;
   __no_operation();
   SET_EN;
  __no_operation();
  CLR_EN ;
   Delayms(30);
}


void  LCD_initial(void)
{

   P2DIR|=BIT0+BIT2;
   P2DIR|=BIT4;
   P3DIR|=0xff;
   
   Delayms(15);
   write_command(0x38,0);
   Delayms(5);
   write_command(0x38,0);
    Delayms(5);
   write_command(0x38,0);
   Delayms(5);
   
   
   write_command(0x38,1);       
   write_command(0x08,1);//关闭显示
   write_command(0x01,1);//清屏
   write_command(0x06,1);//光标右移       
   write_command(0x0C,1);//开整体显示,光标关,无黑块               
}

void  string(unsigned char ad,unsigned  char  *s)
{
  write_command(ad,1);
  while(*s!='\0')
  {
    write_data(s);
    s++;
   }
}

void  startmodule()
{
  int i;
   SET_Trig;
   for(i=0;i<20;i++)
   {
       __no_operation();
   }
    CLR_Trig ;
}

/******************************************
用定时器TA1,捕获比较器用CCR1
*******************************************/
void  SetTIMEA()
{
  t=0;
  lastCCR1=0;
TA1CTL|=TACLR+TASSEL__SMCLK +ID_2+MC_2+TAIE;//计数清0,选子系统时钟做时钟源,4分频,1M,连续计数模式,定时器允许中断
TA1CCTL1|=CM_1+SCS+CAP+CCIE+CCIS_0; //上升沿和下降沿捕获,选择捕获功能,捕获信号和定时器时钟同步,该捕获允许中断
}



void  Initclock()
{
  //int i;
  P5SEL |= BIT2+BIT3; //将IO配置为XT2功能
  UCSCTL6&=~XT2OFF;//选择XT2作为时钟源  4M
  
  UCSCTL3 |= SELREF_2;                  //FLL模块的参考时钟源选择REFO
  UCSCTL4 = UCSCTL4&(~(SELA_7))|SELA_1; //先将ACLK配置为VLOCLK

  do{
    UCSCTL7&=~(XT2OFFG+DCOFFG+XT1LFOFFG);
    SFRIFG1&=~OFIFG;//清除振荡器失效标志
    //for(i=0xff;i>0;i--);稳定时间
    }while((SFRIFG1&OFIFG)!=0);//如果振荡器失效则继续循环
  UCSCTL4|=SELM__XT2CLK + SELS__XT2CLK ;//主时钟的信号源为XT2,子系统时钟的信号源也为XT2,
  UCSCTL5 =DIVM__4;//主系统时钟4分频  1M
}


void   ShowDistance()
{
  S=(t*17)/1000;//单位是cm
  distance[9]=S/100+0x30;
  distance[10]=S/10%10+0x30;
  distance[11]=S%10+0x30;
  string(0XC0,distance);
  Delayms(50);
}
void  main()
{
  WDTCTL = WDTPW + WDTHOLD;
  
   LCD_initial();
   P1DIR&=~BIT2;//设置P1.2为输入
   P1SEL|=BIT2;//将P1.2引脚配置为定时器捕获输入
   P6DIR|=BIT0;
   CLR_Trig;//P6.0输出低电平
   Initclock();
   SetTIMEA();
   TA1CCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
    _EINT();
    while(1)
    {
       startmodule();
       ShowDistance();
    }
}


#pragma vector = TIMER1_A1_VECTOR   //CCR1捕获产生中断
__interrupt void TIMER1_A1__ISR(void)
{
    TA1CCTL1&=~CCIFG;//中断标志清零
    switch(__even_in_range(TA1IV,14))
    {
    case 2:                //CCR1捕获中断   
      if(Echo==1)
           {
             lastCCR1 = TA1CCR1;
             TA1CCTL1 |= CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕获
           }
      else
      {
           _DINT();
           t=TA1CCR1-lastCCR1;
            TA1CCR1 = 0;
            TA1CCTL1|= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
            _EINT();
      }
      break;
    case 4:
      break;
    case 6:
      break;
    case 8:
      break;
    case 0x0A:
      break;
    case 0x0C:
      break;
    case 0x0E:                                       //定时器溢出中断
       if(TA1CCTL1&COV)
          TA1CCTL1&=~COV;
      break;
    default:
      break;
   }
   
}
 
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

4
 
先从单片机学起吧。
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

5
 
dontium 发表于 2016-6-6 17:03
先从单片机学起吧。

正在学啊
 
 
 

回复

527

帖子

1

TA的资源

一粒金砂(高级)

6
 
我印象中,超声波应该是先发射同时开始计时,等接收中断后算时间,然后乘以声速就是距离,后面计算先不管,你先检查下你时间捕获的对不对。
 
 
 

回复

2549

帖子

0

TA的资源

五彩晶圆(初级)

7
 
分三步解决,第一步看你的1602是不是显示正常,第二步看你的数据传递是不是有问题,第三个就是你的超声波驱动没写好了,明天有空的话我跑一下程序
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

8
 
数码小叶 发表于 2016-6-7 17:17
分三步解决,第一步看你的1602是不是显示正常,第二步看你的数据传递是不是有问题,第三个就是你的超声波驱 ...

非常感谢,数码管显示是正常的,
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

9
 
好可爱的小多C 发表于 2016-6-7 17:32
非常感谢,数码管显示是正常的,

不是,是1602显示是正常的
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

10
 
数码小叶 发表于 2016-6-7 17:17
分三步解决,第一步看你的1602是不是显示正常,第二步看你的数据传递是不是有问题,第三个就是你的超声波驱 ...

我将TIMEA1改成了TIMEA0,要是跑程序的话,用这个吧,不过1602显示的距离还是0
#include
#include
#include
#define  CLR_RS  P2OUT&=~BIT0   //RS = P2.0
#define  SET_RS  P2OUT|=BIT0
#define  CLR_RW  P2OUT&=~BIT4
#define  SET_RW  P2OUT|=BIT4
#define  CLR_EN  P2OUT&=~BIT2
#define  SET_EN  P2OUT|=BIT2
#define  SET_Trig  P6OUT|=BIT0
#define  CLR_Trig  P6OUT&=~BIT0
#define  Echo    (P1IN&BIT2)    //回波引脚
#define  uchar   unsigned  char
#define  uint    unsigned  int
uchar distance[]="distance:    CM";
uint lastCCR1;
uint t,S;
void Delayms(unsigned int m);
void  check_busy(void);
void write_command(unsigned char com,unsigned char chk);
void  write_data(unsigned char  *dat);
void  LCD_initial(void);
void  string(unsigned char ad,unsigned  char  *s);
void  startmodule();
void  SetTIMEA();
void  Initclock();
void   ShowDistance();

void Delayms(unsigned int m)
  {
    unsigned int i, j;
    for(i=0; i       for(j=0; j<1000; j++);
  }




/*检测忙状态*/
void  check_busy(void)
{
    unsigned int m;
    P3DIR=0X00;//设置P3为输入
     CLR_EN ;
      __no_operation();
     CLR_RS;
      __no_operation();
     SET_RW;
      __no_operation();
     SET_EN;
    m=P3IN&BIT7;
    while(m);       
   CLR_EN;
   P3DIR|=0Xff;//将P3设置为输出
}

/*写命令*/
void write_command(unsigned char com,unsigned char chk)
{
   if(chk)
   check_busy();
  CLR_EN;
  CLR_RS;
   __no_operation();
  CLR_RW ;
   __no_operation();
  P3OUT=com;
  __no_operation();
  SET_EN;         
  __no_operation();
   CLR_EN;
   Delayms(30);
}

/*写数据*/
void  write_data(unsigned char  *dat)
{
  check_busy();
   CLR_EN ;
    __no_operation();
   SET_RS;
  __no_operation();  
   CLR_RW ;
    __no_operation();
   P3OUT=*dat;
   __no_operation();
   SET_EN;
  __no_operation();
  CLR_EN ;
   Delayms(30);
}


void  LCD_initial(void)
{

   P2DIR|=BIT0+BIT2;
   P2DIR|=BIT4;
   P3DIR|=0xff;
   
   Delayms(15);
   write_command(0x38,0);
   Delayms(5);
   write_command(0x38,0);
    Delayms(5);
   write_command(0x38,0);
   Delayms(5);
   
   
   write_command(0x38,1);       
   write_command(0x08,1);//关闭显示
   write_command(0x01,1);//清屏
   write_command(0x06,1);//光标右移       
   write_command(0x0C,1);//开整体显示,光标关,无黑块               
}

void  string(unsigned char ad,unsigned  char  *s)
{
  write_command(ad,1);
  while(*s!='\0')
  {
    write_data(s);
    s++;
   }
}

void  startmodule()
{
  int i;
   SET_Trig;
   for(i=0;i<20;i++)
   {
       __no_operation();
   }
    CLR_Trig ;
   while(Echo==0);
}

/******************************************
用定时器TA0,捕获比较器用CCR1
*******************************************/
void  SetTIMEA()
{
  t=0;
  lastCCR1=0;
TA0CTL|=TACLR+TASSEL__SMCLK +ID_2+MC_2+TAIE;//计数清0,选子系统时钟做时钟源,4分频,1M,连续计数模式,定时器允许中断
TA0CCTL1|=CM_1+SCS+CAP+CCIE+CCIS_0; //上升沿和下降沿捕获,选择捕获功能,捕获信号和定时器时钟同步,该捕获允许中断
}



void  Initclock()
{
  //int i;
  P5SEL |= BIT2+BIT3; //将IO配置为XT2功能
  UCSCTL6&=~XT2OFF;//选择XT2作为时钟源  4M
  
  UCSCTL3 |= SELREF_2;                  //FLL模块的参考时钟源选择REFO
  UCSCTL4 = UCSCTL4&(~(SELA_7))|SELA_1; //先将ACLK配置为VLOCLK

  do{
    UCSCTL7&=~(XT2OFFG+DCOFFG+XT1LFOFFG);
    SFRIFG1&=~OFIFG;//清除振荡器失效标志
    //for(i=0xff;i>0;i--);稳定时间
    }while((SFRIFG1&OFIFG)!=0);//如果振荡器失效则继续循环
  UCSCTL4|=SELM__XT2CLK + SELS__XT2CLK ;//主时钟的信号源为XT2,子系统时钟的信号源也为XT2,
  UCSCTL5 =DIVM__4;//主系统时钟4分频  1M
}


void   ShowDistance()
{
  S=(t*17)/1000;//单位是cm
  distance[9]=S/100+0x30;
  distance[10]=S/10%10+0x30;
  distance[11]=S%10+0x30;
  string(0XC0,distance);
  Delayms(50);
}
void  main()
{
  WDTCTL = WDTPW + WDTHOLD;
  
   LCD_initial();
   P1DIR&=~BIT2;//设置P1.2为输入
   P1SEL|=BIT2;//将P1.2引脚配置为定时器捕获输入
   P6DIR|=BIT0;
   CLR_Trig;//P6.0输出低电平
   Initclock();
   SetTIMEA();
   TA0CCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
    _EINT();
    while(1)
    {
       startmodule();
       ShowDistance();
    }
}


#pragma vector = TIMER0_A1_VECTOR   //CCR1捕获产生中断
__interrupt void TIMER0_A1__ISR(void)
{
    TA0CCTL1&=~CCIFG;//中断标志清零
    switch(__even_in_range(TA0IV,14))
    {
    case 2:                //CCR1捕获中断   
      if(Echo==1)
           {
             lastCCR1 = TA0CCR1;
             TA0CCTL1 |= CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕获
           }
      else
      {
           _DINT();
           t=TA0CCR1-lastCCR1;
            TA0CCR1 = 0;
            TA0CCTL1|= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
            _EINT();
      }
      break;
    case 4:
      break;
    case 6:
      break;
    case 8:
      break;
    case 0x0A:
      break;
    case 0x0C:
      break;
    case 0x0E:                                       //定时器溢出中断
       if(TA0CCTL1 & COV)
         TA0CCTL1 &= ~COV;
      break;
   }
   
}
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

11
 
请问楼主解决了吗?
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

12
 
chengruiqi 发表于 2016-6-14 11:37
请问楼主解决了吗?

解决了
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 
楼主 ,解决了 可以贴下程序么

点评

加我,2446445103,我把程序发给你  详情 回复 发表于 2016-7-10 18:13
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

14
 
阿拉斯没有家 发表于 2016-7-10 14:17
楼主 ,解决了 可以贴下程序么

加我,2446445103,我把程序发给你
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表