找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机IIC时序及对IIC器件使用时的一些理解和源程序

[复制链接]
跳转到指定楼层
楼主
IIC时序在多种通讯方式中是明显比较复杂,他不仅在时间上有严格的要求,而且还具有多种模式。
新手往往对SCK,SDA还有读写应答时序很难理解,而且对主从机与接收发送机的关系很头疼。
这次整理了一些常用程序和个人理解,以及IIC协议讲解,希望对大家有帮助。

一、IIC通讯协议其实对大部分iic器件是通用的,但是它有不同的工作模式,比如说在单片机中,我们就学习了标准模式(PCF8591 A/D转换芯片),快速模式(24C02存储芯片),其实还有HS模式等等,目前我感觉得区别就是时间上的区别。


二、对于应答信号来说,虽然主机和从机的身份是固定的,但是接收方和发送方的身份是可以变化的,而且应答信号的产生是接收方发出的,所以比如说读的时候,主机是接收方,从机是发送方,主机在读完数据后,需要根据情况发出(非)应答信号;写的时候则是相反的,需要从机作出应答。


三、接收从机应答的时序和读时序其实很相似,都需要自从机接收数据。


SDA_IN与起始、终止及写时序有关
SDA_OUT与应答、读时序有关

单片机源程序如下:
  1. /**********************BST-V51实验开发板例程************************
  2. *  平台:BST-V51 + Keil U3 + STC89C52
  3. *  名称:为IIC总线的基本驱动程序(此程序没有写主函数,只是一些IIC必备的子函数)
  4. *  晶振:11.0592MHZ
  5. *  说明:免费开源,不提供源代码分析.
  6. ******************************************************************/

  7. #include<reg51.h>
  8. #include <intrins.h>
  9. #define uint unsigned int
  10. #define uchar unsigned char
  11. sbit sda=P2^0;                          //IO口定义
  12. sbit scl=P2^1;

  13. void nop()
  14. {
  15.         _nop_();
  16.         _nop_();
  17. }
  18. /////////24C02读写驱动程序////////////////////
  19. void delay1(unsigned int m)
  20. {        unsigned int n;
  21.           for(n=0;n<m;n++);
  22. }

  23. void init()  //24c02初始化子程序
  24. {
  25.         scl=1;
  26.         nop();
  27.         sda=1;
  28.         nop();
  29. }

  30. void start()        //启动I2C总线
  31. {
  32.         sda=1;
  33.         nop();
  34.         scl=1;
  35.         nop();
  36.         sda=0;
  37.         nop();
  38.         scl=0;
  39.         nop();
  40. }

  41. void stop()         //停止I2C总线
  42. {
  43.         sda=0;
  44.         nop();
  45.         scl=1;
  46.         nop();
  47.         sda=1;
  48.         nop();
  49. }

  50. void writebyte(unsigned char j)  //写一个字节
  51. {
  52.         unsigned char i,temp;
  53.            temp=j;
  54.            for (i=0;i<8;i++)
  55.    {
  56.            temp=temp<<1;
  57.            scl=0;
  58.            nop();
  59.            sda=CY;                //temp左移时,移出的值放入了CY中
  60.            nop();
  61.            scl=1;                //待sda线上的数据稳定后,将scl拉高
  62.            nop();
  63.    }
  64.    scl=0;
  65.    nop();
  66.    sda=1;
  67.    nop();
  68. }

  69. unsigned char readbyte()   //读一个字节
  70. {
  71.    unsigned char i,j,k=0;
  72.    scl=0; nop(); sda=1;
  73.    for (i=0;i<8;i++)
  74.    {  
  75.                 nop(); scl=1; nop();
  76.               if(sda==1)
  77.                 j=1;
  78.               else
  79.                 j=0;
  80.               k=(k<<1)|j;
  81.                   scl=0;
  82.         }
  83.            nop();
  84.         return(k);
  85. }

  86. void clock()         //I2C总线时钟
  87. {
  88.    unsigned char i=0;
  89.    scl=1;
  90.    nop();
  91.    while((sda==1)&&(i<255))
  92.              i++;
  93.    scl=0;
  94.    nop();
  95. }
复制代码

所有资料51hei提供下载:
iic时序及讲解.rar (1.4 MB, 下载次数: 43)
51单片机IIC常用函数.rar (1.04 KB, 下载次数: 35)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:612010 发表于 2019-9-17 10:14 | 只看该作者
收藏学习一下
回复

使用道具 举报

板凳
ID:358100 发表于 2020-4-16 09:20 | 只看该作者
收藏学习学学。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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