目录

  • 一、前言
  • 二、硬件准备
  • 二、软件准备
  • 三、硬件接线图
  • 四、例程源码
  • 五、烧录说明
    • 5.1 烧录接线示意图
    • 5.2 烧录动态图
  • 六、结果输出

一、前言

此片文章主要介绍如果通过51系列开发板来读取TOF250(IIC接口)数据的教程
由于51芯片一般不太有IIC接口,此篇主要介绍通过模拟IIC来读取的案例。
提示:以下的案例仅供参考学习使用


二、硬件准备

  • TOF250 :测距传感器

  • 51系列开发板:STC12C5A60S2 主频12M
    提示:51系列开发板种类较多,此处不专门举例

详细资料可以参考:STC 官网

  • 电脑 :Windows 7/10/11

  • TTL转USB:本次测试使用CH340芯片转接板

  • 杜邦线:各类(若干)

  • TOF250尾线:购买时自带有一根尾线


二、软件准备

  • KEIL IDE:参考官网下载安装教程

三、硬件接线图

提示:实际在测试过程中不建议接上图黄色的线
说明:

  • STC12C5A60S2共有两个串口,不过此次测试仅使用一个串口,方便理解
  • 此时使用的是模拟IIC接口来读取TOF250的数据
  • USB打印结果需要用到串口1的TX

四、例程源码

mian.c

/**************************************************************
**技术论坛:https://blog.csdn.net/HCJ_Application/article/details/124058266
**修改日期:2022/4/24
**技术说明:基于STC12C5A60S2单片机,主频12M
**版本:V1.0
**作者:深圳市弘成基科技有限公司
**************************************************************/#include <STC12C5A60S2.h>
#include <stdio.h>
#include "myiic.h"#define TOF250_DIST_H 0x00             //TOF250距离值高8位
#define TOF250_DIST_L 0x01             //TOF250距离值低8位
#define TOF250_READ_L    2             //TOF250读取的长度
#define TOF250_ID     0x52             //TOF250的IIC地址unsigned char data RxData[10];          //IIC接口接收数据区unsigned int  Tof250_dist = 0;         //读取到TOF250的具体数值void Uart1_SendChar(unsigned char Udat) ;void UartInit(void)       //9600bps@12.000MHz
{PCON |= 0x80;     //使能波特率倍速位SMODSCON = 0x50;     //8位数据,可变波特率AUXR |= 0x40;      //定时器时钟1T模式AUXR &= 0xFE;       //串口1选择定时器1为波特率发生器TMOD &= 0x0F;        //设置定时器模式TMOD |= 0x20;     //设置定时器模式TL1 = 0xB2;       //设置定时初始值TH1 = 0xB2;       //设置定时重载值ET1 = 0;      //禁止定时器%d中断TR1 = 1;        //定时器1开始计时ES = 1;     //打开串口接收中断EA = 1;           //打开所有中断
}
char putchar(char c)
{Uart1_SendChar(c);return c;
}void Uart1_SendChar(unsigned char Udat)
{SBUF=Udat; //将要发送的数据放入串口数据缓冲区while(!TI); //等待发送完成TI=0;      //清零TI发送完成标记
}//定义一个延时
void Delay100ms()       //@12.000MHz
{unsigned char i, j, k;i = 5;j = 144;k = 71;do{do{while (--k);} while (--j);} while (--i);
}void main()
{UartInit();                 //串口初始化,使用9600波特率打印IIC读到的距离值while(1) {tof250_i2c_read(TOF250_ID,TOF250_DIST_H, &RxData[0], TOF250_READ_L);    //通过IIC读取TOF250距离值信息Tof250_dist = RxData[1] + RxData[0]*256;                                //转换成距离值printf("%u cm\n",Tof250_dist);                                          //串口1直接打印输出Delay100ms();                                                           //延时100ms,TOF250默认更新速度10HZ}
}

myiic.h

#ifndef _MYIIC_H_
#define _MYIIC_H_
#include <STC12C5A60S2.h>sbit SCL = P2^3;
sbit SDA = P2^4;void tof250_i2c_read(unsigned char tof_ID,unsigned char word_adress, unsigned char *rdata, unsigned char num);#endif

myiic.c

#include "myiic.h"
/*
*********************************************************************************************************
*   函 数 名: i2c_Delay
*   功能说明: I2C总线位延迟,最快400KHz
*   形    参:  无
*   返 回 值: 无
*********************************************************************************************************
*/
static void i2c_Delay(void)
{unsigned char i;/* IIC 延时时间根据具体情况自行决定for循环延迟时间的大小实际应用选择小于400KHz左右的速率即可*/for (i = 0; i < 10; i++);
}void i2c_Start(void)
{/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */SDA = 1;SCL = 1;i2c_Delay();SDA = 0;i2c_Delay();SCL = 0;i2c_Delay();
}/*
*********************************************************************************************************
*   函 数 名: i2c_Start
*   功能说明: CPU发起I2C总线停止信号
*   形    参:  无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_Stop(void)
{/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */SDA = 0;SCL = 1;i2c_Delay();SDA = 1;i2c_Delay();
}
/*
*********************************************************************************************************
*   函 数 名: i2c_WaitAck
*   功能说明: CPU产生一个时钟,并读取器件的ACK应答信号
*   形    参:  无
*   返 回 值: 返回0表示正确应答,1表示无器件响应
*********************************************************************************************************
*/
unsigned char i2c_WaitAck(void)
{unsigned char re; //应答信号等于0则应答正确,等于1则没有应答SDA = 1;          //释放总线,能让对方拉低i2c_Delay();SCL = 1;          //此时刻开始,数据保持应答状态稳定i2c_Delay();if(SDA == 1){re = 1;        //没有应答}else{re = 0;        //应答正确                                                                                                                                                                            }SCL = 0;i2c_Delay();return re;
}
/*
*********************************************************************************************************
*   函 数 名: i2c_SendByte
*   功能说明: CPU向I2C总线设备发送8bit数据
*   形    参:  _ucByte : 等待发送的字节
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_SendByte(unsigned char _ucByte)
{unsigned char i;     //其实信号开始后SCL是被拉低的for(i = 0; i < 8; i++){if(_ucByte & 0x80)SDA = 1;elseSDA = 0;SCL = 1; i2c_Delay();SCL = 0;      //SCL等于0的时候写数据if(i == 7)    //最后一次时释放总线{SDA = 1;}_ucByte<<=1;  //左移一位i2c_Delay();}
}/*
*********************************************************************************************************
*   函 数 名: i2c_ReadByte
*   功能说明: CPU从I2C总线设备读取8bit数据
*   形    参:  无
*   返 回 值: 读到的数据
*********************************************************************************************************
*/
unsigned char i2c_ReadByte(void)
{unsigned char i;unsigned char value = 0;for(i = 0; i < 8; i++){value<<=1;SCL = 1;  //稳定状态的时候读数据if(SDA == 1)value++;SCL = 0;  //允许数据变化i2c_Delay();}return value;
}/*
*********************************************************************************************************
*   函 数 名: i2c_Ack
*   功能说明: CPU产生一个ACK信号
*   形    参:  无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_Ack(void)
{SDA = 0;//响应i2c_Delay();SCL = 1;i2c_Delay();SCL = 0;i2c_Delay();   //在SCL为高电平期间SDA都为0即产生一个应答信号SDA = 1;       //释放总线i2c_Delay();
}/*
*********************************************************************************************************
*   函 数 名: i2c_NAck
*   功能说明: CPU产生1个NACK信号
*   形    参:  无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_NAck(void)
{SDA = 1;i2c_Delay();SCL = 1;i2c_Delay();SCL = 0;i2c_Delay();   //在SCL为高电平期间SDA都为1即产生一个非应答信号
}void tof250_i2c_read(unsigned char tof_ID,unsigned char word_adress, unsigned char *rdata, unsigned char num)
{unsigned char i;i2c_Start();i2c_SendByte(tof_ID << 1);i2c_WaitAck();i2c_SendByte(word_adress);i2c_WaitAck();i2c_Stop();i2c_Delay();i2c_Start();i2c_SendByte(tof_ID << 1 | 0x01);i2c_WaitAck();if(num > 1){for (i = 0; i < num - 1; i++) {*(rdata + i) = i2c_ReadByte();i2c_Ack();}}*(rdata + num - 1) = i2c_ReadByte();i2c_NAck();i2c_Stop();}

五、烧录说明

5.1 烧录接线示意图

5.2 烧录动态图

提示:烧录过程中请先断开TF250与STC12C5A60S2的TX\RX接线,否则无法正常烧录


六、结果输出

通过SSCOM串口软件打印结果(其他串口工具也可以)

提示:注意选择对应的波特率,此次测试使用波特率为9600

【STC12C5A60S2】TOF250(IIC)基于51系列开发板的运用相关推荐

  1. 【STC12C5A60S2】TOF250(TTL)基于51系列开发板的运用

    目录 一.前言 二.硬件准备 二.软件准备 三.硬件接线图 四.例程源码 五.烧录说明 5.1 烧录接线示意图 5.2 烧录动态图 六.结果输出 一.前言 此片文章主要介绍如果通过51系列开发板来读取 ...

  2. 【STM32F103ZE】TOF250(TTL)基于STM32系列开发板的运用

    目录 @[TOC](目录) 一.前言 二.硬件准备 二.软件准备 三.硬件接线图 四.例程源码 五.烧录说明 5.1 烧录接线示意图 5.2 烧录动态图 六.结果输出 一.前言 此片文章主要介绍如果通 ...

  3. 如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习,来自STM32神舟系列开发板设计师的总结)

    转载: 来源:www.armjishu.com 作者:jesse 我的另一篇文章:<STM32嵌入式入门必看之文章-----介绍非常详细!(学STM32的理由!!!!)>http://ww ...

  4. 基于stm32物联网开发板(1)

    基于stm32物联网开发板(1)   本开发板采用了STM32F103RET6作为核心CPU,72MHZ工作频率,512KB flash,64KB Sram.本开发平台外设模块有ESP8266 WIF ...

  5. 构建一个适合stm32mp157系列开发板的嵌入式Linux系统

    在线课堂:https://www.100ask.net/index(课程观看) 论  坛:http://bbs.100ask.net/(学术答疑) 开 发 板:https://100ask.taoba ...

  6. 基于ShineBlink物联网开发板和机智云平台开发的“针对短期内宠物无人照顾的智能宠物屋”系统

    正式介绍作品前先说明一下,我是湖南文理学院计算机与电气工程学院的一名大三学生,我叫陈海涛.作品全部内容均为个人创意.个人设计并手工制作,后期会考虑写论文投期刊,So!!严禁抄袭!抄袭必究! 该作品是用 ...

  7. RK系列开发板音频驱动适配指南(一)

    背景: 多媒体系统目前在Linux操作系统,windows操作系统已经非常成熟,并且应用场景广泛,但是,基于OpenAtom OpenHarmony(以下简称"OpenHarmony&quo ...

  8. SSI技术的前端动态实现(AJAX+SSI,适用于任何系统,包括搭载嵌入式RTOS的STM32系列开发板)

    SSI技术的前端动态实现(AJAX+SSI,适用于任何系统,包括搭载嵌入式RTOS的STM32系列开发板) 前言 RTOS简述及开发困难所在 开发环境 详细的解决方案 SSI初加载 基础的动态操作 伪 ...

  9. 巫妖王51单片机开发板配套视频课程-朱有鹏-专题视频课程

    巫妖王51单片机开发板配套视频课程-8368人已学习 课程介绍         本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机.配合巫妖王51单片机开发 ...

最新文章

  1. RecyclerView 缓存机制
  2. linux中级篇--网络相关命令
  3. 一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)
  4. 基于AWS的云备份容灾解决方案
  5. 关于redis说法正确的是_还不会正确使用Redis?这几个技巧让你的程序快如闪电...
  6. SoundPool详解
  7. AD转换及其相关背景知识
  8. imac苹果一体机忘记开机密码,直接重置开机密码
  9. mac 清理微信缓存文件
  10. Tensorflow 中 learning rate decay 的奇技淫巧
  11. NFC应用(二)读写器模式
  12. 352439-37-3,Amino-PEG8-alcohol,氨基-八聚乙二醇由氨基(NH2)和羟基(OH)组成
  13. 浅谈Deferred(延迟对象)
  14. “算力经济”时代扑面而来,智算中心成未来数据中心进化方向
  15. python元组使用什么界定符_CookBook/2-Python3基本语法.md at master · Byron4j/CookBook · GitHub...
  16. 产品定位的步骤,如何探寻市场机会、挖掘市场细分并选择目标市场
  17. 支付宝APP支付 (JAVA生成支付信息,uniapp拉起支付宝支付)
  18. 弥知AR试衣重磅上线!
  19. java反射和反编译
  20. 如何正确使用HTTP代理?

热门文章

  1. linux下使用微信web开发者工具
  2. .pt文件无法打开或乱码?如何查看.pt文件的具体内容?
  3. 阿里云ET城市大脑新突破:行人检测与识别破世界纪录
  4. 苹果测试充电速度软件,苹果iPhone8 Plus充电测试:快充真的快吗?
  5. 【转载】演讲实录:百度大规模深度学习应用实践和开源AI框架PaddlePaddle
  6. file 文件与 base64 互相转化
  7. 昨天,阿里用“平头哥”死磕起了中国芯!
  8. 查看windows服务、服务是否开启
  9. OpenGL 关于平面树的一点点理解
  10. 事务标识(xid)解析