GP2Y0E02B测距模块89c52单片机串口程序

2019-12-11来源: 51hei关键字:GP2Y0E02B  测距模块  89c52  串口程序

iic接口,GPIO1需要3.3V转5v模块
程序已经调试可以用,串口输出晶振11.0592,波特率9600
SCL=P0^6;    iic接口需要3.3V转5v模块
SDA=P0^7;  iic接口需要3.3V转5v模块
GPIO1=P0^5;   //模块使能

#include
#include
#include
#include "stdio.h"   //需要使用printf()函数故而包含该头文件

#define FOSC 11059200UL     //系统外部时钟频率(无符号长整型)
#define BAUD 9600           //欲配置的串口通信波特率值
#define DISTANCE_REG  0x5E
#define SHIFT         0x35
typedef unsigned int uint;
typedef unsigned char uchar ;
float distance = 0;                // 存储计算的距离 
long high = 0, low = 0;              // 高字节和低字节的距离
int shift = 0;                   // 移位寄存器中的数值

uchar R_data;
bit R_flag=0;
sbit GPIO1=P0^5;   //模块使能
sbit SCL=P0^6;    //iic接口需要3.3V转5v模块
sbit SDA=P0^7;  //iic接口需要3.3V转5v模块

/*******************************************************************************
* 函数名         : Delay10us()
* 函数功能     : 延时10us
* 输入           : 无
* 输出           : 无
*******************************************************************************/
void Delay10us()
{
unsigned char a,b;
for(b=1;b>0;b--)
  for(a=2;a>0;a--);
}

/********************************************************************
* 名称 : Uart_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Uart_Init(void)
{
SCON=0x50;       //10位数据异步通信模式,允许接收
TMOD=0x20;       //设定T1工作在8位自动重装载模式
TH1=-(FOSC/12/32/BAUD);    //赋值定时初值,为了设定波特率
TL1=TH1;       //赋值定时初值,为了设定波特率
TR1 = 1;       //启动T1运行控制位
ES = 1;        //使能UART中断开关ES
EA = 1;        //使能单片机总中断开关EA
}

/*******************************************************************************
* 函数名         : I2cStart()
* 函数功能   : 起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿
* 输入           : 无
* 输出           : 无
* 备注           : 起始之后SDA和SCL都为0
*******************************************************************************/
void I2cStart()
{
SDA=1;
Delay10us();
SCL=1;
Delay10us();//建立时间是SDA保持时间>4.7us
SDA=0;
Delay10us();//保持时间是>4us
SCL=0;   
Delay10us();  
}
/*******************************************************************************
* 函数名         : I2cStop()
* 函数功能   : 终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿
* 输入           : 无
* 输出           : 无
* 备注           : 结束之后保持SDA和SCL都为1;表示总线空闲
*******************************************************************************/
void I2cStop()
{
SDA=0;
Delay10us();
SCL=1;
Delay10us();//建立时间大于4.7us
SDA=1;
Delay10us();  
}
/*******************************************************************************
* 函数名         : I2cSendByte(unsigned char dat)
* 函数功能   : 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定
* 输入           : num
* 输出           : 0或1。发送成功返回1,发送失败返回0
* 备注           : 发送完一个字节SCL=0,SDA=1
*******************************************************************************/
unsigned char I2cSendByte(unsigned char dat)
{
unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。  
for(a=0;a<8;a++)//要发送8位,从最高位开始
{
  SDA=dat>>7;  //起始信号之后SCL=0,所以可以直接改变SDA信号
  dat=dat<<1;
  Delay10us();
  SCL=1;
  Delay10us();//建立时间>4.7us
  SCL=0;
  Delay10us();//时间大于4us  
}
SDA=1;
Delay10us();
SCL=1;
while(SDA)//等待应答,也就是等待从设备把SDA拉低
{
  b++;
  if(b>200)  //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
  {
   SCL=0;
   Delay10us();
   return 0;
  }
}
SCL=0;
Delay10us();
  return 1;  
}

/*******************************************************************************
* 函数名         : I2cReadByte()
* 函数功能     : 使用I2c读取一个字节
* 输入           : 无
* 输出           : dat
* 备注           : 接收完一个字节SCL=0,SDA=1.
*******************************************************************************/
unsigned char I2cReadByte()
{
unsigned char a=0,dat=0;
SDA=1;   //起始和发送一个字节之后SCL都是0
Delay10us();
for(a=0;a<8;a++)//接收8个字节
{
  SCL=1;
  Delay10us();
  dat<<=1;
  dat|=SDA;
  Delay10us();
  SCL=0;
  Delay10us();
}
return dat;  
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
GPIO1 = 1;
Uart_Init();

I2cStart();
I2cSendByte(0x80);//发送写器件地址
I2cSendByte(SHIFT);//发送要写入内存地址
I2cStop();

I2cStart();
I2cSendByte(0x81); //发送读器件地址
shift = I2cReadByte(); //读取数据
I2cStop();
SBUF = 0x00;

while(1)
{

请求并从GP2Y0E02B读取2个地址字节
   I2cStart();
   I2cSendByte(0x80);//发送写器件地址
   I2cSendByte(DISTANCE_REG);//发送要写入内存地址
   I2cStop();
   
   I2cStart();
   I2cSendByte(0x81); //发送读器件地址
   high = I2cReadByte();
   I2cStop();

   I2cStart();
   I2cSendByte(0x80);//发送写器件地址
   I2cSendByte(DISTANCE_REG+1);//发送要写入内存地址
   I2cStop();
   
   I2cStart();
   I2cSendByte(0x81); //发送读器件地址
   low = I2cReadByte();
   I2cStop();
   
   SBUF = 0x00;
   distance = (high * 160 + low*10)/16/(float)pow(2,shift); // Calculate the range in mm
  
   printf("Distance = %fn",distance);
}
/********************************************************************
* 名称 : Uart_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Uart_Int(void) interrupt 4
{
EA = 0;
if(RI)   //当硬件接收到一个数据时,RI会置位
{
  R_data= SBUF; //这里减去48是因为从电脑中发送过来的数据是ASCII码。
  RI = 0;  
  R_flag=1; 
}
EA = 1;
}

关键字:GP2Y0E02B  测距模块  89c52  串口程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic482551.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:简单做的基于51单片机的数码管时钟
下一篇:单片机自行车测速系统+源程序+proteus仿真

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

VL53L0X激光测距模块的单片机驱动程序
自己做的激光测距VL53L0X程序,拿出来和大家分享。这程序里面没有加显示设备,因为不知道大家要使用什么来显示,所以请根据个人情况来进行修改添加,但是附件里面的程序是我加上OLED后的程序各位请按需使用。单片机源程序如下:#include <REGX51.H>#include "intrins.h"#define uchar unsigned char#define uint unsigned int#define VL53L0X_REG_IDENTIFICATION_MODEL_ID         0xc0#define
发表于 2019-12-23
STC15单片机使用HC-SR04超声波测距模块
【HC-SR04】HC-HR04超声波测距可提供2cm-400cm的非接触式距离感测功能,测距精度可达3mm。基本工作原理1、采用IO口TRIG触发测距,给最少10us的高电平信呈。2、模块自动发送8个40KHz的方波,自动检测是否有信号返回。3、有信号返回,通过IO口ECHO输出一个高电平,高电平持续时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340m/s))/2.时序图以上时序图表明你只需要提供一个10uS以上脉冲触发信号,该模块内部将:发出8个40kHz周期电平并检测回波。一.旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离
发表于 2019-05-22
STC15单片机使用HC-SR04超声波测距模块
51单片机超声波测距模块
  sbit test  = P1^1; //测试用引脚    uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9  uint distance[4];  //测距接收缓冲区  uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i;  //自定义寄存器 
发表于 2017-09-09
「51单片机」收发一体超声波测距模块分析+代码
我用的超声波型号是US-020,四个接口的超声波用法基本相同。 一、概述US-020超声波模块测距范围:2cm~7m供电电压5V,静态功耗低于3mA 二、实物图 尺寸:45mm*20mm*1.6mm 三、接口1.VCC 电源,直流5V2.Trig 向此管脚输入10us以上高电平,可触发模块测距3.Echo 测距结束时会输出高电平,电平时长为超声波信号往返时间之和4.GND 接地 四、测距工作原理只要在Trig管脚输入10us以上高电平,系统会自动发出8个40KHz的超声波脉冲,然后检测回波信号。检测到后通过Echo管脚输出。 
发表于 2017-01-17
「51单片机」收发一体超声波测距模块分析+代码
单片机超声波测距模块学习笔记_发射端学习
超声波测距--发射端电路原理图如下: 示波器波形图如下: 绿色的波形是单片机产生的40KHz的方波黄色的波形是经三极管放大后送入超声波发射头之前的波形。 51单片机产生方波的汇编指令 mov R6,#8h    ;超声波发射的完整波形个数:共计四个 FB: cpl p2.7       ;输出40kHz方波               
发表于 2017-01-17
单片机超声波测距模块学习笔记_发射端学习
关于MSP硬件I2C讲解
0.前言对于大多数单片机来说,I2C成了一个老大难问题。从51时代开始,软件模拟I2C成了主流,甚至到ARMCortex M3大行其道的今天,软件模拟I2C依然是使用最广的方法。虽然软件模拟可以解决所有的问题,但是总感觉没有充分发挥MCU内部的硬件资源。查阅了所有关于MSP430F5系列的图书,没有关于硬件I2C的应用代码,自己通过调试摸索,把经验总结之后和大家分享,希望大家喜欢。同时,I2C的使用可以分为等待法和中断法,从理解的角度来说等待法思路清晰易于上手,从功耗的角度出发,中断法可以灵活的进入低功耗模式,但是不易理解。本文先从等待法入手。MSP430F5系列的硬件I2C使用大致会有以下问题:【I2C地址设定】一般情况下I2C
发表于 2020-01-21
关于MSP硬件I2C讲解
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved