C51对24c02的读写

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

# include<reg52.h> # define ON 0 # define OFF 1 sbit IIC_SCL=P3^6; sbit IIC_SDA=P3^7; void IIC_Delay() //延时 { unsigned char t; t=10; while(--t!=0); } void IIC_Init() //初始化 { IIC_SCL=1; IIC_Delay(); IIC_SDA=1; IIC_Delay(); } void IIC_Start() //开始 { IIC_SDA=1; IIC_Delay(); IIC_SCL=1; IIC_Delay(); IIC_SDA=0; IIC_Delay(); IIC_SCL=0; IIC_Delay(); }
void IIC_Stop() { unsigned int t; IIC_SDA=0; IIC_Delay(); IIC_SCL=1; IIC_Delay(); IIC_SDA=1; IIC_Delay(); t=15; while(--t!=0); }
//停止
bit IIC_GetAck() //读取应答 { bit ack; IIC_SDA=1; IIC_Delay(); IIC_SCL=1; IIC_Delay(); ack=IIC_SDA; IIC_SCL=0; IIC_Delay(); return ack; } void IIC_PutAck(bit ack) //产生应答 { IIC_SDA=ack; IIC_Delay(); IIC_SCL=1; IIC_Delay(); IIC_SCL=0; IIC_Delay(); }
C51对24C02的读写
2C总线相关介绍 I
1、SDA和SCL都是双向线路,都通过一个电流源或上拉 电阻连接到正的电源电压。 2、当总线空闲时,这两条线都是高电平 ,连接到总线的器件 输出级必须是漏极开路或集电极开路才能执行线与的功能。 连到总线上的任一器件输出的低电平,都将使总线的信号 变低,即各器件的SDA及SCL都是线“与”关系。 3、 IIC总线进行数据传送时,时钟信号为高电平期间,数 据线上的数据必须保持稳定,只有在时钟线(SCL)上的信 号为低电平期间,数据线上的高电平或低电平状态才允许 变化。


4、SCL线为高电平期间,SDA线由高电平向低电平的变化表 示起始信号;SCL线为高电平期间,SDA线由低电平向高电 平的变化表示终止信号。

当一个字节数据传送把SDA拉至低电平,否则表示从机没有应 答。
开始 (start)
ack
写芯片内部地 址
重新开始 (restart)
读取数据
• A0H= • 10100000B
写芯片地址并 对其写操作
• 00H~FFH
• A1= • 10100001B
写芯片地址并 对其读操作
• DATA 8bit
No ack
结束 (stop)
ack
ack
(1)开始(start) ( 2)写芯片地址(A0H=10100000B) (3)写芯片内部地址(如00H) (4)往芯片内部写入数据 (5)结束(stop)
void main() //主函数 { unsigned char code str[]={0x31,0x32}; unsigned char code z[1]; unsigned char code s[2]={0x31,0x32}; IIC_Init(); IIC_Puts(0xa0,0,1,s); //(从机地址,从机子地址,数据长度(字节), 数据) delay(100); IIC_Gets(0xa0,0,1,z); delay(100); while(1) {P0=s[0]; P2=str[z[0]]; } }
void delay(unsigned int t) { for(;t!=0;t--); }
//延时函数
bit IIC_Puts(unsigned char SlaveAddr,unsigned char SubAddr,unsigned char size,unsigned char *dat) //写操作 { SlaveAddr&=0xfe; IIC_Start(); IIC_Write(SlaveAddr); if( IIC_GetAck()) { IIC_Stop(); return 1; void IIC_Write(unsigned char dat) //写数据 } { unsigned char t=8; IIC_Write(SubAddr); do if( IIC_GetAck()) { { IIC_SDA=(bit)(dat&0x80); IIC_Stop(); return 1; dat<<=1; } IIC_SCL=1; IIC_Delay(); do IIC_SCL=0; IIC_Delay(); { }while(--t!=0); IIC_Write(*dat++); } if(IIC_GetAck()) {IIC_Stop(); return 1;} }while(--size!=0); IIC_Stop(); return 0; }
bit IIC_Gets(unsigned char SlaveAddr,unsigned char SubAddr,unsigned char size,unsigned char *dat) //读操作 { SlaveAddr&=0xfe; IIC_Start(); IIC_Write(SlaveAddr); unsigned char IIC_Read() if( IIC_GetAck()) {IIC_Stop(); return 1; } //读数据 IIC_Write(SubAddr); { if( IIC_GetAck()) {IIC_Stop(); return 1;} unsigned char dat; IIC_Start(); unsigned char t=8; SlaveAddr|=0x01; IIC_SDA=1; //将其拉高,使之处于输 IIC_Write(SlaveAddr); 状态 if(IIC_GetAck()) {IIC_Stop(); return 1;} do for(;;) { { IIC_SCL=1; *dat++=IIC_Read(); IIC_Delay(); if(--size==0) dat<<=1; {IIC_PutAck(1); if(IIC_SDA) dat++; break; IIC_SCL=0; } IIC_Delay(); IIC_PutAck(0); }while(--t!=0); } return dat; IIC_Stop(); } return 0;}
相关文档
最新文档