51单片机-AT24CXX存储器工作原理

embedded/2025/2/26 3:07:02/

1、AT24CXX存储器工作原理

1.1、特点:

  • 与400KHz,I2C总线兼容
  • 1.8到6.0伏工作电压范围
  • 低功耗CMOS技术
  • 写保护功能当WP为高电平时进入写保护状态
  • 页写缓冲器
  • 自定时擦写周期
  • 100万次编程/擦除周期
  • 可保存数据100年
  • 8脚DIP SOIC或TSSOP封装
  • 温度范围商业级和工业级

1.2、概述

CAT24WC01/02/04/08/16是一个1K/2K/4K/8K/16K位串行CMOS,EEPROM内部含有128/256/512/1024/2048个8位字节CATALYST公司的先进CMOS技术实质上减少了器件的功耗,CAT24WC01有一个8字节页写缓冲器CAT24WC02/04/08/16有一个16字节页写缓冲器,该器件通过I2C总线接口进行操作有一个专门的写保护功能。

 

 总线时序

 

1.3、驱动程序编写

//<main.c>#include "reg52.h"
#include "i2c.h"typedef unsigned int u16;
typedef unsigned char u8;//使用单片机上四个独立按键
sbit k1=P3^1; //保存显示的数据
sbit k2=P3^0; //读取上次保存的数据
sbit k3=P3^2; //对显示的数据进行累加
sbit k4=P3^1; //清零// 38译码器
sbit LBA=P2^2;
sbit LBB=P2^3;
sbit LBC=P2^4;u8 num=0,
disp[4]; //4位数码管显示// 发生字码:code关键词,保持变量到flash里面,如果没有code保持在data里面
u8 code  smgduan[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay(u16 i)
{while(i--)
}void Keypros()
{if(k1=0){delay(1000); //按键消抖if(k1==0){At24c02Write(1,num);}while(!k1); //判断按键是否松开}if(k2=0){delay(1000); //按键消抖if(k2==0){num = At24c02read(1);}while(!k2); //判断按键是否松开}if(k3=0){delay(1000); //按键消抖if(k3==0){num++;if(num>255) num=0;}while(!k3); //判断按键是否松开}if(k4=0){delay(1000); //按键消抖if(k4==0){num=0;}while(!k4); //判断按键是否松开}
}void datapros()
{disp[0]=smgduan[num/1000]; //因为数码管四位,所以最高显示9999disp[1]=smgduan[num%1000/100]; //取百位disp[2]=smgduan[num%1000%100/10];disp[3]=smgduan[num%1000%100%10];
}void Digplsplay()
{u8 i;for(i=0;i<4;i++){switch(i){case 0:LSA = 0;LSB = 0;LSC = 0;break;case 1:LSA = 1;LSB = 0;LSC = 0;break;case 2:LSA = 0;LSB = 1;LSC = 0;break;case 3:LSA = 0;LSB = 0;LSC = 1;break;}P0=disp[3-i];delay(100);p0=0x00;}
}void main()
{while(1){Keypros();datapros();Digplsplay();}
}
//<i2c.h>#ifndef _I2C_H
#define _I2C_H#include <reg52.h>sbit SCL=p2^1;
sbit SDA=P2^0;void At24c02Write(unsigned char addr,unsigned char dat);
unsigned char At24c02Read(unsigned char addr);#endif
//<i2c.c>文件#include "i2c.h"/**
编写单片机时序,单片机小精灵工具生成
12MHZ晶振,延迟10us
*/
void Delay10us(void)
{unsigned char a,b;for(b=1;b>0;b--)for(a=2;a>0;a--)
}//起始信号S
void I2cStart()
{SDA=1;Delay10us();SCL=1;Delay10us();SDA=0;Delay10us();SCL=0;Delay10us();
}//终止信号
void I2cStop()
{SDA=0;Delay10us();SCL=1;Delay10us();SDA=1;Delay10us();
}//发送字节,一个个发送,先发送高位后发送地位,应答 “0”
unsigned char I2cSendByte(unsigned char dat)
{unsigned char a=0,b;for(a=0;a<8;a++){SDA=dat>>7;  //传送最高位dat=dat<<1;  //右移一位,次高位变成最高位Delay10us(); //延迟10us//SCL为低电平可以变化,为高电平保持稳定SCL=1; //移位的数据就会保持稳定Delay10us();SCL=0; //数据可以改变Delay10us();    }//将数据线和时钟线释放出来SDA=1;Delay10us();    SCL=1;while(SDA) //如果从机对主机发送的字节产生应答SDA会变成 0{//发送失败SDA始终为高电平b++ //设置个等待时间if(b>200){ //至少200us,1条指令1usSCL=0;Delay10us();return 0; }}//产生应答 SCL=0拉低SCL=0;Delay10us();  return 1;
}/**
接收数据
*/
unsigned char I2cReadByte()
{unsigned char a=0,dat=0;SDA=1;  //拉高SDA使处于空闲状态Delay10us();for(a=0;a<0;a++){SCL=1;Delay10us();dat<<=1;  // dat=0 00  01  10dat|=SDA; //    01     11   把SDA的值给datDelay10us();SCL=0;Delay10us();}return dat;
}/**针对AT24C02的读写函数S-器件地址+0 A  写入首地址 A Data1 A  .....  Data0  A  P*/void At24c02Write(unsigned char addr,unsigned char dat){ I2cStart(); //起始信号I2cSendByte(0xa0); //器件地址I2cSendByte(addr); // 首地址I2cSendByte(dat); // 发送数据I2cStop(); //停止
}unsigned char At24c02Read(unsigned char addr)
{unsigned char num;I2cStart(); //起始信号I2cSendByte(0xa0); //器件地址I2cSendByte(addr); // 首地址//在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相I2cStart(); //起始信号I2cSendByte(0xa1); //器件地址num=I2cReadByte();I2cStop();return num;
}

http://www.ppmy.cn/embedded/167176.html

相关文章

Llama 3.1 本地电脑部署 Linux系统 【轻松简易】

本文分享在自己的本地电脑部署 llama3.1&#xff0c;而且轻松简易&#xff0c;快速上手。 这里借助Ollama工具&#xff0c;在Linux系统中进行大模型部署~ Llama3.1&#xff0c;有三个版本&#xff1a;8B、70B、405B Llama 3.1 405B 是第一个公开可用的模型&#xff0c;在常识…

运行 Rancher 的建议

运行在多个节点上的多个 Rancher 实例确保了单节点环境无法实现的高可用性&#xff0c;所以在生产环境或者一些很重要的环境中部署 Rancher 时&#xff0c;应该使用至少有三个节点的高可用 Kubernetes 集群&#xff0c;并在这个集群上面安装 Rancher。 在专用的集群上运行 Ran…

Prime_Series_Level-1靶场,wpscan爆破,LFI漏洞,wordpress更改文件getshell,ubuntu内核提权

泷羽Sec-尘宇安全 前言 oscp备考&#xff0c;oscp系列——Prime_Series_Level-1靶场&#xff0c;wpscan爆破&#xff0c;LFI漏洞&#xff0c;wordpress更改文件getshell&#xff0c;ubuntu内核提权 难度简单偏上 对于低权限shell获取涉及&#xff1a;wpscan爆破&#xff0c;…

Java虚拟机(JVM)深度解析

Java虚拟机(JVM)深度解析 JVM概述JVM内存结构堆内存详细分区类加载机制类加载流程类加载器层次执行引擎与运行时数据区执行引擎核心组件运行时数据区交互垃圾回收机制(GC)GC算法分类常见垃圾收集器JVM性能调优常用参数示例JVM概述 Java虚拟机(Java Virtual Machine, JVM)…

计算机视觉算法实战——产品分拣(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ 1. 领域简介✨✨ 产品分拣是工业自动化和物流领域的核心技术&#xff0c;旨在通过机器视觉系统对传送带上的物品进行快速识别、定位和分类&a…

instanceof和typeof的区别【JavaScript常见面试题】

typeof &#xff08;一元操作符&#xff09;&#xff1a; 用于判断一个变量的类型。它可以用于任何数据类型&#xff0c;并返回一个表示该类型的字符串。 console.log(typeof 42); // "number" console.log(typeof Hello); // "string" conso…

Spring Boot + JSqlParser:全面解析数据隔离最佳实践

Spring Boot JSqlParser&#xff1a;全面解析数据隔离最佳实践 在构建多租户系统或需要进行数据权限控制的应用时&#xff0c;数据隔离是一个至关重要的课题。不同租户之间的数据隔离不仅能够确保数据的安全性&#xff0c;还能提高系统的灵活性和可维护性。随着业务的扩展和需…

python和pycharm 和Anaconda的关系

好的&#xff0c;下面我会详细说明 Python、PyCharm 和 Anaconda 三者的关系&#xff0c;并逐一解释它们的功能和作用。 1. Python&#xff08;编程语言&#xff09; 定义&#xff1a;Python 是一种高级编程语言&#xff0c;设计简洁&#xff0c;易于学习&#xff0c;且功能强…