• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 使用UART与PC通信实现msp430g2553单片机超声波测距示例

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了超声波测距,超声波测距模块,超声波测距原理,超声波测距c程序,超声波测距电路图等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

/*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<ACCU_GRD-1;i++)            //转化核心算法
  {
    if(i==4)
    {
      trans[i] = '.';                  
      continue;
    }
    trans[i] = '0'+ distance/f;
    distance %= f;
    f /= 10;
  }
  trans[ACCU_GRD-1] = '\0';                   
  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("\n\r");
  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;              &

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-05-28C++类模板与模板类深入详解
  • 2017-05-28浅谈C++中虚函数实现原理揭秘
  • 2017-05-28输出1000以内的素数的算法(实例代码)
  • 2017-05-28C语言编程中函数的基本学习教程
  • 2017-05-28C++实现寻找最低公共父节点的方法
  • 2017-05-28用C++实现一个链式栈的实例代码
  • 2017-05-28深入分析C++派生类中的保护成员继承
  • 2017-05-28C++线程池的简单实现方法
  • 2017-05-28Android App仿微信界面切换时Tab图标变色效果的制作方法
  • 2017-05-28C++设计模式编程中简单工厂与工厂方法模式的实例对比

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言堆栈入门指南
    • 浅析C/C++变量在内存中的分布
    • 基于结构体与指针的详解
    • C++ operator关键字(重载操作符)的用法详解
    • 用C语言获取文件的大小示例分享
    • C++设计模式编程中proxy代理模式的使用实例
    • C++实现String类实例代码
    • 四叉树有损位图压缩处理程序示例
    • WIN32程序获取父进程ID的方法
    • C语言单链表的实现

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有