搜索
bottom↓
回复: 64

完全原创!C51成功读写AT24C32(EEPROM),希望对了解I2C及EEPROM的初学者有帮助!--缺电路图

[复制链接]

出0入0汤圆

发表于 2008-5-20 11:08:38 | 显示全部楼层 |阅读模式
以下蓝色文字由站长:armok 于:2008-05-20,11:11:33 加入。
贴子很好,但需要补充一些材料才能置成酷贴
谢谢你的共享。只是一堆源代码,没有电路图会大幅降低帖子的交流效果。
请将电路图也上传上来,这样本贴就能置COOL,会有更多的人关注,并且能获得本论坛的专家分数(迟些会实施)
你可以编辑本贴上传电路图,或在后面的回复里上传。谢谢对我们网站的支持。



#include<reg52.h>
#include<D:\C51_H\LCD1602.H>        //我的自定义LCD1602头文件

/*---------------------------------------------------------------
24C32可存储4K(1024*4)个字节(8bit),因此寻址地址最大为0x0FFF,24C32为从机。
----------------------------------------------------------------*/

#define WriteDeviceAddress 0x0A2 //定义器件在I2C总线中的写地址(注意:根据自定义从机地址接口改变)
#define ReadDviceAddress 0x0A3   //定义器件在I2C总线中的读地址(注意:根据自定义从机地址接口改变)

sbit SCL=P0^4;           //我的24C32接口设置
sbit SDA=P3^7;

//2us延时子程序
void delay_2us(uchar i)
{
while(--i);
}

//开始总线
void Start()
{
SDA=1;
SCL=1;
delay_2us(1);
SDA=0;
delay_2us(1);
SCL=0;
}
//结束总线
void Stop()
{
SDA=0;
SCL=1;
delay_2us(1);
SDA=1;
delay_2us(1);
SDA=0;
SCL=0;
}
//发送应答位信号
//void MACK()
//{
//SDA=0;
//SCL=1;
//delay_2us(1);
//SCL=0;
//SDA=1;
//}

//发送非应答位信号
void MNACK()
{
SDA=1;
SCL=1;
delay_2us(1);
SCL=0;
SDA=0;
}
//检测从机应答信号
bit CACK()
{
bit flag;
SDA=1;
SCL=1;
delay_2us(1);
flag=SDA;
SCL=0;
return(flag);
}
/*--------------------------------------------------------------------------
       //写入8个bit到24C32
---------------------------------------------------------------------------*/
Write8Bit(uchar input)
{
uchar temp;
for(temp=0;temp<8;temp++)
{
SDA=(bit)(input&0x80);
SCL=1;
delay_2us(1);
SCL=0;
input=input<<1;
}
}
/*--------------------------------------------------------------------------
          //写入一个字节到24C32中
---------------------------------------------------------------------------*/

void Write24C32(uchar ch,uint address)
{
Start();
Write8Bit(WriteDeviceAddress);
while(CACK());
Write8Bit(address/256);(注意:地址分两次传送,高位在前!)
while(CACK());
Write8Bit(address%256);
while(CACK());
Write8Bit(ch);
while(CACK());
Stop();
}
/*--------------------------------------------------------------------------
          //从24C32中读出8个bit
---------------------------------------------------------------------------*/
uchar Read8Bit()
{
unsigned char temp,rbyte=0;
for(temp=0;temp<8;temp++)
{
SDA=1;
SCL=1;
rbyte=rbyte|((unsigned char)(SDA));
if(temp<7)                //注意:仅左移7次
{
  rbyte=rbyte<<1;
}
SCL=0;
}
return(rbyte);
}

/*--------------------------------------------------------------------------
          从24c32中读出1个字节
---------------------------------------------------------------------------*/
uchar Read24C32(uint address)
{
uchar ch;
Start();
Write8Bit(WriteDeviceAddress);
while(CACK());
Write8Bit(address/256);
while(CACK());
Write8Bit(address%256);
while(CACK());
Start();
Write8Bit(ReadDviceAddress);
while(CACK());
ch=Read8Bit();
MNACK();
Stop();
return(ch);
}
/*--------------------------------------------------------------------------
          主函数
---------------------------------------------------------------------------*/
void main(void) // 主程序
{
uchar newchar;                           

LCD1602_init();                           //1602初始化

Write24C32('8',0x01FF);                   //写'5'进0x1FF

LCD1602_puts(0,0,"24C32 W_Test OK!");

newchar=Read24C32(0x01FF);               //从0x1FF接收数据

LCD1602_puts(0,1,"ReadValue=");

LCD1602_puts(10,1,newchar);

while(1);

}


/*---------------------------------------------------------
如有什么疑问,可加本人QQ:175070658 一同讨论、研究。
如果觉得这是个不错的参考资料就帮忙 顶 一下,^-^ ^-^
---------------------------------------------------------*/


24C32硬件连接图 (原文件名:24C32硬件连接图.jpg)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2008-5-21 11:21:29 | 显示全部楼层
正在学这个,顶

出0入0汤圆

发表于 2008-5-21 12:54:19 | 显示全部楼层
不错!顶

出0入0汤圆

发表于 2008-5-21 17:28:11 | 显示全部楼层
学习一下,楼主厉害哦!我没玩过这种器件,呵呵

出0入0汤圆

发表于 2008-6-30 23:21:11 | 显示全部楼层
mark 。。。。

还不会用那些东西了。

出0入0汤圆

发表于 2008-12-25 20:02:11 | 显示全部楼层
我D

出0入0汤圆

发表于 2009-1-13 12:53:14 | 显示全部楼层
正在学习中&nbsp;顶

出0入0汤圆

发表于 2009-4-30 15:06:31 | 显示全部楼层
ding qilai

出0入0汤圆

发表于 2009-5-15 14:44:59 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-5-17 10:04:12 | 显示全部楼层
先顶下

出0入10汤圆

发表于 2009-5-17 19:47:23 | 显示全部楼层
学习了

出0入0汤圆

发表于 2009-5-18 08:45:57 | 显示全部楼层
学习了。

出0入0汤圆

发表于 2009-5-25 16:06:18 | 显示全部楼层
学习了

出0入0汤圆

发表于 2010-3-23 21:22:19 | 显示全部楼层
正在学习中

出0入0汤圆

发表于 2010-3-23 21:25:32 | 显示全部楼层
回复【楼主位】liruxiao
-----------------------------------------------------------------------

   楼主你可以帮我看看下吗?
欢迎您,yongwen2010 |登录 |快速注册 |退出  首页 酷贴 搜索 在线   个人功能 -------------- 修改个人资料 我的主题 我的回复  本网站由阿莫电子邮购独家赞助  
51单片机 -> 搜索主题:at24 -> 我的AT2402C程序到底哪里出错了!  跳转至:  ╟—虚拟总论坛╟┬AVR (原ourAVR.com) 技术论坛║├AVR32技术论坛║├STM32/STM8 技术讨论区║├CPLD/FPGA║├PSoC(Cypress)可编程片上系统技术讨论区║├ARM技术论坛║├其它Cortex-M3技术讨论区(ST除外)║├51单片机║├PIC单片机║├DSP║├MSP430║├NEC单片机║├其它单片机║├都江堰操作系统(djyos)║├RT-Thread实时线程操作系统║└嵌入式操作系统╟┬开源雕刻机DIY活动(及机械分论坛)║├白沙开源专栏(段式液晶,怀表等)║├四轴飞行DIY论坛║├网站逻辑分析仪开源活动║├开源PLC(暂时关闭,2010春节假期后重开)║├磁悬浮开源设计活动║└“魏坤手持数字示波仪”开源DIY活动╟┬STM8手持示波仪(已完成)║├开源充电器设计活动(已完成)║├Mini DVD 应用与DIY(已完成)║├ATmel蜗牛触摸演示板Snail Touch(已完成)║├RF通信应用(筹备)║└PLC开源设计活动(已经暂停)╟┬创意电子产品║├USB║├MP3播放器║├电源║├通信技术║├视频捕捉与处理║├电子零件与线路║├行业标准与规范║├PCB(Protel等)║├电路仿真(Proteus等)║├音响论坛║└手机╟┬Fluke(福禄克)仪器专栏║├示波器║├万用表║├信号发生器║├基准源║└其它仪器╟┬西门子PLC║├三菱PLC║├台系PLC║├国内PLC║└其它PLC╟┬电脑综合论坛║├Google(浏览器Chrome)║├上位机软件开发(Delphi,C++等)║└网页编程(网站开发)讨论区╟┬机器人║├智能小车║├航空模型讨论区║└开源自充电清扫小车╟┬马潮AVR专栏║├小俊(qwernet)专栏║├傻孩子(Gorgon Meducer)专栏║└shaoziyang专栏╙┬ 水坛,招聘,淘宝超值,二手交易,寻找器件等 └垃圾收集区(定期删除)  发表新话题  
我的AT2402C程序到底哪里出错了!  回复数:0,点击数:3  
【楼主位】 yongwen2010
积分:5
派别:
等级:------
来自:
#include<reg52.h>
#include <intrins.h>   
sbit scl=P1^1;
sbit sda=P1^2;
sbit EQ=P1^0;
void delay()
{
unsigned char i;
for(i=0;i<255;i++);
}
void stdar()/*开始*/
{
  sda=0;
   _nop_();_nop_();
  scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
  sda=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
  scl=0;
}
void stop()/*停止*/
{
  sda=1;
_nop_();
  scl=1;
  _nop_();_nop_();_nop_();_nop_();_nop_();
  sda=0;
  _nop_();_nop_();_nop_();_nop_();_nop_();
  scl=0;
}
void init()/*初始化*/
{
  sda=1;
  _nop_();_nop_();
  scl=1;
  _nop_();_nop_();
}
void ask()/*应答*/
{
  sda=0;
  _nop_();_nop_();_nop_();
  scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
  scl=0;
  _nop_();_nop_();_nop_();_nop_();_nop_();
  sda=1;
  _nop_();_nop_();;   
}
void noask()/*非应答*/
{
     sda=1;
_nop_();_nop_();_nop_();
scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
scl=0;
_nop_();_nop_();
}  
void write_byte(  unsigned char date)/*写字节*/
{
   unsigned char temp,k;
   temp=date;
   for(k=0;k<8;k++)
    {
temp=temp<<1;
     scl=0;
      _nop_();_nop_(); _nop_();_nop_();
  
sda=CY;
_nop_();_nop_();
scl=0;
  //_nop_();_nop_();
    }
}
unsigned char read_byte()/*读字节*/
{
unsigned char i,k;
scl=0;
_nop_();_nop_();
sda=1;
_nop_();_nop_();
for(i=0;i<8;i++)
{
scl=1;
_nop_();_nop_();
k=(k<<1)|sda;
scl=0;
_nop_();_nop_();
}
return k;
}  
void write_date(unsigned char addss,unsigned char date)/*写数据*/
{
  stdar();
  write_byte(0xae);
  ask();
  write_byte(addss);
  ask();
  write_byte(date);
  noask();
  stop();
}
unsigned char read_date(unsigned char addss)/*读数据*/
{
unsigned char date;
  stdar();
  write_byte(0xae);
  ask();
  write_byte(addss);
  ask();
  write_byte(0xaf);
  ask();
  date=read_byte();
  noask();
  stop();
  return date;
}
void main()/*主程序*/
{
    EQ=0;
    init();
write_date(25,0x0f);
delay();


  P1=read_date(25);
  while(1);

}
我刚刚学这个器件,但是给P1口返回就没有成功!不知道程序哪里出问题了!帮我看下是不是读写字节哪里处理错误!
 

出0入0汤圆

发表于 2010-4-16 13:24:13 | 显示全部楼层

出0入0汤圆

发表于 2010-4-16 13:46:46 | 显示全部楼层
标记!

出0入0汤圆

发表于 2010-4-16 14:40:26 | 显示全部楼层
make

出0入0汤圆

发表于 2010-4-17 21:01:53 | 显示全部楼层
顶 学习中

出0入0汤圆

发表于 2010-4-18 14:12:26 | 显示全部楼层
看看

出0入0汤圆

发表于 2010-4-18 14:26:51 | 显示全部楼层
学习!!

出0入0汤圆

发表于 2010-4-19 10:31:08 | 显示全部楼层
一直没有意识到地址是16位的。网上大部分资料都直接用8位的地址

Write8Bit(address/256);(注意:地址分两次传送,高位在前!)
while(CACK());
Write8Bit(address%256);
可以用位移操作代替吧,除法很耗CPU的
/256 代替为 address>>8
%256 代替为 先 address<<8 再address>>8

出0入0汤圆

发表于 2010-4-19 17:52:38 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2010-8-11 17:05:09 | 显示全部楼层
最近在研究这个呢,一定要学习学习!

出0入0汤圆

发表于 2010-8-11 21:22:39 | 显示全部楼层
hao

出0入0汤圆

发表于 2010-8-20 21:44:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-21 21:30:28 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-8-24 09:21:24 | 显示全部楼层
我的就是参考你的,谢谢了。

出0入0汤圆

发表于 2010-8-27 11:37:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-27 12:52:31 | 显示全部楼层
哈哈
遇上了
刚学到这里
谢谢楼主分享!!

出0入0汤圆

发表于 2011-1-28 21:47:49 | 显示全部楼层
回复【23楼】fw190d9
-----------------------------------------------------------------------

回复【23楼】fw190d9
一直没有意识到地址是16位的。网上大部分资料都直接用8位的地址
write8bit(address/256);(注意:地址分两次传送,高位在前!)  
while(cack());  
write8bit(address%256);  
可以用位移操作代替吧,除法很耗cpu的
/256 代替为 address>>8
%256 代替为 先 address<<8 再address>>8

-----------------------------------------------------------------------
   address>>8 ,还是很耗cpu的,其实编译器已经知道address高8位的地址和低8位的地址
直接用:write8bit(address>>8);  //高8位的
  代替:write8bit(address/256);

   用:write8bit(address);      //低8位的,而address的高8位自动去掉
  代替:write8bit(address%256);

直接寄存器访问,根本不用什么运算。

出0入0汤圆

发表于 2011-1-29 01:09:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-29 09:20:50 | 显示全部楼层
正在学习这个,谢谢LZ共享。

出0入0汤圆

发表于 2011-7-16 11:38:05 | 显示全部楼层
mark~~~~

出0入0汤圆

发表于 2011-7-28 12:17:07 | 显示全部楼层
回复【楼主位】liruxiao
-----------------------------------------------------------------------

楼主,把你的LCD1602程序也附上吧

出0入0汤圆

发表于 2011-8-18 10:33:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-28 20:34:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-28 20:52:33 | 显示全部楼层
不知道24c02和24c32甚至24c512有什么区别?寻址方式有区别么?估计24c02的程序能用到24c32上把。。。。。个人猜测,没看数据手册

出0入0汤圆

发表于 2011-11-30 09:58:18 | 显示全部楼层
学习了!顶起

出0入0汤圆

发表于 2011-11-30 13:52:27 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-11-30 14:53:09 | 显示全部楼层
学习中,好!

出0入0汤圆

发表于 2011-12-11 00:29:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-11 14:19:57 | 显示全部楼层
回复【楼主位】liruxiao
----------------------------------------------------------------good

出0入0汤圆

发表于 2011-12-12 10:06:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-8 12:32:47 | 显示全部楼层
正在学这个,顶

出0入0汤圆

发表于 2012-2-1 15:26:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-14 19:40:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-14 21:35:40 | 显示全部楼层
好资料,值得学习……

出0入0汤圆

发表于 2012-2-15 09:58:14 | 显示全部楼层
初学中,I&sup2;C一直困扰中

出0入0汤圆

发表于 2012-2-15 16:38:21 | 显示全部楼层
正在研究这个东西的。

出0入0汤圆

发表于 2012-2-16 11:42:00 | 显示全部楼层
以前找过这个  后来还是在开发板自带的光盘上找到的 1602的

出0入0汤圆

发表于 2012-3-5 13:59:14 | 显示全部楼层
mark!

出0入0汤圆

发表于 2012-8-18 11:24:39 | 显示全部楼层
加你qq了,我是用430 做的,有问题,请叫 你。

出0入0汤圆

发表于 2012-12-24 09:03:13 | 显示全部楼层
正在学这个,顶!

出0入0汤圆

发表于 2013-4-21 14:26:19 | 显示全部楼层
Mark     C51成功读写AT24C32

出0入0汤圆

发表于 2013-4-24 00:45:45 来自手机 | 显示全部楼层
收藏啦,谢谢

出0入0汤圆

发表于 2013-4-29 10:47:09 | 显示全部楼层
最近咋研究I2C和SPI。感谢

出0入0汤圆

发表于 2013-9-23 21:37:36 | 显示全部楼层
Mark  先收着  

出0入0汤圆

发表于 2013-9-23 21:40:56 | 显示全部楼层
不错,支持一下

出0入0汤圆

发表于 2013-9-24 09:24:11 | 显示全部楼层
这是个好东西,一直在找。

出0入0汤圆

发表于 2013-9-26 23:53:40 来自手机 | 显示全部楼层
学习了~~~

出0入0汤圆

发表于 2013-11-12 13:19:41 | 显示全部楼层
顶一个!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表