找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6131|回复: 5
收起左侧

51单片机通过I2C串行总线扩展1片AT24C02,实现单片机对存储器AT24C02的读、写

  [复制链接]
ID:777981 发表于 2020-6-13 14:22 | 显示全部楼层 |阅读模式
单片机通过I2C串行总线扩展1AT24C02,实现单片机对存储器AT24C02的读、写。由于Proteus元件库中没有AT24C02,可用FM24C02芯片代替,即在Proteus中“关键字”对话框元件查找栏中输入“24C02”,就会在左侧的元件列表中显示,然后在元件列表中选择即可。AT89S51FM24C02的接口原理电路见图。
图中KEY1作为外部中断0的中断源,当按下KEY1,单片机通过I2C总线发送数据0xaaAT24C02,等发送数据完毕后,将0xc3P2口通过LED显示。
KEY2作为外部中断1的中断源,当按下KEY2时,单片机通过I2C总线读AT24C02,等读数据完毕后,将读出的最后数据0xaaP2口的LED显示出来。

最终显示的仿真效果是:按下KEY1,标号为D1D88LEDD3D4D5D6灯亮,如图10-17所示。按下KEY2,则D1D3D5D7灯亮。
Proteus提供的I2C调试器是调试I2C系统的得力工具,使用I2C调试器的观测窗口可观察I2C总线上的数据流,查看I2C总线发送的数据,也可作为从器件向I2C总线发送数据。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

仿真结果

仿真结果


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<stdio.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define out P2
  7. sbit scl=P1^1;
  8. sbit sda=P1^0;
  9. sbit key1 =P3^2;
  10. sbit key2=P3^3;
  11. uchar data mem[4]_at_0x55;
  12. uchar mem[4]={0x41,0x42,0x43,0xaa};
  13. uchar data rec_mem[4]_at_0x60;
  14. void start(void);
  15. void stop(void);
  16. void sack(void);
  17. bit rack(void);
  18. void ackn(void);
  19. void send_byte(uchar);
  20. uchar rec_byte(void);
  21. void write(void);
  22. void read(void);
  23. void delay4us(void);
  24. void main(void)
  25. {
  26. EA=1 ;EX0=1;EX1=1;
  27. while(1);
  28. }
  29. void ext0()interrupt 0
  30. {
  31. write();
  32. }
  33. void ext1()interrupt 2
  34. {
  35. read();
  36. }
  37. void read(void)
  38. {
  39. uchar i;
  40. bit f;
  41. start();
  42. send_byte(0xa0);
  43. f=rack();
  44. if(!f)
  45. {
  46. start();
  47. send_byte(0xa0);
  48. f=rack();
  49. send_byte(0x00);
  50. f=rack();
  51. if(!f)
  52. {
  53. or(i=0;i<3;i++)
  54. {
  55. rec_mem[i]=rec_byte();
  56. sack(); .
  57. rec_mem[3]=rec_byte();ackn();
  58. }
  59. }
  60. }
  61. stop();out=rec_mem[3];while(!key2);
  62. }
  63. void write(void)
  64. {
  65. uchar i;
  66. bit f;
  67. start();
  68. send_byte(0xa0);
  69. f=rack();
  70. if(!f){
  71. send_byte(0x00);
  72. f=rack();
  73. if(!f){
  74. for(i=0;i<4;i++)
  75.         {
  76. send_byte(mem[i]);
  77. f=rack();
  78. if(f)break;
  79. }
  80.         }
  81. }
  82. stop();out=0xc3;while(!key1);
  83. }
  84. void start(void)
  85. {
  86. scl=1;
  87. sda=1;
  88. delay4us();
  89. sda=0;
  90. delay4us();
  91. scl=0;
  92. }
  93. void stop(void)
  94. {
  95. scl=0;
  96. sda=0;
  97. delay4us();
  98. scl=1;
  99. delay4us();
  100. sda=1;
  101. delay5us();
  102. sda=0;
  103. }
  104. bit rack(void)
  105. {
  106. bit flag;
  107. scl=1;
  108. delay4us();
  109. flag= sda;
  110. scl=0;
  111. }
  112. return(flag);
  113. }
  114. void sack(void)
  115. {
  116. sda=0;
  117. delay4us();
  118. scl=1;
  119. delay4us();
  120. scl=0;
  121. delay4us();
  122. sda=1;
  123. delay4us();
  124. }
  125. void ackn(void)
  126. {
  127. sda=1;
  128. delay4us();
  129. scl=1;
  130. delay4us();
  131. scl=0;
  132. delay4us();
  133. sda=0;
  134. }
  135. uchar rec_byte(void)
  136. {
  137. uchar i,temp;
  138. for(i=0;i<8;i++)
  139. {
  140. temp<<=1;
  141. scl=1;
  142. delay4us();
  143. temp|=sda;
  144. scl=0;
  145. delay4us();
  146. }
  147. ……………………

  148. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
51hei.png
所有资料51hei提供下载:
protues仿真工程文件.rar (50.38 KB, 下载次数: 151)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:769562 发表于 2020-6-15 16:25 | 显示全部楼层
大佬大佬
回复

使用道具 举报

ID:980960 发表于 2021-11-14 21:39 | 显示全部楼层
想请问一下通过I2C串行总线扩展的.c文件为什么在建立工程后再编译就会显示失败啊
回复

使用道具 举报

ID:551172 发表于 2021-12-15 21:55 | 显示全部楼层
我这里一直有一个错误
I2C.c(11): error C129: missing ';' before '_at_0x55'
I2C.c - 1 Error(s), 0 Warning(s).  一直没找到
回复

使用道具 举报

ID:294858 发表于 2023-6-7 09:23 | 显示全部楼层
有错误,不能运行
回复

使用道具 举报

ID:883242 发表于 2023-6-8 00:37 | 显示全部楼层
xiaozhou1210 发表于 2021-12-15 21:55
我这里一直有一个错误
I2C.c(11): error C129: missing ';' before '_at_0x55'
I2C.c - 1 Error(s), 0 Wa ...

_at_0x55中间应该有一个空格。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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