新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 51单片机—AT24C1024(带程序解析!)—07

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

作者: 时间:2016-11-25 来源:网络 收藏

//------------------------------------------------------------------------------
//主控器件向被控器件发送应答函数
void IIC_ack_send(bit a)
{
if(a==0) //发应答信号
sda=0;
else
sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
}
//------------------------------------------------------------------------------
//写一个字节函数
void send_byte(uchar c)
{
uchar bit_cnt;
for(bit_cnt=0;bit_cnt<8;bit_cnt++)//循环传送8位
{
if((c< //取当前发送位
sda=1;
else
sda=0;
_nop_();
scl=1;//发送到数据线上
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
}
}
//------------------------------------------------------------------------------
//接收一个字节函数
//返回接收的8位数据
uchar receive_byte()
{
uchar temp;
uchar bit_cnt;
temp=0;
sda=1; //置数据线为输入方式
for(bit_cnt=0;bit_cnt<8;bit_cnt++)
{
_nop_();
scl=0; //置时钟线为低电平,准备接收数据
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
temp<<=1;
if(sda==1)//接收当前数据位,接收内容放入temp中
temp+=1;
_nop_();
_nop_();
}
scl=0;
_nop_();
_nop_();
return(temp);
}

本文引用地址:https://www.eepw.com.cn/article/201611/321505.htm

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



上一页 1 2 3 下一页

关键词: 51单片机AT24C102程序解

评论


相关推荐

技术专区

关闭