找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4215|回复: 12
打印 上一主题 下一主题
收起左侧

提问:关于AT24c02读写程序求解

  [复制链接]
跳转到指定楼层
楼主
ID:418425 发表于 2018-11-10 23:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yf15966844335 于 2018-11-11 00:02 编辑
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. bit write=0;
  5. sbit sda=P2^0;
  6. sbit scl=P2^1;
  7. sbit dula=P2^6;
  8. sbit wela=P2^7;

  9. uchar sec,tcnt;
  10. uchar code table[]={
  11.         0x3f,0x06,0x5b,0x4f,0x66,0x6d,
  12.         0x7d,0x07,0x7f,0x6f,0x77,0x7c,
  13.         0x39,0x5e,0x79,0x71
  14. };
  15. void delay()
  16. {
  17. ;;
  18. }

  19. void delay1ms(uint z)
  20. {
  21.         uint x,y;
  22.         for(x=z;x>0;x--)
  23.                 for(y=110;y>0;y--);
  24. }

  25. void start()//kaishi
  26. {
  27.         sda=1;
  28.         delay();
  29.         scl=1;
  30.         delay();
  31.         sda=0;
  32.         delay();
  33. }

  34. void stop()//tingzhi
  35. {
  36.         sda=0;
  37.         delay();
  38.         scl=0;
  39.         delay();
  40.         sda=1;
  41.         delay();
  42. }

  43. void respons()//yingda
  44. {
  45.         uchar i;
  46.         scl=1;
  47.         delay();
  48.         while((sda==1)&&(i<250))i++;
  49.         scl=0;
  50.         delay();
  51. }

  52. void init()//chushihua
  53. {
  54.         sda=1;
  55.         delay();
  56.         scl=1;
  57.         delay();
  58. }

  59. void write_byte(uchar date)//xiezijie
  60. {
  61.         uchar i,temp;
  62.         temp=date;
  63.         for(i=0;i<8;i++)
  64.         {
  65.                 temp=temp<<1;
  66.                 scl=0;
  67.                 delay();
  68.                 sda=CY;
  69.                 delay();
  70.                 scl=1;
  71.                 delay();
  72.         }
  73.         scl=0;
  74.         delay();
  75.         sda=1;
  76.         delay();
  77. }
  78. uchar read_byte()//duzijie
  79. {
  80.         uchar i,k;
  81.         scl=0;
  82.         delay();
  83.         sda=1;
  84.         delay();
  85.         for(i=0;i<8;i++)
  86.         {
  87.                 scl=1;
  88.                 delay();
  89.                 k=(k<<1)|sda;
  90.                 scl=0;
  91.                 delay();
  92.         }
  93.         return k;
  94. }

  95. void write_add(uchar address,uchar date)
  96. {
  97.         start();
  98.         write_byte(0xa0);
  99.         respons();
  100.         write_byte(address);
  101.         respons();
  102.         write_byte(date);
  103.         respons();
  104.         stop();
  105. }

  106. uchar read_add(uchar address)
  107. {
  108.         uchar date;
  109.         start();
  110.         write_byte(0xa0);
  111.         respons();
  112.         write_byte(address);
  113.         respons();
  114.         start();
  115.         write_byte(0xa1);
  116.         respons();
  117.         date=read_byte();
  118.         stop();
  119.         return date;
  120. }

  121. void display(uchar bai_c,uchar sh_c)
  122. {
  123.         dula=0;
  124.         P0=table[bai_c];
  125.         dula=1;
  126.         dula=0;
  127.         wela=0;
  128.         P0=0xfe;
  129.         wela=1;
  130.         wela=0;
  131.         delay1ms(5);
  132.         dula=0;
  133.         P0=table[sh_c];
  134.         dula=1;
  135.         dula=0;
  136.         wela=0;
  137.         P0=0xfd;
  138.         wela=1;
  139.         wela=0;
  140.         delay1ms(5);
  141. }

  142. void main()
  143. {
  144.         init();
  145.         sec=read_add(2);
  146.         if(sec>100)
  147.                 sec=0;
  148.         TMOD=0x01;
  149.         ET0=1;
  150.         EA=1;
  151.         TH0=(65536-50000)/256;
  152.         TH1=(65536-50000)%256;
  153.         TR0=1;
  154.         while(1)
  155.         {
  156.                 display(sec/10,sec%10);
  157.                 if(write==1)
  158.                 {
  159.                         write=0;
  160.                         write_add(2,sec);
  161.                 }
  162.         }

  163. }

  164. void T0_time()interrupt 1
  165. {
  166.         TH0=(65536-50000)/256;
  167.         TH1=(65536-50000)%256;
  168.         tcnt++;
  169.         if(tcnt==20)
  170.         {
  171.                 tcnt=0;
  172.                 sec++;
  173.                 write=1;
  174.                 if(sec==100)
  175.                         sec=0;
  176.         }        
  177. }
复制代码
       以上就是AT24c02的读写小程序,要求是:利用定时器产生一个0~99秒变化的秒表,并且在数码管上显示,每过一秒将这个变化的数写入AT24c02内部。当关闭电源时,并再次打开电源,单片机先从AT24c02中读出原先显示数值,接着运行秒表。          代码写入后,1、数码管每次开机都显示“10”,一直运行到“99”,再从“0”,运行;且不能在断电时恢复数据;求解!!
                             2、uchar read_add(uchar address)中write_byte(address);作用是什么,为什么后面跟着开始?
        求大神帮帮忙,小弟刚刚学习不久,最近对I2c比较感兴趣,再次谢谢了!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2018-11-11 10:16 | 只看该作者
频繁写入24c02是要把器件写坏的,是一个错误的方案,不如直接选用时钟芯片,比如DS1302.
回复

使用道具 举报

板凳
ID:418425 发表于 2018-11-11 10:35 | 只看该作者
xuyaqi 发表于 2018-11-11 10:16
频繁写入24c02是要把器件写坏的,是一个错误的方案,不如直接选用时钟芯片,比如DS1302.

我这个程序是什么地方错了吗,我已经查了1天了,还是没有查到原因。。。
回复

使用道具 举报

地板
ID:77406 发表于 2018-11-11 14:26 | 只看该作者
对于iic器件,你的时序要用设备看看。如果用stc的话,你的iic模拟读写速度快了,要延时。其次24c0x的读写驱动不对。这个你可以参考网络上一大把。最后,你的定时器的自动重装对了没有?如果用stc单片机貌似不对。检查吧。

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:111634 发表于 2018-11-11 19:34 | 只看该作者
本帖最后由 zl2168 于 2018-11-11 21:11 编辑

有关AT24Cxx页写缓冲的概念说明如下: 由于E2PROM的半导体工艺特性,对E2PROM的写入时间需要5~10ms,但AT24Cxx系列串行E2PROM芯片内部设置了一个具有SRAM性质的输入缓冲器,称为页写缓冲器。CPU对该芯片写操作时,AT24Cxx系列芯片先将CPU输入的数据暂存在页写缓冲器内,然后,慢慢写入E2PROM中。因此,CPU对AT24Cxx系列E2PROM一次写入的字节数,受到该芯片页写缓冲器容量的限制。页写缓冲器的容量为16B,若CPU写入字节数超过芯片页写缓冲器容量,应在一页写完后,隔5~10ms重新启动一次写操作。
实例49  读写AT24C02

Proteus仿真一下,确认有效。 实例49 读写IIC AT24C02.rar (38.96 KB, 下载次数: 19)

实例50  非零地址读写AT24C02 实例50 非零地址读写AT24C02.rar (39.09 KB, 下载次数: 8)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

6#
ID:111634 发表于 2018-11-11 21:08 | 只看该作者
实例93  99.9秒秒表
实例95 99.9秒秒表.rar (38.86 KB, 下载次数: 5)
Proteus仿真一下,确认有效。

实例96  能预置初值的倒计时秒表 实例96 能设置初值的倒计时秒表.rar (40 KB, 下载次数: 4)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,书中电路和程序设计有详细说明,电路与程序真实可靠可信可行,程序语句条条有注解。若需99.99秒,硬件电路增加一位595。软件程序增加0.01s10ms计数器,并修改相应计数显示程序。

回复

使用道具 举报

7#
ID:418425 发表于 2018-11-11 21:38 | 只看该作者
bg8wj 发表于 2018-11-11 14:26
对于iic器件,你的时序要用设备看看。如果用stc的话,你的iic模拟读写速度快了,要延时。其次24c0x的读写驱 ...

下午找到原因了 ,好不容易,原因在停止信号上,时钟信号没有被拉高,谢谢大家了
回复

使用道具 举报

8#
ID:401564 发表于 2018-11-12 02:14 | 只看该作者
你要是用汇编 我就能帮到你了,可是............
如果你要用到IIC保存一些东西,不要在程序运行的时候一直不断的写入,说不定几天24C02就坏了的.
用一个二极管把电源分开,再加一个掉电检测的电路,就一个电阻就可以,接到单片机的中断,那一头掉电了,这一头还有电,可以写入一次IIC
这样一来,就只有有掉电的情况下写入一次而已了
回复

使用道具 举报

9#
ID:424815 发表于 2018-11-12 09:08 | 只看该作者
IIC写完或者读取完成之后,需要延时
回复

使用道具 举报

10#
ID:359322 发表于 2018-11-12 09:09 | 只看该作者
调这个  要耐心   首先看   开始停止等   时序  对照 DATASHHEET   建议延时时间多一点   
回复

使用道具 举报

11#
ID:418425 发表于 2018-11-12 10:53 | 只看该作者
zl2168 发表于 2018-11-11 21:08
实例93  99.9秒秒表
先Proteus仿真一下,确认有效。

谢谢大神的讲解,我看懂了
回复

使用道具 举报

12#
ID:623732 发表于 2019-11-10 08:37 | 只看该作者
把字符数组存到AT24c02并在串口调试助手显示的程序怎么写?
回复

使用道具 举报

13#
ID:623732 发表于 2019-11-10 08:38 | 只看该作者
swiky 发表于 2018-11-12 09:09
调这个  要耐心   首先看   开始停止等   时序  对照 DATASHHEET   建议延时时间多一点

把字符数组存到AT24c02并在串口调试助手显示的程序怎么写?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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