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

       找回密碼
       立即注冊

      QQ登錄

      只需一步,快速開始

      搜索
      查看: 2811|回復: 1
      收起左側

      單片機I2C總線擴展 IC卡仿真與源碼設計

      [復制鏈接]
      ID:339064 發(fā)表于 2018-5-27 14:34 | 顯示全部樓層 |閱讀模式
      仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
      QQ圖片20180527143700.png 0.png

      單片機源程序如下:
      1. #include "reg51.h"
      2. #include "intrins.h"                                 //包含有函數(shù)_nop_()的頭文件
      3. #define uchar unsigned char
      4. #define uint unsigned int
      5. #define out P2                                                //發(fā)送緩沖區(qū)的首地址
      6. sbit scl=P1^1;
      7. sbit sda=P1^0;
      8. sbit key1=P3^2;
      9. sbit key2=P3^3;
      10. uchar data mem[4]_at_ 0x55;                //發(fā)送緩沖區(qū)的首地址
      11. uchar mem[4]={0x41,0x42,0x43,0xaa};        //預發(fā)送的數(shù)據數(shù)組0x41,0x42,0x43,0xaa
      12. uchar data rec_mem[4] _at_ 0x60;        //接收緩沖區(qū)的首地址
      13. void start(void);                                        //起始信號函數(shù)
      14. void stop(void);                                        //終止信號函數(shù)
      15. void sack(void);                                        //發(fā)送應答信號函數(shù)
      16. bit rack(void);                                                //接收應答信號函數(shù)
      17. void ackn(void);                                        //發(fā)送無應答信號函數(shù)
      18. void send_byte(uchar);                                //發(fā)送一個字節(jié)函數(shù)
      19. uchar rec_byte(void);                                //接收一個字節(jié)函數(shù)
      20. void write(void);                                        //寫一組數(shù)據函數(shù)
      21. void read(void);                                        //讀一組數(shù)據函數(shù)
      22. void delay4us(void);                                //延時4us

      23. void main(void)
      24. {
      25.         EA=1;EX0=1;EX1=1;                                //總中斷開,外中斷0與外中斷1允許中斷
      26.         while(1);
      27. }

      28. void ext0()interrupt 0                                //外中斷0中斷函數(shù)
      29. {
      30.         write();                                                //調用寫數(shù)據函數(shù)
      31. }

      32. void ext1()interrupt 2                                //外中斷1中斷函數(shù)
      33. {
      34.         read();                                                        //調用讀數(shù)據函數(shù)
      35. }

      36. void read(void)                                                //讀數(shù)據函數(shù)
      37. {
      38.         uchar i;
      39.         bit f;
      40.         start();                                                //起始函數(shù)
      41.         send_byte(0xa0);                                //發(fā)從機的地址
      42.         f=rack();                                                //接收應答
      43.         if(!f)
      44.         {
      45.                 start();                                        //起始信號
      46.                 send_byte(0xa0);
      47.                 f=rack();
      48.                 send_byte(0x00);                   //設置要讀取從器件的片內地址
      49.                 f=rack();       
      50.         if(!f)
      51.         {
      52.                 start();                                        //起始信號
      53.                 send_byte(0xa1);
      54.                 f=rack();
      55.         if(!f)
      56.         {
      57.                 for(i=0;i<3;i++)       
      58.                 {
      59.                         rec_mem[i]=rec_byte();
      60.                         sack();
      61.                 }
      62.                 rec_mem[3]=rec_byte();ackn();                  
      63.         }
      64.         }
      65.         }
      66.         stop();out=rec_mem[3];while(!key2);       
      67. //stop();out=0x55;while(!key2);                       
      68. }

      69. void write(void)                                   //寫數(shù)據函數(shù)
      70. {
      71.         uchar i;
      72.         bit f;
      73.         start();
      74.         send_byte(0xa0);
      75.         f=rack();
      76.         if(!f)
      77.         {
      78.                 send_byte(0x00);
      79.                 f=rack();
      80.                 if(!f){
      81.                 for(i=0;i<4;i++)
      82.                 {
      83.                         send_byte(mem[i]);
      84.                         f=rack();
      85.                         if(f)break;
      86.                 }
      87.                 }
      88.         }
      89.         stop();out=0xc3;while(!key1);
      90. }

      91. void start(void)                                  //起始信號
      92. {
      93.         scl=1;
      94.         sda=1;
      95.         delay4us();
      96.         sda=0;
      97.         delay4us();
      98.         scl=0;
      99. }

      100. void stop(void)                                         //終止信號
      101. {
      102.         scl=0;
      103.         sda=0;
      104.         delay4us();
      105.         scl=1;
      106.         delay4us();
      107.         sda=1;
      108.         delay4us();
      109.         sda=0;
      110. }

      111. bit rack(void)                                        //接收一個應答位
      112. {
      113.         bit flag;
      114.         scl=1;
      115.         delay4us();
      116.         flag=sda;
      117.         scl=0;
      118.         return(flag);
      119. }

      120. void sack(void)                                   //發(fā)送接收應答位
      121. {
      122.         sda=0;
      123.         delay4us();
      124.         scl=1;
      125.         delay4us();
      126.         scl=0;
      127.         delay4us();
      128.         sda=1;
      129.         delay4us();
      130. }

      131. void ackn(void)                                   //發(fā)送非接受應答位
      132. {
      133.         sda=1;
      134.         delay4us();
      135.         scl=1;
      136.         delay4us();
      137.         scl=0;
      138.         delay4us();
      139.         sda=0;
      140. }

      141. uchar rec_byte(void)                   //接收一個字節(jié)函數(shù)
      142. {
      143.         uchar i,temp;
      144.         for(i=0;i<8;i++)
      145.         {
      146.                 temp<<=1;
      147.                 scl=1;
      148.                 delay4us();
      149.                 temp|=sda;
      150.                 scl=0;
      151.                 delay4us();
      152.         }
      153.         return(temp);
      154. }

      155. void send_byte(uchar temp)           //發(fā)送一個字節(jié)函數(shù)
      156. {
      157.         uchar i;
      158.         scl=0;
      159.         for(i=0;i<8;i++)
      160.         {
      161.                 sda=(bit)(temp&0x80);
      162.                 scl=1;
      163.                 delay4us();
      164.                 scl=0;
      165.                 temp<<=1;
      166.         }
      167.         sda=1;
      168. }

      169. void delay4us(void)
      170. {
      171.         _nop_();_nop_();_nop_();_nop_();         //延時4us函數(shù)
      172. }
      復制代碼

      全部資料51hei下載地址:
      eg10_2.rar (59.78 KB, 下載次數(shù): 18)

      評分

      參與人數(shù) 1黑幣 +50 收起 理由
      admin + 50 共享資料的黑幣獎勵!

      查看全部評分

      回復

      使用道具 舉報

      ID:320306 發(fā)表于 2018-5-31 14:09 | 顯示全部樓層
      此帖僅作者可見

      使用道具 舉報

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

      本版積分規(guī)則

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

      Powered by 單片機教程網

      快速回復 返回頂部 返回列表