小白跟做江科大51单片机之AT24C02数据存储

1.导入Delay、key、LCD1602相关文件

2.控制逻辑

以I2C去写入,用AT24C02包装好,main调用即可

3.编写I2C代码

看着这六个状态编

图1 开和关

图2 发送一个字节

图3 接收一个字节

图4 接收和发送应答

#include <REGX52.H>


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

/**
  * @brief  I2C开始
  * @param  无
  * @retval 无
  */
void I2C_Start(void)
{
    //空闲状态默认SCL和SDA是高电平的
    I2C_SDA=1;    //SDA可能是0
    I2C_SCL=1;    //SCL在I2C复合的时候有可能为低电平
    
    I2C_SDA=0;    //SDA要换为低电平
    I2C_SCL=0;    //SCL要换为低电平
    
}

/**
  * @brief  I2C发送一个字节
  * @param  Data 要发送的字节
  * @retval 无
  */

void I2C_Send(unsigned char Data)
{
    //默认I2C_SCL=0;
    unsigned char i;
    for(i=0;i<8;i++)
    {
        I2C_SDA=Data&(0x80>>i);
        I2C_SCL=1;    
        I2C_SCL=0;    //写了立马就读没超过最大时钟
    }
    
}


/**
  * @brief  I2C接收一个字节
  * @param  无
  * @retval 接收到的一个字节数据
  */
unsigned char I2C_Receive(void)   //这里不需要参数Data
{
    unsigned char Receive_Data=0x00,i;
    I2C_SDA=1;  //释放SDA
    for(i=0;i<8;i++)
    {
        I2C_SCL=1;  //低电平不允许读取,所以要为1
        if(I2C_SDA)Receive_Data|=(0x80>>i);   
        I2C_SCL=0;
    }
    return Receive_Data;
}


/**
  * @brief  I2C发送应答
  * @param  ACK_select 应答位,0为应答,1为非应答
  * @retval 无
  */
void I2C_Send_ACK(unsigned char ACK_select)
{
    //返回需要通过时序变化,不能直接返回参数值
    I2C_SDA=ACK_select;  //SDA就是应答位
    //发送应答过程
    I2C_SCL=1;
    I2C_SCL=0; 
}

/**
  * @brief  I2C接收应答位
  * @param  无
  * @retval 接收到的应答位,0为应答,1为非应答
  */
unsigned char I2C_Receive_ACK(void)
{
    unsigned char ACK_bit;
    //返回需要通过时序变化,不能直接返回参数值
    I2C_SDA=1;  //SDA释放
    //发送应答过程
    I2C_SCL=1;
    ACK_bit=I2C_SDA;
    I2C_SCL=0;
    return ACK_bit;
}


/**
  * @brief  I2C停止
  * @param  无
  * @retval 无
  */
void I2C_Stop(void)
{  //归为0上拉才有意义
    I2C_SDA=0;    //在终止之前,SDA有可能是0,有可能是1
    I2C_SCL=1;    
    I2C_SDA=1;    
}

4.看此图编写AT24C02代码

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

#define AT24C02_ADDRESS        0xA0  //默认地址

void AT24C02_WriteByte(unsigned char WordAddress,Data)
{
    I2C_Start();
    I2C_Send(AT24C02_ADDRESS);
    I2C_Send_ACK(0);
    I2C_Send(WordAddress);
    I2C_Send_ACK(0);
    I2C_Send(Data);   //第一个字节数据
    I2C_Send_ACK(0);
    I2C_Stop();
}

unsigned char AT24C02_ReadByte(unsigned char WordAddress)
{
    unsigned char num;
    I2C_Start();
    I2C_Send(AT24C02_ADDRESS);
    I2C_Receive_ACK();
    I2C_Send(WordAddress);
    I2C_Receive_ACK();
    I2C_Start();
    I2C_Send(AT24C02_ADDRESS|0x01);   //这表示为读
    I2C_Receive_ACK();
    num=I2C_Receive();   
    I2C_Send_ACK(1);
    I2C_Stop();
    return num;
}

5.编写main代码

#include <REGX52.H>
#include "LCD1602.h"
#include "key.h"
#include "AT24C02.h"
#include "Delay.h"

unsigned char keynum;
unsigned int  figure=0;

void main()
{
    LCD_Init();
    LCD_ShowString(1,1,"Hello!   ");
    while(1)
    {
        
        keynum=Key();
        //K1按键,Num自增
        if(keynum==1)
        {
            figure++;
            LCD_ShowNum(2,1,figure,5);
        }
        //K2按键,Num自减
        if(keynum==2)
        {
            figure--;
            LCD_ShowNum(2,1,figure,5);
        }
        //K3按键,向AT24C02写入数据
        if(keynum==3)
        {
            AT24C02_WriteByte(0,figure%256);
            Delay(5);
            AT24C02_WriteByte(1,figure/256);
            Delay(5);
            Delay(1000);
            LCD_ShowString(2,1,"Write ok");
            Delay(500);
        }
        //K4按键,从AT24C02读取数据
        if(keynum==4)
        {
            static int temp=0;
            temp=AT24C02_ReadByte(0);
            temp|=AT24C02_ReadByte(1)<<8;     //这一步为叠加数据
            LCD_ShowString(2,1,"Read  ok");
            Delay(500);
            LCD_ShowString(2,1,"        ");
            LCD_ShowNum(2,1,temp,5);
            Delay(1000);
        }
    }
}

6.试验结果展示

AT24C02存储

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

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

相关文章

java: No enum constant javax.lang.model.element.Modifier.SEALED报错

这里我的idea版本为2021.03&#xff0c;JDK版本为21.0.2。经过大量冲浪后大多数都是让修改JDK版本&#xff0c;原因是Modifier.SEALED是JDK15新增的&#xff0c;但是当我修改完JDK版本后并无卵用。 尝试在代码中声明&#xff0c;也没问题可以引用到&#xff0c;这就怪了&#…

CleanMyMac X2024非常值得推荐的Mac清理工具

经过全面的评估和分析&#xff0c;CleanMyMac X在Mac清理和优化软件市场中表现出色。它具备全面的功能特点&#xff0c;如智能扫描、恶意软件检测和清除、应用程序管理等&#xff0c;为用户提供了全面的Mac维护服务。同时&#xff0c;该软件的用户体验也非常优秀&#xff0c;界…

所有人都告诉我考上了会怎么怎么样,却没人告诉我考研失败后该何去何从?

“所有人都告诉我考上了会怎么怎么样&#xff0c;却好像没人告诉我考研失败后该何去何从?” 2023年考研人数: 474万。 在竞争愈发激烈的考研热潮下&#xff0c;破茧成蝶&#xff0c;金榜题名注定只能成为少数人的如愿以偿。梦醒时分&#xff0c;大多数人或许也只能无奈地自嘲&…

【产品经理方法论——产品的基本概念】

1. 产品学三元素 产品学有三个元素&#xff1a;用户、需求、产品 产品学的内容&#xff1a;根据用户的需求设计产品&#xff0c;使用产品服务用户 仅仅通过三个元素无法说明每个元素的概念&#xff0c;因为三个元素互为说明关系。 通过引入人/群体来说明三个元素的关系。 需…

html2canvas和dom-to-image的优缺点对比

前段时间因为需求需要用到截图功能&#xff0c;一番调研后了解到html2canvas和dom-to-image可以实现截图功能。原理都是获取到dom元素&#xff0c;将dom绘制成canvas,然后转成图片。刚开始用的是html2canvas插件&#xff0c;后面因为html2vancas没法更改生成图片的样式&#xf…

C++高级面试题:解释 C++ 中的内存分配器(Allocator)。

C高级面试题&#xff1a;解释 C 中的内存分配器&#xff08;Allocator&#xff09;。 在 C 中&#xff0c;内存分配器&#xff08;Allocator&#xff09;是用于动态分配内存的对象&#xff0c;它提供了一种将内存分配和释放的任务与具体数据类型的对象分离的机制。使用内存分配…

LeetCode hot100-6

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。注意&#xff1a;答案中不可以包含重复的三元组。这题不会做&…

基于springboot海滨学院班级回忆录的设计与实现论文

海滨学院班级回忆录 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了海滨学院班级回忆录的开发全过程。通过分析海滨学院班级回忆录管理的不足&#xff0c;创建了一个计算机管理海滨学院班级回忆录的方案。文章…

[three.js]UV动画

背景 好久没接触UV动画这块内容&#xff0c;突然接手了一个涉及这块的开发任务&#xff0c;被打个措手不及。完成任务后&#xff0c;把涉及到的知识点记录下。其实做的就是一个光带。 UV坐标系 UV坐标系是将贴图贴到某个面上时&#xff0c;指定怎么贴合的坐标系。以平面几何…

2.Rust变量

变量的声明 let关键字 在Rust中变量必须要先声明才能使用&#xff0c;let关键字用于声明变量并将一个值绑定到该变量上。如下: fn main() {let var_name:i32 123123;println!("{}",var_name) //println! 是一个宏&#xff08;macros&#xff09;&#xff0c;可以…

PSINS工具箱笔记——SINS/GNSS的例程

如图&#xff0c;三个不同维数的SINS/GPS的融合&#xff0c;153表示状态量15维、观测量3维&#xff0c;以此类推。 15维包括&#xff1a;失准角&#xff08;3&#xff09;速度误差&#xff08;3&#xff09;位置误差&#xff08;3&#xff09;陀螺漂移&#xff08;3&#xff…

数字文旅:引领文旅产业迈向全新篇章

每天五分钟讲解一个商业模式&#xff0c;大家好我是啊浩说模式 近年来&#xff0c;数字技术的迅猛发展&#xff0c;尤其是虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;等尖端技术的广泛应用&#xff0c;在旅游业这一娱乐文化产业中&#xff0c;低…

vue + js 项目打包JS、CSS文件自动部署到oss

一、下载oss依赖 npm install webpack-aliyun-oss 或 yarn add webpack-aliyun-oss 二、在vue.config.js中配置文件 const WebpackAliyunOss require("webpack-aliyun-oss");let VUE_APP_BUCKET "xxx"; let VUE_APP_REGION "xx-xxx-xxx";m…

FL Studio20官方中文国内版升级下载2024最新

FL Studio 20&#xff0c;也被众多音乐制作人亲切地称为“水果20”&#xff0c;是一款功能强大的音乐制作软件&#xff0c;它在音乐创作、编曲、录音、混音以及后期制作等方面都有着出色的表现。这款软件不仅适用于专业的音乐制作人&#xff0c;也对初学者非常友好&#xff0c;…

【CSS】关于文字的换行问题

给固定宽度的div中写入一些文字&#xff0c;你会发现文字可能会超出&#xff0c;实例如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&qu…

C++ QT 嘴试题--集锦

1、C的默认函数都有哪些&#xff1f; 在C中&#xff0c;默认函数&#xff08;也称为特殊成员函数&#xff09;是一组在类定义中不需要显式声明和定义的函数。这些函数在特定的情况下会被编译器自动合成&#xff08;隐式生成&#xff09;。以下是C中的默认函数&#xff1a; 默认…

倒计时33天

1.L1-8 静静的推荐 - 2024团体程序设计天梯赛&#xff08;历年真题&#xff09;练习集 (pintia.cn) //碎碎念&#xff1a;主要还是理解题意吧&#xff0c;&#xff0c;为什么每一个字我都认识但合起来就看不懂了呢&#xff0c;&#xff0c;(・∀・(・∀・(・∀・*)&#xff0c…

【QT】重载的信号槽/槽函数做lambda表达式

重载的信号槽 函数指针&#xff1a; int fun(int a,long b) int (*funp)(int, long) fun; 实现回调函数就需要函数指针 信号重载 派生类槽函数发送两个信号 派生类给父类发两个信号 void (SubWidget::*mysigsub)() &SubWidget::sigSub;connect(&subw,mysigsub,t…

Linux命令高效的4个shell替代工具

文章目录 前言1.Top1.1 htop1.2 btop1.3 glances 2.df2.1 duf 3.ls3.1 eza 4.cat4.1 bat 前言 Unix系统发展了好多年了&#xff0c;不论是各开源发行版的linux还是封闭商业化的MacOS&#xff0c;上古流传的古董命令依旧在终端发挥着重要作用&#xff0c;但其实使用体验感觉还是…

2024年Android开发进阶课程,面试一路绿灯Offer拿到手软

职业生涯规划 Android系统的市场地位 Android程序开发的技能成长经验 Android程序员为什么需要学习Html5 Android软件工程师为什么不会被前端替代 为什么小程序无法替代原生开发 为什么Html5无法取代NativeAPP Html5在Android中的应用场景 如何成为一名合格的高级Android程序员…