代码增进对IIC的理解

2024-06-19 04:32
文章标签 代码 理解 iic 增进

本文主要是介绍代码增进对IIC的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 我看了一下,写的确实不错,基于51的
  2. #include<reg52.h>  
  3. #define uchar unsigned char  
  4. sbit sda=P2^0;  
  5. sbit scl=P2^1;              //用单片机的两个I/O口模拟I2C接口  
  6. uchar a;  
  7. ***************************************************************************  
  8. void delay()                             //简单延时函数  
  9. { ;; }  
  10. ***************************************************************************  
  11. void start()             //开始信号 SCL在高电平期间,SDA一个下降沿则表示启动信号  
  12. {     
  13.     sda=1;              //释放SDA总线  
  14.     delay();  
  15.     scl=1;  
  16.     delay();  
  17.     sda=0;  
  18.     delay();  
  19. }  
  20. ***************************************************************************  
  21. void stop()   //停止 SCL在高电平期间,SDA一个上升沿则表示停止信号  
  22. {  
  23.     sda=0;  
  24.     delay();  
  25.     scl=1;  
  26.     delay();  
  27.     sda=1;  
  28.     delay();  
  29. }***************************************************************************  
  30. void respons()  //应答 SCL在高电平期间,SDA被从设备拉为低电平表示应答  
  31. {  
  32.     uchar i;  
  33.     scl=1;  
  34.     delay();  
  35.     while((sda==1)&&(i<250))i++;  
  36.     scl=0;  
  37.     delay();  
  38. }  
  39. ***************************************************************************  
  40. /*总线初始化 将总线都拉高一释放总线  发送启动信号前,要先初始化总线。即总有检测到总线空闲才开始发送启动信号*/
  41. void init()
  42. {  
  43.     sda=1;  
  44.     delay();  
  45.     scl=1;  
  46.     delay();  
  47. }  
  48. /***************************************************************************/
  49. void write_byte(uchar date) //写一个字节  
  50. {  
  51.     uchar i,temp;  
  52.     temp=date;  
  53.   
  54.   
  55.     for(i=0;i<8;i++)  
  56.     {  
  57.         temp=temp<<1;  
  58.         scl=0;     //拉低SCL,因为只有在时钟信号为低电平期间按数据线上的高低电平状态才允许变化;并在此时和上一个循环的scl=1一起形成一个上升沿  
  59.         delay();  
  60.         sda=CY;  
  61.         delay();  
  62.         scl=1;         //拉高SCL,此时SDA上的数据稳定  
  63.         delay();  
  64.     }  
  65.     scl=0;          //拉低SCL,为下次数据传输做好准备  
  66.     delay();  
  67.     sda=1;          //释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为高时,拉低SDA作为应答信号  
  68.     delay();  
  69. }  
  70. ***************************************************************************  
  71. uchar read_byte()           //读一个字节  
  72. {  
  73.     uchar i,k;  
  74.     scl=0;  
  75.     delay();  
  76.     sda=1;  
  77.     delay();  
  78.     for(i=0;i<8;i++)  
  79.     {  
  80.         scl=1;           //上升沿时,IIC设备将数据放在sda线上,并在高电平期间数据已经稳定,可以接收啦  
  81.         delay();      
  82.         k=(k<<1)|sda;  
  83.         scl=0;          //拉低SCL,使发送端可以把数据放在SDA上  
  84.         delay();      
  85.     }  
  86.     return k;  
  87. }  
  88. ***************************************************************************  
  89. void write_add(uchar address,uchar date)//任意地址写一个字节  
  90. {  
  91.     start();        //启动  
  92.     write_byte(0xa0);        //发送从设备地址  
  93.     respons();                  //等待从设备的响应  
  94.     write_byte(address);        //发出芯片内地址  
  95.     respons();                       //等待从设备的响应  
  96.     write_byte(date);         //发送数据  
  97.     respons();                  //等待从设备的响应  
  98.     stop();                       //停止  
  99. }  
  100. ***************************************************************************  
  101. uchar read_add(uchar address)//读取一个字节  
  102. {  
  103.     uchar date;  
  104.     start();              //启动  
  105.     write_byte(0xa0);             //发送从设备地址 写操作  
  106.     respons();                      //等待从设备的响应  
  107.     write_byte(address);          //发送芯片内地址  
  108.     respons();                        //等待从设备的响应  
  109.     start();                                //启动  
  110.     write_byte(0xa1);                //发送从设备地址 读操作  
  111.     respons();                             //等待从设备的响应  
  112.     date=read_byte();                //获取数据  
  113.     stop();                                 //停止  
  114.     return date;                      //返回数据  
  115. }  

这篇关于代码增进对IIC的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074008

相关文章

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤