1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3509|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

GP2Y0E02B測(cè)距模塊89c52單片機(jī)串口程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:331263 發(fā)表于 2019-11-26 09:19 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 dingpeng1980 于 2019-12-11 01:28 編輯

iic接口,GPIO1需要3.3V轉(zhuǎn)5v模塊
程序已經(jīng)調(diào)試可以用,串口輸出晶振11.0592,波特率9600
SCL=P0^6;    iic接口需要3.3V轉(zhuǎn)5v模塊
SDA=P0^7;  iic接口需要3.3V轉(zhuǎn)5v模塊
GPIO1=P0^5;   //模塊使能

#include<reg52.h>
#include<intrins.h>
#include<math.h>
#include "stdio.h"   //需要使用printf()函數(shù)故而包含該頭文件

#define FOSC 11059200UL     //系統(tǒng)外部時(shí)鐘頻率(無(wú)符號(hào)長(zhǎng)整型)
#define BAUD 9600           //欲配置的串口通信波特率值
#define DISTANCE_REG  0x5E
#define SHIFT         0x35
typedef unsigned int uint;
typedef unsigned char uchar ;
float distance = 0;                // 存儲(chǔ)計(jì)算的距離
long high = 0, low = 0;              // 高字節(jié)和低字節(jié)的距離
int shift = 0;                   // 移位寄存器中的數(shù)值

uchar R_data;
bit R_flag=0;
sbit GPIO1=P0^5;   //模塊使能
sbit SCL=P0^6;    //iic接口需要3.3V轉(zhuǎn)5v模塊
sbit SDA=P0^7;  //iic接口需要3.3V轉(zhuǎn)5v模塊

/*******************************************************************************
* 函數(shù)名         : Delay10us()
* 函數(shù)功能     : 延時(shí)10us
* 輸入           : 無(wú)
* 輸出           : 無(wú)
*******************************************************************************/
void Delay10us()
{
unsigned char a,b;
for(b=1;b>0;b--)
  for(a=2;a>0;a--);
}

/********************************************************************
* 名稱 : Uart_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中斷
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void Uart_Init(void)
{
SCON=0x50;       //10位數(shù)據(jù)異步通信模式,允許接收
TMOD=0x20;       //設(shè)定T1工作在8位自動(dòng)重裝載模式
TH1=-(FOSC/12/32/BAUD);    //賦值定時(shí)初值,為了設(shè)定波特率
TL1=TH1;       //賦值定時(shí)初值,為了設(shè)定波特率
TR1 = 1;       //啟動(dòng)T1運(yùn)行控制位
ES = 1;        //使能UART中斷開(kāi)關(guān)ES
EA = 1;        //使能單片機(jī)總中斷開(kāi)關(guān)EA
}

/*******************************************************************************
* 函數(shù)名         : I2cStart()
* 函數(shù)功能   : 起始信號(hào):在SCL時(shí)鐘信號(hào)在高電平期間SDA信號(hào)產(chǎn)生一個(gè)下降沿
* 輸入           : 無(wú)
* 輸出           : 無(wú)
* 備注           : 起始之后SDA和SCL都為0
*******************************************************************************/
void I2cStart()
{
SDA=1;
Delay10us();
SCL=1;
Delay10us();//建立時(shí)間是SDA保持時(shí)間>4.7us
SDA=0;
Delay10us();//保持時(shí)間是>4us
SCL=0;   
Delay10us();  
}
/*******************************************************************************
* 函數(shù)名         : I2cStop()
* 函數(shù)功能   : 終止信號(hào):在SCL時(shí)鐘信號(hào)高電平期間SDA信號(hào)產(chǎn)生一個(gè)上升沿
* 輸入           : 無(wú)
* 輸出           : 無(wú)
* 備注           : 結(jié)束之后保持SDA和SCL都為1;表示總線空閑
*******************************************************************************/
void I2cStop()
{
SDA=0;
Delay10us();
SCL=1;
Delay10us();//建立時(shí)間大于4.7us
SDA=1;
Delay10us();  
}
/*******************************************************************************
* 函數(shù)名         : I2cSendByte(unsigned char dat)
* 函數(shù)功能   : 通過(guò)I2C發(fā)送一個(gè)字節(jié)。在SCL時(shí)鐘信號(hào)高電平期間,保持發(fā)送信號(hào)SDA保持穩(wěn)定
* 輸入           : num
* 輸出           : 0或1。發(fā)送成功返回1,發(fā)送失敗返回0
* 備注           : 發(fā)送完一個(gè)字節(jié)SCL=0,SDA=1
*******************************************************************************/
unsigned char I2cSendByte(unsigned char dat)
{
unsigned char a=0,b=0;//最大255,一個(gè)機(jī)器周期為1us,最大延時(shí)255us。  
for(a=0;a<8;a++)//要發(fā)送8位,從最高位開(kāi)始
{
  SDA=dat>>7;  //起始信號(hào)之后SCL=0,所以可以直接改變SDA信號(hào)
  dat=dat<<1;
  Delay10us();
  SCL=1;
  Delay10us();//建立時(shí)間>4.7us
  SCL=0;
  Delay10us();//時(shí)間大于4us  
}
SDA=1;
Delay10us();
SCL=1;
while(SDA)//等待應(yīng)答,也就是等待從設(shè)備把SDA拉低
{
  b++;
  if(b>200)  //如果超過(guò)2000us沒(méi)有應(yīng)答發(fā)送失敗,或者為非應(yīng)答,表示接收結(jié)束
  {
   SCL=0;
   Delay10us();
   return 0;
  }
}
SCL=0;
Delay10us();
  return 1;  
}

/*******************************************************************************
* 函數(shù)名         : I2cReadByte()
* 函數(shù)功能     : 使用I2c讀取一個(gè)字節(jié)
* 輸入           : 無(wú)
* 輸出           : dat
* 備注           : 接收完一個(gè)字節(jié)SCL=0,SDA=1.
*******************************************************************************/
unsigned char I2cReadByte()
{
unsigned char a=0,dat=0;
SDA=1;   //起始和發(fā)送一個(gè)字節(jié)之后SCL都是0
Delay10us();
for(a=0;a<8;a++)//接收8個(gè)字節(jié)
{
  SCL=1;
  Delay10us();
  dat<<=1;
  dat|=SDA;
  Delay10us();
  SCL=0;
  Delay10us();
}
return dat;  
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數(shù)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void main()
{
GPIO1 = 1;
Uart_Init();

I2cStart();
I2cSendByte(0x80);//發(fā)送寫器件地址
I2cSendByte(SHIFT);//發(fā)送要寫入內(nèi)存地址
I2cStop();

I2cStart();
I2cSendByte(0x81); //發(fā)送讀器件地址
shift = I2cReadByte(); //讀取數(shù)據(jù)
I2cStop();
SBUF = 0x00;

while(1)
{

請(qǐng)求并從GP2Y0E02B讀取2個(gè)地址字節(jié)
   I2cStart();
   I2cSendByte(0x80);//發(fā)送寫器件地址
   I2cSendByte(DISTANCE_REG);//發(fā)送要寫入內(nèi)存地址
   I2cStop();
   
   I2cStart();
   I2cSendByte(0x81); //發(fā)送讀器件地址
   high = I2cReadByte();
   I2cStop();

   I2cStart();
   I2cSendByte(0x80);//發(fā)送寫器件地址
   I2cSendByte(DISTANCE_REG+1);//發(fā)送要寫入內(nèi)存地址
   I2cStop();
   
   I2cStart();
   I2cSendByte(0x81); //發(fā)送讀器件地址
   low = I2cReadByte();
   I2cStop();
   
   SBUF = 0x00;
   distance = (high * 160 + low*10)/16/(float)pow(2,shift); // Calculate the range in mm
  
   printf("Distance = %f\n",distance);
}
/********************************************************************
* 名稱 : Uart_Int()
* 功能 : 串口中斷子函數(shù)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void Uart_Int(void) interrupt 4
{
EA = 0;
if(RI)   //當(dāng)硬件接收到一個(gè)數(shù)據(jù)時(shí),RI會(huì)置位
{
  R_data= SBUF; //這里減去48是因?yàn)閺碾娔X中發(fā)送過(guò)來(lái)的數(shù)據(jù)是ASCII碼。
  RI = 0;  
  R_flag=1;
}
EA = 1;
}




評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:644037 發(fā)表于 2019-12-6 15:53 | 只看該作者
大佬,有這個(gè)傳感器的I2C時(shí)序圖嗎?我搜索到的手冊(cè)貌似都沒(méi)有寫到這個(gè),感謝!
回復(fù)

使用道具 舉報(bào)

板凳
ID:331263 發(fā)表于 2019-12-10 23:55 | 只看該作者
有啊,這程序你試了么?沒(méi)發(fā)現(xiàn)問(wèn)題么?
回復(fù)

使用道具 舉報(bào)

地板
ID:331263 發(fā)表于 2019-12-10 23:58 | 只看該作者
有的,你直接去官網(wǎng)就有,這程序可以顯示,但數(shù)值有點(diǎn)問(wèn)題,做接近開(kāi)關(guān)是可以的,我已經(jīng)修改了
回復(fù)

使用道具 舉報(bào)

5#
ID:826204 發(fā)表于 2020-11-3 21:45 | 只看該作者
dingpeng1980 發(fā)表于 2019-12-10 23:58
有的,你直接去官網(wǎng)就有,這程序可以顯示,但數(shù)值有點(diǎn)問(wèn)題,做接近開(kāi)關(guān)是可以的,我已經(jīng)修改了

樓主 你這個(gè)程序是不是只顯示到255?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表