登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看3715|回1|收藏
楼主 ID:262 只看他
2016-8-15 15:32
0.png

代码:


  1. /*****单片机模拟I2C总线,并存取I2C串行EEPROM 24C02C****/

  2. #include <reg52.h>
  3. #include <string.h>
  4. #include "I2C_51.h"
  5. #include "uart.h"

  6. sbit sda=P2^1;//数据线
  7. sbit scl=P2^0;    //时钟线

  8. sbit dula=P2^6;
  9. sbit wela=P2^7;



  10. typedef unsigned char uchar;
  11. typedef unsigned int  uint;

  12. uchar code table[]={0x3f,0x06,0x5b,0x4f,
  13.                                         0x66,0x6d,0x7d,0x07,
  14.                                         0x7f,0x6f,0x77,0x7c,
  15.                                         0x39,0x5e,0x79,0x71,
  16.                                         };

  17. /********************I2C_51.h***********************************************************
  18. void I2C_Start(void);
  19. void I2C_Stop(void);
  20. bit Check_Acknowledge(void);
  21. void WriteI2CByte(char b)reentrant;
  22. char ReadI2CByte(void)reentrant
  23. ****************************************************************************************/
  24. /***************write one byte***********************************************************
  25. 功能:将ch写到地址add处                                                                                                                                        *
  26. 输入:地址add,待写字节数据ch                                                                                                                        *
  27. 输出:无                                                                                                                                                                *
  28. ****************************************************************************************/

  29. void WriteByte(uchar add,uchar ch){
  30.         I2C_Start();                                                                        //start
  31.         WriteI2CByte(0xa0);        while(!Check_Acknowledge());//control byte:1010+A2+A1+A0+1(write)/0(read)
  32.         WriteI2CByte(add);        while(!Check_Acknowledge());//address
  33.         WriteI2CByte(ch);        while(!Check_Acknowledge());//data
  34.         I2C_Stop();                                                                            //stop
  35. }
  36. /***************Read one byte************************************************************
  37. 功能:从地址ch处读取一字节数据                                                                                                                        *
  38. 输入:地址add                                                                                                                                                        *
  39. 输出:从地址add处读得的一字节数据                                                                                                                *
  40. ****************************************************************************************/
  41. char  ReadByte(uchar add){
  42.         char b;
  43.         I2C_Start();                                     //start
  44.         WriteI2CByte(0xa0);         while(!Check_Acknowledge());//control byte,
  45.         WriteI2CByte(add);   while(!Check_Acknowledge());//address
  46.         I2C_Start();                                                                         //start
  47.         WriteI2CByte(0xa1);  while(!Check_Acknowledge());//data
  48.         b=ReadI2CByte();                        //N0 Acknowledge
  49.         I2C_Stop();                                                                                 //stop       
  50.         return b;
  51. }
  52. /***************write string***************************************************************
  53. 功能:以add为起始地址连续写入字符串p                                                                                                            *
  54. 输入:地址,待写字符串                                                                                                                                          *
  55. 输出:无                                                                                                                                                                  *
  56. 注意:字符串p的长度不需小于一页数据(24c02c的一页为16byte)。                                                          *
  57.       数据字节临时存储在片内页缓冲器中。在主器件发送停止条件之后,这些数据将被写入存储器。*
  58.       每接收一个字,内部地址计数器加一。如果在停止条件产生前,主器件有超出一页的数据要发送,
  59.           地址计数器将会翻转,先前写入的数据将被覆盖。                                                                                  *
  60. ******************************************************************************************/
  61. void WriteString(uchar add,uchar *p){ /*224C02C(2kbit),strlen(p)should<=16bit*/
  62.         uchar i;
  63.         I2C_Start();
  64.         WriteI2CByte(0xa0);  while(!Check_Acknowledge());
  65.         WriteI2CByte(add);   while(!Check_Acknowledge());
  66.         for(i=strlen(p);i!=0;i--){
  67.                 WriteI2CByte(*p);   while(!Check_Acknowledge());
  68.                 p++;
  69.         }
  70.         I2C_Stop();       
  71. }

  72. /***************read string*************************************************************************
  73. 功能:以add为起始地址连续读len长字节数据,并通过*P返回                                                                                           *
  74. 输入:地址add,读取长度len                                                                                                                                                   *
  75. 输出:字符串*p                                                                                                                                                                           *
  76. 说明:连续读操作的起动过程和随机读操作相同,只是在 24XX发送完第一个数据字节后,主器件发出确认信号,*
  77.         而在随机读操作中发送的是停止条件。确认信号指示 24XX 器件发送下一个连续地址的数据字节(图 8-4)。
  78.         在24器件向主器件发送完最后一个字节后,主器件不会 产生确认信号,而是产生停止条件。                           *
  79. ***************************************************************************************************/
  80. void  ReadString(uchar add,uchar *p,uchar len){
  81.         I2C_Start();                                         //start
  82.         WriteI2CByte(0xa0);          while(!Check_Acknowledge());   //control byte,
  83.         WriteI2CByte(add);    while(!Check_Acknowledge());   //address
  84.         I2C_Start();                                                                             //start
  85.         WriteI2CByte(0xa1);   while(!Check_Acknowledge());         //data
  86.         while(len--){
  87.                 *p=ReadI2CByte();
  88.                 SDA=0;     //MCU发确认信号,使器件发送下一个连续地址的数据字节                                       
  89.                 SCL=1;
  90.                 DELAY(DELAY_TIME);
  91.                 SCL=0;
  92.                 DELAY(DELAY_TIME);
  93.                 p++;
  94.         }//读完最后一个字节不确认,停止结束
  95.         I2C_Stop();                                                                                     //stop       
  96. }
  97. /*******************main fuction*************************/
  98. void delayms(uint z)
  99. {
  100.         uint x,y;
  101.         for(x=z;x>0;x--)
  102.                 for(y=110;y>0;y--);
  103. }

  104. void display(uchar shu)
  105. {
  106.                  dula=1;
  107.             P0=table[shu];
  108.                 dula=0;
  109.                 P0=0xff;
  110.                
  111.                 wela=1;
  112.                 P0=0xfe;
  113.                 wela=0;
  114.                 delayms(5);
  115. }
  116. void main()
  117. {        uchar a;
  118.     uint b;

  119.         UartInit();
  120.         WriteByte(1,'3');
  121.         a=ReadByte(1);
  122.         b=a;

  123.         putchar(a);
  124.                 putchar(b);

  125.         display(b-48);

  126.         while(1);
  127.        

  128.         for(;;);
  129. }

0.png

附件列表

PROTEUS.zip (2016-8-15 15:31 上传)

118.1 KB, 下载次数: 58, 下载积分: 黑币 -5

沙发 ID:153935 只看他
2016-12-11 18:04
看起来不完整

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版