【51单片机】AT24C20数据帧(I2C总线)

news2024/12/23 23:56:08

🎊专栏【51单片机】

🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。

🎆音乐分享【Love Story】

🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰

小吉先向大家道个歉,因为最近在期末突击,所以文章久久没有更新,也请大家多多见谅😥

目录

🎁I2C总线

🏳️‍🌈分析

🏳️‍🌈代码 

🎁AT24C20数据帧

🏳️‍🌈分析

🏳️‍🌈代码 


🎁I2C总线

🏳️‍🌈分析

注意图片中左右两部分是连贯的(SCL在左边结束时是0,右边开始时仍然为0) 

void I2C_Start(void)
{
    I2C_SDA=1;        //注意顺序, I2C_SCL和 I2C_SDA的顺序不能反了
    I2C_SCL=1;
    I2C_SDA=0;
    I2C_SCL=0;
}

void I2C_Stop(void)
{
    I2C_SDA=0;
    I2C_SCL=1;        //先把 I2C_SCL置为1,再把 I2C_SDA置为1
    I2C_SDA=1;


void I2C_SendByte(unsigned char Byte)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        I2C_SDA=Byte&(0x80>>i);       //把数据写到I2C_SDA上面,因为高位在前,所以使用                                                                Byte&(0x80>>i)读出最高位
        I2C_SCL=1;
        I2C_SCL=0;
    }
}


 

 unsigned char I2C_ReceiveByte(void)
{
    unsigned char i,Byte=0x00;        //给Byte赋初值
    I2C_SDA=1;
    for(i=0;i<8;i++)
    {
        I2C_SCL=1;
        if(I2C_SDA){Byte|=(0x80>>i);}        //如果I2C_SDA为1,那么把Byte的最高位置为1 
        I2C_SCL=0;                                     //如果I2C_SDA为0,那么不处理,默认为0 
    }
    return Byte;
}


 

 AckBit 应答位,0为应答,1为非应答

void I2C_SendAck(unsigned char AckBit)        //发送
{
    I2C_SDA=AckBit;
    I2C_SCL=1;
    I2C_SCL=0;
}


unsigned char I2C_ReceiveAck(void)        //接收
{
    unsigned char AckBit;
    I2C_SDA=1;
    I2C_SCL=1;
    AckBit=I2C_SDA;
    I2C_SCL=0;
    return AckBit;
}

🏳️‍🌈代码 

#include <REGX52.H>

sbit I2C_SCL=P2^1;
sbit I2C_SDA=P2^0;

/**
  * @brief  I2C开始
  * @param  无
  * @retval 无
  */
void I2C_Start(void)
{
	I2C_SDA=1;
	I2C_SCL=1;
	I2C_SDA=0;
	I2C_SCL=0;
}

/**
  * @brief  I2C停止
  * @param  无
  * @retval 无
  */
void I2C_Stop(void)
{
	I2C_SDA=0;
	I2C_SCL=1;
	I2C_SDA=1;
}

/**
  * @brief  I2C发送一个字节
  * @param  Byte 要发送的字节
  * @retval 无
  */
void I2C_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		I2C_SDA=Byte&(0x80>>i);
		I2C_SCL=1;
		I2C_SCL=0;
	}
}

/**
  * @brief  I2C接收一个字节
  * @param  无
  * @retval 接收到的一个字节数据
  */
unsigned char I2C_ReceiveByte(void)
{
	unsigned char i,Byte=0x00;
	I2C_SDA=1;
	for(i=0;i<8;i++)
	{
		I2C_SCL=1;
		if(I2C_SDA){Byte|=(0x80>>i);}//把Byte的最高位置为1 
		I2C_SCL=0;
	}
	return Byte;
}

/**
  * @brief  I2C发送应答
  * @param  AckBit 应答位,0为应答,1为非应答
  * @retval 无
  */
void I2C_SendAck(unsigned char AckBit)
{
	I2C_SDA=AckBit;
	I2C_SCL=1;
	I2C_SCL=0;
}

/**
  * @brief  I2C接收应答位
  * @param  无
  * @retval 接收到的应答位,0为应答,1为非应答
  */
unsigned char I2C_ReceiveAck(void)
{
	unsigned char AckBit;
	I2C_SDA=1;
	I2C_SCL=1;
	AckBit=I2C_SDA;
	I2C_SCL=0;
	return AckBit;
}

🎁AT24C20数据帧

🏳️‍🌈分析

  

void AT24C02_WriteByte(unsigned char WordAddress,Data)
{
    I2C_Start();
    I2C_SendByte(AT24C02_ADDRESS);
    I2C_ReceiveAck();
    I2C_SendByte(WordAddress);
    I2C_ReceiveAck();
    I2C_SendByte(Data);
    I2C_ReceiveAck();
    I2C_Stop();
}

/**
  * @brief  AT24C02读取一个字节
  * @param  WordAddress 要读出字节的地址
  * @retval 读出的数据
  */
unsigned char AT24C02_ReadByte(unsigned char WordAddress)
{
    unsigned char Data;
    I2C_Start();
    I2C_SendByte(AT24C02_ADDRESS);
    I2C_ReceiveAck();
    I2C_SendByte(WordAddress);
    I2C_ReceiveAck();
    I2C_Start();
    I2C_SendByte(AT24C02_ADDRESS|0x01);
    I2C_ReceiveAck();
    Data=I2C_ReceiveByte();
    I2C_SendAck(1);
    I2C_Stop();
    return Data;
}


由于写周期需要一定的时间,所以我们在写周期后面一定要delay()一下

在AT24C02_WriteByte后面Delay()一下 

🏳️‍🌈代码 

#include <REGX52.H>
#include "I2C.h"

#define AT24C02_ADDRESS		0xA0

/**
  * @brief  AT24C02写入一个字节
  * @param  WordAddress 要写入字节的地址
  * @param  Data 要写入的数据
  * @retval 无
  */
void AT24C02_WriteByte(unsigned char WordAddress,Data)
{
	I2C_Start();
	I2C_SendByte(AT24C02_ADDRESS);
	I2C_ReceiveAck();
	I2C_SendByte(WordAddress);
	I2C_ReceiveAck();
	I2C_SendByte(Data);
	I2C_ReceiveAck();
	I2C_Stop();
}

/**
  * @brief  AT24C02读取一个字节
  * @param  WordAddress 要读出字节的地址
  * @retval 读出的数据
  */
unsigned char AT24C02_ReadByte(unsigned char WordAddress)
{
	unsigned char Data;
	I2C_Start();
	I2C_SendByte(AT24C02_ADDRESS);
	I2C_ReceiveAck();
	I2C_SendByte(WordAddress);
	I2C_ReceiveAck();
	I2C_Start();
	I2C_SendByte(AT24C02_ADDRESS|0x01);
	I2C_ReceiveAck();
	Data=I2C_ReceiveByte();
	I2C_SendAck(1);
	I2C_Stop();
	return Data;
}
🥰如果大家有不明白的地方,或者文章有问题,欢迎大家在评论区讨论,指正🥰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/600358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“微商城”项目(4首页)

1.显示轮播图 首页和商品详情页都有图片轮播图展示&#xff0c;考虑到Vue组件代码的复用性&#xff0c;把轮播图相关代码单独放置在src\components\swiper.vue文件中。 在src\pages\Home.vue文件中&#xff0c;编写HTML结构代码&#xff0c;示例代码如下。 <template>…

大数据AI课程更新——6月AI绘画入门小课

在这个课程中&#xff0c;我们将探索人工智能在绘画领域的应用&#xff0c;学习如何利用AI技术创造出令人惊叹的艺术作品。无论你是对绘画有兴趣的初学者&#xff0c;还是已经有一定绘画基础的学生&#xff0c;本训练营都将为你提供一个展示创造力和实践技巧的平台。 2022年是A…

永远年轻,永远在路上的AI TIME

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 在2019年的智源人工智能大会上&#xff0c;我第一次接触AI TIME&#xff0c;时至今日&#xff0c;加入AI TIME已经四年了。在过去的四年里&#xff0c;AI技术、产业发生了翻天覆地的变化&#xff0c;我自己的思…

80后程序员涛哥的童年

博主&#xff1a;爱码叔 个人博客站点&#xff1a; icodebook 公众号&#xff1a;漫话软件设计 微博&#xff1a;程序员涛哥 专注于软件设计与架构、技术管理。擅长用通俗易懂的语言讲解技术。对技术管理工作有自己的一定见解。文章会第一时间首发在个站上&#xff0c;欢迎大家…

态路小课堂丨交换机堆叠—简化组网结构,增强网络可靠性

TARLUZ态路 01、什么是交换机堆叠 交换机堆叠是指将多台支持堆叠特性的交换机通过堆叠线缆连接起来&#xff0c;从逻辑上虚拟成一台交换设备&#xff0c;该交换机中的所有交换机共享相同的配置信息和路由信息。当向逻辑交换机增加和减少单体交换机时不会影响其性能。 02、有什么…

新鲜出炉

最近发现了一爆款APP重新来袭&#xff0c;心中不由感叹“经典永不过时”&#xff01;它可是能节省真金白银的&#xff0c;尤其是几年前&#xff0c;流量真是不便宜&#xff0c;出门到了哪里都是赶紧寻找wifi和密码&#xff0c;直到它的出现&#xff0c;可以完全自动化&#xff…

除了降价,阿里云还有王炸

1. 写本文的前因 最近业内多家云厂商都找到了简单的宣传方法&#xff0c;那就是跟风降列表价。我并不反对这种常规宣传&#xff0c;我那篇科普谈降价的文章&#xff0c;据说也让某些云参透了敲锣不要钱&#xff0c;宣传没损失。 在阵阵锣声中&#xff0c;我随口和朋友们发牢骚&…

盘点一个Python自动化办公需求,实现数据自动填充(上篇)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 临别殷勤重寄词&#xff0c;词中有誓两心知。 大家好&#xff0c;我是皮皮。 一、前言 前几天遇到了一个小需求&#xff0c;粉丝自己在实际工作中的需求…

牛叉,一行代码不写,就可以开发系统

如今AI和低代码越来越火&#xff0c;可以瞬间完成一个系统的开发。 不用一行代码&#xff0c;轻松实现业务数字化&#xff0c;是怎么做到的&#xff1f; 前面小孟开发了大量的系统&#xff0c;很多时候不是我写代码多么快&#xff0c;也不是我技术多么的厉害&#xff0c;而是…

GPU与CPU

1 什么是GPU&#xff1f; GPU的英文全称Graphics Processing Unit&#xff0c;图形处理单元。通俗来说&#xff0c;GPU是一款专门的图形处理芯片&#xff0c;做图形渲染、数值分析、金融分析、密码破解&#xff0c;以及其他数学计算与几何运算的。GPU可以在PC、工作站、游戏主…

chatgpt赋能python:Python如何关闭对话框?

Python如何关闭对话框&#xff1f; 如果你是一名Python编程经验丰富的工程师&#xff0c;你一定已经遇到过需要在Python中关闭对话框的场景。在这篇文章中&#xff0c;我将详细介绍如何处理这个问题&#xff0c;并提供一些有用的技巧和建议。 什么是对话框&#xff1f; 在编…

跨境电商平台支持后台采集商城PC+WAP+小程序+APP,Java

跨境电商系统概述 跨境电商系统是一种在全球范围内开展电子商务的技术平台。它能够帮助企业建立贸易关系、实现商品销售、支付和物流配送等功能&#xff0c;提高企业的市场竞争力和盈利能力。该系统支持自营和招商入驻的电商模式&#xff0c;多终端交互&#xff0c;有PC、APP、…

【Springboot实用功能开发】发送QQ邮件以及邮件验证码对话框

文章目录 参考博客1. 发送一封QQ邮件添加Maven依赖QQ邮箱开启POP服务配置application.properties文件Controller层编写 vue前端&#xff08;也可以直接省略使用PostMan测试接口&#xff09; 2. 做一个发送邮件验证的对话框 参考博客 vue实现验证码倒计时功能SpringBoot实现邮箱…

会讲ppt的技术人,平均薪资多30%以上!

一场好的技术分享&#xff0c;可以用“有趣有料”四个字来形容&#xff0c;那么如何才能做到有趣又有料呢&#xff1f;结合我的经历&#xff0c;做了一些总结。 2015年&#xff0c;我出版《技术管理之巅》以后&#xff0c;先后收到QCon、CSDN、IT168等业界知名技术大会的邀请担…

大手笔!吴恩达一口气开放了 3 个 AIGC 教程。。

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 一个月前&#xff0c;DeepLearning.ai 创始人吴恩达与 OpenAI 开发者 Iza Fulford 联手推出了一门面向开发者的技术教程&#xff1a;《ChatGPT 提示工程》。 该教程总共分为 9 个章节&…

编码器-解码器 | 基于 Transformers 的编码器-解码器模型

基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶。本文简要介绍了神经编码器-解码器模型的历史&#xff0c;更多背景知识&#xff0c;建议读者阅读由 Sebastion Ruder 撰写的这篇精彩 博文。此外&#xff0c;建议读者对 自注意力 (…

PYtriton:从Python提供的Triton Inference Server

env sudo docker run -it --shm-size 8gb --rm --gpusall -p 8126:8000 -v ${PWD}:/test nvcr.io/nvidia/pytorch:23.04-py3 bash sudo docker run -it --shm-size 8gb --rm --gpusall -v ${PWD}:/test nvcr.io/nvidia/pytorch:23.04-py3 bash 服务端Docker : sudo docker ru…

chatgpt赋能python:Python关闭应用程序:如何安全、有效地终止进程

Python关闭应用程序&#xff1a;如何安全、有效地终止进程 Python是一种流行的编程语言&#xff0c;广泛应用于各种领域和行业。在实际的开发工作中&#xff0c;我们常常需要处理进程的启动和终止问题。无论是在测试环境还是在生产环境中&#xff0c;安全有效地终止进程都是至…

一个job问题引出的Oracle官方文档的差错

同事提了个问题&#xff0c;PLSQL Developer连接Oracle 11g创建编辑job都正常&#xff0c;但是相同的PLSQL Developer连接Oracle 19c能创建job&#xff0c;但是选择编辑&#xff0c;就会提示如下日期格式错误&#xff0c; 看了一些资料&#xff0c;有的说是操作系统和Oracle的日…

【实用篇】RabbitMQ

文章目录 RabbitMQ1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯 1.2.技术对比&#xff1a; 2.快速入门2.1.安装RabbitMQ2.1.1.单机部署下载镜像安装MQ 2.2.RabbitMQ消息模型2.3.导入Demo工程2.4.入门案例2.4.1.publisher实现2.4.2.consumer实现 2.5.总结 3.SpringA…