找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么我这个单片机IIC链接的出错了

[复制链接]
跳转到指定楼层
楼主
我想用两个单片机,1用来读数据,2写数据到AT24C
  1. #include <reg51.h>
  2. #include<intrins.h>//包含_nop_()函数
  3. #define uc unsigned char
  4. #define CTL_R 0xa1//AT24读控制
  5. #define CTL_W 0xa0//AT24写控制

  6. sbit whitch = P3^1;
  7. sbit what = P3^0;
  8. sbit SCL = P2^6;
  9. sbit SDA = P2^7;
  10. sbit BUSY = P3^2;

  11. uc code num[10] = {
  12. 0x3f, 0x06, 0x5b,
  13. 0x4f,0x66,0x6d,
  14. 0x7d, 0x07, 0x7f, 0x6f
  15. };

  16. /**
  17. *    @name                : void Delay(int n)
  18. *    @description  : 延时
  19. *    @param        ;int n  延迟的时间
  20. *    @return              :
  21. */
  22. void Delay(int n)
  23. {
  24.         int i,j;
  25.         for(i = 0; i < n; i++)
  26.         for(j = 0; j < 100; j++);
  27. }

  28. /**
  29. *    @name                : void delay()
  30. *    @description  : 延时>4us
  31. *    @param        ;
  32. *    @return              :
  33. */
  34. void delay()
  35. {
  36.         _nop_();//空指令
  37.         _nop_();
  38.         _nop_();
  39.         _nop_();
  40. }

  41. /**
  42. *    @name                : void IIC_start()
  43. *    @description  : IIC开始
  44. *    @param        ;
  45. *    @return              :
  46. */
  47. void IIC_start()
  48. {
  49.         SDA = 1;
  50.         SCL = 1;
  51.         delay();
  52.         SDA = 0;
  53.         delay();
  54.         SCL = 0;
  55. }

  56. /**
  57. *    @name                : void IIC_stop()
  58. *    @description  : IIC结束
  59. *    @param        ;
  60. *    @return              :
  61. */
  62. void IIC_stop()
  63. {
  64.         SDA = 0;
  65.         SCL = 1;
  66.         delay();
  67.         SDA = 1;
  68.         delay();
  69.         SCL = 0;
  70. }

  71. /**
  72. *    @name                : void IIC_ACK()
  73. *    @description  : 发送应答ACK=0
  74. *    @param        ;
  75. *    @return              :
  76. */
  77. void IIC_ACK()
  78. {
  79.         SDA = 0;
  80.         SCL = 1;
  81.         delay();
  82.         SCL = 0;
  83.         SDA = 1;
  84. }

  85. /**
  86. *    @name                : uc IIC_CACK()
  87. *    @description  : 检查应答
  88. *    @param        ;
  89. *    @return              :
  90. */
  91. uc IIC_CACK()
  92. {
  93.         int C = 0;
  94.         while(C != SDA);
  95.         SCL = 1;
  96.         delay();
  97.         SCL = 0;
  98.         return C;
  99. }

  100. /**
  101. *    @name                : void IIC_send(uc n)
  102. *    @description  :发送一个字节
  103. *    @param        ;uc n发送的字节
  104. *    @return              :
  105. */
  106. void IIC_send(char n)
  107. {
  108.         uc i;
  109.         char tmp = n;
  110.         for(i = 0; i < 8; i++)
  111.         {
  112.                 SDA =(bit)(tmp >> 7);//发送一个字节的高位
  113.                 SCL = 1;
  114.                 delay();
  115.                 tmp <<= 1;
  116.                 SCL = 0;
  117.         }
  118. }

  119. /**
  120. *    @name                : uc IIC_rec()
  121. *    @description  :接收一个字节
  122. *    @param        ;
  123. *    @return              : 收到的数
  124. */
  125. uc IIC_rec()
  126. {
  127.         uc i;
  128.         char tmp = 0;
  129.         for(i = 0; i < 8; i++)
  130.         {
  131.                 tmp <<= 1;
  132.                 tmp        |= SDA;
  133.                 SCL = 1;
  134.                 delay();
  135.                 SCL = 0;
  136.         }
  137.         return tmp;
  138. }

  139. /**
  140. *    @name                : void IIC_W_AT24C1024B(uc datas, short int ADDR)
  141. *    @description  :写一个字节的全过程
  142. *    @param        :uc datas  写的数   short int ADDR  写到的地址
  143. *    @notice              : None
  144. */
  145. void IIC_W_AT24C1024B(char datas, short int ADDR)
  146. {
  147.         IIC_start();
  148.         do
  149.                 IIC_send(CTL_W);
  150.         while(IIC_CACK());//等待应答
  151.         do
  152.                 IIC_send((char)(ADDR >> 4));//1字节高位地址
  153.         while(IIC_CACK());//等待应答
  154.         do
  155.                 IIC_send((char)ADDR);//1字节低位地址
  156.         while(IIC_CACK());//等待应答
  157.         IIC_send(datas);//发送一个字节
  158.         while(IIC_CACK());//等待应答
  159.         IIC_stop();
  160. }

  161. /**
  162. *    @name        : uc IIC_R_AT24C1024B(short int ADDR)
  163. *    @description :读一个字节的全过程
  164. *    @param         short int ADDR  读的地址
  165. *    @notice      : None
  166. */
  167. uc IIC_R_AT24C1024B(short int ADDR)
  168. {
  169.         char datas;
  170.         IIC_start();
  171.         do
  172.                 IIC_send(CTL_W);
  173.         while(IIC_CACK());//等待应答
  174.         do
  175.                 IIC_send((char)(ADDR >> 4));//1字节高位地址
  176.         while(IIC_CACK());//等待应答
  177.         do
  178.                 IIC_send((char)ADDR);//1字节低位地址
  179.         while(IIC_CACK());//等待应答
  180.         IIC_start();
  181.         do
  182.                 IIC_send(CTL_R);
  183.         while(IIC_CACK());//等待应答
  184.         datas = IIC_rec();//接收一个字节
  185.         IIC_ACK();//发送应答
  186.         IIC_stop();
  187.         return datas;
  188. }

  189. /**
  190. *    @name        : void checkbusy()
  191. *    @description : 检测EEPROM是否在工作
  192. *    @param         short int ADDR  读的地址
  193. *    @notice      : None
  194. */
  195. void checkbusy()
  196. {
  197.         while(BUSY);
  198. }

  199. int main(void)//单片机1
  200. {
  201.         char datas;
  202.         BUSY = 0;
  203.         whitch = 1;
  204.         P1 = 0x0f;
  205.         whitch = 0;
  206.         while(1)
  207.         {
  208.                 Delay(50);Delay(50);Delay(50);
  209.                 checkbusy();
  210.                 BUSY = 1;
  211.                 Delay(50);
  212.                 datas = IIC_R_AT24C1024B(0x0020);
  213.                 BUSY = 0;
  214.                 what = 1;
  215.                 P1 = num[(int)datas];
  216.                 what = 0;
  217.         }
  218. }
  219. ////////单片机2(其他函数在单片机1里面有)
  220. /**
  221. *  @name        : void key();
  222. *  @description : 键盘检测
  223. *  @return      : 代表键盘按键的变量
  224. */
  225. char key()
  226. {
  227.         char x,k = 0;
  228.         P3 = 0xff;
  229.         x = P3;
  230.         if(x != 0xff)           //没按键跳出
  231.         {
  232.                 Delay(10);           //有按键,延时
  233.                 P3 = 0xff;
  234.                 x = P3;
  235.                 if(x != 0xff)                //再测
  236.                 {
  237.                         switch(x)           //获取键值
  238.                         {
  239.                                 case 0xfe:
  240.                                         k = 1;
  241.                                         break;
  242.                                 case 0xfd:
  243.                                         k = 2;
  244.                                         break;
  245.                                 case 0xfb:
  246.                                         k = 3;
  247.                                         break;
  248.                                 case 0xf7:
  249.                                         k = 4;
  250.                                         break;
  251.                                 case 0xef:
  252.                                         k = 5;
  253.                                         break;
  254.                                 case 0xdf:
  255.                                         k = 6;
  256.                                         break;
  257.                                 case 0xbf:
  258.                                         k = 7;
  259.                                         break;
  260.                                 case 0x7f:
  261.                                         k = 8;
  262.                                         break;
  263.                                 default:
  264.                                         break;
  265.                         }
  266.                 }
  267.         }
  268.         return k;
  269. }

  270. /**
  271. *    @name        : void checkbusy()
  272. *    @description : 检测EEPROM是否在工作
  273. *    @param         short int ADDR  读的地址
  274. *    @notice      : None
  275. */
  276. void checkbusy()
  277. {
  278.         while(BUSY);
  279. }

  280. int main(void)
  281. {
  282.         char datas;
  283.         Delay(30);
  284.         while(1)
  285.         {
  286.                 datas = key();
  287.                 checkbusy();
  288.                 BUSY = 1;
  289.                 Delay(30);
  290.                 IIC_W_AT24C1024B(0x05, 0x0020);
  291.                 BUSY = 0;while(1);
  292.         }
  293. }
复制代码

那里,但是单片机2写不了数据到它里面,单片机1倒是可以正常读写,这是为什么呢?

捕获1.JPG (171.84 KB, 下载次数: 64)

捕获1.JPG

出错的.zip

28.06 KB, 下载次数: 5

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

使用道具 举报

沙发
ID:693990 发表于 2020-6-7 08:32 | 只看该作者
WWP不应该接VCC吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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