久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

單片機源程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"                                 //包含有函數_nop_()的頭文件
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define out P2                                                //發送緩沖區的首地址
  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;                //發送緩沖區的首地址
  11. uchar mem[4]={0x41,0x42,0x43,0xaa};        //預發送的數據數組0x41,0x42,0x43,0xaa
  12. uchar data rec_mem[4] _at_ 0x60;        //接收緩沖區的首地址
  13. void start(void);                                        //起始信號函數
  14. void stop(void);                                        //終止信號函數
  15. void sack(void);                                        //發送應答信號函數
  16. bit rack(void);                                                //接收應答信號函數
  17. void ackn(void);                                        //發送無應答信號函數
  18. void send_byte(uchar);                                //發送一個字節函數
  19. uchar rec_byte(void);                                //接收一個字節函數
  20. void write(void);                                        //寫一組數據函數
  21. void read(void);                                        //讀一組數據函數
  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中斷函數
  29. {
  30.         write();                                                //調用寫數據函數
  31. }

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

  36. void read(void)                                                //讀數據函數
  37. {
  38.         uchar i;
  39.         bit f;
  40.         start();                                                //起始函數
  41.         send_byte(0xa0);                                //發從機的地址
  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)                                   //寫數據函數
  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)                                   //發送接收應答位
  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)                                   //發送非接受應答位
  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)                   //接收一個字節函數
  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)           //發送一個字節函數
  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函數
  172. }
復制代碼

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

評分

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

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 嫩草一区二区三区 | 亚洲欧美日韩网站 | 午夜爽爽爽男女免费观看 | 中文字幕在线一区二区三区 | 最新中文字幕久久 | 一区二区三区免费网站 | 日韩一区在线观看视频 | 中文字幕精品一区二区三区精品 | 日韩快播电影网 | 亚洲国产在 | 午夜精品久久久 | 久久91精品国产一区二区 | 一区二区三区免费 | 亚洲精品女人久久久 | 人人人人爽 | 亚洲成av| 日本一区二区三区四区 | 久久久久成人精品亚洲国产 | www.色综合 | av手机在线免费观看 | 国产二区在线播放 | 欧美激情国产日韩精品一区18 | 欧洲色综合 | 日韩精品一区中文字幕 | 精品欧美一区二区三区久久久 | 日韩精品在线看 | 日韩欧美亚洲 | 欧美一级在线 | 国产精品国产成人国产三级 | 亚洲网视频 | 亚洲在线电影 | 亚洲国产日韩一区 | 国产伦精品一区二区三区高清 | 日韩美av | 欧美日韩在线观看一区 | 特级做a爰片毛片免费看108 | 久久新视频 | 国产精品国产三级国产播12软件 | 激情网站在线观看 | 欧美影院| 日韩精品一区二区三区中文在线 |