一、AT24C02外设简介与代码编写
AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节。该模块具有掉电存储功能,是蓝桥杯单片机比赛中常见考点。
//at24c02模块写操作
void write_24c(unsigned char addr,dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
//at24c02模块读操作
unsigned char read_24c(unsigned char addr)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
经验之谈
AT24C02模块每一个地址只能写入0~256位,所以长数据需要进行拆分为两位数据分别储存,但是在对AT24C02模块进行连续读写时经常会发现数据错误现象,经过排查实验最终发现:AT24C02可以进行连续不间断的读数据操作,但是连续写操作中必须加入延时(鄙人最终采用的是3毫秒的延时,再无数据错误现象)或者在连续的写操作中穿插其他语句以达到延时的目的
二、示例代码
首先将 IIC 总线的底层驱动代码文件正确移植到工程中,在 CT107D 单片机综合训练平台上根据题目描述实现其要求的功能。
1.基础读写操作
系统上电后,从 24C04 存储器的 0x01、0x03 和 0x05这三个地址单元读取数据。
1.将 0x01 单元读出的数据进行加 1 操作,如果计算结果大于 10,复位为 0,然后将这个结果写回 0x01 单元。
2.将 0x03 单元读出的数据进行加 2 操作,如果计算结果大于 20,复位为 0,然后将这个结果写回 0x03 单元。
3.将 0x05 单元读出的数据进行加 3 操作,如果计算结果大于 30,复位为 0,然后将这个结果写回 0x05 单元。
4.将三个单元的当前数据从左到右依次显示在数码管上,各个数字之间用“-”分隔。
//需要在IIC.H中加入AT24C02的读写代码
#include "stc15f2k60s2.h"
#include "iic.h"
#define uchar unsigned char
#define uint unsigned int
uchar code leddata[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
uchar dat1,dat2,dat3;
void display();
void keydown();
void delay_ms(uint xx)
{
uint i,j;
for(i=0;i<xx;i++)
for(j=0;j<900;j++);
}
void hc(uchar aa)
{
switch(aa)
{