找回密码
 立即注册

QQ登录

只需一步,快速开始

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

EEPROM AT24CO2读写操作

[复制链接]
跳转到指定楼层
楼主
ID:72519 发表于 2015-1-21 21:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
时间过的真快转眼天气冷了,这让懒惰的我都来不及适应,最近是东一下西一下的 把  IIC总线接口的EEPROM 勉强学会点,留下点痕迹留着以后品味当时的心情吧!



  1. # include  <reg52.h>
  2. # define uchar unsigned char            //宏定义
  3. # define uint unsigned int
  4. uchar shi,ge,dd,ff,write;        //定义局变量
  5. sbit sda=P2^1;        //声明P2口
  6. sbit scl=P2^0;        //声明P2口
  7. sbit duan=P2^6;
  8. sbit wei=P2^7;
  9. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  10. 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}        ;        //LED数组显示
  11. void delay() //微秒级延时
  12. { ; ;}
  13. void delayms(uchar a)  //毫秒延时
  14. {
  15. uchar x,y;
  16. for(x=a;x>0;x--)
  17.    for(y=0;y<110;y++);
  18. }
  19. void init()          //AT24C02初始化
  20. {
  21. sda=1;
  22. delay();
  23. scl=1;
  24. delay();
  25. }
  26. void start()   //AT24C02启动信号
  27. {
  28. sda=1;
  29. delay();
  30. scl=1;
  31. delay();
  32. sda=0;
  33. delay();
  34. }
  35. void stop()         //AT24C02停止信号
  36. {
  37. sda=0;
  38. delay();
  39. scl=1;
  40. delay();
  41. sda=1;
  42. delay();
  43. }
  44. void respons()         //AT24C02应答
  45. {
  46.    uchar i;
  47.    scl=1;
  48.    delay();
  49.    while((sda==1)&&(i<255))i++;
  50.    scl=0;
  51.    delay();

  52. }
  53. void write_byte(uchar a)   //AT24C02写一个字节
  54. {
  55. uchar i,j;
  56. j=a;
  57. for(i=0;i<8;i++)
  58. {
  59. scl=0;
  60. delay();
  61. j=j<<1;
  62. sda=CY;
  63. scl=1;
  64. delay();
  65. }
  66. scl=0;
  67. delay();
  68. sda=1;
  69. delay();
  70. }
  71. uchar read_byte()  //AT24C02读一个字节
  72. {
  73. uchar i,j;
  74. for(i=0;i<8;i++)
  75. {
  76. scl=0;
  77. delay();
  78. sda=1;
  79. delay();
  80. scl=1;
  81. j=(j<<1)|sda;
  82. delay();
  83. }
  84. return j;  

  85. }  
  86. void add_write(uchar address,uchar date) //AT240C2任意地址写一个字节数据
  87. {
  88. start();
  89. write_byte(0xae);
  90. respons();
  91. write_byte(address);
  92. respons();
  93. write_byte(date);
  94. respons();
  95. stop();
  96. }
  97. uchar add_read_byte(uchar address)        //AT24C02任意地址读
  98. {
  99. uchar w;
  100. start();
  101. //        respons();
  102. write_byte(0xae);
  103. //        delayms(100);
  104. respons();
  105. write_byte(address);
  106. respons();
  107. start();
  108. write_byte(0xaf);
  109. respons();
  110. w=read_byte();
  111. stop();
  112. return w;
  113. }
  114. void display(uchar shi,uchar ge) //LED数码管显示
  115. {
  116.   //shi=dd/10;
  117.   //ge=dd%10;
  118. wei=0;
  119. duan=1;
  120. P0=table[shi];
  121. duan=0;
  122. P0=0xff;
  123. wei=1;
  124. P0=0xfe;
  125. wei=0;
  126. delayms(10);
  127. P0=0xff;
  128. duan=1;
  129. P0=table[ge];
  130. duan=0;
  131. P0=0xff;
  132. wei=1;
  133. P0=0xfd;
  134.     delayms(5);
  135. wei=0;
  136. }
  137. void stime()        //初始化定时器0并启动
  138. {
  139. TMOD=0X01;
  140. TH1=(65535-5000)/256;
  141. TH0=(65535-5000)%256;
  142. EA=1;
  143. ET0=1;
  144. TR0=1;
  145. }
  146. void t0()interrupt 1   //定时器0中断函数并重新装初值
  147. {
  148.     uchar i;
  149. TH1=(65535-5000)/256;
  150. TH0=(65535-5000)%256;
  151. i++;
  152. if(i==20)
  153.     {        write++;
  154.     ff=1;
  155. i=0;
  156.    if(write==100)
  157. write=0;
  158. }

  159. }
  160. void main()          //主程序
  161. {
  162. init();
  163. write=add_read_byte(5);
  164.     if(write>100)
  165. write=0;
  166. stime();
  167. while(1)
  168. {
  169.     // dd=write;

  170. if(ff==1)
  171. {
  172.         add_write(5,write);
  173. ff=0;        
  174. }
  175. display(write/10,write%10);
  176. }
  177. }   
复制代码



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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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