蓝桥杯笔记之 AT24C02驱动程序(九)
一、芯片介绍
1.原理图
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
上一篇: STM32基础教程 —— 使用HAL库(CubeMX)
下一篇: 5G你在期盼吗