找回密码
 立即注册

QQ登录

只需一步,快速开始

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

PMS154C 24C02 DOME

[复制链接]
跳转到指定楼层
楼主
ID:1135245 发表于 2024-11-3 13:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //********************************************************************************//
  2. //                功能名称:        24C02模块(EEPROM)
  3. //                功能编号:        180201
  4. //                适应芯片:        适用于所有芯片
  5. //--------------------------------------------------------------------------------//
  6. //程序说明:
  7. //        封装引脚图如下
  8. //           ┌─┐
  9. //   A0┤  ├VCC
  10. //         A1┤  ├WP
  11. //         A2┤  ├SCL
  12. //        GND┤  ├SDA
  13. //           └─┘
  14. //        引脚A0~A2地址输入引脚,案例全接GND
  15. //        WP引脚写保护,接GND进行正常读写,接VCC只读模式,案例接GND
  16. //        案例为写入一个地址0数据49,然后再读出该地址的数据
  17. //        地址和数据可以随意改动,数据的范围为0~255,
  18. //        超过的范围请参考连写或连读
  19. //注意事项:
  20. //        1.案例为PMS154C,其他芯片原理都相同
  21. //        2.连读或连写请参考对应的程序
  22. //********************************************************************************//
  23. #include        "extern.h"

  24. #define _5us    5*2
  25. bit     SCL     :   PA.3;//用于产生器件所有数据发送或接收的时钟
  26. bit     SDA     :   PA.4;//用于器件所有数据的发送或接收

  27. byte        Address;
  28. byte        data;
  29. byte        Read_Data;
  30. byte        Write_Data;

  31. void    init(void)//初始化函数
  32. {
  33.     SCL = 1;
  34.     .delay _5us;
  35.     SDA = 1;//控制信号拉高
  36.     .delay _5us;
  37. }

  38. void    start(void)//启动信号子函数//向ROM发送一个开始的信号
  39. {
  40.     SDA = 1;
  41.     .delay _5us;
  42.     SCL = 1;
  43.     .delay _5us;
  44.     SDA = 0;
  45.     .delay _5us;
  46. }

  47. void    stop(void)//停止信号子函数//向ROM发送一个停止的信号
  48. {
  49.     SDA = 0;
  50.     .delay _5us;
  51.     SCl = 1;
  52.     .delay _5us;
  53.     SDA = 1;
  54.     .delay _5us;
  55. }

  56. void    respons(void)//应答信号子函数//接收一信号后应答
  57. {
  58.     $ SDA in,pull;
  59.     .delay 100;
  60.     SCL = 1;
  61.     .delay _5us;
  62.     while(SDA==1)
  63.         nop;
  64.     SCL = 0;
  65.     .delay _5us;
  66.     $ SDA out,high;
  67.     .delay 100;
  68. }

  69. void    write_byte(void)//写入一个字节数据//向E2PROM写数据
  70. {
  71.     byte temp = 0,i = 8;
  72.     while(i--)
  73.     {
  74.         SCL = 0;//数据可以改变
  75.         .delay _5us;
  76.         temp = data & 0x80;//保留最高位
  77.         if(temp)//写一位
  78.             SDA = 1;
  79.         else
  80.             SDA = 0;
  81.         .delay _5us;
  82.         data <<= 1;//要存的数据左移一位
  83.         SCL = 1;//数据稳定不能写了
  84.         .delay _5us;
  85.     }
  86.     SCL = 0;
  87.     .delay _5us;
  88.     SDA = 1;//稳定数据
  89.     .delay _5us;
  90. }

  91. void    read_byte(void)//读回一个字节
  92. {
  93.     byte  i = 8;
  94.     SCL = 0;//数据改变
  95.     .delay _5us;
  96.     SDA = 1;//可读信号
  97.     .delay _5us;
  98.     $ SDA in,pull;
  99.     .delay 100;
  100.     Read_Data = 0;
  101.     while(i--)
  102.     {
  103.         Read_Data = Read_Data << 1;//写入时从高位写,读出时也一样
  104.         SCL = 1;//数据稳定,可从SDA读出一位
  105.         .delay _5us;
  106.         if(SDA)
  107.             Read_Data = Read_Data | 0x01;
  108.         else
  109.             Read_Data = Read_Data & 0xfe;
  110.         SCL = 0;//数据改变准备下一位
  111.         .delay _5us;
  112.     }
  113.     $ SDA out,high;
  114.     .delay 100;
  115. }

  116. void    write_add(void)//片内随意地址写任意数//根据起始地址、数据个数及数据写入E2PROM中
  117. {                       //Write_Data   address变量
  118.     start();//起始

  119.     data = 0xa0;//E2PROM地址(ATC02为0xa0)//器件地址+写控制位
  120.     write_byte();
  121.     respons();//应答

  122.     data = address;//写入数据要存放的地址
  123.     write_byte();
  124.     respons();//应答

  125.     data = Write_Data;//写入数据
  126.     write_byte();
  127.     respons();//应答

  128.     stop();//终止
  129. }

  130. void    read_add(void)//片内随意地址读数据//根据起始地址和读出个数,从E2PROM中读出一串数据
  131. {                   //address变量
  132.     start();//起始

  133.     data = 0xa0;//器件地址+写控制位
  134.     write_byte();
  135.     respons();//应答

  136.     data = address;//数据地址
  137.     write_byte();
  138.     respons();//应答

  139.     start();//起始

  140.     data = 0xa1;//器件地址+读控制位
  141.     write_byte();
  142.     respons();

  143.         read_byte();
  144.         .delay 1000;

  145.         stop();//停止
  146. }

  147. void        FPPA0 (void)
  148. {
  149.         .ADJUST_IC        SYSCLK=IHRC/8, IHRC=16MHz, VDD=5V;

  150.     $ SDA out,high;
  151.     $ SCL out,high;

  152.         Address = 0;
  153.     init();
  154.         .delay 100;
  155.         while (1)
  156.         {
  157.                 Address = 0;//地址
  158.                 Write_Data = 49;//数据
  159.                 write_add();//写入一个数据
  160.                 .delay 5000*2;//延时一下
  161.                 Address = 0;
  162.                 read_add();//读出写入的数据
  163.                 nop;
  164.         }
  165. }

  166. void        Interrupt (void)
  167. {
  168.         pushaf;

  169.         if (Intrq.T16)
  170.         {        //        T16 Trig
  171.                 //        User can add code
  172.                 Intrq.T16        =        0;
  173.                 //...
  174.         }

  175.         popaf;
  176. }

复制代码

原理图: 无
仿真: 无
代码: PMS154C 24C02.zip (11.35 KB, 下载次数: 1)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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