单片机作为主机

sbit SDA = P1^0;
sbit SCL = P1^1;

IIC数据操作:在iic总线上,数据伴随时钟脉冲,一位一位的传送的,数据位由高到低传送,每位数据占一个时钟脉冲。在时钟线(SCL)为高电平期间,数据线(SDA)的状态就表示要传送的数据;高电平为数据1,低电平为数据0;在数据传递时,SDA上数据的改变要在时钟先为低电平时完成,而时钟线(SCL)为高电平时,数据线(SDA)必须保持稳定;否则数据线(SDA)上的变化会被当作开始或结束信号终止数据传输。

总线空闲状态:数据线(SDA)和时钟线(SCL)都是高电平

IIC通信时序图:

1. 起始信号:

时钟线(SCL)高电平,数据线(SDA)从高电平跳变到低电平, 这是一个电平跳变的过程

/***********************************
函数功能:IO模拟IIC起始信号
备注: 起始信号后时钟线和数据线全为低电平
SDA和SCL为单片机IO
************************************/
void iic_Start()
{SDA = 1;delay_us(10);SCL = 1;delay_us(10); //先保持数据线和时钟线高电平一段时间SDA = 0;// 数据线向低电平跳变delay_us(10);SCL = 0;//拉低时钟线delay_us(10);
}

2. 停止信号:

时钟线(SCL)在高电平期间,数据线(SDA)由低电平向高电平跳变 (数据线与开始信号相反)

/**************************************
函数功能:IIC停止信号
**************************************/
void iic_Stop()
{SDA = 0;delay_us(10);SCL = 1;delay_us(10);SDA = 1;delay_us(10);
}

3. 在时钟线(SCL)跳变读取期间, 要保持数据线(SDA)的稳定,只有在时钟线(SCL)为高电平时才读取数据

主机发送一个字节到 IIC 总线,

/**********************************************
函数功能:通过IIC发送一个字节
返回值:  0发送失败,  1发送成功
参数: 要写入的数据8位
**********************************************/
unsigned char iic_WriteByte(unsigned char dat)
{unsigned char i = 0;unsigned char j = 0;for(i = 0; i < 8; i++)//要发送8位,从最高位开始{SDA = dat>>7;dat = dat<<1;SCL = 1;delay_us(10);SCL = 0;delay_us(10);}SDA = 1;//释放总线delay_ms(10);SCL = 1;while(SDA){    j++;if(j>200){SCL = 0;delay_us(10);return 0;}}SCL = 0;delay_us(10);reeturn 1;
}

主机从IIC总线读取一个字节数据

/**************************************
函数功能:主机从IIC总线读取一个字节数据
返回值: 读取的一个字节
备注:在时钟线(SCL)位高电平时,读取数据状态
**************************************/
unsigned char iic_ReadByte()
{unsigned char i = 0;unsigned char dat = 0;SDA = 1;//起始和发送一个字节之后SCL都是0delay_us(10);for(i = 0; i < 8; i++)//接收8个字节{SCL = 1;delay_us(10);dat<<=1;dat|=SDA;        //或运算, 读取数据是dat最低位dealy_us(10);SCL = 0;delay_us(10);}return dat;
}

参考:https://blog.csdn.net/qq_38410730/article/details/80312357

51单片机(IO模拟IIC通信)相关推荐

  1. 基于51单片机实现模拟IIC总线时序

    最近用到测量光线的模块BH1750FVI时需要用到IIC总线操作, 于是就又费功夫学习了下, 基本上算是了解了, 所以呢, 就用51的IO口, 模拟出了总线时序, 并能正确操纵需要用IIC总线访问地一 ...

  2. 51单片机IO模拟UART

    一. IO模拟UART发送 串口通信属于 串行 异步 半双工的通信模式 1. 最近在调试一个IO模拟UART的程序,把调试过程中遇到的问题总结一下.对于UART的发送部分(主机模式)还是比较容易实现的 ...

  3. 基于高速51单片机的模拟USB接口设计

    基于高速51单片机的模拟USB接口设计 作者:廖颂文 摘要:参照AVRUSB技术给出了51单片机通过模拟USB通信的实现方法.用VC编写了上位机软件,通过libusb驱动实现了PC与ST12LE560 ...

  4. 基于stm32单片机的模拟IIC时序(附源码)

    我下面要说的是基于stm32单片机的模拟IIC时序,以及是一些要注意的事项:结合自己所做的MMA7455加速度传感器,我把模拟IIC的源代码贴了出来,大家可以参考一下. 1.因为在IIC协议中,当总线 ...

  5. 使用51单片机+lcd1602转接板-iic接口进行显示

    使用51单片机+lcd1602转接板-iic接口进行显示 某宝上有卖lcd1602与iic芯片pcf8574的整合,虽然lcd1602能直接用51单片机使用,不过经过整合之后只需要对SCL和SDA两个 ...

  6. 51单片机入门——UART串口通信

    文章目录 前言 1.什么是串行通信 2. USB转串口通信 3. IO 口模拟 UART 串口通信 4 UART串口通信的基本应用 4.1 通信的三种类型 4.2 UART模块 4.3 UART 串口 ...

  7. 单片机与PC机一样都是计算机,51单片机与PC机通信资料

    <51单片机与PC机通信资料>由会员分享,可在线阅读,更多相关<51单片机与PC机通信资料(14页珍藏版)>请在人人文库网上搜索. 1.专业综合实习报告专 业: 电子信息工程 ...

  8. 基于51单片机的双机串口通信排队叫号系统(LCD显示)设计

    基于51单片机的双机串口通信排队叫号系统(LCD显示)设计 1 开发环境 视频讲解 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7.2 设计要求及 ...

  9. 51单片机LED模拟交通灯

    51单片机LED模拟交通灯 文章目录 51单片机LED模拟交通灯 实验环境 仿真图 代码解析 效果演示 实验环境 实验软件: Keil5 + Proteus7 实验元件: AT89C51 * 1, L ...

最新文章

  1. C语言编程题目(三)
  2. Laravel+nginx环境配置好后,url加参数提交报404错误
  3. Class.getResources()和classLoader.getResources()区别
  4. python调用webservice接口实例_python调用webservice接口的实现
  5. java自动生成合同_Java 7和Java 8之间的细微自动关闭合同更改
  6. 各种资源(持续更新中)
  7. 惊艳!28岁就任副教授,年纪轻轻已是博导、院长
  8. nginx 部署_部署 hexo 到 nginx
  9. JAVA Map 和 List 排序方法
  10. matlab 高斯迭代代码_主动降噪与双麦降噪原理与实现前篇——LMS算法的matlab实现...
  11. 【论文写作】网上办公自动系统中功能需求如何写
  12. MCMC:Gibbs 采样(matlab 实现)
  13. python小程序代码_Python解题记录第19题
  14. IT管理系统:让酒店更便宜
  15. HTTP下载文件到本地
  16. python英寸和厘米互换_将厘米转换为英寸的Python程序
  17. 采购订单定价策略 超详细
  18. 什么时候线程会进入Waitting状态?
  19. DARKHOLE_1攻略
  20. 有没有好奇过路由器宽带拨号的mtu值为什么是1492呢?了解MTU与IP分片

热门文章

  1. 深入理解计算机系统_第三章_程序的机器级表示
  2. vue+echarts 地图携带参数下钻【demo一】
  3. 在websocket实现zlib压缩通信(Z_SYNC_FLUSH模式的应用)
  4. 这两个世界此次对决之后,“互联网+”与数字化真的要来了
  5. WRTnode2r DTS 入门
  6. mysql xid_解析MYSQL BINLOG 二进制格式(7)--Xid_log_event/XID_EVENT
  7. MinHash 原理
  8. vulnhub potato
  9. 服务器云平台 系统,服务器云平台系统
  10. 仿美丽说底部TAB布局实现