本实验是基于MSP430利用HC-SR04超声波传感器进行测距,测距范围是3-65cm,讲得到的数据显示在LCD 1602液晶屏上。

模块工作原理如下

(1)采用 IO 触发测距,给至少 10us 的高电平信号;

(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;

(3)有信号返回,通过 IO 输出一高电平,高电平持续的时间就是超声波从发射到返回的时间

(4计算测试距离测试距离=(高电平时间*声速(340M/S))/2;

根据工作原理,我们可以选择两种模式驱动

1.       采用中断+定时器方式,将ECHO定义为上升沿下降沿都能触发中断,trig触发之后,echo高电平进中断打开定时器,echo低电平关闭定时器并统计定时器计数值

2.       采用普通IO+定时器模式,触发之后等待echo响应,响应时打开定时器,直到echo恢复低关闭定时器,获取时间

此处我采用的是第一种模式,利用MSP430的timerA 的捕获比较模式,在程序的中断中处理得到的数据,并转化成距离。

1:此模块不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。否则会影响

模块工作。

2:测距时,被测物体的面积不少于0.5平方米且要尽量平整。否则会影响测试结果。在下载程序的时候建议将连接echo的一端断开,避免出现不必要的问题。

/**********************************************************代码***************************************************/

//功能说明:   1602显示 超声波模块测距   串口发送至上位机
#include <msp430x14x.h>
#include "Config.h"
#include "1602.c"
#include "UART.h"int count = 0;
int flag = 0;#define uchar unsigned char
#define uint unsigned int
/***************????*******************************/
#define trig_H P2OUT|=BIT0 //????
#define trig_L P2OUT&=~BIT0
#define echo P2IN & BIT1 //????  uint cnt;
unsigned long int tim_data,dista_data,dista_data_all,dista_data_sum;
/***************??*******************************/
void delay(uint n)
{   uchar i;  for(;n>0;n--)  for(i=10;i>0;i--);
}
/********************??,????????***************/
void dista_f(unsigned long int distance_data)
{  dista_data_all=dista_data_all+distance_data;  cnt=cnt+1;  if(cnt==16)   {  cnt=0;  dista_data_sum=dista_data_all>>4;  dista_data_all=0;  LCD1602_write_double(13,1,dista_data_sum);   //?1602?????   LCD1602_write_char(14,1,'m');  LCD1602_write_char(15,1,'m');  //Print_float(dista_data_sum, 2);}
}  /**************???io?********************/
void Init_IO()
{  P2DIR = 0XFD;  P2OUT |= 0XFF;  P2IE |= BIT1;                               //??P2????  P2IES &=~BIT1;                              //????????
}  /**************??????******************/
void Init_Timer()
{  TACTL|=TACLR+TASSEL_2+ID_3;                   //???A???  //TACTL |= TASSEL1 + TACLR + ID0 + ID1 + MC0 + TAIE;//TACCR0 = 9999;
}
void InitTimerB(){TBCTL=TBSSEL1+ID1+ID0+MC0+TBCLR;//选择1/8SMCLK 增计数 清除TARTBCCTL0=CCIE;//CCR0中断允许 比较模式TBCCR0=10000;//时间间隔10ms
}
/************???**************************/
void main( void )
{  WDTCTL = WDTPW + WDTHOLD;                   //?????  Clock_Init();InitTimerB(); Init_IO(); UART_Init();Start_1602();                                //??1602  tim_data=0;cnt=0;dista_data=0;                delay(1000);   //????  uchar string[] = "distance:";  LCD1602_write_str(0, 0, string);  _EINT();                                    //?????  while(1)  {  /*if(flag == 1){Print_float(dista_data_sum, 2);flag = 0;}*/trig_H;                                   //?????  delay(2);                                 //??15us  trig_L;                                   //?????  delay(50);                                //????  while(echo);                              //????  delay(1000);                              //???? }
}
/*****************************P2???*******************/
#pragma vector=PORT2_VECTOR
__interrupt void port_init(void)
{  if(echo)                                      //?????  {  TACTL|=TACLR+TASSEL_2+ID_3;  TACTL|=MC_2;                                //?????,?????????   P2IES|=BIT1;                                //??P2??????  }  else                                          //?????  {  TACTL=0;                                    //????,????  TACTL|=TASSEL_2+ID_3;  P2IES&=~BIT1;                               //??P2??????       tim_data=TAR;                               //????   dista_data=(tim_data*1000/58);              //?????(??=us/58)   //dista_data=(tim_data*17/100);             dista_f(dista_data);                        //??????  }  P2IFG&=~BIT1;                                 // P2???????
}  #pragma vector=TIMERB0_VECTOR
__interrupt void TimerBINT()
{count++;if(count>=300){Print_float(dista_data_sum, 2);//flag = 1;count = 0;}
}


/*********************************clock.c**********************************/
//****************************************************
//*************时钟源模块
//****************************************************#include <msp430x14x.h>
#include "config.h"
#include "clock.h"/********************系统时钟初始化****************/
void init_clk(void) //初始化系统时钟
{uchar i;BCSCTL1 &=~XT2OFF; //打开XT2振荡器BCSCTL2 |=SELM_2+SELS;do{IFG1 &=~OFIFG; //清除错误标志for(i=0;i<0xff;i++); //延时等待}while((IFG1 & OFIFG)!=0);IFG1 &=~ OFIFG;
}
/*******************************************1602.c***********************************/
#include <msp430x14x.h>
#include "Config.h"
#include "clock.h"
#include "1602.h"
//*************************************************************************
//          初始化IO口子程序
//*************************************************************************
void LCD1602Port_init()
{P4SEL = 0x00;P4DIR = 0xFF;                   //数据口输出模式P5SEL = 0x00;P5DIR|= BIT5 + BIT6 + BIT7;     //控制口设置为输出模式
}//***********************************************************************
//  显示屏命令写入函数
//***********************************************************************
void LCD1602_write_com(unsigned char com)
{   RS_CLR;RW_CLR;EN_SET;DataPort = com;                 //命令写入端口delay_ms(5);EN_CLR;
}//***********************************************************************
//  显示屏数据写入函数
//***********************************************************************
void LCD1602_write_data(unsigned char data)
{RS_SET;RW_CLR;EN_SET;DataPort = data;                //数据写入端口delay_ms(5);EN_CLR;
}//***********************************************************************
//  显示屏清空显示
//***********************************************************************
void LCD1602_clear(void)
{LCD1602_write_com(0x01);            //清屏幕显示delay_ms(5);
}//***********************************************************************
//  显示屏字符串写入函数
//***********************************************************************
void LCD1602_write_str(unsigned char x,unsigned char y,unsigned char *s)
{if (y == 0) {LCD1602_write_com(0x80 + x);        //第一行显示}else {LCD1602_write_com(0xC0 + x);        //第二行显示}while (*s) {LCD1602_write_data( *s);s ++;}
}//***********************************************************************
//  显示屏单字符写入函数
//***********************************************************************
void LCD1602_write_char(unsigned char x,unsigned char y,unsigned char data)
{if (y == 0) {LCD1602_write_com(0x80 + x);        //第一行显示}else {LCD1602_write_com(0xC0 + x);        //第二行显示}LCD1602_write_data( data);
}//***********************************************************************
//  显示屏初始化函数
//***********************************************************************
void LCD1602_init(void)
{LCD1602_write_com(0x38);       //显示模式设置  delay_ms(5);LCD1602_write_com(0x08);      //显示关闭delay_ms(5);LCD1602_write_com(0x01);      //显示清屏delay_ms(5);LCD1602_write_com(0x06);      //显示光标移动设置delay_ms(5);LCD1602_write_com(0x0C);      //显示开及光标设置delay_ms(5);
}void LCD1602_write_double(unsigned char x,unsigned char y,unsigned int data)
{uchar i;for(i=0;i<6;i++){if(i==2)LCD1602_write_char( x--, y, '.');else{  LCD1602_write_char( x--, y, 0x30+data%10);data=data/10;}}
}void LCD1602_write_int(unsigned char x,unsigned char y,unsigned int data)
{uchar i;for(i=0;i<2;i++){ LCD1602_write_char( x--, y, 0x30+data%10);data=data/10;}
}void Start_1602()
{LCD1602Port_init();                //系统初始化,设置IO口属性delay_ms(100);                     //延时100msLCD1602_init();                    //液晶参数初始化设置
}

uart.h
#ifndef _UART_H_
#define _UART_H_
#include "msp430x14x.h"
void Print_Str(uchar *s);
//*************************************************************************
//               MSP430?????
//*************************************************************************
void UART_Init()
{U0CTL|=SWRST + CHAR;                //??SWRST,8?????U0TCTL|=SSEL1;                      //SMCLK?????U0BR1=baud_h;                       //BRCLK=8MHZ,Baud=BRCLK/NU0BR0=baud_l;                       //N=UBR+(UxMCTL)/8U0MCTL=0x00;                        //??????0,???9600bpsME1|=UTXE0;                         //UART0????ME1|=URXE0;                         //UART0????U0CTL&=~SWRST;IE1|=URXIE0;                        //???????P3SEL|= BIT4 + BIT5;                //??IO????????,??UART??P3DIR|= BIT4;                       //??TXD0??????
}//*************************************************************************
//              ??0??????
//*************************************************************************void Send_Byte(uchar data)
{while(!(IFG1&UTXIFG0));          //?????????????U0TXBUF=data;
}
//***************************************//
void Print_float(unsigned int  t, unsigned char position)//?????   position ???????
{unsigned int s_int[5] = {0};int i = 0;while(t>0){s_int[i++] = t%10;t=t/10;}for(i=4;i>=0;i--)  {  if(i==position) {Send_Byte(0x30 + s_int[i]);Send_Byte(0x2E);  }else  {    Send_Byte(0x30 + s_int[i]);   }  }//delay_ms(100);Send_Byte('m');Send_Byte('m');Send_Byte(' ');delay_ms(100);
}
//*************************************************************************
//              ??0??int???
//*************************************************************************
void Print_int(unsigned int  t)
{unsigned int s_int[5];unsigned int i = 1;while(t>0){s_int[i] = t%10;t=t/10;i++;}i--;while(i){Send_Byte(0x30 + s_int[i]);i--;}
}//*************************************************************************
//              ??0???????
//*************************************************************************
void Print_Str(uchar *s)
{while(*s != '\0'){Send_Byte(*s++);}
}
#endif
												

超声波传感器测距实验相关推荐

  1. 超声波传感器测距c语言编程,超声波传感器和stc89c51单片机的c语言代码

    #include         //器件配置文件 #include #define  RX  P1_1 #define  TX  P1_2 #define LCM_RW  P0_6 //定义LCD引 ...

  2. 基于超声波传感器的液位测量及控制系统设计(STM32)

    一.引言 随着工业的发展,计算机.微电子.传感器等高新技术的应用和研究,液位仪表的研制得到了长足的发展,以适应越来越高的应用要求.液位的测量在工业生产过程中已经起着相当重要的作用,其类型大概可以分为接 ...

  3. 超声波测距系统(stc89c52单片机+lcd1602+srf04超声波传感器+DS18B20温度传感器+无源蜂鸣器)

    求赞,它是我写博客的动力,请鼓励鼓励我,谢谢 基于超声波测距的倒车报警系统. 计划通过超声波传感器测距,温度传感器校正误差,lcd1602显示结果,距离小于某一值时将蜂鸣报警. 总体设计思路 HC-S ...

  4. 利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验

    前两周做基于STM32F407芯片的嵌入式系统设计的实验,主要完成利用超声波测距(电脑上用串口显示超声波所测距离,障碍物近于20cm时,使LED灯闪烁,并且可以通过串口更改报警距离)和利用编码器读取电 ...

  5. 使用Arduino和超声波传感器实现简单测距

    使用HC-SR04超声波传感器和Arduino MEGA 2560实现简单测距 一.一个超声波传感器的使用 1.接线部分 2.代码部分 3.在串口看测到的数据 二.两个超声波传感器的使用 1.接线部分 ...

  6. 超声波传感器与液晶屏显示实验

    实验二  超声波传感器与液晶屏显示实验 一.实验目的 了解液晶屏显示的基本原理以及电路连接. 二.实验内容  了解液晶屏的工作原理和工作情况. 三.实验仪器 导线若干,1602液晶显示屏,LY-F2 ...

  7. Arduino中使用超声波测距实验

    尽管网上已经有很多使用超声波测距的案例,但为了配合我们的前面用Processing写好的雷达扫描程序付诸实践,所以我们还是要把超声波的测距的完整步骤在这里列出来,以供初学者来参考,尤其是让前面看到了P ...

  8. US100超声波测距传感器linux,US100超声波传感器手册

    US100超声波传感器手册 (2011-08-13 17:42:47) 标签: 杂谈 US-100 超声波测距模块 1. 概述 US-100 超声波测距模块可实现2cm~4.5m 的非接触测距功 能, ...

  9. stm32f429+超声波传感器HC-SR04 -- 测距

    工具 1. 开发板stm32f429(f4系列的应该都可以) 2. 超声波传感器,型号为HC-SR04 HC-SR04接线 HC-SR04 stm32f4 VCC VCC(5V) GND GND Tr ...

  10. 使用超声波传感器实现检测和测距的RADAR雷达原型

    在本篇文章中,我们使用Arduino开发板和超声波传感器设计了一款雷达模型,用于检测和测距.RADAR是一种物体检测系统,它使用无线电波来识别物体的范围.高度.方向和速度.雷达天线发射的无线电波脉冲会 ...

最新文章

  1. jQuery EasyUI DataGrid 分页 FOR ASP.NET
  2. Facebook成立AI语言研究联盟,自然语言处理或有新成果
  3. python决策树sklearn_请问python中的sklearn中决策树使用的是哪一种算法呢?
  4. Checkstyle 简介 以及各版本下载地址
  5. 安装phpstudy之后发现80端口被占用
  6. 【原题】【noip 2003 T2】【动态规划】加分二叉树
  7. 纪中C组模拟赛总结(2019.8.9)
  8. 创建office一直转圈_Windows写字板出现广告条幅:推荐用户使用在线版Office
  9. 知乎阅读三百万的生信学习指南
  10. mysql optimizer mrr_MySQL优化器功能开关optimizer_switch
  11. Rust中Box、Rc、Arc、Cell、RefCell、Cow简介
  12. 插入移动硬盘_Win10插入移动硬盘或U盘有提示声但电脑中不显示的解决方法
  13. Golang go-huge-util 工具库介绍
  14. 《宝岛双雄》曝正式海报 房祖名挑大梁的银幕转型之作
  15. 三菱FX5U位逻辑指令
  16. HTML-CSS小知识——box-shadow的使用
  17. 商务智能-第五章 多维建模
  18. 编程易筋经:内存解析之实例讲解
  19. Sizes of tensors must match except in dimension 1. Expected size 24 but got size 25 for tensor numbe
  20. 网络安全岗位缺口已达70万,你该不会还不知道如何入门吧?

热门文章

  1. 常用的项目管理工具有哪些?
  2. 项目管理知识体系的构成-5个过程组,9大知识域
  3. 做短视频的几个小技巧,助你吸粉引流
  4. 计算机的储存容量1kb等于多少byte,1M等于多少字节?
  5. Eclipse连接小米手机无连接显示解决办法
  6. 如何避免成为一个油腻的中年猥琐男
  7. 设计测试用例需要注意的点
  8. 有监督学习与无监督学习的几大区别
  9. 可孚医疗的数字化突围
  10. 2021厦门湖滨中学高考成绩查询,厦门各高中本科上线率2020