【STC12C5A60S2】TOF250(IIC)基于51系列开发板的运用
目录
- 一、前言
- 二、硬件准备
- 二、软件准备
- 三、硬件接线图
- 四、例程源码
- 五、烧录说明
- 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系列开发板的运用相关推荐
- 【STC12C5A60S2】TOF250(TTL)基于51系列开发板的运用
目录 一.前言 二.硬件准备 二.软件准备 三.硬件接线图 四.例程源码 五.烧录说明 5.1 烧录接线示意图 5.2 烧录动态图 六.结果输出 一.前言 此片文章主要介绍如果通过51系列开发板来读取 ...
- 【STM32F103ZE】TOF250(TTL)基于STM32系列开发板的运用
目录 @[TOC](目录) 一.前言 二.硬件准备 二.软件准备 三.硬件接线图 四.例程源码 五.烧录说明 5.1 烧录接线示意图 5.2 烧录动态图 六.结果输出 一.前言 此片文章主要介绍如果通 ...
- 如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习,来自STM32神舟系列开发板设计师的总结)
转载: 来源:www.armjishu.com 作者:jesse 我的另一篇文章:<STM32嵌入式入门必看之文章-----介绍非常详细!(学STM32的理由!!!!)>http://ww ...
- 基于stm32物联网开发板(1)
基于stm32物联网开发板(1) 本开发板采用了STM32F103RET6作为核心CPU,72MHZ工作频率,512KB flash,64KB Sram.本开发平台外设模块有ESP8266 WIF ...
- 构建一个适合stm32mp157系列开发板的嵌入式Linux系统
在线课堂:https://www.100ask.net/index(课程观看) 论 坛:http://bbs.100ask.net/(学术答疑) 开 发 板:https://100ask.taoba ...
- 基于ShineBlink物联网开发板和机智云平台开发的“针对短期内宠物无人照顾的智能宠物屋”系统
正式介绍作品前先说明一下,我是湖南文理学院计算机与电气工程学院的一名大三学生,我叫陈海涛.作品全部内容均为个人创意.个人设计并手工制作,后期会考虑写论文投期刊,So!!严禁抄袭!抄袭必究! 该作品是用 ...
- RK系列开发板音频驱动适配指南(一)
背景: 多媒体系统目前在Linux操作系统,windows操作系统已经非常成熟,并且应用场景广泛,但是,基于OpenAtom OpenHarmony(以下简称"OpenHarmony&quo ...
- SSI技术的前端动态实现(AJAX+SSI,适用于任何系统,包括搭载嵌入式RTOS的STM32系列开发板)
SSI技术的前端动态实现(AJAX+SSI,适用于任何系统,包括搭载嵌入式RTOS的STM32系列开发板) 前言 RTOS简述及开发困难所在 开发环境 详细的解决方案 SSI初加载 基础的动态操作 伪 ...
- 巫妖王51单片机开发板配套视频课程-朱有鹏-专题视频课程
巫妖王51单片机开发板配套视频课程-8368人已学习 课程介绍 本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机.配合巫妖王51单片机开发 ...
最新文章
- RecyclerView 缓存机制
- linux中级篇--网络相关命令
- 一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)
- 基于AWS的云备份容灾解决方案
- 关于redis说法正确的是_还不会正确使用Redis?这几个技巧让你的程序快如闪电...
- SoundPool详解
- AD转换及其相关背景知识
- imac苹果一体机忘记开机密码,直接重置开机密码
- mac 清理微信缓存文件
- Tensorflow 中 learning rate decay 的奇技淫巧
- NFC应用(二)读写器模式
- 352439-37-3,Amino-PEG8-alcohol,氨基-八聚乙二醇由氨基(NH2)和羟基(OH)组成
- 浅谈Deferred(延迟对象)
- “算力经济”时代扑面而来,智算中心成未来数据中心进化方向
- python元组使用什么界定符_CookBook/2-Python3基本语法.md at master · Byron4j/CookBook · GitHub...
- 产品定位的步骤,如何探寻市场机会、挖掘市场细分并选择目标市场
- 支付宝APP支付 (JAVA生成支付信息,uniapp拉起支付宝支付)
- 弥知AR试衣重磅上线!
- java反射和反编译
- 如何正确使用HTTP代理?