找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11256|回复: 17
收起左侧

注释非常详细的51单片机IIC源程序

  [复制链接]
ID:369907 发表于 2018-9-21 17:55 | 显示全部楼层 |阅读模式
自己写的IIC程序,因为初学,还是有借鉴的地方,但是所有程序均为手打,每一行都有详细的注释

0.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <iic.h>

  3. sbit IIC_SDA=P2^6;        //声明IIC总线的数据线接在单片机的P2.6端口。
  4. sbit IIC_SCL=P2^7;        //声明IIC总线的时钟线接在单片机的P2.5端口。


  5. //void delay(unsigned int t)
  6. //{//延时函数
  7. //    while(t){t--;};                    //延时循环计数
  8. //}
  9. //-------------------------------------------------------------------
  10. void delay_IIC(void)   
  11. {//IIC总线限速延时函数。
  12. //该函数是空函数,延时4个机器周期。
  13.         ;
  14.         ;
  15. }
  16. //-------------------------------------------------------------------
  17. void IIC_Init(void)
  18. {//IIC总线初始化函数
  19.     IIC_SDA=1;//释放IIC总线的数据线。
  20.     IIC_SCL=1;//释放IIC总线的时钟线。
  21. }
  22. //-------------------------------------------------------------------
  23. void IIC_start(void)
  24. {//IIC总线产生起始信号函数  
  25.    IIC_SDA=1;//拉高数据线
  26.          IIC_SCL=1;//拉高时钟线
  27.          delay_IIC();
  28.          IIC_SDA=0;//在时钟线为高电平时,拉低数据线,产生起始信号。
  29.          delay_IIC();
  30.    IIC_SCL=0;//拉低时钟线
  31. }
  32. //-------------------------------------------------------------------
  33. void IIC_stop(void)
  34. {//IIC总线产生停止信号函数
  35.     IIC_SDA=0;//拉低数据线
  36.     delay_IIC();
  37.     IIC_SCL=1;//拉高时钟线。
  38.     delay_IIC();
  39.     IIC_SDA=1;//时钟时线为高电平时,拉高数据线,产生停止信号。
  40.     delay_IIC();
  41. }
  42. //-------------------------------------------------------------------
  43. bit IIC_Tack(void)
  44. {//接收应答信号函数
  45.     bit ack;//定义一个位变量,来暂存应答状态。
  46.     IIC_SDA=1;//释放数据总线,准备接收应答信号。
  47.     delay_IIC();
  48.     IIC_SCL=1;//拉高时钟线。
  49.     delay_IIC();
  50.     ack=IIC_SDA;//读取应答信号的状态。
  51.     delay_IIC();
  52.     IIC_SCL=0;//拉低时钟线。
  53.     delay_IIC();
  54.     return ack;//返回应答信号的状态,0表示应答,1表示非应答。
  55. }
  56. //-------------------------------------------------------------------
  57. void IIC_write_byte(unsigned char Data)
  58. {//向IIC总线写入一个字节的数据函数
  59.         unsigned char i;
  60.          for(i=0;i<8;i++)//有8位数据
  61.         {
  62.                         IIC_SDA=Data&0x80;//写最高位的数据
  63.                         delay_IIC();
  64.                         IIC_SCL=1; //拉高时钟线,将数写入到设备中。
  65.                         delay_IIC();
  66.                         IIC_SCL=0;//拉低时钟线,允许改变数据线的状态
  67.                         delay_IIC();
  68.                         Data=Data<<1;//数据左移一位,把次高位放在最高位,为写入次高位做准备
  69.         }
  70. }
  71. //-------------------------------------------------------------------
  72. unsigned char IIC_read_byte()
  73. {//从IIC总线读取一个字节的数据函数
  74.     unsigned char i;
  75.     unsigned char Data;       //定义一个缓冲寄存器。
  76.     for(i=0;i<8;i++)//有8位数据
  77.     {
  78.         IIC_SCL=1;//拉高时钟线,为读取下一位数据做准备。
  79.         delay_IIC();
  80.         Data=Data<<1;//将缓冲字节的数据左移一位,准备读取数据。
  81.         delay_IIC();
  82.         
  83.         if(IIC_SDA)//如果数据线为高平电平。
  84.             Data=Data|0x1;//则给缓冲字节的最低位写1。
  85.         IIC_SCL=0;//拉低时钟线,为读取下一位数据做准备。
  86.         delay_IIC();
  87.     }
  88.     return Data;//返回读取的一个字节数据。
  89. }
  90. void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data)
  91. {//向任意地址写入一个字节数据函数
  92.     IIC_start();//产生起始信号
  93.     IIC_write_byte(Daddr);//写入设备地址(写)
  94.     IIC_Tack();//等待设备的应答
  95.     IIC_write_byte(Waddr);//写入要操作的单元地址。
  96.     IIC_Tack();//等待设备的应答。
  97.     IIC_write_byte(Data);//写入数据。
  98.     IIC_Tack();//等待设备的应答。
  99.     IIC_stop();//产生停止符号。
  100. }
  101. //-------------------------------------------------------------------
  102. unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Waddr)
  103. {//从任意地址读取一个字节数据函数
  104.     unsigned char Data;//定义一个缓冲寄存器。

  105.     IIC_start();//产生起始信号
  106.     IIC_write_byte(Daddr);//写入设备地址(写)
  107.     IIC_Tack();//等待设备的应答
  108.     IIC_write_byte(Waddr);//写入要操作的单元地址。
  109.     IIC_Tack();//等待设备的应答。
  110.    
  111.     IIC_start();//产生起始信号
  112.     IIC_write_byte(Daddr+1);//写入设备地址(读)。
  113.     IIC_Tack();//等待设备的应答。
  114.     Data=IIC_read_byte();//写入数据。
  115.     IIC_stop();//产生停止符号。
  116.     //-------------------返回读取的数据--------------------
  117.     return Data;//返回读取的一个字节数据。
  118. }
复制代码

所有资料51hei提供下载:
IIC.rar (1.48 KB, 下载次数: 317)

评分

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

查看全部评分

回复

使用道具 举报

ID:242300 发表于 2018-10-5 23:56 | 显示全部楼层
收藏学习一下
回复

使用道具 举报

ID:162431 发表于 2018-10-28 21:30 | 显示全部楼层
请问楼主这个测试过可以用的吗
回复

使用道具 举报

ID:417004 发表于 2018-10-29 02:20 来自手机 | 显示全部楼层
楼主辛苦了,收藏了
回复

使用道具 举报

ID:469847 发表于 2019-1-17 19:58 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:369907 发表于 2019-3-19 10:29 | 显示全部楼层
Rhysking 发表于 2018-10-28 21:30
请问楼主这个测试过可以用的吗

可以,我用的就是这个
回复

使用道具 举报

ID:612010 发表于 2019-9-17 10:09 | 显示全部楼层
收藏学习一下
回复

使用道具 举报

ID:682679 发表于 2020-2-21 10:51 | 显示全部楼层
这个对新手很友好
回复

使用道具 举报

ID:607312 发表于 2020-2-24 08:51 | 显示全部楼层
感谢分享,学习了
回复

使用道具 举报

ID:733307 发表于 2020-4-20 10:20 | 显示全部楼层
非常感谢楼主分享这个。
回复

使用道具 举报

ID:733307 发表于 2020-4-21 10:38 | 显示全部楼层
感谢分享
谢谢楼主
回复

使用道具 举报

ID:752705 发表于 2020-5-18 07:12 | 显示全部楼层
亲测好用,就用它
回复

使用道具 举报

ID:52653 发表于 2020-5-27 10:16 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:94642 发表于 2020-6-16 08:43 | 显示全部楼层
楼主怎么返回一个32位的一个数据,我这个IIC的数据类型是32位的,现在数据是8位的uchar型的
回复

使用道具 举报

ID:307544 发表于 2020-6-16 10:17 | 显示全部楼层
程序注释清晰,感谢大侠分享!
回复

使用道具 举报

ID:817725 发表于 2021-4-2 13:15 | 显示全部楼层
为什么写入设备地址要+1
回复

使用道具 举报

ID:336232 发表于 2022-4-15 09:10 | 显示全部楼层
lgl12345 发表于 2021-4-2 13:15
为什么写入设备地址要+1

读写位
回复

使用道具 举报

ID:1069725 发表于 2023-4-3 19:09 | 显示全部楼层
收藏学习一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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