找回密码
 立即注册

QQ登录

只需一步,快速开始

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

想请教大神 这个程序是什么意思

[复制链接]
跳转到指定楼层
楼主
ID:188684 发表于 2017-6-8 19:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想请教大神 这个程序是什么意思
新建 Microsoft Office Word 2007 文档.docx (14.02 KB, 下载次数: 4)
  1. #include <reg51.h>

  2. typedef unsigned char uchar;
  3. typedef unsigned int uint;

  4. #define write_c02 0xa0
  5. #define read_c02 0xa1

  6. sbit sda = P2^0;
  7. sbit scl = P2^1;

  8. void delay()
  9. {
  10. //delay:5us
  11. ;;
  12. }


  13. //i2c:init
  14. void i2c_init()
  15. {
  16. sda = 1;
  17. delay();
  18. scl = 1;
  19. delay();
  20. }


  21. //delayms:
  22. void delayms(uint xms)
  23. {
  24. uchar x, y;
  25. for(x = xms; x > 0; x--)
  26.    for(y = 110; y > 0; y--);
  27. }

  28. //start:
  29. void start() //启动i2c
  30. {
  31. sda = 1;
  32. scl = 1;
  33. delay();//延时必须大于4.7us,此约为五微秒
  34. sda = 0; //在scl为高电平时,sda一个下降沿为启动信号
  35. delay();
  36. }

  37. //stop:
  38. void stop() //停止i2c
  39. {
  40. sda = 0;
  41. scl = 1;
  42. delay();
  43. sda = 1; //在scl为高电平时,sdasda一个上升沿为停止信号
  44. delay();
  45. }

  46. //ack:
  47. void ack() //应答信号0
  48. {
  49. uchar i = 0; //等待变量
  50. scl = 1;//在scl为高电平期间等待应答
  51. delay();
  52. while((sda == 1) && i < 250)//若为应答0即退出,从机向主机发送应答信号
  53. i++;//等待一段时间
  54. scl = 0; //应答之后将scl拉低
  55. delay();
  56. }

  57. //nack:
  58. void nack() //非应答
  59. {
  60. scl = 1;//在scl为高电平期间,由主机向从机发送一个1,非应答信号
  61. delay();
  62. sda = 1;
  63. scl = 0; //应答之后将scl拉低
  64. delay();
  65. }

  66. //send byte:
  67. void send_byte(uchar date)//写一个字节
  68. {
  69. uchar i, temp;
  70. temp = date; //存入要写入的数据,即要发送到sda上的数据
  71. for(i = 0; i < 8; i++)
  72. { //发送8位
  73.   temp <<= 1; //to CY 将数据的最高位移入到PSW中的CY位中
  74.   scl = 0;//只有在scl为低电平时,才允许sda上的数据变化
  75.   delay();
  76.   sda = CY; //将CY里的数据发送到sda数据线上
  77.   delay(); //可以延时
  78.   scl = 1; //在scl为高电平时,不允许sda上的数据变化,使数据稳定
  79.   delay();
  80.   scl = 0;//允许sda数据线的数据变化,等待下一个数据的传输
  81.   delay();
  82. }
  83. //wait ack:发送完一个字节数据后要主机要等待从机的应答,第九位
  84. scl = 0;//允许sda变化
  85. delay();
  86. sda = 1;//wait:ack,sda拉高等待应答,当sda=0时,表示从机的应答
  87. delay();
  88. }

  89. //read: byte
  90. uchar read_byte() //读一个字节数据
  91. {
  92. uchar i, j, k;
  93. scl = 0; //读之前先允许sda变化
  94. delay(); //等待数据
  95. for(i = 0; i < 8; i++)
  96. {
  97.   scl = 1; //不允许sda变化
  98.   delay(); //使sda数据稳定后开始读数据
  99.   j = sda; //读出sda上的数据
  100.   k = (k << 1)| j; //将数据通过|运算存入k中
  101.   scl = 0;//允许sda变化等待下一位数据的到来
  102.   delay();
  103. }
  104. //delay();//可不用延时
  105. return k;//返回读出的数据
  106. }

  107. //write:at24c02  在at24c02中的指定地址写入数据
  108. void write_at24c02(uchar address, uchar date)
  109. {
  110. start(); //启动i2c
  111. send_byte(write_c02);//写入期间地址和写操作
  112. ack(); //从机应答0
  113. send_byte(address); //写入写数据的单元地址
  114. ack(); //ack0
  115. send_byte(date); //在指定地址中写入数据
  116. ack(); //从机应答0
  117. stop();    //停止i2c
  118. }

  119. //read: at24c02   在at24c02的指定地址中读出写入的数据
  120. uchar read_at24c02(address)
  121. {
  122. uchar dat;//用来存储读出的数据
  123. start(); //启动i2c
  124. send_byte(write_c02); //写入at24c02器件地址和写操作
  125. ack(); //从机应答0
  126. send_byte(address); //写入要读取AT24C02的数据的单元地址
  127. ack(); //从机应答0
  128. start();  //再次启动i2c
  129. send_byte(read_c02); //写入AT24C02器件地址和读操作
  130. ack();//从机应答‘0’
  131. dat = read_byte();//读出指定地址中的数据
  132. nack(); //主机发出非应答‘1’
  133. stop();  //停止i2c
  134. return dat;    //返回读出的数据
  135. }

  136. //main:
  137. void main()
  138. {
  139. uchar i;
  140. i2c_init();
  141. start();
  142. while(1)
  143. {
  144.   for(i = 0x00; i < 0xff; i++)
  145.   {
  146.    write_at24c02(10, i);
  147.    delayms(10);//需等待十毫秒
  148.    P1 = read_at24c02(10);//1010 1010
  149.    delayms(2000);
  150.   }
  151. }
  152. }
复制代码


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

使用道具 举报

沙发
ID:206560 发表于 2017-6-9 04:07 | 只看该作者
软件模拟I2C通信,与AT24C02连接,读写数据。
回复

使用道具 举报

板凳
ID:164602 发表于 2017-6-9 08:20 | 只看该作者
这个程序,就是对24C02进行读写,并显示读出的内容。
前面的子函数,都是IIC(读用I方C,即I平方的意思)通讯的,如:初始化IIC,IIC开始、停止,应答,读写等。
主函数内容:
(1)先初始化IIC
(2)然后循环进行对24C02位地址10的写和读,读出的值在P1口显示(可能是数码管)。
程序每次只写读一位(不要被i变量从0x00到0xff骗了),因为24C02是位存贮的。
回复

使用道具 举报

地板
ID:7485 发表于 2017-6-9 10:04 | 只看该作者
你不知道是什么程序,怎么会用到它呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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