当前位置: 移动技术网 > 科技>人工智能>嵌入式 > 蓝桥杯笔记之 AT24C02驱动程序(九)

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

2020年08月12日  | 移动技术网科技  | 我要评论
一、芯片介绍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.写一字节
写一字节的时序
“ **** ”表示发送方为单片机。

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


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

2.读操作

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

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

3.连续读
连续读
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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网