标题:
AT24c64读写程序,已在单片机开发板上测试通过
[打印本页]
作者:
arzeng
时间:
2018-1-19 19:08
标题:
AT24c64读写程序,已在单片机开发板上测试通过
24c02存储地址
是8位,
24c64存储地址是16位,24c02的读写程序不能直接用在AT24c64上。
本测试程序已经在开发板上测试成功。
单片机源程序如下:
/************************************************
51HEI开发板
跳线设置:J7拔掉,双排针除PSEN外全部插上
硬件结构框架:
1,IIC总线芯AT24C64
2,MCU AT89S52
显示效果:
1,在数码管上计数
2,断电记忆
相关知识点:
1,类似IIC总线芯片的操作
功能描述:利用定时器产生一个0~99秒变化的秒表,并且显示在数码管上,
每过一秒将这个数写入板上的AT24C64内部。当关闭实验板电源,并再次打开
实验板电源时,单片机先进入AT24C64中将原来写入的数读取出来,接着此数
继续变化并显示在数码管上。
*本测试程序不适用于24c02*
Arzeng 2018.01.19 整理
************************************************/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define w_24C64 0xa0//0xa0 10100000 " MSB 0 1 0 1 A2 A1 A0 R/W " A2 A1 A0 接地为“0”
#define r_24C64 0xa1//0xa1
/********************24c64定义*********************/
sbit scl_24c64 = P2^1; //24c64定义时钟线
sbit sda_24c64 = P2^0; //24c64定义数据线
/**************************************************/
uchar m_data_to_24c64[] = {0x01,0x08,0x0b,0x04,0x05,0x06};
uchar m_data_from_24c64[32] ;//接收数组
uchar DATA2;
void delay1(uchar i)
{
uchar j,k;
for(j=i; j>0; j--)
for(k=125; k>0; k--)
{
;
}
}
sbit dula=P2^6;
sbit wela=P2^7;
void display()
{
static uchar a;
uchar dis[8];
uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
for(a=0; a<8; a++)
{
dis[a]=0;
}
dis[5]=DATA2/100;
dis[6]=DATA2%100/10;
dis[7]=DATA2%10;
for(a=0; a<8; a++)
{
dula=0;
P0=table[dis[a]];
dula=1;
dula=0;
wela=0;
P0=~(0x01<<a);
wela=1;
wela=0;
delay1(5);
}
}
void timer0() interrupt 1 //TR0
{
uint i;
if(i++>=1250)
{
i=0;
if(DATA2++>=255)
{
DATA2=0;
}
}
TH0=(65536-500)/256;
TL0=(65536-500)%256;
}
void Delay_xus(uint i)
{
while(i--)
{
;
}
}
void Delay_100us()
{
uchar i = 14;
while(i--)
{
;
}
}
void Delay_100ms()
{
uchar i;
uint j = 1000;
for(; j>0; j--)
{
i = 14;
while(i--)
{
;
}
}
}
/***************************************/
void start_24c64()
{
sda_24c64 = 1;
scl_24c64 = 1;
Delay_xus(1); //也可不用延时,怕你单片机快;
sda_24c64 = 0;
Delay_xus(1);
scl_24c64 = 0;//控制时钟线,防止数据误入
// I2C总线空闲时,sda、scl为高电平
}
void stop_24c64()
{
sda_24c64 = 0;
scl_24c64 = 1;
Delay_xus(1);
sda_24c64 = 1;
Delay_xus(1);
scl_24c64 = 0;
}
void ask_24c64() //写数据应答,第九个脉冲sda_24c64为低,则24c64成功接受数据
{
uchar k=30;
scl_24c64 = 0;
scl_24c64 = 1;
Delay_xus(1);
while(sda_24c64&&k--)
{
; //结合写数据发第九个脉冲,检查应答位,若无应答,一定时间后退出
}
scl_24c64 = 0;
}
void writebyte_24c64(uchar data_to_24c64)//写入数据
{
uchar i;
scl_24c64 = 0;
for(i=0; i<8; i++)
{
if(data_to_24c64&0x80)
{
sda_24c64 = 1;
}
else
{
sda_24c64 = 0;
}
scl_24c64 = 1; //时钟线低变高,发数据
Delay_xus(1);
scl_24c64 = 0;
data_to_24c64<<=1;
}
ask_24c64();
}
uchar readbyte_24c64(uchar ack) //ack应答位,ack=1,MCU不应答(不继续接受数据)
{
//ack=0,MCU应答,继续接受数据
uchar i,data_from_24c64;
scl_24c64 = 0;
for(i=0; i<8; i++)
{
data_from_24c64<<=1;
scl_24c64 = 1;
Delay_xus(1);
data_from_24c64 |= sda_24c64;
Delay_xus(1);
scl_24c64 = 0;
}
sda_24c64 = ack;
scl_24c64 = 1;
scl_24c64 = 0;
sda_24c64 = 1;
return data_from_24c64;
}
void write_o_data_24c64(uchar addH,uchar addL,uchar data_24c64)//写入单个数据
{
start_24c64();
writebyte_24c64(w_24C64);//写指令
writebyte_24c64(addH);//写高位地址
writebyte_24c64(addL);//写低位地址
writebyte_24c64(data_24c64);//写储存数据
stop_24c64();
}
uchar read_o_data_24c64(uchar addH,uchar addL) //读出单个数据
{
uchar temp;
start_24c64();
writebyte_24c64(w_24C64);//写写指令
writebyte_24c64(addH);//写高位地址
writebyte_24c64(addL);//写低位地址(实际上是调24c64地址指针到要读取的数据的地址)
stop_24c64();
start_24c64();
writebyte_24c64(r_24C64);//写读指令
temp = readbyte_24c64(1);
stop_24c64();
return temp;
}
void write_m_data_24c64(uchar addH,uchar addL,uchar *m_data_24c64,uchar n) //从某地址开始连续多字节写入
{
uchar i;
start_24c64();
writebyte_24c64(w_24C64);//写指令
writebyte_24c64(addH);//写高位地址
writebyte_24c64(addL);//写低位地址
if(n>32) //每页最多32字节
{
n = 32;
}
for(i=0; i<n; i++)
{
writebyte_24c64(*(m_data_24c64++));//写储存数据
Delay_xus(1);
}
stop_24c64();
}
void read_m_data_24c64(uchar addH,uchar addL,uchar n)//从某地址开始连续读取n个数据
{
uchar i;
if(n>32) //n不能大于32,会从头覆盖字节
{
n=32;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
24c64读写.rar
(26.08 KB, 下载次数: 267)
2018-1-19 19:07 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
web7825
时间:
2018-4-15 13:19
正需要这类的
作者:
lizi5802
时间:
2018-6-23 20:59
正学习中,谢谢分享
作者:
fsss007
时间:
2018-8-8 17:31
正需要,下载了也不会用。
作者:
HenryJony
时间:
2019-1-11 14:37
楼主,你的定义都是uchar的,是不是最大值只能是255啊?
作者:
kevenyon
时间:
2019-3-17 11:01
正在调试DS3231时钟模块,上面有个AT24C32,想借鉴一下调试
作者:
kevenyon
时间:
2019-3-17 11:26
正在调试DS3231时钟模块,参考一下
作者:
saya0769
时间:
2019-3-25 20:34
每一秒都写入的话。10万次不是很快用完了?》?
作者:
aking991
时间:
2020-2-5 16:35
下载学习与测试一下看看
作者:
linnyshow
时间:
2021-3-28 10:02
正在调试
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1