找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3748|回復(fù): 1
收起左側(cè)

單片機模擬I2C總線,并存取I2C串行EEPROM 24C02 proteus仿真,數(shù)碼管顯示

[復(fù)制鏈接]
ID:262 發(fā)表于 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;//數(shù)據(jù)線
  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,待寫字節(jié)數(shù)據(jù)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處讀取一字節(jié)數(shù)據(jù)                                                                                                                        *
  38. 輸入:地址add                                                                                                                                                        *
  39. 輸出:從地址add處讀得的一字節(jié)數(shù)據(jù)                                                                                                                *
  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為起始地址連續(xù)寫入字符串p                                                                                                            *
  54. 輸入:地址,待寫字符串                                                                                                                                          *
  55. 輸出:無                                                                                                                                                                  *
  56. 注意:字符串p的長度不需小于一頁數(shù)據(jù)(24c02c的一頁為16byte)。                                                          *
  57.       數(shù)據(jù)字節(jié)臨時存儲在片內(nèi)頁緩沖器中。在主器件發(fā)送停止條件之后,這些數(shù)據(jù)將被寫入存儲器。*
  58.       每接收一個字,內(nèi)部地址計數(shù)器加一。如果在停止條件產(chǎn)生前,主器件有超出一頁的數(shù)據(jù)要發(fā)送,
  59.           地址計數(shù)器將會翻轉(zhuǎn),先前寫入的數(shù)據(jù)將被覆蓋。                                                                                  *
  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為起始地址連續(xù)讀len長字節(jié)數(shù)據(jù),并通過*P返回                                                                                           *
  74. 輸入:地址add,讀取長度len                                                                                                                                                   *
  75. 輸出:字符串*p                                                                                                                                                                           *
  76. 說明:連續(xù)讀操作的起動過程和隨機讀操作相同,只是在 24XX發(fā)送完第一個數(shù)據(jù)字節(jié)后,主器件發(fā)出確認信號,*
  77.         而在隨機讀操作中發(fā)送的是停止條件。確認信號指示 24XX 器件發(fā)送下一個連續(xù)地址的數(shù)據(jù)字節(jié)(圖 8-4)。
  78.         在24器件向主器件發(fā)送完最后一個字節(jié)后,主器件不會 產(chǎn)生確認信號,而是產(chǎn)生停止條件。                           *
  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發(fā)確認信號,使器件發(fā)送下一個連續(xù)地址的數(shù)據(jù)字節(jié)                                       
  89.                 SCL=1;
  90.                 DELAY(DELAY_TIME);
  91.                 SCL=0;
  92.                 DELAY(DELAY_TIME);
  93.                 p++;
  94.         }//讀完最后一個字節(jié)不確認,停止結(jié)束
  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. }

復(fù)制代碼
0.png

PROTEUS.zip

118.1 KB, 下載次數(shù): 58, 下載積分: 黑幣 -5

相關(guān)帖子

回復(fù)

使用道具 舉報

ID:153935 發(fā)表于 2016-12-11 18:04 | 顯示全部樓層
看起來不完整
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表