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

适用于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-SR04 Echo
#define TRIG BIT4                       //HC-SR04 Trig
#define ACCU_GRD 7   //Accuracy Grade "xxx.x"+'\0'                   
#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<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;                       
  P1DIR = TRIG + LED_1;
  init_timer1();
  init_uart();
  while(1)
  {  
   int c = 8;
   while(c--)
   delay();
   if(TA1CCTL1 & CCIFG)
   TA1CCTL1 &= ~CCIFG;
   once_pro();
  }
}

(0)

相关推荐

  • PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法

    本文实例讲述了PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法.分享给大家供大家参考.具体分析如下: PHP 连接 MSSQL 的新手经常遇到这个问题:数据库里面的 nvarchar 字段中数据一切正常,但是用 PHP 查询出来却发现长度只有 255,我们都知道,在 MySQL 里面 varchar 的长度只有 255,但是 MSSQL 却不是,不会是 PHP 将 nvarchar 按照 MySQL 的 varchar 处理了吧. 本文给出了解决方法: 复制代码 代码如下:

  • 了解Powershell中的Exit函数

    Powershell支持"EXIT"关键字,它的范围是基于作用域的,它可能比你想象的工作方式要不同. 让我们来测试下这个函数: 复制代码 代码如下: function test {   'A'   exit   'B' } 当你保存并调用脚本,你将得到: 复制代码 代码如下: PS> C:\Users\Tobias\Documents\PowerShell\test12343.ps1 A 这时"exit"过早的结束了这个函数.可是当你没有保存当前脚本或当你调用

  • PowerShell中使用return语句退出函数例子

    本文介绍在自定义PowerShell函数时,可以使用return语句来退出函数,同时return语句也可以返回值给函数的调用者. 使用return语句来直接退出函数.看一个退出函数的例子: 复制代码 代码如下: function Get-NamedProcess {     param     ($name=$null)     if ($name -eq $null)     {         Write-Host -ForegroundColor Red 'Specify a name!'

  • Powershell的break、continue和return简单总结

    在Powershell中有两个特殊的关键字,就是你使用在循环中的break和continue. 看下这个"continue",循环中的继续就是跳过其中的剩余代码.当你使用一个"break",这个循环将提前结束但是会返回当前所有结果. 除此之外,关键字"return",它将马上退出当前的作用域.所以当你在函数中执行"return",这时函数将会结束,同时当你在脚本中执行"return",这时脚本也将结束.

  • 恶意网站4255.biz的完美解决办法

    问题提出和症状:最近上网碰到这个网站(4255.biz),无意中了它的招,之后每当访问其他网站的时候,都会从4255.biz 上下载数据,并且其他网站都不能下载完整,不能正常访问,郁闷了好久,尤其是带框架的网站干脆就出不来. (该图为诺顿报毒和处理结果)分析:(此分析内容为C.I.S.R.T.博客小陌摘录) 打开该网页后,就可以看到三个恶意网址: 001.htm用到的是MS07-017漏洞的网马:002.htm用到的是MS06-014漏洞的网马:003.htm会下载ccc.html(其实是个ch

  • exit(-1)或者return(-1)shell得到的退出码为什么是255

    下面我写了一个hello world程序,一起看看吧: // filename: main.c #include <stdio.h> int main(void) { printf("hello wolrd!\n"); return(-); } 编译执行:gcc main.c && ./a.out 现在我们看看在当前shell中返回上一个执行过程的返回值是多少,是 "-1" 吗? inuyasha@inuyasha-Aspire-4741

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

    适用于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

  • java线程间通信的通俗解释及代码示例

    线程间通信:由于多线程共享地址空间和数据空间,所以多个线程间的通信是一个线程的数据可以直接提供给其他线程使用,而不必通过操作系统(也就是内核的调度). 进程间的通信则不同,它的数据空间的独立性决定了它的通信相对比较复杂,需要通过操作系统.以前进程间的通信只能是单机版的,现在操作系统都继承了基于套接字(socket)的进程间的通信机制.这样进程间的通信就不局限于单台计算机了,实现了网络通信.线程通信主要分为以下几个部分,下面通过生活中图书馆借书的例子简单讲解以下: 通过共享对象通信 加入图书馆只有

  • Vue PC端实现扫码登录功能示例代码

    目录 需求描述 思路解析 前端功能实现 如何控制二维码的时效性? 前端如何获取服务器二维码的状态? 本篇文章给大家带来了关于Vue的相关知识,其中主要介绍了在PC端实现扫码的原理是什么?怎么生成二维码图片?怎么用Vue实现前端扫码登录?感兴趣的朋友,下面一起来看一下吧,希望对大家有帮助. 需求描述 目前大多数PC端应用都有配套的移动端APP,如微信,淘宝等,通过使用手机APP上的扫一扫功能去扫页面二维码图片进行登录,使得用户登录操作更方便,安全,快捷. 思路解析 PC 扫码原理? 扫码登录功能涉

  • 总结Python连接CS2000的详细步骤

    前言 记录CS2000设备使用串口连接以及相关控制. CS2000是一台分光辐射亮度计,也就是可以测量光源的亮度.详细的规格网址参考CS2000/CS-2000A,所有信息以柯尼卡美能达官网的参数以及使用手册为主. 使用目的及环境 当前的使用目的是使用PC端控制CS2000,测量屏幕的亮度数据. PC端使用Python,在Win10环境下开发: 需要额外安装的模块:pySerial: 设备连接方法 这台设备是支持USB1.1 Full-Speed和RS-232C的.其配套的软件CS-S10是使用

  • go操作Kafka使用示例详解

    目录 1. Kafka介绍 1.1 Kafka是什么 1.2 Kafka的特点 1.3 常用的场景 1.4 Kafka中包含以下基础概念 1.5 消息 1.6 消息格式 2. Kafka深层介绍 2.1 架构介绍 2.2 ⼯作流程 2.3 选择partition的原则 2.4 ACK应答机制 2.5 Topic和数据⽇志 2.6 Partition结构 2.7 消费数据 3. 操作Kafka 3.1 sarama 3.2 下载及安装 3.3 连接kafka发送消息 3.4 连接kafka消费消息

  • C++ 中const和复合类型

    1.const和引用 可以把引用绑定在常量上,称之为,对常量的引用.不能对那个引用赋值. 如: const int ci = 1024; const int &ri = ci; 解读:ri是对ci的引用.ri的const意思是视ci为变量. 对于常量,只能使用"对常量的引用"这个引用方式 int &ri = ci;是错误的,因为ci不能赋值,但是可能会对ri赋值从而影响const限定. 所以,他们(制定标准的人)创造了 对常量的引用 的 引用方式. 下面高能!!! 上面

  • Java编程Post数据请求和接收代码详解

    这两天在做http服务端请求操作,客户端post数据到服务端后,服务端通过request.getParameter()进行请求,无法读取到数据,搜索了一下发现是因为设置为text/plain模式才导致读取不到数据 urlConn.setRequestProperty("Content-Type","text/plain; charset=utf-8"); 若设置为以下方式,则通过request.getParameter()可以读取到数据 urlConn.setReq

  • Python中的TCP socket写法示例

    前言 本文主要介绍了关于Python中TCP socket的写法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一. 服务器server的写法: 1. 创建 socket 套接字: 网络编程接口 socket(family = AF_INET , type = SOCKET_STREM,proto = 0, fileno = None)   提供了多种socket family.AF_INET 是默认的family,需要绑定IP和端口. 127.0.0.1是一个特殊的IP地址

  • Android neon 优化实践示例

    目录 搭建实验环境 小试牛刀 实战尝试 CMake添加汇编支持 实现汇编Neon优化 搭建实验环境 首先新建一个包含native代码的项目: 然后在gradle中添加对neon的支持: externalNativeBuild { cmake { cppFlags "-std=c++14" arguments "-DANDROID_ARM_NEON=TRUE" } } 这样,项目就可以支持neon加速了. 小试牛刀 一个最简单的neon编程的流程大致是这样的: 1.装

  • VSCode Webview中实现点击下载图片的基本流程

    众所周知,在一个普通的HTML页面中,如果要实现一个链接点击后下载图片,只需要在页面上放一个<a>标签,然后将属性href的值指向图片的URL或者Base64字符串就可以了.或者按照stackoverflow上提供的方法动态创建<a>标签来完成图片的下载动作.不过原理都是相同的. 但是这个方法在VSCode的Webview中不起作用,点击链接之后没有任何反应.如果图片的地址是一个可以独立访问的绝对地址,例如任何一个互联网上可以访问到的图片地址,则点击链接之后VSCode会将图片在浏

随机推荐