1. #include<reg52.h>

  2. #define uchar unsignedchar

  3. sbit sda=P2^0;

  4. sbit scl=P2^1;

  5. uchar a;

  6. void delay()

  7. {;;}

  8. void start()

  9. {

  10. sda=1;

  11. delay();

  12. scl=1;

  13. delay();

  14. sda=0;

  15. delay();

  16. }

  17. void stop()

  18. {

  19. sda=0;

  20. delay();

  21. scl=1;

  22. delay();

  23. sda=1;

  24. delay();

  25. }

  26. void respons()

  27. {

  28. uchar i;

  29. scl=1;

  30. delay();

  31. while((sda==1)&&(i<250))i++;

  32. scl=0;

  33. delay();

  34. }

  35. void init()

  36. {

  37. sda=1;

  38. delay();

  39. scl=1;

  40. delay();

  41. }

  42. void write_byte(uchar date)

  43. {

  44. uchar i,temp;

  45. temp=date;

  46. for(i=0;i<8;i++)

  47. {

  48. temp=temp<<1;

  49. scl=0;

  50. delay();

  51. sda=CY;

  52. delay();

  53. scl=1;

  54. delay();

  55. }

  56. scl=0;

  57. delay();

  58. sda=1;

  59. delay();

  60. }

  61. uchar read_byte()

  62. {

  63. uchar i,k;

  64. scl=0;

  65. delay();

  66. sda=1;

  67. delay();

  68. for(i=0;i<8;i++)/*4,数据位的传输是边沿触发,因此每次确定一位sda的电平的时候就来一个高定平

  69. 然后再下降,利用这个边沿就把数据发送出去了。循环8次即把一个字节都传完了*/

  70. {

  71. scl=1;

  72. delay();

  73. k=(k<<1)|sda;

  74. scl=0;

  75. delay();

  76. }

  77. return k;

  78. }

  79. void delay1(uchar x)

  80. {

  81. uchar a,b;

  82. for(a=x;a>0;a--)

  83. for(b=100;b>0;b--);

  84. }

  85. void write_add(uchar address,uchar date)

  86. {

  87. start();

  88. write_byte(0xa0);

  89. respons();

  90. write_byte(address);//发送从机地址

  91. respons();

  92. write_byte(date);//写入数据

  93. respons();

  94. stop();//结束

  95. }

  96. uchar read_add(uchar address)

  97. {

  98. uchar date;

  99. start();

  100. write_byte(0xa0);

  101. respons();

  102. write_byte(address);

  103. respons();

  104. start();//另外一个方向开始

  105. write_byte(0xa1);//数据的传输方向有所改变

  106. respons();

  107. date=read_byte();//将读的数据返回

  108. stop();

  109. return date;

  110. }

  111. void main()

  112. {

  113. init();

  114. write_add(23,0x55);

  115. delay1(100);

  116. P1=read_add(23);

  117. while(1);

  118. }

  119. /*学完i2c小结下吧。

  120. I2c主要就是包括三大块函数

  121. 信号函数; 检测或者是反馈

  122. 接受函数;其包括读的函数

  123. 发送函数;其包括写的函数;

  124. 1,一条为时钟控制线;一条位数据线;

  125. 2,然而数据有低有高,有两个方向,从而导致我们在写程序的时候很麻烦,

  126. 如果,不看时序图,容易乱。

  127. 3,始终记得 数据是在scl为低时才可以发生改变;

  128. sda有时候表示状态,有时候表示的数传输的数据,一定要时刻记住。

  129. */

1.《(i2c如何避开while)i2c如何设定地址?》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《(i2c如何避开while)i2c如何设定地址?》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/3299357.html