找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1035|回复: 0
打印 上一主题 下一主题
收起左侧

IIC总线单片机程序

[复制链接]
跳转到指定楼层
楼主
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define out P0

  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};
  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);


  23. void main(void)
  24. {
  25.         EA=1;
  26.         EX0=1;
  27.         EX1=1;
  28.         while(1);
  29. }

  30. void ext0()interrupt 0
  31. {
  32.         write();
  33. }

  34. void ext1()interrupt 2
  35. {
  36.         read();
  37. }

  38. void read(void)
  39. {
  40.         uchar i;
  41.         bit f;
  42.         start();
  43.         send_byte(0xa0);
  44.         f=rack();
  45.         if(!f)
  46.         {
  47.                 start();
  48.                 send_byte(0xa0);
  49.                 f=rack();
  50.                 send_byte(0x00);
  51.                 f=rack();
  52.                 if(!f)
  53.                 {
  54.                         start();
  55.                         send_byte(0xa1);
  56.                         f=rack();
  57.                         if(!f)
  58.                                 {
  59.                                 for(i=0;i<3;i++)
  60.                                 {
  61.                                 rec_mem[i]=rec_byte();
  62.                                 sack();
  63.                                 }
  64.                                 rec_mem[3]=rec_byte();
  65.                                 ackn();
  66.                                 }
  67.                                 }
  68.                                 }
  69.                                 stop();out=rec_mem[3];while(!key2);
  70.                 }

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

  94. void start(void)
  95. {
  96.         scl=1;
  97.         sda=1;
  98.         delay4us();
  99.         sda=0;
  100.         delay4us();
  101.         scl=0;
  102.         }

  103. void stop(void)
  104. {
  105.         scl=0;
  106.         sda=0;
  107.         delay4us();
  108.         scl=1;        
  109.         delay4us();
  110.         sda=1;
  111.     delay4us();
  112.     sda=0;
  113.   }
  114. bit rack(void)
  115. {
  116.         bit flag;
  117.         scl=1;
  118.         delay4us();
  119.         flag=sda;
  120.         scl=0;
  121.         return(flag);
  122.   }

  123. void sack(void)  
  124. {        sda=0;
  125.         delay4us();
  126.         scl=1;
  127.         delay4us();
  128.         scl=0;
  129.         delay4us();
  130.         sda=1;
  131.         delay4us();
  132.         }
  133. void ackn(void)
  134. {         sda=1;
  135.         delay4us();
  136.         scl=1;
  137.         delay4us();
  138.         scl=0;
  139.         delay4us();
  140.         sda=0;
  141.         }
  142. uchar rec_byte(void)
  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. {   uchar i;
  157.     scl=0;
  158.         for(i=0;i<8;i++)
  159.         {
  160.                 sda=(bit)(temp&0x80);
  161.                 scl=1;
  162.                 delay4us();
  163.                 scl=0;
  164.                 temp<<=1;
  165.         }
  166.                 sda=1;
  167. }

  168. void delay4us(void)
  169. {
  170.         _nop_();_nop_(); _nop_(); _nop_();
  171. }
复制代码

仿真图.png (46.51 KB, 下载次数: 7)

仿真图.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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