超声波传感器测距实验
本实验是基于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
超声波传感器测距实验相关推荐
- 超声波传感器测距c语言编程,超声波传感器和stc89c51单片机的c语言代码
#include //器件配置文件 #include #define RX P1_1 #define TX P1_2 #define LCM_RW P0_6 //定义LCD引 ...
- 基于超声波传感器的液位测量及控制系统设计(STM32)
一.引言 随着工业的发展,计算机.微电子.传感器等高新技术的应用和研究,液位仪表的研制得到了长足的发展,以适应越来越高的应用要求.液位的测量在工业生产过程中已经起着相当重要的作用,其类型大概可以分为接 ...
- 超声波测距系统(stc89c52单片机+lcd1602+srf04超声波传感器+DS18B20温度传感器+无源蜂鸣器)
求赞,它是我写博客的动力,请鼓励鼓励我,谢谢 基于超声波测距的倒车报警系统. 计划通过超声波传感器测距,温度传感器校正误差,lcd1602显示结果,距离小于某一值时将蜂鸣报警. 总体设计思路 HC-S ...
- 利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验
前两周做基于STM32F407芯片的嵌入式系统设计的实验,主要完成利用超声波测距(电脑上用串口显示超声波所测距离,障碍物近于20cm时,使LED灯闪烁,并且可以通过串口更改报警距离)和利用编码器读取电 ...
- 使用Arduino和超声波传感器实现简单测距
使用HC-SR04超声波传感器和Arduino MEGA 2560实现简单测距 一.一个超声波传感器的使用 1.接线部分 2.代码部分 3.在串口看测到的数据 二.两个超声波传感器的使用 1.接线部分 ...
- 超声波传感器与液晶屏显示实验
实验二 超声波传感器与液晶屏显示实验 一.实验目的 了解液晶屏显示的基本原理以及电路连接. 二.实验内容 了解液晶屏的工作原理和工作情况. 三.实验仪器 导线若干,1602液晶显示屏,LY-F2 ...
- Arduino中使用超声波测距实验
尽管网上已经有很多使用超声波测距的案例,但为了配合我们的前面用Processing写好的雷达扫描程序付诸实践,所以我们还是要把超声波的测距的完整步骤在这里列出来,以供初学者来参考,尤其是让前面看到了P ...
- US100超声波测距传感器linux,US100超声波传感器手册
US100超声波传感器手册 (2011-08-13 17:42:47) 标签: 杂谈 US-100 超声波测距模块 1. 概述 US-100 超声波测距模块可实现2cm~4.5m 的非接触测距功 能, ...
- stm32f429+超声波传感器HC-SR04 -- 测距
工具 1. 开发板stm32f429(f4系列的应该都可以) 2. 超声波传感器,型号为HC-SR04 HC-SR04接线 HC-SR04 stm32f4 VCC VCC(5V) GND GND Tr ...
- 使用超声波传感器实现检测和测距的RADAR雷达原型
在本篇文章中,我们使用Arduino开发板和超声波传感器设计了一款雷达模型,用于检测和测距.RADAR是一种物体检测系统,它使用无线电波来识别物体的范围.高度.方向和速度.雷达天线发射的无线电波脉冲会 ...
最新文章
- jQuery EasyUI DataGrid 分页 FOR ASP.NET
- Facebook成立AI语言研究联盟,自然语言处理或有新成果
- python决策树sklearn_请问python中的sklearn中决策树使用的是哪一种算法呢?
- Checkstyle 简介 以及各版本下载地址
- 安装phpstudy之后发现80端口被占用
- 【原题】【noip 2003 T2】【动态规划】加分二叉树
- 纪中C组模拟赛总结(2019.8.9)
- 创建office一直转圈_Windows写字板出现广告条幅:推荐用户使用在线版Office
- 知乎阅读三百万的生信学习指南
- mysql optimizer mrr_MySQL优化器功能开关optimizer_switch
- Rust中Box、Rc、Arc、Cell、RefCell、Cow简介
- 插入移动硬盘_Win10插入移动硬盘或U盘有提示声但电脑中不显示的解决方法
- Golang go-huge-util 工具库介绍
- 《宝岛双雄》曝正式海报 房祖名挑大梁的银幕转型之作
- 三菱FX5U位逻辑指令
- HTML-CSS小知识——box-shadow的使用
- 商务智能-第五章 多维建模
- 编程易筋经:内存解析之实例讲解
- Sizes of tensors must match except in dimension 1. Expected size 24 but got size 25 for tensor numbe
- 网络安全岗位缺口已达70万,你该不会还不知道如何入门吧?