IIC总线24C02读写文档格式.docx
- 文档编号:21164506
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:16
- 大小:18.45KB
IIC总线24C02读写文档格式.docx
《IIC总线24C02读写文档格式.docx》由会员分享,可在线阅读,更多相关《IIC总线24C02读写文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
sbitSDA=P1^1;
/***********************简单延时****************************/
voidDelayMs(unsignedintnumber)
{
unsignedchartemp=112;
while(number--!
=0)
while(temp--!
}
}
/*********************启动IIC总线***************************/
voidStart(){
SDA=1;
SCL=1;
SDA=0;
SCL=0;
/*********************停止IIC总线***************************/
voidStop(){
/***********************请求相应****************************/
voidAck(){
/*从器件响应信号将SDA线拉到低电平*/
/*响应结束,SDA回到高电平继续下一个传送周期*/
/*******************不对IIC总线产生应答*********************/
voidNoAck(){
/*从机不响应时,数据线保持高电平*/
/**********************检查应答位***************************/
bitTestAck(){
CY=SDA;
return(CY);
/*CY=0表应答*/
【关于I2C的检查应答信号的程序】
unsignedcharI2C_CheckAck(void)
{
unsignedchari;
unsignedcharAck=1;
I2C_SDA=1;
DelayUs(I2C_DELAY);
I2C_SCL=1;
for(i=0;
i<
10;
i++)
Ack=I2C_SDA;
if(!
Ack)
I2C_SCL=0;
return1;
I2C_Stop();
return0;
/********************向IIC总线写数据************************/
bitWrite8Bit(unsignedcharinput)
unsignedchartemp;
for(temp=8;
temp!
=0;
temp--)
SDA=(bit)(input&
0x80);
/*取Input最高位*/
input=input<
<
1;
/*input左移输入下一位*/
return(0);
/****************从IIC总线上读数据子程序********************/
unsignedcharRead8Bit()
unsignedchartemp,rbyte=0;
for(temp=8;
temp!
=0;
temp--)
{
SCL=1;
rbyte=rbyte<
rbyte=rbyte|((unsignedchar)(SDA));
/*循环结束把8位的SDA(串行的)读成了一个8位的数放到rbyte中*/
SCL=0;
return(rbyte);
/*******************向EEPROM中写入数据块********************/
voidAT24C02WriteBlock(unsignedchar*Wdata,unsignedcharRomAddress,unsignedcharnumber)
if(number>
8)
number%=8;
/*对于24C02,一个页为8字节,所以最大的块写操作字节数为8*/
Start();
Write8Bit(WriteDeviceAddress);
//总线上器件地址
TestAck();
Write8Bit(RomAddress);
//器件内部要写入地址,有时将此处省略默认从00开始
for(;
number!
number--)
Write8Bit(*Wdata);
Wdata++;
Stop();
DelayMs(10);
/**************从EEPROM中读出数据块到指定RAM中**************/
voidAT24C02ReadBlock(unsignedchar*RamAddress,unsignedcharRomAddress,unsignedcharbytes)
EA=0;
//单片机读操作限制在外部ROM
//重新启动总线
Write8Bit(ReadDeviceAddress);
while(bytes!
=1)
*RamAddress=Read8Bit();
Ack();
RamAddress++;
bytes--;
NoAck();
/*****************向EEPROM中写入单字节数据******************/
voidAT24c02WriteByte(unsignedcharWriteData,unsignedcharRomAddress){
Write8Bit(WriteData);
/************从EEPROM中读出单字节数据到指定RAM中************/
unsignedcharAT24c02ReadByte(unsignedcharRomAddress){
unsignedcharReadData;
ReadData=Read8Bit();
return(ReadData);
voidmain(void)
unsignedchari;
unsignedcharWriteBuff[8],ReadBuff[8];
/*读写缓冲初始化*/
for(i=0;
i<
8;
i++)
WriteBuff[i]=0x55+i;
ReadBuff[i]=0xff;
/*从地址0开始按字节方式写入8个数据'
0'
*/
AT24c02WriteByte(0,i);
/*按字节方式读出数据*/
i++){
ReadBuff[i]=AT24c02ReadByte(i);
/*按写Page方式从地址0开始写入WriteBuff指向的8个数据*/
AT24C02WriteBlock(WriteBuff,0x00,8);
/*按连续读取方式读出从地址0开始的8个数据*/
AT24C02ReadBlock(ReadBuff,0x00,8);
while
(1);
汇编语言:
;
实验四十二IIC总线24C02读写
ASM51
**********************************************************
WriteDeviceAddressequ0a0h
ReadDeviceAddressequ0a1h
******************IIC器件驱动引脚定义*********************
SCLequP1.0
SDAequP1.1
*******************读写数据缓冲定义***********************
ReadBuffequ40h
WriteBuffequ48h
RWLengthequ30h
RomAddressequ31h
org0000h
ljmpMain
org0100h
***********************简单延时***************************
DelayMs:
push06
nop
DelayMsLoop2:
movr6,#0ffh
DelayMsLoop1:
djnzr6,DelayMsLoop1
djnzacc,DelayMsLoop2
pop06
ret
********************启动IIC总线***************************
Start:
setbSDA
setbSCL
clrSDA
clrSCL
********************停止IIC总线***************************
Stop:
**********************请求相应****************************
Ack:
******************不对IIC总线产生应答*********************
NoAck:
*********************检查应答位***************************
TestAck:
movC,SDA
*******************向IIC总线写数据************************
Write8Bit:
push07
movr7,#8
Write8BitLoop:
rlca
movSDA,C
nop;
此处建议加入几个NOP指令降低MCU对器件操作的速度
djnzr7,Write8BitLoop
pop07
***************从IIC总线上读数据子程序********************
Read8Bit:
clra
Read8BitLoop:
clrC
djnzr7,Read8BitLoop
******************向EEPROM中写入数据块********************
AT24C02WriteBlock:
clrea
movr0,#WriteBuff
incRWLength
anlRWLength,#0f0h;
对于24C02,一个页为8字节,所以最大的块写操作字节数为8*/
movr7,RWLength
callStart
mova,#WriteDeviceAddress
callWrite8Bit
callTestAck
mova,RomAddress
AT24C02WriteBlockLoop:
mova,@r0
incr0
djnzr7,AT24C02WriteBlock
callStop
mova,#10
callDelayMs
*************从EEPROM中读出数据块到指定RAM中**************
AT24C02ReadBlock:
movr0,#ReadBuff
mova,#ReadDeviceAddress
AT24C02ReadBlockLoop:
callRead8Bit
mov@r0,a
callAck
djnzr7,AT24C02ReadBlock
callNoAck
****************向EEPROM中写入单字节数据******************
AT24c02WriteByte:
***********从EEPROM中读出单字节数据到指定RAM中************
AT24c02ReadByte:
mov@r0,a
SetReadBuff:
SetReadBuffLoop:
djnzr7,SetReadBuffLoop
SetWriteBuff:
SetWriteBuffLoop:
djnzr7,SetWriteBuffLoop
Main:
movSP,#60h
;
读写缓冲初始化
mova,#00
movRWLength,#8
callSetReadBuff
callSetWriteBuff
写缓冲初始化
mova,#55h
InitWriteBuffLoop:
inca
djnzr7,InitWriteBuffLoop
从地址0开始按字节方式写入8个数据'
movRomAddress,#0
WriteLoop:
callAT24c02WriteByte
incRomAddress
djnzr7,WriteLoop
按字节方式读出数据
ReadLoop:
callAT24c02ReadByte
djnzr7,ReadLoop
按写Page方式从地址0开始写入WriteBuff指向的8个数据
callAT24C02WriteBlock
按连续读取方式读出从地址0开始的8个数据
callAT24C02ReadBlock
jmp$
end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IIC 总线 24 C02 读写