本驱动能产生20-40KHz左右的IIC时钟。(11.0592MHz晶振)

若不加延时,可能出现问题。

接收部分未进行测试,发送已经测试完毕。

my_iic.h

#include "regx52.h"#define uint16_t  unsigned short int
#define uint8_t unsigned charsbit SCL=P1^4;
sbit SDA=P1^5;#define SCL_0 (SCL=0)
#define SCL_1 (SCL=1)#define SDA_0 (SDA=0)
#define SDA_1 (SDA=1)//void myiic_init();void IIC_Master_Transmit_Mem_1Byte(uint8_t Slave_Address,uint8_t MemAddress,uint8_t Data);
void IIC_Master_Transmit_1Byte(uint8_t Slave_Address,uint8_t Data);
void IIC_Master_Transmit(uint8_t Slave_Address,uint8_t MemAddress,uint8_t *Data,uint8_t length);uint8_t IIC_Master_Receive_1Byte(uint8_t Slave_Address);
void IIC_Master_Receive(uint8_t Slave_Address,uint8_t MemAddress,uint8_t *Data,uint8_t length);
uint8_t IIC_Master_Receive_Mem_1Byte(uint8_t Slave_Address,uint8_t MemAddress);

my_iic.c

#include "regx52.h"
#include "my_iic.h"static void IIC_Delay()
{int i=0;for (;i<1;i++);
}static void IIC_Start()
{SCL_1;SDA_1;//IIC_Delay();SDA_0;
}static void IIC_Sr()
{SCL_0;SDA_1;IIC_Delay();SCL_1;IIC_Delay();SDA_0;
}static void IIC_Stop()
{SCL_0;SDA_0;SCL_1;SDA_0;SDA_1;
}static void IIC_Send(uint8_t Data)
{int i=0;for (i;i<8;i++){SCL_0;IIC_Delay();if (Data&0x80)SDA_1;elseSDA_0;SCL_1;Data=Data<<1;}
}static uint8_t IIC_Receive(void)
{int i,Receive_Data=0;for(i=0;i<8;i++){SCL_0;IIC_Delay();SCL_1;if (SDA==1)Receive_Data|=1;else Receive_Data|=0;Receive_Data<<1;}return Receive_Data;
}static void IIC_Wait_Ack(void)
{#ifdef IIC_DEBUGSCL_0;IIC_Delay();SDA_0;SCL_1;IIC_Delay();#elseuint8_t i=0;SCL_0;IIC_Delay();SCL_1;while (SDA!=0){i++;if (i==255){break;}}#endif
}static void IIC_Ack(uint8_t Status)
{SCL_0;if (Status!=0)SDA_0;elseSDA_1;SCL_1;IIC_Delay();SCL_0;}void IIC_Master_Transmit_Mem_1Byte(uint8_t Slave_Address,uint8_t MemAddress,uint8_t Data)
{IIC_Start();IIC_Send(Slave_Address);IIC_Wait_Ack();IIC_Send(MemAddress);IIC_Wait_Ack();IIC_Send(Data);IIC_Wait_Ack();IIC_Stop();
}
void IIC_Master_Transmit_1Byte(uint8_t Slave_Address,uint8_t Data)
{IIC_Start();IIC_Send(Slave_Address);IIC_Wait_Ack();IIC_Send(Data);IIC_Wait_Ack();IIC_Stop();}void IIC_Master_Transmit(uint8_t Slave_Address,uint8_t MemAddress,uint8_t *Data,uint8_t length)
{IIC_Start();IIC_Send(Slave_Address);IIC_Wait_Ack();IIC_Send(MemAddress);IIC_Wait_Ack();while(length--){IIC_Send(*Data++);IIC_Wait_Ack();}IIC_Stop();}uint8_t IIC_Master_Receive_1Byte(uint8_t Slave_Address_r)
{uint8_t Data_Temp=0;IIC_Start();IIC_Send(Slave_Address_r|0x01);IIC_Wait_Ack();Data_Temp=IIC_Receive();IIC_Ack(0);IIC_Stop();return Data_Temp;
}void IIC_Master_Receive(uint8_t Slave_Address,uint8_t MemAddress,uint8_t *Data,uint8_t length)
{IIC_Start();IIC_Send(Slave_Address);IIC_Wait_Ack();IIC_Send(MemAddress);IIC_Wait_Ack();IIC_Sr();IIC_Send(Slave_Address|0x01);IIC_Wait_Ack();while (length--){*Data++=IIC_Receive();if (length!=0)IIC_Ack(1);else IIC_Ack(0);}IIC_Stop();
}uint8_t IIC_Master_Receive_Mem_1Byte(uint8_t Slave_Address,uint8_t MemAddress)
{uint8_t Data_Temp=0;IIC_Start();IIC_Send(Slave_Address);IIC_Wait_Ack();IIC_Send(MemAddress);IIC_Wait_Ack();IIC_Sr();IIC_Send(Slave_Address|0x01);IIC_Wait_Ack();Data_Temp=IIC_Receive();IIC_Ack(0);IIC_Stop();return Data_Temp;
}

STC89C52RC软件IIC驱动相关推荐

  1. 15. STM32——软件IIC驱动OLED屏幕显示字符、字符串、数字、汉字

    STM32--软件IIC驱动OLED屏幕显示 OLED屏幕 写命令 写内容 对OLED写入一个字节 设置光标 启动OLED 关闭OLED 全屏填充(清屏) 显示字符 显示字符串 获取次方 显示数字 显 ...

  2. STM32 驱动 GY-302 光照传感器 BH1750 模块(软件IIC与硬件IIC驱动)

    1.特别说明 ​ 要是不想看原理和过程,直接下拉找代码吧,都是测试过的,很稳定,有硬件I2C驱动的,也有软件模拟I2C驱动的,基于STM32F103系列和STM32F4系列实现,基于标准库实现,条理清 ...

  3. 【FOC控制】英飞凌TC264无刷驱动方案simplefoc移植(5)-磁编码器移植AS5600 软件IIC

    [FOC控制]英飞凌TC264无刷驱动方案simplefoc移植(5)-磁编码器移植 [FOC控制]英飞凌TC264无刷驱动方案simplefoc移植(5)-磁编码器移植 一.编码器选择 二.通讯方式 ...

  4. IIC驱动0.96寸OLED屏幕显示(51单片机)

    这篇文章得用到IIC驱动,大家如果不会IIC通信,可以看这篇文章,也是我写的,是有关IIC通信的,有什么不理解的可以在看一下:https://blog.csdn.net/m0_58832575/art ...

  5. stm32的IIC驱动0.96OLED

    IIC原理介绍: IIC是一个总线的结构但不支持总线协议 OLED介绍: 一.0.96寸OLED屏幕介绍 本文采用的是4针的0.96寸OLED显示进行讲解,采用的是SPI协议,速度会比采用I2C协议的 ...

  6. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析 (iic驱动框架,i2c驱动框架)...

    转载于 : http://blog.csdn.net/zqixiao_09/article/details/50917655 关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸 ...

  7. 1.3寸OLED IIC驱动右方出现两列像素白边的解决方法

    问题 因为1.3寸OLED IIC驱动资源网上少很多,买来时以为和0.96寸OLED的驱动一样,没在意,但使用0.96寸的程序调试中,却出现右方一直有两列白边. 思考 在排除其他接线.取模显示等因素后 ...

  8. IIC 驱动OLED

    IIC总线可以驱动很多器件,比较常见的有OLED.EEPROM存储器(AT24C02).温度传感器(LM75A).温湿度传感器(DHT11)等.有关IIC总线协议的基本原理可以看我之前的文章介绍.这一 ...

  9. 12. STM32——硬件IIC驱动OLED屏幕显示

    STM32--硬件IIC驱动OLED屏幕显示 OLED屏幕 OLED屏幕特点 OLED屏幕接线说明 OLED屏幕显存 OLED屏幕原理 OLED屏幕常用指令 OLED屏幕字模软件的使用 写命令 写数据 ...

最新文章

  1. .net平台性能很不错的轻型ORM类Dapper(转)
  2. MavenAnt使用
  3. oracle数据导入-dblink方式
  4. 关于函数返回值的讨论与总结
  5. iOS持久化存储-CoreData简介
  6. python locust_python locust--性能测试框架从零开始(三)
  7. Ext的组件模型印象
  8. 【SQL】INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND
  9. web文件上传(二)--使用form还是ajax
  10. 【渝粤题库】陕西师范大学292231 财务管理Ⅱ 作业(专升本)
  11. mysql5.6.38 设置密码_Percona Server MySQL 5.6.38修改root密码(忘记root密码)
  12. 前端开发必备,【项目实战】
  13. 为什么计算机里没有桌面显示不出来,电脑开机不显示桌面怎么办解决教程
  14. 一文理清Apache Spark内存管理脉络
  15. 什么音频剪辑软件好用?
  16. PYTHON实现迅雷、FLASHGET、QQ旋风转真实链接、磁链转种子文件、迅雷快传链接抓取
  17. 程序员辞职回老家山洞写代码,二年敲了 45 万行!
  18. java中strictfp么意思_java中的strictfp的作用
  19. 如何用python简单做一个植物大战僵尸 源码
  20. 谈谈区块链入门技能(二):以太坊区块链浏览器如何使用?

热门文章

  1. Python的皮肤的使用
  2. [转]element-ui输入框(el-input)前缀图标和后缀图标(转载请删除括号里的内容)
  3. 【转载】清华毕业致辞:从容行走于无人知晓的荒原,欣赏并创造别样的风景...
  4. 手机玩exe游戏的模拟器_如何在手机上玩全面战争模拟器等电脑付费游戏?
  5. 临近空间环境监测系统
  6. seo网站优化,网站SEO优化方案
  7. 阿里技术leader:哪有什么天生的领导力,不过是后期不断磨练罢了
  8. 中国制造2025-智能制造是强国必由之路
  9. 第二届全国智能制造(中国制造2025)创新创业大赛华南人工智能专项赛决赛圆满举办
  10. 重复数据删除行之有效