欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機模擬I2C總線,并存取I2C串行EEPROM 24C02 proteus仿真,數碼管顯示 [打印本頁]

作者: heicad    時間: 2016-8-15 15:32
標題: 單片機模擬I2C總線,并存取I2C串行EEPROM 24C02 proteus仿真,數碼管顯示

  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. }

復制代碼


PROTEUS.zip

118.1 KB, 下載次數: 58, 下載積分: 黑幣 -5


作者: hei_cmh    時間: 2016-12-11 18:04
看起來不完整




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1