历史上的今天
返回首页

历史上的今天

今天是:2024年12月11日(星期三)

正在发生

2019年12月11日 | GP2Y0E02B测距模块89c52单片机串口程序

2019-12-11 来源:51hei

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;
}

推荐阅读

史海拾趣

Electronic-Bauteile Goerlitz GmbH公司的发展小趣事

为了进一步提升公司的竞争力,Electronic-Bauteile Goerlitz GmbH公司积极实施国际化战略。公司通过与国外知名企业的合作,引进先进的技术和管理经验;同时,公司还在海外设立了研发中心和生产基地,以便更好地满足当地市场的需求。这些举措使得公司的业务范围不断扩展,国际影响力不断增强。

Eastman Kodak Company公司的发展小趣事

经过破产保护和重组的洗礼后,伊士曼柯达公司更加注重创新和可持续发展。公司加强了与新兴科技公司的合作,积极探索新的业务模式和市场机会。同时,柯达还致力于研发更加环保、高效的影像产品和技术,以满足客户对高品质影像的需求。未来,伊士曼柯达公司将继续秉承创新、品质、服务的理念,不断推动影像行业的发展和进步。

DDP Engineered LED Solutions公司的发展小趣事

随着技术的不断成熟和市场的不断扩大,DDP Engineered LED Solutions公司开始注重市场拓展和品牌建设。公司积极参加国内外各类展会和论坛,展示公司的产品和技术实力,与业界同行交流学习。同时,公司还加大品牌宣传力度,通过广告、宣传册等多种渠道提升品牌知名度和美誉度。这些努力不仅让DDP的产品走进了更多客户的视野,也为公司的长远发展奠定了坚实的基础。

FLIR公司的发展小趣事

近年来,随着智能化和便携化趋势的兴起,FLIR积极响应市场需求,推出了一系列智能化、便携化的红外热像仪产品。例如,FLIR的I系列和T系列产品就以其小巧轻便、操作简便的特点受到了广大用户的青睐。这些产品不仅具备高性能的红外成像能力,还集成了多种智能化功能,如自动测温、图像分析、报告生成等,极大地提升了用户的使用体验和工作效率。此外,FLIR还推出了适用于智能手机的红外热像仪配件,进一步拓宽了产品的应用领域和市场空间。

Hitron公司的发展小趣事

FLIR一直将技术创新视为企业发展的核心驱动力。在过去的几十年里,公司不断推出具有革命性的红外热像仪产品。例如,1985年,FLIR研制出全球首台无需液氮制冷的高性能红外热像仪系统;1993年,公司推出了全球首台高分辨率平面(FPA)热像仪;2000年,FLIR又推出了可同时拍摄红外图像和可见光图像的红外热像仪ThermaCAM PM695。这些创新产品不仅提升了红外热像仪的性能和易用性,还推动了整个行业的技术进步和产业升级。

AAT [Advanced Analog Technology, Inc.]公司的发展小趣事

近年来,随着智能化和便携化趋势的兴起,FLIR积极响应市场需求,推出了一系列智能化、便携化的红外热像仪产品。例如,FLIR的I系列和T系列产品就以其小巧轻便、操作简便的特点受到了广大用户的青睐。这些产品不仅具备高性能的红外成像能力,还集成了多种智能化功能,如自动测温、图像分析、报告生成等,极大地提升了用户的使用体验和工作效率。此外,FLIR还推出了适用于智能手机的红外热像仪配件,进一步拓宽了产品的应用领域和市场空间。

问答坊 | AI 解惑

异步FIFO结构及FPGA设计

摘要:首先介绍异步FIFO的概念、应用及其结构,然后分析实现异步FIFO的难点问题及其解决办法;在传统设计的基础上提出一种新颖的电路结构并对其进行综合仿真和FPGA实现。 关键词:异步电路 FIFO 亚稳态 格雷码1 异步FIFO介绍在现代的集成电路芯片 ...…

查看全部问答>

做IRIG-B码的AC码解码电路

我正在做IRIG-B码的AC码解码电路。由于没有什么经验和资料。现在已经停滞下来了。如果谁有关于IRIG-B码的AC码解码的相关资料、电路和程序,可不可以发给我一份。我深表感谢。我的邮箱是m-a-r-y@163.com。…

查看全部问答>

有关蓝牙的问题

我现在手上有一个USB接口的蓝牙模块,我现在把它插在我的开发板上,然后使用“控制面板”下的“蓝牙设置”进去后点击搜索,可以搜索到其它的蓝牙设备。这就说明模块可以再我板子上正常运行。现在的问题就是我想对它开发软件的话,我该怎么来入手呢 ...…

查看全部问答>

【求助】keilc编程 严重问题

*************************************************************************** RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 09CCH BYTE (122%) ************************************************************************** ...…

查看全部问答>

WINCE 启动第三方软件超慢是什么原因?

问题如题,我是用HIVE注册表的。…

查看全部问答>

单片机时钟周期与机器周期的转换?

最近学紧单片机,有两本书作参考。看到单片机的时钟周期我就晕了。 一本书上写着:1个时钟周期=2个振荡周期               1个机器周期=6个时钟周期 另一本书上有这样写道:    & ...…

查看全部问答>

问一下STM32F103C8T6的AD参考电压问题

从引脚上看,这个CPU是没有vref+和vref-引脚的,那么AD转换的参考电压时从哪里来的?是内部的Vrefint吗?如果是,这个电压值是多少? 谢谢!…

查看全部问答>

EVA 中 T1CMPR 和 CMPR1 有什么区别?

本帖最后由 dontium 于 2015-1-23 13:37 编辑 请指教 EVA 中 T1CMPR 和 CMPR1 有什么区别? …

查看全部问答>

超低功耗温控器

利用积分AD转换实现一个超低功耗恒温器…

查看全部问答>