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

news2024/11/25 6:33:04

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.coloradmin.cn/o/1493433.html

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

相关文章

2024年Java者未来的出路在哪里,java多线程面试

重要 大环境对于我们能力要求越来越高&#xff0c;医学专家又说今年冬天新冠肺炎将“席卷重来”。 如果疫情再次爆发&#xff0c;势必将再次影响企业的正常运作&#xff0c;一波裁员浪潮你又能否抗住&#xff1f; 不管如何&#xff0c;明年金三银四又是一波跳槽时机&#xf…

CUDA学习笔记04:向量之和

参考资料 CUDA编程模型系列二(向量操作)_哔哩哔哩_bilibili &#xff08;非常好的学习资料&#xff01;&#xff09; vs2019 随意新建一个空项目&#xff0c;按照之前的环境配置配好项目依赖&#xff1a; CUDA学习笔记02&#xff1a;测试程序hello world-CSDN博客 代码结构…

k倍区间c++

题目 输入样例&#xff1a; 5 2 1 2 3 4 5输出样例&#xff1a; 6 思路 本题默认所有读者已经理解了如何求前缀和。 可以利用双层循环分别枚举左端点和右端点即可枚举完所有区间&#xff0c;而对于每个区间&#xff0c;利用一维前缀和判断它是否是一个k倍区间&#xff0c;是…

必看内容!物联网ESP8266与阿里云物联网平台通信

一、硬件连接 wifi模块ESP8266-01S接线&#xff1a; TXD接RXD&#xff08;USB&#xff09; RXD接TXD (USB) VCC接3.3V GNDGPIO0接地 二、调试工具 三、烧录MQTT固件 购买的ESP8266一般没带MQTT固件&#xff0c;所以无法通过MQTT指令与云平台通信&#xff0c;需要烧录固件。 …

1、Linux-安装

一、Linux和Windows的一些区别 1、Linux严格区分大小写——【Windows创建文件夹时不区分大小写】 2、Linux中所有内容都以文件形式存储&#xff0c;包括硬件 3、Linux不靠拓展名区分文件类型&#xff0c;而是可以通过读取文件开头的一些字节来区分。 但是在实际使用中一般要…

C#,电话数字键盘问题(Mobile Numeric Keypad problem)的算法与源代码

1 电话数字键盘问题 提供移动数字键盘。您只能按向上、向左、向右或向下至当前按钮的按钮。不允许您按最下面一行的角点按钮&#xff08;即.*和#&#xff09;。 移动键盘 给定一个数N&#xff0c;找出给定长度的可能数。 示例&#xff1a; 对于N1&#xff0c;可能的数字数为…

Guava处理异常

guava由Google开发&#xff0c;它提供了大量的核心Java库&#xff0c;例如&#xff1a;集合、缓存、原生类型支持、并发库、通用注解、字符串处理和I/O操作等。 异常处理 传统的Java异常处理通常包括try-catch-finally块和throws关键字。 遇到FileNotFoundException或IOExce…

LocalDateTime类常用的方法介绍

Java 8引入了新的日期和时间API&#xff0c;其中包括LocalDateTime类&#xff0c;它表示没有时区信息的日期和时间。这个类是不可变的&#xff0c;并且线程安全。LocalDateTime类提供了大量的方法来处理日期和时间&#xff0c;包括格式化、转换和计算。 创建LocalDateTime对象 …

Android耗电分析之Battery Historian工具使用

Battery-Historian是谷歌推出的一款专门分析Bugreport的工具&#xff0c;是谷歌在2015年I/O大会上推出的一款检测运行在android5.0(Lollipop)及以后版本的设备上电池的相关信息和事件的工具&#xff0c;是一款对于分析手机状态&#xff0c;历史运行情况很好的可视化分析工具。 …

第106讲:Mycat实践指南:范围分片下的水平分表详解

文章目录 1.Mycat水平拆分的分片规则2. Mycat水平拆分之范围分片2.1.使用范围分片水平分表的背景2.2.水平分表范围分片案例2.3.准备测试的表结构2.4.配置Mycat实现范围分片的水平分表2.4.1.配置Schema配置文件2.4.2.配置Rule分片规则配置文件2.4.3.配置Server配置文件2.4.4.重启…

牛客网 华为机试 取近似值

本题是要实现四舍五入。我们采用float的数据类型&#xff0c;因为这样数据精度更高。然后我们可以把得到的数据0.5&#xff0c;然后再转换成int数据类型&#xff0c;因为转换成int数据类型的时候是向下取整的&#xff0c;比如4.9转换成int就是4&#xff0c;4.2转换成int也是4。…

Python错题集-7:DeprecationWarning: Conversion of an array with ndim(被弃用警告)

1问题描述 DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.) X[i] np.random.nor…

LCR 188. 买卖芯片的最佳时机

解题思路&#xff1a; 动态规划 方法一&#xff1a;常规解法 class Solution {public int bestTiming(int[] prices) {int n prices.length;if (n 0) return 0;int[] dp new int[n];int cost prices[0];for (int i 1; i < n; i) {cost Math.min(cost, prices[i]);dp…

Unity类银河恶魔城学习记录8-2 p78.Improving black with clone creating源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作【Unity教程】从0编程制作 Blackhole_Hotkey_Controller.cs using System.Collections; using System.Collectio…

Dell R620中文手册下载

poweredge-r620_owners-manual_zh-cn.pdf https://url20.ctfile.com/f/36743220-1030280698-8d9322?p2024 (访问密码: 2024)

为什么我建议你2024年一定要入局鸿蒙?

自去年发布现象级“爆款”手机Mate 60后&#xff0c;华为就备受关注。小灰作为一枚程序员&#xff0c;关注的重心更偏向于技术。华为手机搭载的国产自研的鸿蒙操作系统&#xff08;HarmonyOS&#xff09;&#xff0c;已经成为一个业界的里程碑&#xff0c;是我国国产技术自主化…

ChatGPT Plus 自动扣费失败,如何续订

ChatGPT Plus 自动扣费失败&#xff0c;如何续订 如果您的 ChatGPT Plus 订阅过期或扣费失败&#xff0c;本教程将指导您如何重新订阅。 本周更新 ChatGPT Plus 是一种每月20美元的订阅服务。扣费会自动进行&#xff0c;如果您的账户余额不足&#xff0c;OpenAI 将在一次扣费…

C语言写学生信息管理系统

说明:本博文来自CSDN-问答板块,题主提问。 需要:用C语言设计一个学生信息管理系统(尽量不使用指针),学生信息包括学号,姓名,数学成绩,C语言成绩,英语成绩和每个学生的总成绩这几项。系统要实现如下几个功能:1.添加学生2.删除学生3.修改学生信息4.查询学生信息5进行学…

C#,无监督的K-Medoid聚类算法(K-Medoid Algorithm)与源代码

1 K-Medoid算法 K-Medoid&#xff08;也称为围绕Medoid的划分&#xff09;算法是由Kaufman和Rousseeuw于1987年提出的。中间点可以定义为簇中的点&#xff0c;其与簇中所有其他点的相似度最小。 K-medoids聚类是一种无监督的聚类算法&#xff0c;它对未标记数据中的对象进行聚…

安装/升级 gcc

文章目录 查看当前 gcc 版本查看 yum 软件库 gcc 版本列表下载最新版本安装 查看当前 gcc 版本 查看 yum 软件库 gcc 版本列表 只有一个4.8的版本&#xff0c;过旧 下载最新版本 wget https://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.gz 安装 ./configure 报错 提示…