[51单片机] at24c1024那位写过驱动,分享一下

[复制链接]
 楼主| chuandaoxy 发表于 2021-2-8 08:26 | 显示全部楼层 |阅读模式
手里的活要存储波形,只有一个1024,之前没用过,那位用过分享一下,谢谢
ayb_ice 发表于 2021-2-8 09:02 | 显示全部楼层
网上一大把的
 楼主| chuandaoxy 发表于 2021-2-8 13:42 | 显示全部楼层

pudn上不去了,不中啊

评论

网上太多了,但是1024的确实没有,拿别的修改一下。  发表于 2021-2-8 20:08
网上太多了,但是1024的确实没有,拿别的修改一下。  发表于 2021-2-8 20:07
xyz549040622 发表于 2021-2-8 20:12 | 显示全部楼层
这有一个24c02的,拿来修改一下就好了。上pudn干什么,去 https://github.com/
  1. /*-----------------------------------------------
  2.   名称:IIC协议 EEPROM24c02
  3.   论坛:www.doflye.net
  4.   编写:shifang
  5.   修改:无
  6.   内容:此程序用于检测EEPROM性能,测试方法如下:写入24c02一些数据,然后在内存中清除这些数据,
  7.         掉电后主内存将失去这些信息,然后从24c02中调入这些数据。看是否与写入的相同。
  8.                 函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器
  9.                 周期,即晶振频率要小于12MHZ)
  10. ------------------------------------------------*/  
  11.   
  12.               
  13. #include <reg52.h>          //头文件的包含
  14. #include <intrins.h>

  15. #define  _Nop()  _nop_()        //定义空指令

  16. // 常,变量定义区
  17. unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
  18.                                                    0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F
  19. unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码

  20. sbit LATCH1=P2^2;
  21. sbit LATCH2=P2^3;
  22.                                              
  23. sbit SDA=P2^1;            //模拟I2C数据传送位
  24. sbit SCL=P2^0;            //模拟I2C时钟控制位

  25.                           
  26. bit ack;                      //应答标志位
  27.    

  28. void DelayUs2x(unsigned char t);//函数声明
  29. void DelayMs(unsigned char t);

  30. /*------------------------------------------------
  31. uS延时函数,含有输入参数 unsigned char t,无返回值
  32. unsigned char 是定义无符号字符变量,其值的范围是
  33. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  34. 长度如下 T=tx2+5 uS
  35. ------------------------------------------------*/
  36. void DelayUs2x(unsigned char t)
  37. {   
  38. while(--t);
  39. }
  40. /*------------------------------------------------
  41. mS延时函数,含有输入参数 unsigned char t,无返回值
  42. unsigned char 是定义无符号字符变量,其值的范围是
  43. 0~255 这里使用晶振12M,精确延时请使用汇编
  44. ------------------------------------------------*/
  45. void DelayMs(unsigned char t)
  46. {
  47.      
  48. while(t--)
  49. {
  50.      //大致延时1mS
  51.      DelayUs2x(245);
  52.          DelayUs2x(245);
  53. }
  54. }

  55. /*------------------------------------------------
  56.                     启动总线
  57. ------------------------------------------------*/
  58. void Start_I2c()
  59. {
  60.   SDA=1;   //发送起始条件的数据信号
  61.   _Nop();
  62.   SCL=1;
  63.   _Nop();    //起始条件建立时间大于4.7us,延时
  64.   _Nop();
  65.   _Nop();
  66.   _Nop();
  67.   _Nop();   
  68.   SDA=0;     //发送起始信号
  69.   _Nop();    //起始条件锁定时间大于4μ
  70.   _Nop();
  71.   _Nop();
  72.   _Nop();
  73.   _Nop();      
  74.   SCL=0;    //钳住I2C总线,准备发送或接收数据
  75.   _Nop();
  76.   _Nop();
  77. }
  78. /*------------------------------------------------
  79.                     结束总线
  80. ------------------------------------------------*/
  81. void Stop_I2c()
  82. {
  83.   SDA=0;    //发送结束条件的数据信号
  84.   _Nop();   //发送结束条件的时钟信号
  85.   SCL=1;    //结束条件建立时间大于4μ
  86.   _Nop();
  87.   _Nop();
  88.   _Nop();
  89.   _Nop();
  90.   _Nop();
  91.   SDA=1;    //发送I2C总线结束信号
  92.   _Nop();
  93.   _Nop();
  94.   _Nop();
  95.   _Nop();
  96. }




  97. /*----------------------------------------------------------------
  98.                  字节数据传送函数               
  99. 函数原型: void  SendByte(unsigned char c);
  100. 功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
  101.      此状态位进行操作.(不应答或非应答都使ack=0 假)     
  102.      发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
  103. ------------------------------------------------------------------*/
  104. void  SendByte(unsigned char c)
  105. {
  106. unsigned char BitCnt;

  107. for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位
  108.     {
  109.      if((c<<BitCnt)&0x80)SDA=1;   //判断发送位
  110.        else  SDA=0;               
  111.      _Nop();
  112.      SCL=1;               //置时钟线为高,通知被控器开始接收数据位
  113.       _Nop();
  114.       _Nop();             //保证时钟高电平周期大于4μ
  115.       _Nop();
  116.       _Nop();
  117.       _Nop();         
  118.      SCL=0;
  119.     }
  120.    
  121.     _Nop();
  122.     _Nop();
  123.     SDA=1;               //8位发送完后释放数据线,准备接收应答位
  124.     _Nop();
  125.     _Nop();   
  126.     SCL=1;
  127.     _Nop();
  128.     _Nop();
  129.     _Nop();
  130.     if(SDA==1)ack=0;     
  131.        else ack=1;        //判断是否接收到应答信号
  132.     SCL=0;
  133.     _Nop();
  134.     _Nop();
  135. }







  136. /*----------------------------------------------------------------
  137.                  字节数据传送函数               
  138. 函数原型: unsigned char  RcvByte();
  139. 功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
  140.      发完后请用应答函数。  
  141. ------------------------------------------------------------------*/       
  142. unsigned char  RcvByte()
  143. {
  144.   unsigned char retc;
  145.   unsigned char BitCnt;
  146.   
  147.   retc=0;
  148.   SDA=1;             //置数据线为输入方式
  149.   for(BitCnt=0;BitCnt<8;BitCnt++)
  150.       {
  151.         _Nop();           
  152.         SCL=0;       //置时钟线为低,准备接收数据位
  153.         _Nop();
  154.         _Nop();      //时钟低电平周期大于4.7us
  155.         _Nop();
  156.         _Nop();
  157.         _Nop();
  158.         SCL=1;       //置时钟线为高使数据线上数据有效
  159.         _Nop();
  160.         _Nop();
  161.         retc=retc<<1;
  162.         if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中
  163.         _Nop();
  164.         _Nop();
  165.       }
  166.   SCL=0;   
  167.   _Nop();
  168.   _Nop();
  169.   return(retc);
  170. }



  171. /*----------------------------------------------------------------
  172.                      应答子函数
  173. 原型:  void Ack_I2c(void);

  174. ----------------------------------------------------------------*/
  175. void Ack_I2c(void)
  176. {
  177.   
  178.   SDA=0;     
  179.   _Nop();
  180.   _Nop();
  181.   _Nop();      
  182.   SCL=1;
  183.   _Nop();
  184.   _Nop();              //时钟低电平周期大于4μ
  185.   _Nop();
  186.   _Nop();
  187.   _Nop();  
  188.   SCL=0;               //清时钟线,钳住I2C总线以便继续接收
  189.   _Nop();
  190.   _Nop();   
  191. }
  192. /*----------------------------------------------------------------
  193.                      非应答子函数
  194. 原型:  void NoAck_I2c(void);

  195. ----------------------------------------------------------------*/
  196. void NoAck_I2c(void)
  197. {
  198.   
  199.   SDA=1;
  200.   _Nop();
  201.   _Nop();
  202.   _Nop();      
  203.   SCL=1;
  204.   _Nop();
  205.   _Nop();              //时钟低电平周期大于4μ
  206.   _Nop();
  207.   _Nop();
  208.   _Nop();  
  209.   SCL=0;                //清时钟线,钳住I2C总线以便继续接收
  210.   _Nop();
  211.   _Nop();   
  212. }






  213. /*----------------------------------------------------------------
  214.                     向无子地址器件发送字节数据函数               
  215. 函数原型: bit  ISendByte(unsigned char sla,ucahr c);  
  216. 功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
  217.            如果返回1表示操作成功,否则操作有误。
  218. 注意:    使用前必须已结束总线。
  219. ----------------------------------------------------------------*/
  220. /*bit ISendByte(unsigned char sla,unsigned char c)
  221. {
  222.    Start_I2c();               //启动总线
  223.    SendByte(sla);             //发送器件地址
  224.      if(ack==0)return(0);
  225.    SendByte(c);               //发送数据
  226.      if(ack==0)return(0);
  227.   Stop_I2c();                 //结束总线
  228.   return(1);
  229. }
  230. */

  231. /*----------------------------------------------------------------
  232.                     向有子地址器件发送多字节数据函数               
  233. 函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);  
  234. 功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
  235.           地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
  236.            如果返回1表示操作成功,否则操作有误。
  237. 注意:    使用前必须已结束总线。
  238. ----------------------------------------------------------------*/
  239. bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
  240. {
  241.    unsigned char i;

  242.    Start_I2c();               //启动总线
  243.    SendByte(sla);             //发送器件地址
  244.      if(ack==0)return(0);
  245.    SendByte(suba);            //发送器件子地址
  246.      if(ack==0)return(0);

  247.    for(i=0;i<no;i++)
  248.     {   
  249.      SendByte(*s);            //发送数据
  250.        if(ack==0)return(0);
  251.      s++;
  252.     }
  253. Stop_I2c();                  //结束总线
  254.   return(1);
  255. }

  256. /*----------------------------------------------------------------
  257.                     向无子地址器件读字节数据函数               
  258. 函数原型: bit  IRcvByte(unsigned char sla,ucahr *c);  
  259. 功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地
  260.           址sla,返回值在c.
  261.            如果返回1表示操作成功,否则操作有误。
  262. 注意:    使用前必须已结束总线。
  263. ----------------------------------------------------------------*/
  264. /*bit IRcvByte(unsigned char sla,unsigned char *c)
  265. {
  266.    Start_I2c();                //启动总线
  267.    SendByte(sla+1);            //发送器件地址
  268.      if(ack==0)return(0);
  269.    *c=RcvByte();               //读取数据
  270.      NoAck_I2c();              //发送非就答位
  271.      Stop_I2c();               //结束总线
  272.   return(1);
  273. }

  274. */
  275. /*----------------------------------------------------------------
  276.                     向有子地址器件读取多字节数据函数               
  277. 函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);  
  278. 功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
  279.           地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
  280.            如果返回1表示操作成功,否则操作有误。
  281. 注意:    使用前必须已结束总线。
  282. ----------------------------------------------------------------*/
  283. bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
  284. {
  285.    unsigned char i;

  286.    Start_I2c();               //启动总线
  287.    SendByte(sla);             //发送器件地址
  288.      if(ack==0)return(0);
  289.    SendByte(suba);            //发送器件子地址
  290.      if(ack==0)return(0);

  291.    Start_I2c();
  292.    SendByte(sla+1);
  293.       if(ack==0)return(0);

  294.    for(i=0;i<no-1;i++)
  295.     {   
  296.      *s=RcvByte();              //发送数据
  297.       Ack_I2c();                //发送就答位
  298.      s++;
  299.     }
  300.    *s=RcvByte();
  301.     NoAck_I2c();                 //发送非应位
  302.    Stop_I2c();                    //结束总线
  303.   return(1);
  304. }
  305. /*------------------------------------------------
  306.                     主函数
  307. ------------------------------------------------*/
  308. void main()
  309.         {
  310.          unsigned char dofly[4]={1,2,3,4};          // 显示码值 1234
  311.          unsigned char i;
  312.          
  313.          ISendStr(0xae,4,dofly,4);                   //写入24c02
  314.          DelayMs(200);
  315.          dofly[0]=0;                                  //清除当前数据
  316.          dofly[1]=0;
  317.          dofly[2]=0;
  318.          dofly[3]=0;
  319.          IRcvStr(0xae,4,dofly,4);                  //调用存储数据
  320.          
  321.          while(1)
  322.               {
  323.            
  324.                P0=dofly_DuanMa[dofly[i]];//显示存储数据
  325.            LATCH1=1;                  //锁存
  326.            LATCH1=0;
  327.       
  328.                       P0=dofly_WeiMa[i];  //取位码
  329.            LATCH2=1;          // 锁存
  330.            LATCH2=0;
  331.                    DelayMs(200);      //延时用于演示显示数据
  332.                    DelayMs(200);
  333.                    i++;
  334.                    if(i==4)
  335.                       i=0;
  336.                   }
  337. }




 楼主| chuandaoxy 发表于 2021-2-9 16:05 | 显示全部楼层
2402页写通了,24c1024还没有试,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

855

主题

1044

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部