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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4097|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:262 發(fā)表于 2016-8-15 15:32 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

  1. /*****單片機(jī)模擬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;    //時(shí)鐘線

  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. 輸出:無(wú)                                                                                                                                                                *
  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. 輸出:無(wú)                                                                                                                                                                  *
  56. 注意:字符串p的長(zhǎng)度不需小于一頁(yè)數(shù)據(jù)(24c02c的一頁(yè)為16byte)。                                                          *
  57.       數(shù)據(jù)字節(jié)臨時(shí)存儲(chǔ)在片內(nèi)頁(yè)緩沖器中。在主器件發(fā)送停止條件之后,這些數(shù)據(jù)將被寫入存儲(chǔ)器。*
  58.       每接收一個(gè)字,內(nèi)部地址計(jì)數(shù)器加一。如果在停止條件產(chǎn)生前,主器件有超出一頁(yè)的數(shù)據(jù)要發(fā)送,
  59.           地址計(jì)數(shù)器將會(huì)翻轉(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長(zhǎng)字節(jié)數(shù)據(jù),并通過(guò)*P返回                                                                                           *
  74. 輸入:地址add,讀取長(zhǎng)度len                                                                                                                                                   *
  75. 輸出:字符串*p                                                                                                                                                                           *
  76. 說(shuō)明:連續(xù)讀操作的起動(dòng)過(guò)程和隨機(jī)讀操作相同,只是在 24XX發(fā)送完第一個(gè)數(shù)據(jù)字節(jié)后,主器件發(fā)出確認(rèn)信號(hào),*
  77.         而在隨機(jī)讀操作中發(fā)送的是停止條件。確認(rèn)信號(hào)指示 24XX 器件發(fā)送下一個(gè)連續(xù)地址的數(shù)據(jù)字節(jié)(圖 8-4)。
  78.         在24器件向主器件發(fā)送完最后一個(gè)字節(jié)后,主器件不會(huì) 產(chǎn)生確認(rèn)信號(hào),而是產(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ā)確認(rèn)信號(hào),使器件發(fā)送下一個(gè)連續(xù)地址的數(shù)據(jù)字節(jié)                                       
  89.                 SCL=1;
  90.                 DELAY(DELAY_TIME);
  91.                 SCL=0;
  92.                 DELAY(DELAY_TIME);
  93.                 p++;
  94.         }//讀完最后一個(gè)字節(jié)不確認(rèn),停止結(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ù)制代碼


PROTEUS.zip

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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:153935 發(fā)表于 2016-12-11 18:04 | 只看該作者
看起來(lái)不完整
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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