微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机—AT24C1024(带程序解析!)—07

51单片机—AT24C1024(带程序解析!)—07

时间:11-25 来源:互联网 点击:

AT24C1024.c(这个才是压轴的哦~~

//------------------------------------------------------------------------------
//AT24C1024文件的函数,便于以后调用
//用的1M的EEPROM
#include"reg52.h"
#include"IIC.h"
#include"MacroAndConst.h"
#include"intrins.h"
//------------------------------------------------------------------------------
//器件当前地址写字节数据
//入口参数:器件地址码和传送的数据
//返回一位,1表示成功,否则有误,使用后必须结束总线
bit mcu_send_byte(uchar add,uchar dat)
{
IIC_start();//发开始信号
send_byte(add);//写器件地址码到IIC总线
IIC_ack_acc();//其实我感觉应该把这个程序固化到发送字节,省得写一遍又一遍~~~~
if(ack==0)
return(0);
send_byte(dat);//如果接收到应答信号,则发送一个字节数据
IIC_ack_acc();
if(ack==0)
return(0);
IIC_stop();//正常结束,发送结束信号,返回1
return(1);
}
//------------------------------------------------------------------------------
//向器件指定地址按页写函数
//入口参数有4个:器件地址码、器件单元地址、写入的数据串的指针、写入的字节个数
//写入成功,返回1;不成功,返回0,使用后必须结束总线
bit mcu_send_string(uchar add,uchar rom_add_h,uchar rom_add_l,uchar *s,uchar num)
{
uchar i;
IIC_start();
send_byte(add);//发送器件地址码
IIC_ack_acc();
if(ack==0)
return(0);
send_byte(rom_add_h); //有应答,发送ROM的单元地址的高8位
IIC_ack_acc();
if(ack==0)
return(0);
send_byte(rom_add_l); //有应答,发送ROM的单元地址的低8位
IIC_ack_acc();
if(ack==0)
return(0);
for(i=0;i //连续发送num个字节数据
{
send_byte(*s);
IIC_ack_acc();
if(ack==0)
return(0);
s++;
}
IIC_stop();
return(1);
}
//------------------------------------------------------------------------------
//读器件当前地址单元数据函数
//入口参数两个:器件的地址码、读入位置,读成功返回1,否则返回0
//在对AT24C1024芯片写操作之前,需要将WP置0,允许写,写操作完成后,WP置1,禁止对AT24C1024改写
bit mcu_receive_byte(uchar add,uchar *c)
{
IIC_start();
send_byte(add);
IIC_ack_acc();
if(ack==0)
return(0);
*c=receive_byte();//读入字节送目的位置
IIC_ack_send(1);//送非应答信号:1
IIC_stop();
return(1);
}
//------------------------------------------------------------------------------
//从器件指定地址读多个字节
//入口参数有4个:器件地址码、器件单元地址、读出的数据串、读出的字节个数,写入成功返回1,不成功返回0
bit mcu_receive_string(uchar add,uchar rom_add_h,uchar rom_add_l,uchar *s,uchar num)
{
uchar i;
IIC_start();
send_byte(add); //发送器件的地址码,这里最低位为0,写
IIC_ack_acc();
if(ack==0)
return(0);
send_byte(rom_add_h);//发送器件单元地址的高字节
IIC_ack_acc();
if(ack==0)
return(0);
send_byte(rom_add_l);//发送器件单元地址的低字节
IIC_ack_acc();
if(ack==0)
return(0);
//------------------------------------------------------------------------------
IIC_start(); //重新发送开始信号,开始读取数据
send_byte(add+1);//发送器件的地址码,这里最后一位为1,读
IIC_ack_acc();
if(ack==0)
return(0);
for(i=0;i{
*s=receive_byte();
IIC_ack_send(0); //送应答信号
s++;
}
*s=receive_byte();
IIC_ack_send(1); //送非应答信号
IIC_stop();
return(1);
}

要是程序有问题的看这个:

http://blog.sina.com.cn/s/blog_7ec8fc2c01012pla.html

要是芯片资料有问题的话看这个:

http://blog.sina.com.cn/s/blog_7ec8fc2c01012ksx.html


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top