找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1967|回复: 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 单片机教程网

快速回复 返回顶部 返回列表