使用UART与PC通信实现msp430g2553单片机超声波测距示例

   这篇文章主要介绍了使用UART与PC通信实现msp430g2553单片机超声波测距示例,需要的朋友可以参考下

  适用于msp430g2553单片机 使用到了hc-sr04超声测距模块,使用UART与PC通信。

  代码如下:

  #include

  long current_time;//最近一次测得时间

  /*MyPro*/

  #define LED_1 BIT0

  #define SW_2 BIT3

  #define TA1_1 BIT2 //TA0.1 HC-SR04 Echo

  #define TRIG BIT4 //HC-SR04 Trig

  #define ACCU_GRD 7 //Accuracy Grade "xxx.x"+''

  #define MIN_UNIT_TO1M 1000 //1 m to 1 mm

  /*TIMER0*/

  #define SOUR_CLK 1045000

  #define DIV_CLK_1 1

  #define SYS_CLK_SIG_1 SOUR_CLK/DIV_CLK_1

  #define DISTANCE 45//dm

  #define TIMER_RIG_MAX 0xffff

  #define MAX_TIME_1 DISTANCE*2/34*SYS_CLK_SIG_1

  #ifdef MAX_TIME_1

  #define SYS_CLK SYS_CLK_SIG_1

  #endif

  #define UART_TXD BIT2

  void init_timer1()

  {

  P2SEL |= TA1_1; //TA1.1 CCI1B be used

  P2DIR &= ~TA1_1;

  TA1CTL = MC_0 + TASSEL_2; //TimerA_0 stop mode,clock=1Mhz

  TA1CCTL1 = CCIE + SCCI + CCIS_1 + SCS + CAP + CM_2; //TA0CC1 capture mode + down edge

  }

  /*UART*/

  void init_uart() //USCI 初始化函数

  {

  UCA0CTL1 |= UCSWRST; //初始化串口寄存器

  UCA0CTL1 |= UCSSEL_2; //选择子系统时钟 1.045MHz

  UCA0BR0 = 0x6d; //波特率为9600

  UCA0BR1 = 0x00;

  P1SEL |= UART_TXD;

  P1SEL2 |= UART_TXD;

  P1DIR |= UART_TXD; //将P1.2设为第二功能

  UCA0CTL1 &= ~UCSWRST; //初始化结束

  }

  long cal_distance() //通过测得时间计算距离

  {

  return (long)((340*(0.5000*current_time/SYS_CLK)*MIN_UNIT_TO1M));

  }

  void delay() //粗略延迟

  {

  unsigned char i,j;

  for(i=124;i>0;i--)

  for(j=8;j>0;j--);

  }

  static char * translater(long distance) //将测得的距离以字符串形式存储

  {

  static char trans[ACCU_GRD];

  int i;

  long f;

  trans[0]=' ';

  if(distance)

  for(i=1,f=MIN_UNIT_TO1M;i

  {

  if(i==4)

  {

  trans[i] = '.';

  continue;

  }

  trans[i] = '0'+ distance/f;

  distance %= f;

  f /= 10;

  }

  trans[ACCU_GRD-1] = '';

  return trans;

  }

  void once_pro() //发一次超声波

  {

  if(TA1CCTL1 & COV)

  TA1CCTL1 &= ~COV;

  if(!(P1IN & BIT3))

  {

  TA1R = 0;

  P1OUT |= TRIG; //Trig 10 us 高电平

  _EINT();

  TA1CTL |= MC_2; //continue mode

  P1OUT &= ~TRIG;

  P1OUT |= LED_1;

  while(TA1CCTL1 & CCIFG); //等待 捕捉中断结束

  }

  else

  {

  P1OUT &= ~LED_1;

  _DINT();

  }

  }

  void uart_txstring(char *string) //UART_TX 发送一个串

  {

  int i=0;

  while(string[i++])

  {

  switch (i) //过滤无效 '0'

  {

  case 1:if(string[i]=='0') continue;

  case 2:if(string[i]=='0'&&string[i-1]=='0') continue;

  }

  UCA0TXBUF = string[i];

  delay();

  }

  }

  /*UART_ISR*/

  #pragma vector = USCIAB0TX_VECTOR

  __interrupt void usci_txdistance() //向 PC 发送 测得的距离

  {

  uart_txstring("nr");

  uart_txstring(" Current ");

  uart_txstring(" distance: ");

  uart_txstring(translater(cal_distance()));

  uart_txstring(" cm");

  IE2 &= ~UCA0TXIE;

  }

  /*TIMER0_INT_ISR*/

  #pragma vector = TIMER1_A1_VECTOR

  __interrupt void capture()

  {

  current_time = TA1CCR1;

  TA1CTL &= ~MC_2;

  TA1CCTL1 &= ~CCIFG; //清CC1中断标志位

  IE2 |= UCA0TXIE;

  }

  /*Main*/

  void main()

  {

  WDTCTL = WDTPW + WDTHOLD; //关狗

  DCOCTL = 0;

  BCSCTL1 = CALBC1_1MHZ;

  DCOCTL = CALDCO_1MHZ;

  P1OUT = 0;

  P2OUT = 0;

  P1REN |= SW_2;

  P2REN |= TA1_1;

  P1OUT |= SW_2;

  P1DIR &= ~SW_2;

  P1DIR = TRIG + LED_1;

  init_timer1();

  init_uart();

  while(1)

  {

  int c = 8;

  while(c--)

  delay();

  if(TA1CCTL1 & CCIFG)

  TA1CCTL1 &= ~CCIFG;

  once_pro();

  }

  }

时间: 2024-11-03 20:14:10

使用UART与PC通信实现msp430g2553单片机超声波测距示例的相关文章

使用UART与PC通信实现msp430g2553单片机超声波测距示例_C 语言

适用于msp430g2553单片机  使用到了hc-sr04超声测距模块,使用UART与PC通信. 复制代码 代码如下: #include <msp430.h>long current_time;//最近一次测得时间/*MyPro*/#define LED_1 BIT0                      #define SW_2 BIT3                       #define TA1_1 BIT2                      //TA0.1 HC-S

通讯-基于VB的三菱PLC跟PC通信的(读取PLC的X寄存器状态)的例子

问题描述 基于VB的三菱PLC跟PC通信的(读取PLC的X寄存器状态)的例子 PLC是FX3u-48M的,小弟想做一个通讯的试验,我给PLC 的X0高电平后,想从VB上的程序读出X寄存器为高电平或低电平,Y寄存器的通断可以,但是要读X寄存器的状态该怎样设置?

用spi接口与74hc595通信 的pic单片机的代码给数码管

问题描述 用spi接口与74hc595通信 的pic单片机的代码给数码管 用spi接口与74hc595通信 的pic单片机的代码 按照datasheet写 总是不显示 解决方案 595是串行接口,按照一定时序将串行数据转换为并行数据,,spi接口配置时序是否与595要求的一致,以及595其他控制信号是否配置合适.不建议用spi控制,建议用普通io模拟就可以了.

sync ocket-GCDAsyncSocket手机客户端与PC通信,真机无法执行到didconnecttohost函数

问题描述 GCDAsyncSocket手机客户端与PC通信,真机无法执行到didconnecttohost函数 直接用的网上的GCDAsyncSocket包,想实现手机发送数据到PC机. [asyncSocket connectToHost:host onPort:port error:&err]这一步可以正常返回,并返回true,但是 -(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uin

安卓应用开发-安卓蓝牙通信 基于底层单片机蓝牙模块的通信

问题描述 安卓蓝牙通信 基于底层单片机蓝牙模块的通信 现在在做一个app项目,负责显示由底层单片机蓝牙模块发送过来的数据,单片机 不断循环发送 s234,而我这边显示不全,一会儿显示s,一会儿显示234开发-安卓蓝牙通信 基于底层单片机蓝牙模块的通信-单片机与蓝牙模块通信"> 解决方案 安卓蓝牙通信安卓蓝牙通信安卓蓝牙通信 解决方案二: 可以设置发送接收标志,单片机发送一个标志告诉安卓端应用,准备开始接收有效数据,单片机发送完后再发送结束标志,告诉安卓端应用发送完成. 安卓端的应用如果没收

usb-Android 使用Usb调试模式如何与PC通信

问题描述 Android 使用Usb调试模式如何与PC通信 我现在想通过Android系统自带的adb实现个功能 是想实现个这样的功能,Android 与PC通过usb连接, 在PC上有个界面输入:123abcd 然后马上在Android程序的界面显示刚才输入的内容,这个应该怎么实现那 高手给个思路啊 解决方案 建议使用socekt连接传递数据 解决方案二: 参考 http://blog.csdn.net/hsp1990/article/details/21978327

串口通信-求51单片机用uart发送接收到的字符串

问题描述 求51单片机用uart发送接收到的字符串 51单片机用uart 把接收到的字符串 自动显示在串口调试助手上的代码. 解决方案 如果你的单片机代码支持收发,你可以直接在硬件上 将 RX 和 TX 端口短接,这样你在PC 上面发什么下来,同时PC 就会接收到什么.

请教一下广域网中两台PC通信的问题。

问题描述 我们这个小单位不是软件公司,软件开发除了本人略知皮毛外,其他人都不懂.为了满足一个客户的需求,昨天领导突发奇想,说要通过3G上网卡,让两台PC进行类似局域网的通信运算.具体情况如下:一台PC通过标签打印机打印二维码,将条码信息通过广域网传到远端另一台PC的数据库中.本人对计算机网络一知半解,感觉头有点大.首先两台PC的IP都不是固定的.需要构建网络服务器吗?构建服务器步骤是什么?如果不用服务器,只用静态IP能否实现?这种广域网点对点传输数据,用底层的Socket流传输是不是不稳定也不安

C#我做了个PC发送系统时间到单片机!!熟悉串口通讯的帮帮忙谢谢!!

问题描述 代码片段!Port1=comboBox1.Text.ToString();Baud=Int16.Parse(comboBox2.Text);sp1.Open();sum="A"+"3"+sth+stm;this.textBox1.AppendText("rn端口重新打开发送中!!");data=Encoding.Unicode.GetBytes(sum);//放入数组stringstr=Convert.ToBase64String(da