小白跟做江科大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;因为三个元素互为说明关系。 通过引入人/群体来说明三个元素的关系。 需…

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

海滨学院班级回忆录 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了海滨学院班级回忆录的开发全过程。通过分析海滨学院班级回忆录管理的不足&#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…

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…

【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程序员…

C及C++每日练习(1)

一.选择&#xff1a; 1.以下for循环的执行次数是&#xff08;&#xff09; for(int x 0, y 0; (y 123) && (x < 4); x); A.是无限循环 B.循环次数不定 C.4次 D.3次 对于循环&#xff0c;其组成部分可以四个部分&#xff1a; for(初始化;循环进行条件;调整) …

【QA-SYSTEMS】CANTATA-解决Jenkins中build Cantata报错

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 解决Jenkins中build Cantata测试项目报找不到license server的错误。 2、 问题场景 在Jenkins中build Cantata测试项目&#xff0c;报错“Failed to figure out the license server correctly”。 3、软硬件环…

Numpy教程

文章目录 数组基础文件与字符串多项式分布实战 Numpy绝对可以说是支撑Python地位的最重要的包了&#xff0c;几乎所有能叫出名的Python计算库&#xff0c;都不可避免地调用了Numpy&#xff0c;Numpy官网也列出了一些&#xff0c;大致如下图这样&#xff0c;在科学计算领域&…

Spring事务管理与模板对象

1.事务管理 1.事务回顾 事务指数据库中多个操作合并在一起形成的操作序列 事务的作用 当数据库操作序列中个别操作失败时&#xff0c;提供一种方式使数据库状态恢复到正常状态&#xff08;A&#xff09;&#xff0c;保障数据库即使在异常状态下仍能保持数据一致性&#xff…

android开发教程百度网盘,高并发系统基础篇

展望未来 操作系统 移动操作系统的演变过程&#xff0c;从按键交互的塞班功能机到触摸屏交互的Android/IOS智能机&#xff0c;从小屏幕手机到全面屏、刘海屏、水滴屏。任何系统无非干两件事&#xff1a;输入和输出&#xff0c;接收到外部输入信号后经过操作系统处理后输出信息…

史称GPT-4最强劲敌——Claude 3 大模型它来了【附体验教程】

Anthropic 的 Claude 3 Sonnet 模型现已在亚马逊云科技的 Amazon Bedrock 正式可用。 Amazon Bedrock 是目前 第一个 也是 唯一 一个提供 Claude 3 Sonnet 的托管服务 。 Claude 3 免费测试体验者福利&#x1f9e7;&#xff1a;https://mp.weixin.qq.com/s/hszLRa8B5zKsTDg2bmI…

Java两周半速成之路(第七天)

一.多态 3.多态的好处: 提高了程序的维护性(由继承保证) 提高了程序的扩展性(由多态保证) 演示&#xff1a; package com.shujia.day08;public class Animal {String name;int age;public Animal() {}public Animal(String name, int age) {this.name name;this.age age…

安装/升级 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 报错 提示…