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

QQ登錄

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

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

單片機(jī)I2C總線擴(kuò)展 IC卡仿真與源碼設(shè)計(jì)

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

單片機(jī)源程序如下:
  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};        //預(yù)發(fā)送的數(shù)據(jù)數(shù)組0x41,0x42,0x43,0xaa
  12. uchar data rec_mem[4] _at_ 0x60;        //接收緩沖區(qū)的首地址
  13. void start(void);                                        //起始信號(hào)函數(shù)
  14. void stop(void);                                        //終止信號(hào)函數(shù)
  15. void sack(void);                                        //發(fā)送應(yīng)答信號(hào)函數(shù)
  16. bit rack(void);                                                //接收應(yīng)答信號(hào)函數(shù)
  17. void ackn(void);                                        //發(fā)送無(wú)應(yīng)答信號(hào)函數(shù)
  18. void send_byte(uchar);                                //發(fā)送一個(gè)字節(jié)函數(shù)
  19. uchar rec_byte(void);                                //接收一個(gè)字節(jié)函數(shù)
  20. void write(void);                                        //寫(xiě)一組數(shù)據(jù)函數(shù)
  21. void read(void);                                        //讀一組數(shù)據(jù)函數(shù)
  22. void delay4us(void);                                //延時(shí)4us

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

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

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

  36. void read(void)                                                //讀數(shù)據(jù)函數(shù)
  37. {
  38.         uchar i;
  39.         bit f;
  40.         start();                                                //起始函數(shù)
  41.         send_byte(0xa0);                                //發(fā)從機(jī)的地址
  42.         f=rack();                                                //接收應(yīng)答
  43.         if(!f)
  44.         {
  45.                 start();                                        //起始信號(hào)
  46.                 send_byte(0xa0);
  47.                 f=rack();
  48.                 send_byte(0x00);                   //設(shè)置要讀取從器件的片內(nèi)地址
  49.                 f=rack();       
  50.         if(!f)
  51.         {
  52.                 start();                                        //起始信號(hào)
  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)                                   //寫(xiě)數(shù)據(jù)函數(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)                                  //起始信號(hào)
  92. {
  93.         scl=1;
  94.         sda=1;
  95.         delay4us();
  96.         sda=0;
  97.         delay4us();
  98.         scl=0;
  99. }

  100. void stop(void)                                         //終止信號(hào)
  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)                                        //接收一個(gè)應(yīng)答位
  112. {
  113.         bit flag;
  114.         scl=1;
  115.         delay4us();
  116.         flag=sda;
  117.         scl=0;
  118.         return(flag);
  119. }

  120. void sack(void)                                   //發(fā)送接收應(yīng)答位
  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ā)送非接受應(yīng)答位
  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)                   //接收一個(gè)字節(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ā)送一個(gè)字節(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_();         //延時(shí)4us函數(shù)
  172. }
復(fù)制代碼

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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