欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

蓝桥杯笔记之 AT24C02驱动程序(九)

程序员文章站 2022-06-22 18:57:45
一、芯片介绍1.原理图2.管脚功能管脚名称功能A2,A1,A0器件地址选择SDA串行数据/地址SCL串行时钟WP写保护(应接地)VCC+1.8V~ 6.0V 工作电压GND地3.中文手册链接二、原理分析1.设备地址D7D6D5D4D3D2D1D01010A2A1A0R/WD0: 读写标志位,1为读,0为写。D3,D2,D1: 器件地址,由硬件决定。D7,D6,D5,D4...

一、芯片介绍

1.原理图
蓝桥杯笔记之 AT24C02驱动程序(九)
2.管脚功能

管脚名称 功能
A2,A1,A0 器件地址选择
SDA 串行数据/地址
SCL 串行时钟
WP 写保护(应接地)
VCC +1.8V~ 6.0V 工作电压
GND

3.中文手册
链接

二、原理分析

1.设备地址

D7 D6 D5 D4 D3 D2 D1 D0
1 0 1 0 A2 A1 A0 R/W

D0: 读写标志位,1为读,0为写。
D3,D2,D1: 器件地址,由硬件决定。
D7,D6,D5,D4: 高四位固定为1010。

2.写操作

1.写一字节
蓝桥杯笔记之 AT24C02驱动程序(九)
“ **** ”表示发送方为单片机。

1.起始信号****
2.器件地址 (其中高四位为固定1010,D3 D2 D1为器件地址,最低位为读写标志0为写,1为读) ****
3.应答
4.数据首地址(个人理解是将指针调到进行读写的位置)****
5.应答
6.一字节数据****
7.停止信号(发送完一字节数据后会有一个应答,但由于我们只发送一个数据,所以可以不管那个应答信号了)****
8.结束
2.页写
蓝桥杯笔记之 AT24C02驱动程序(九)
1.起始信号****
2.器件地址****
3.应答
4.数据首地址****
5.应答
6.数据1****
7.应答
8.数据2****
9.应答


数据n****
应答****
停止信号****

2.读操作

1.读当前地址字节
蓝桥杯笔记之 AT24C02驱动程序(九)
1.起始信号****
2.器件地址(注意读写标志,此处为读)****
3.应答
4.读一字节数据(当前地址)
5.非应答****
6.停止信号****
2.读任意地址字节
蓝桥杯笔记之 AT24C02驱动程序(九)
1.起始信号****
2.器件地址(写)****
3.应答
4.数据地址(个人理解为-调节指针)****
5.应答

6.起始信号****
7.器件地址(读)****
8.应答
9.读一字节数据
10.发送非应答****
11.停止信号

3.连续读
蓝桥杯笔记之 AT24C02驱动程序(九)
1.起始信号****
2.器件地址(读)****
3.应答
4.读一个字节的数据1
5.发送应答****
6.读一个字节的数据2
7.发送应答****


读一个字节的数据n
发送非应答****
停止信号

三、注意事项

1.一定要看懂时序图,底层驱动初赛会给
2.at24c02内部数据存储地址是从0x00到0xff,共256个字节
3.好像是每次发送起始信号都会把指针挪回0x00,此处没去仔细了解,个人猜测
暂时就这些,有再补充。

四、程序例程

该程序实现的是对开发板上电次数的计数

#include<STC15F2K60S2.H>
#include<intrins.h>
#include<iic.h>
#define uchar unsigned char

uchar wei_tab[]={0xff,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};		//位选从0到8依次为全选,1号管到八、8号管
uchar duan_tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xbf};	//段选从0到10依次为,0到9以及‘-’

uchar num=1;

void Delay1ms();
void all_init();
void dispaly(uchar wei,uchar duan);
void at24c02_write_byte(uchar address,uchar dat);
uchar at24c02_read_byte(uchar address);

//void IIC_Start(void); 
//void IIC_Stop(void);  
//bit IIC_WaitAck(void);  
//void IIC_SendAck(bit ackbit); 
//void IIC_SendByte(unsigned char byt); 
//unsigned char IIC_RecByte(void);

void main()
{
	all_init();
	//at24c02_write_byte(0x00,0);
	num=at24c02_read_byte(0x00);
	num+=1;
	at24c02_write_byte(0x00,num);
	while(1)
	{
		num=at24c02_read_byte(0x00);
		dispaly(1,num);
	}
}

void at24c02_write_byte(uchar address,uchar dat)
{
	IIC_Start();	//起始信号
	IIC_SendByte(0xa0);	//发送器件地址(写)
	IIC_WaitAck();	//等待应答
	IIC_SendByte(address);	//发送数据地址
	IIC_WaitAck();	//等待应答
	IIC_SendByte(dat);	//发送一字节数据
	IIC_WaitAck();	//等待应答
	IIC_Stop();	//停止信号
}

uchar at24c02_read_byte(uchar address)
{
	uchar dat;
	IIC_Start();	//起始信号
	IIC_SendByte(0xa0);	//发送器件地址(写)
	IIC_WaitAck();	//等待应答
	IIC_SendByte(address);	//发送数据地址
	IIC_WaitAck();	//等待应答(注意这里没有停止信号)

	IIC_Start();	//起始信号
	IIC_SendByte(0xa1);	//发送器件地址(读)
	IIC_WaitAck();	//等待应答
	dat=IIC_RecByte();
	IIC_Stop();	//停止信号
	return dat;
}

void all_init()
{
	P2=0x80;	//译码器输出选择Y4 ,p27,p27,p25控制译码器输出
	P0=0x00;

	P2=0xa0;	//ULN2003
	P0=0x00;	//主要是想关了蜂鸣器
}

void dispaly(uchar wei,uchar duan)
{
	P2=0xc0;	//1100 0000,译码器输出Y6,选择位选锁存器
	P0=wei_tab[wei];

	P2=0xff;
	P0=duan_tab[duan];

	Delay1ms();
}

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}

本文地址:https://blog.csdn.net/weixin_45289059/article/details/107901476

相关标签: 蓝桥杯 单片机