MSP430F149实现超声波测距并通过串口和PC机通信进行显示

本文档介绍了一个使用IAR开发的超声波测距系统,该系统基于MSP430微控制器,通过外部32.768kHz晶振进行时间测量。程序中定义了延时函数、串口初始化和超声波传感器的初始化及操作。在测量完成后,通过串口1将距离数据以16进制形式发送到PC机,但目前遇到的问题是数据显示为16进制而非期望的十进制格式。
摘要由CSDN通过智能技术生成

使用IAR实现超声波测距,但是用串口在PC机显示时是16进制显示。

#include  <msp430x14x.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define CPU_F ((double)32768)   //外部低频晶振32.768KHZ
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 

#define Trig1(a)  if(a==1) P1OUT |= BIT3; else P1OUT &= ~BIT3
#define  RISE  1
#define  FALL  0
void Delays(void);
void PutString(uchar *ptr);
void Hc_sr_Init(void);
void Hc_sr_Open(void);

uint TA_Overflow_Cnt; 
unsigned int cap_new = 0;           // 首次捕捉的ta0r值
unsigned int cap_old = 0;           // 二次捕捉的ta0r值
char cap_N = 0;                     // 溢出次数
char state = 0x00;              
long cap_data = 0;                  // 距离值
uint value = 0;


void main(void)
{
    
    Hc_sr_Init();                             //初始化定时器
    WDTCTL = WDTPW + WDTHOLD;                 // 关狗
    //初始化串口
    P3SEL |= 0xC0;                            // P3.6,7 = USART1 TXD/RXD
    ME2 |= UTXE1 + URXE1;                     // Enable USART1 TXD/RXD
    UCTL1 |= CHAR;                            // 8-bit character
    UTCTL1 |= SSEL0;                          // UCLK = ACLK
    UBR01 = 0x03;                             // 32k/9600 - 3.41
    UBR11 = 0x00;                             
    UMCTL1 = 0x4A;                            // Modulation
    UCTL1 &= ~SWRST;                          // Initialize USART state machine
    IE2 |= URXIE1;                            // Enable USART1 RX interrupt
    _EINT();
  
    while(1)
    {   
        Hc_sr_Open();
        while (!(IFG2 & UTXIFG1));
              TXBUF1 = (int)(cap_data);
        Delays();
        
    }
}

void PutString(uchar *ptr)
{
      while(*ptr != '\0')
      {
            while (!(IFG2 & UTXIFG1));                // TX缓存空闲
            TXBUF1 = *ptr++;                         // 发送数据
      }
      while (!(IFG2 & UTXIFG1));
      TXBUF1 = '\n';
}

void Delays(void)
{
    uchar i=20;
    uint j;
    while(i--)
    {
            j=2000;
            while(j--);
    }
}

void Hc_sr_Init(void)
{
   /*
    *  P1.2 为echo引脚             捕获模式
    *  P1.3 为Trig                 数字i/o模式
    */
    P1OUT &= ~( BIT2 + BIT3 );
    P1DIR |=  BIT3;
    P1SEL |=  BIT2;
    TACTL   = TASSEL_2 + ID_3 + MC_2 + TACLR + TAIE;
    TACCTL1 = CM_1 + SCS +CAP + CCIE + CCIS_0;
}
void Hc_sr_Open(void)           //生成一个持续10us的高电平
{
    Trig1(1);
    __delay_cycles(40);
    Trig1(0);
}
#pragma vector=TIMERA1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
    switch(TAIV)
  {

    case 2 :
          state =  TACCTL1 >> 14;
          TACCTL1 &= ~CCIFG;
          if( TACCTL1 & CM_1){
              cap_new = TACCR1;
              TACCTL1 &= ~CM_1;
              TACCTL1 |=  CM_2;
          }else if ( TACCTL1 & CM_2){
              cap_old = TACCR1;
              cap_data = ( cap_old - cap_new ) * 340/2000;    //转化为cm/s
              TACCTL1 &= ~CM_2;
              TACCTL1 |=  CM_1;
          }
     break;
   case 4: break;	 
   case 10: 
     TA_Overflow_Cnt++;//溢出标志 
     break;
   default:
     break;
 }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是msp430f5529的超声波测距代码,同时在OLED显示屏上显示距离: ```c #include <msp430.h> #include "oled.h" #define TRIG BIT0 // P1.0 #define ECHO BIT1 // P1.1 volatile int distance = 0; void main(void) { WDTCTL = WDTPW + WDTHOLD; // 停用看门狗定时器 P1OUT &= ~TRIG; // 将P1.0输出低电平 P1DIR |= TRIG; // P1.0设为输出 P1DIR &= ~ECHO; // P1.1设为输入 P1SEL |= ECHO; // P1.1设为TA0.1输入 TA0CTL = TASSEL_2 + MC_2; // SMCLK, 连续计数模式 TA0CCTL1 = CAP + CM_3 + CCIS_0 + SCS + CCIE; // 捕获模式, 上升/下降沿捕获, TA0.1输入选择, 同步捕获, 捕获中断使能 OLED_Init(); // 初始化OLED显示屏 OLED_Clear(); // 清屏 __enable_interrupt(); // 使能中断 while(1) { P1OUT |= TRIG; // 将P1.0输出高电平 __delay_cycles(10); // 延时10us P1OUT &= ~TRIG; // 将P1.0输出低电平 __delay_cycles(30000); // 延时30ms if(distance > 0 && distance < 50) // 超声波测距范围为2cm-4m { OLED_ShowString(0, 0, "Distance:"); // 在OLED显示屏上显示"Distance:" OLED_ShowNum(60, 0, distance, 3, 16); // 在OLED显示屏上显示距离 } } } #pragma vector = TIMER0_A1_VECTOR // TA0.1中断向量 __interrupt void Timer_A(void) { static unsigned int last_capture = 0; unsigned int current_capture = TA0CCR1; if(TA0CCTL1 & CCI) { distance = (current_capture - last_capture) / 58; // 计算距离 } last_capture = current_capture; TA0CCTL1 &= ~CCIFG; // 清除中断标志位 } ``` 这段代码使用了msp430f5529的TIMER0_A1模块进行超声波测距超声波模块的TRIG引脚连接到P1.0,ECHO引脚连接到P1.1,测距范围为2cm-4m。在距离小于50cm时,在OLED显示屏上显示距离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值