(基于江协科技)51单片机入门:10.AT24C0

存储区

易失性存储区(RAM) 掉电数据丢失 但 数据传输快

(SRAM)触发器,用电路储存数据

(DRAM)电容,存在漏电现象,需要配扫描电路

非易失性存储区(ROM) 掉电数据不丢失 但 数据传输慢

(Mask ROM) 只能读取不能写

(PROM)能读能写,只能写一次

(EPROM)能写能读,但是写入时数据清空要利用紫外线照射

(E2PROM)能写能读,利用电擦除数据

(Flash)

(硬盘,软盘,光盘)

Mask ROM 是在电路设计时所确定好的,短路是交叉板什么都不接表示0,通路是接上二极管的通路表示1,接上二极管保证单条存储数据不会受另条影响,所以扫描时为一条一条扫描获取数据

PROM 所有路都接通带有双向的二极管,如图但异向的蓝色二极管较为特殊,可以利用高电压,将其击穿,获得右方效果图表示1,低电压击穿不了,是短路,表示0。由于被击穿的蓝色二极管不能自动复原,所以只能编写一次、

AT24C02

AT24C02是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息

存储介质:E^2PROM

通信接口:I^2C总线

容量:256字节

I^2C总线

采用一主多从模式

应答信号:0 表示收到

1 表示没收到或者读取完成

应答分:发送应答和接收应答

发送应答:再接收完一个字节后,主机在下一个时钟发送一位数据

接收应答:在发送完一个字节后,主机在下一个时钟接收一位数据(主机在接收之前,需要释放SDA)

起始位和停止位信息发送

数据01的发送

IIC数据传输,bit位以高位向低位先行传输

将读写数据帧划分为 开始 停止 数据接收 发送应答 数据传输 接收应答 6个模块函数

IIC模块函数

源文件

cpp 复制代码
#include <REGX52.H>

sbit IIC_SCL =P2^1;
sbit IIC_SDA =P2^0;

void IIC_Satrt(void)
{
	IIC_SDA = 1;
	IIC_SCL = 1;
	IIC_SDA = 0;
	IIC_SCL = 0;
}

void IIC_Stop(void)
{
	IIC_SDA = 0;
	IIC_SCL = 1;
	IIC_SDA = 1;
}

void IIC_SendByte(unsigned char Byte)
{
	unsigned char i = 0;
	for(i = 0; i < 8; i++)
	{
	IIC_SDA = Byte&(0x80>>i);
	IIC_SCL = 1;
	IIC_SCL = 0;             // AT24C02在5V情况最大1000KHe也就是最短时间为0.5微秒翻转一次 
	}						 // 51单片机IO口翻转最快是1(12MHz)微妙翻转一下 11.0592更长
							 // 所以时间早不了
}

unsigned char IIC_ReceiveByte(void)
{
	unsigned char read_Byte = 0x00;
	unsigned char i = 0;
	
	for(i = 0; i < 8; i++)
	{
	IIC_SDA = 1;
	IIC_SCL = 1;
	
	if(IIC_SDA){read_Byte |= (0x80>>i); }
	IIC_SCL = 0;
	}
	
	return read_Byte;
}

void IIC_SendAck(unsigned char Ackbit)
{
	IIC_SDA = Ackbit;
	IIC_SCL = 1;
	IIC_SCL = 0;
}

unsigned char IIC_ReceiveAck(void)
{
	unsigned char Ackbit = 0;
	
	IIC_SDA = 1;
	IIC_SCL = 1;
	if(IIC_SDA)Ackbit = 1;
	IIC_SCL = 0;
	
	return Ackbit;
}

头文件

cpp 复制代码
#ifndef __IIC_H_  
#define __IIC_H_

void IIC_Satrt(void);
	
void IIC_Stop(void);
	
void IIC_SendByte(unsigned char Byte);
	
unsigned char IIC_ReceiveByte(void);
	
void IIC_SendAck(unsigned char Ackbit);
	
unsigned char IIC_ReceiveAck(void);
#endif

利用模块后的IIC函数拼接AT24C02的通讯协议函数

源文件

cpp 复制代码
#include <REGX52.H>
#include "IIC.h"

#define AT24C02_Address 0xA0 // AT24C02的固定地址是1010 后3位是000 地址都是写入也是0  
							 // 也就是 1010 0000

void AT24C02_W(unsigned char WordAddress,Date)
{
	IIC_Satrt();
	IIC_SendByte(AT24C02_Address);
    IIC_ReceiveAck();
	IIC_SendByte(WordAddress);
	IIC_ReceiveAck();
	IIC_SendByte(Date);
	IIC_ReceiveAck();	
	IIC_Stop();
}

unsigned char AT24C02_R(unsigned char WordAddress)
{

	unsigned char ret = 0;
	IIC_Satrt();
	IIC_SendByte(AT24C02_Address);
	IIC_ReceiveAck();
	IIC_SendByte(WordAddress);
	IIC_ReceiveAck();
	IIC_Satrt();
	IIC_SendByte(AT24C02_Address | 0x01);
	IIC_ReceiveAck();
	
    ret = IIC_ReceiveByte();
	IIC_SendAck(1); // 置1表示读取完成
	IIC_Stop();
	return ret;
}

头文件

cpp 复制代码
#ifndef __AT24C02_H_  
#define __AR24C02_H_
void AT24C02_W(unsigned char WordAddress,Date);
	
unsigned char AT24C02_R(unsigned char WordAddress);

#endif

注意在使用写入函数时,后续要Delay 5毫秒,让数据成功写入

1.数据的写入和读出主函数文件

cpp 复制代码
#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
#include "key.h"
#include "AT24C02.H"

int main()
{
	unsigned char ret_key = 0;
	unsigned int num = 0;
	LCD_Init();
	LCD_ShowNum(1,1,num,5);

	AT24C02_W(0,88);
	Delay(5);
	num = AT24C02_R(0);
	LCD_ShowNum(1,1,num,5);
	
	while(1)
	{
		ret_key = key();
		if(ret_key == 1)
		{
			num++;
			LCD_ShowNum(1,1,num,5);
		}
		if(ret_key == 2)
		{
			num--;
			LCD_ShowNum(1,1,num,5);
		}
			if(ret_key == 3)
		{
			AT24C02_W(0,num/256);
			Delay(5);
			AT24C02_W(1,num%256);
			Delay(5);
			LCD_ShowString(2,1,"Write OK");
			Delay(1000);
			LCD_ShowString(2,1,"        ");
		}
			if(ret_key == 4)
		{
			 num = AT24C02_R(1) + AT24C02_R(0)*256;
			 
			 LCD_ShowNum(1,1,num,5);
			 LCD_ShowString(2,1,"Rread OK");
			 Delay(1000);
			 LCD_ShowString(2,1,"        ");
		}
	}
	return 0;
}
相关推荐
新启航光学频率梳5 分钟前
精密陶瓷轴承套孔深光学3D轮廓测量-激光频率梳3D轮廓技术
科技·3d·制造
鲨辣椒1008614 分钟前
51单片机核心钉子户——温度采集模块
单片机·嵌入式硬件·51单片机
ayingmeizi1631 小时前
从算力领先到增长领先:前沿科技企业为何需要AI原生CRM作为增长引擎
人工智能·科技·数据可视化·crm·ai-native
xiangw@GZ1 小时前
CapSense底层逻辑:硬件设计规范
单片机·嵌入式硬件·设计规范
自动化智库1 小时前
西门子S7-1200PLC与V90PN伺服基于FB284模块的定位控制应用
开发语言·科技
Nice__J1 小时前
Mcu架构以及原理——3.存储器架构
单片机·嵌入式硬件·架构
weiyvyy1 小时前
嵌入式硬件接口的定义与作用
单片机·嵌入式硬件·信息与通信·信息化系统
senijusene1 小时前
依赖51 单片机的 Modbus 协议温度采集与外设控制系统的实现
c语言·单片机·嵌入式硬件·51单片机·keil
JSMSEMI112 小时前
JSM1040T 1Mbps高速具有总线唤醒功能的CAN总线收发器
单片机·嵌入式硬件
busideyang2 小时前
STC8H单片机delay_ms函数闪烁不准?原因是参数溢出!
c语言·单片机·嵌入式硬件·嵌入式