1、学习三极管的使用( 四 )


void ()
= 1; //首先确保SDA、SCL都是高电平
= 1;
();
= 0; //先拉低SDA
();
= 0; //再拉低SCL
/* 产生总线停止信号 */
void ()
= 0; //首先确保SDA、SCL都是低电平
= 0;
();
= 1; //先拉高SCL
();
= 1; //再拉高SDA
();
/* I2C总线写操作 , dat-待写入字节 , 返回值-从机应答位的值 */
bit ( char dat)
{ bit ack; //用于暂存应答位的值char mask; //用于探测字节内某一位值的掩码变量
for (mask=0x80; mask!=0; mask>>=1) //从高位到低位依次进行
{ if ((mask&dat) == 0) //该位的值输出到SDA上
= 0; else
= 1;
();
= 1; //拉高SCL
();
= 0; //再拉低SCL , 完成一个位周期
= 1; //8位数据发送完后 , 主机释放SDA , 以检测从机应答
();
= 1; //拉高SCL
ack = ; //读取此时的SDA值 , 即为从机的应答值
();
= 0; //再拉低SCL完成应答位 , 并保持住总线
(~ack); //应答值取反以符合通常的逻辑:
//0=不存在或忙或写入失败 , 1=存在且空闲或写入成功
在整个过程中 , SCL均由单片机来操作 。无论是起始、读、写操作函数 , 在调用这些函数之后SCL被提前拉低 。
I2C 通信分为低速模式 /s、快速模式 /s 和高速模式 3.4Mbit/s 。在使用/s时需要SCL 的高低电平持续时间都不短于 5us 。
单片机与用IIC通信的例子:
单片机写:
第一步 , 发送 I2C 的起始信号 , 接着跟上I2C 的器件地址 , 在读写方向上选择“写”操作 。
第二步 , 发送数据的存储地址 。24C02 一共 256 个字节的存储空间 , 地址从 0x00~0xFF , 我们想把数据存储在哪个位置 , 此刻写的就是哪个地址 。
第三步 , 发送要存储的数据第一个字节、第二个字节…在写数据的过程中 , 每个字节都会回应一个“应答位 0” , 来告诉我们写数据成功 , 如果没有回应答位 , 说明写入不成功 。
在写数据的过程中 , 每成功写入一个字节 ,  存储空间的地址就会自动加 1 , 当加到 0xFF 后 , 再写一个字节 , 地址会溢出又变成了 0x00 。
/* 向中写入一个字节 , addr-字节地址 */
void ( char addr,char dat)
();
【1、学习三极管的使用】(0x50