热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言模拟IIC

为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形:如下图所示的写操作的时序图:完整的程序如下ÿ

为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形:

如下图所示的写操作的时序图:


完整的程序如下:

#include
#define uchar unsigned char
#define uint unsigned int
#define write_ADD 0xa0
#define read_ADD 0xa1
uchar a;
sbit SDA=P2^0;
sbit SCL=P2^1;
void SomeNop(); //短延时
void init(); //初始化
void check_ACK(void);
void I2CStart(void);
void I2cStop(void);
void write_byte(uchar dat);//写字节
void delay(uint z);
uchar read_byte(); //读字节
void write(uchar addr,uchar dat); //指定地址写
uchar read(uchar addr); //指定地址读
bit flag; //应答标志位
void main()
{init();write_add(5,0xaa); //向地址5写入0xaadelay(10); //延时,否则被坑呀!!!P1=read_add(5); //读取地址5的值while(1);
}//***************************************************************************
void delay()//简单延时函数
{ ;; }
//***************************************************************************
void start() //开始信号 SCL在高电平期间,SDA一个下降沿则表示启动信号
{ sda=1; //释放SDA总线 delay(); scl=1; delay(); sda=0; delay();
}
//***************************************************************************
void stop() //停止 SCL在高电平期间,SDA一个上升沿则表示停止信号
{ sda=0; delay(); scl=1; delay(); sda=1; delay();
}
//***************************************************************************
void respons() //应答 SCL在高电平期间,SDA被从设备拉为低电平表示应答
{ uchar i; scl&#61;1; delay(); //至多等待250个CPU时钟周期 while((sda&#61;&#61;1)&&(i<250))i&#43;&#43;; scl&#61;0; delay();
}
//***************************************************************************
void init()//总线初始化 将总线都拉高一释放总线 发送启动信号前&#xff0c;要先初始化总线。即总有检测到总线空闲才开始发送启动信号
{ sda&#61;1; delay(); scl&#61;1; delay();
}
//***************************************************************************
void write_byte(uchar date) //写一个字节
{ uchar i,temp; temp&#61;date; for(i&#61;0;i<8;i&#43;&#43;) { temp&#61;temp<<1; scl&#61;0;//拉低SCL&#xff0c;因为只有在时钟信号为低电平期间按数据线上的高低电平状态才允许变化&#xff1b;并在此时和上一个循环的scl&#61;1一起形成一个上升沿 delay(); sda&#61;CY; delay(); scl&#61;1;//拉高SCL&#xff0c;此时SDA上的数据稳定 delay(); } scl&#61;0;//拉低SCL&#xff0c;为下次数据传输做好准备 delay(); sda&#61;1;//释放SDA总线&#xff0c;接下来由从设备控制&#xff0c;比如从设备接收完数据后&#xff0c;在SCL为高时&#xff0c;拉低SDA作为应答信号 delay();
}
//***************************************************************************
uchar read_byte()//读一个字节
{ uchar i,k; scl&#61;0; delay(); sda&#61;1; delay(); for(i&#61;0;i<8;i&#43;&#43;) { scl&#61;1;//上升沿时&#xff0c;IIC设备将数据放在sda线上&#xff0c;并在高电平期间数据已经稳定&#xff0c;可以接收啦 delay(); k&#61;(k<<1)|sda; scl&#61;0;//拉低SCL&#xff0c;使发送端可以把数据放在SDA上 delay(); } return k;
}
//***************************************************************************
void write_add(uchar address,uchar date)//任意地址写一个字节
{ start();//启动 write_byte(0xa0);//发送从设备地址 respons();//等待从设备的响应 write_byte(address);//发出芯片内地址 respons();//等待从设备的响应 write_byte(date);//发送数据 respons();//等待从设备的响应 stop();//停止
}
//***************************************************************************
uchar read_add(uchar address)//读取一个字节
{ uchar date; start();//启动 write_byte(0xa0);//发送发送从设备地址 写操作 respons();//等待从设备的响应 write_byte(address);//发送芯片内地址 respons();//等待从设备的响应 start();//启动 write_byte(0xa1);//发送发送从设备地址 读操作 respons();//等待从设备的响应 date&#61;read_byte();//获取数据 stop();//停止 return date;//返回数据
}





推荐阅读
  • 编码unicode解决了语言不通的问题.但是.unicode又有一个新问题.由于unicode是万国码.把所有国家的文字都编进去了.这就导致一个unicode占用的空间会很大.原来 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本题要求计算一组正整数的最小公倍数(LCM)。输入包括多组测试数据,每组数据首先给出一个正整数n,随后是n个正整数。 ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • 实现系统调用
    实现系统调用一、实验环境​本次操作还是基于上次编译Linux0.11内核的实验环境进行操作。环境如下:二、实验目标​通过对上述实验原理的认识,相信 ... [详细]
  • 编译原理中的语法分析方法探讨
    本文探讨了在编译原理课程中遇到的复杂文法问题,特别是当使用SLR(1)文法时遇到的多重规约与移进冲突。文章讨论了可能的解决策略,包括递归下降解析、运算符优先级解析等,并提供了相关示例。 ... [详细]
  • C语言中的指针详解
    1.什么是指针C语言中指针是一种数据类型,指针是存放数据的内存单元地址。计算机系统的内存拥有大量的存储单元,每个存储单元的大小为1字节, ... [详细]
  • 本文详细介绍了在单片机编程中常用的几个C库函数,包括printf、memset、memcpy、strcpy和atoi,并提供了具体的使用示例和注意事项。 ... [详细]
  • 编程解析:CF989C 花朵之雾 (构造算法)
    本文深入探讨了CF989C '花朵之雾'问题的构造算法,提供了详细的解题思路和代码实现。 ... [详细]
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • Hanks博士是一位著名的生物技术专家,他的儿子Hankson对数学有着浓厚的兴趣。最近,Hankson遇到了一个有趣的数学问题,涉及求解特定条件下的正整数x,而不使用传统的辗转相除法。 ... [详细]
  • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 本问题涉及在给定的无向图中寻找一个至少包含三个节点的环,该环上的节点不重复,并且环上所有边的长度之和最小。目标是找到并输出这个最小环的具体方案。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
author-avatar
为我分心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有