单片机AT24C02芯片上电自启动读取数据,写入数据的实现也是挺重要的一个模块,往年的考试就有考到过,下面就来解说一下具体的分析过程吧。
编写一个记录上电次数的代码,每一次上电自加一,使用数码管显示。
首先,官方提供的数据包中有提供了IIC总线的底层驱动代码,我们是可以直接调用这个底层驱动代码的,方便自己编写代码;
其次,系统设置一个记录上电次数的变量,上电的时候,上电之后把变量自加一,写入到芯片中;
之后,对芯片数据进行读取,读取到的数据进行显示;
最后,大概流程就差不多了,开始动手吧。
#include "reg52.h"
#include "iic.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
u8 shuma[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xbf};
// 外设初始化
void init_system()
{
P2 = (P2 & 0x1f) | 0x80;
P0 = 0xff;
P2 = (P2 & 0x1f);
P2 = (P2 & 0x1f) | 0xa0;
P0 = 0x00;
P2 = (P2 & 0x1f);
P2 = (P2 & 0x1f) | 0xc0;
P0 = 0x00;
P2 = (P2 & 0x1f);
}
// 外设导通选择
void select(u8 local)
{
switch(local)
{
case(4): P2 = (P2 & 0x1f) | 0x80; break;
case(5): P2 = (P2 & 0x1f) | 0xa0; break;
case(6): P2 = (P2 & 0x1f) | 0xc0; break;
case(7): P2 = (P2 & 0x1f) | 0xe0; break;
}
}
void delay()
{
u8 t = 200;
while(t--);
}
void display(u8 local, u8 num)
{
select(6);
P0 = 0x80 >> (local - 1);
P2 = P2 & 0x1f;
delay();
// 消隐
select(7);
P0 = num;
P2 = P2 & 0x1f;
}
void write_at24c02(u8 add, u8 data1) // 往AT24C02芯片写入数据函数
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(data1);
IIC_WaitAck();
IIC_Stop();
}
unsigned char read_at24c02(u8 add) // 读取ATC24C02的数据函数
{
u8 temp;
IIC_Start(); // 启动总线 ,函数主体在底层函数中
IIC_SendByte(0xa0); // 发送标志字节
IIC_WaitAck(); // 等待总线响应
IIC_SendByte(add); // 发送读取数据的地址
IIC_WaitAck(); // 等待总线响应
IIC_Start(); // 重新启动再发送地址单元写进去
IIC_SendByte(0xa1);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_WaitAck();
IIC_Stop();
return temp;
}
void Delay2ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 22;
j = 128;
do
{
while (--j);
} while (--i);
}
void main()
{
u8 num;
init_system();
num = read_at24c02(0x55); // 读取数据的地址可以0x00-0xff,自行选择,注意写入到那个地址,之后读取数据就在那个地址进行读取
write_at24c02(0x55,++num); // 写入数据到上面读取数据的地址(地址需要一致)
while(1)
{
display(1,shuma[num%10]);
display(2,shuma[num/10]);
close_display();
Delay2ms();
}
}
单片机AT24C02芯片上电自启动读取数据,写入数据的实现也是挺重要的一个模块,往年的考试就有考到过,下面就来解说一下具体的分析过程吧。
编写一个记录上电次数的代码,每一次上电自加一,使用数码管显示。
首先,官方提供的数据包中有提供了IIC总线的底层驱动代码,我们是可以直接调用这个底层驱动代码的,方便自己编写代码;
其次,系统设置一个记录上电次数的变量,上电的时候,上电之后把变量自加一,写入到芯片中;
之后,对芯片数据进行读取,读取到的数据进行显示;
最后,大概流程就差不多了,开始动手吧。
#include "reg52.h"
#include "iic.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
u8 shuma[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xbf};
// 外设初始化
void init_system()
{
P2 = (P2 & 0x1f) | 0x80;
P0 = 0xff;
P2 = (P2 & 0x1f);
P2 = (P2 & 0x1f) | 0xa0;
P0 = 0x00;
P2 = (P2 & 0x1f);
P2 = (P2 & 0x1f) | 0xc0;
P0 = 0x00;
P2 = (P2 & 0x1f);
}
// 外设导通选择
void select(u8 local)
{
switch(local)
{
case(4): P2 = (P2 & 0x1f) | 0x80; break;
case(5): P2 = (P2 & 0x1f) | 0xa0; break;
case(6): P2 = (P2 & 0x1f) | 0xc0; break;
case(7): P2 = (P2 & 0x1f) | 0xe0; break;
}
}
void delay()
{
u8 t = 200;
while(t--);
}
void display(u8 local, u8 num)
{
select(6);
P0 = 0x80 >> (local - 1);
P2 = P2 & 0x1f;
delay();
// 消隐
select(7);
P0 = num;
P2 = P2 & 0x1f;
}
void write_at24c02(u8 add, u8 data1) // 往AT24C02芯片写入数据函数
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(data1);
IIC_WaitAck();
IIC_Stop();
}
unsigned char read_at24c02(u8 add) // 读取ATC24C02的数据函数
{
u8 temp;
IIC_Start(); // 启动总线 ,函数主体在底层函数中
IIC_SendByte(0xa0); // 发送标志字节
IIC_WaitAck(); // 等待总线响应
IIC_SendByte(add); // 发送读取数据的地址
IIC_WaitAck(); // 等待总线响应
IIC_Start(); // 重新启动再发送地址单元写进去
IIC_SendByte(0xa1);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_WaitAck();
IIC_Stop();
return temp;
}
void Delay2ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 22;
j = 128;
do
{
while (--j);
} while (--i);
}
void main()
{
u8 num;
init_system();
num = read_at24c02(0x55); // 读取数据的地址可以0x00-0xff,自行选择,注意写入到那个地址,之后读取数据就在那个地址进行读取
write_at24c02(0x55,++num); // 写入数据到上面读取数据的地址(地址需要一致)
while(1)
{
display(1,shuma[num%10]);
display(2,shuma[num/10]);
close_display();
Delay2ms();
}
}
举报