I2C串行AT24C02实验.docx
- 文档编号:23079132
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:25
- 大小:88.17KB
I2C串行AT24C02实验.docx
《I2C串行AT24C02实验.docx》由会员分享,可在线阅读,更多相关《I2C串行AT24C02实验.docx(25页珍藏版)》请在冰豆网上搜索。
I2C串行AT24C02实验
第4章实验01-I2C串行AT24C02实验
一、实验目的:
1、了解I2C总线的工作原理;
2、学习I2C总线与单片机的接口方法;
3、学习串行E2PROM芯片24CXX系列的读写方法;
4、单片机I2C总线接口的编程方法。
二、实验内容:
1、向24C02写入数据,然后读出数据检验,检验正确,点亮8个发光二极管;检验错误,熄灭8个发光二极管。
原理图:
流程图:
子程序开始子程序开始开始
发送启动条件发送启动条件I/O端口初始化
I2C初始化
送出器件地址,设为送出器件地址,设为
“写”模式;“写”模式;I2C写1个字节
送出写入地址;送出写入地址;
送出写入数据;I2C读出1个字节
送出重启条件否
发送停止条件读出=写入?
送出器件地址,设为“读”是
延时10ms接收24C02送出的数据
灯灭灯亮
返回发送非应答条件
发送停止条件踏步
返回
汇编源程序:
/*根据书上流程图写程序,用R2控制模式,R3存所读值
*/
SDAEQUP1.0;数据
SCLEQUP1.1;时钟
ORG0000H
AJMPMAIN
ORG0030H
MAIN:
MOVP2,#0FFH
ACALLIC24_WRITE;写入一个字节
ACALLIC24_READ;读取一个字节
CJNER3,#09H,LOOP
MOVP2,#00H
LOOP:
AJMP$
IC24_WRITE:
;“写”一个字节
ACALLSTART
MOVR2,#0A8H;送出器件地址,设置为"写"模式
ACALLWRITE
ACALLTACK
MOVR2,#00H;送出写入地址
ACALLWRITE
ACALLTACK
MOVR2,#09H;送出写入数据
ACALLWRITE
ACALLTACK
ACALLSTOP
ACALLDELAY
RET
IC24_READ:
;“读”一个字节
ACALLSTART
MOVR2,#0A8H;送出器件地址,并设置为“写”模式
ACALLWRITE
ACALLTACK
MOVR2,#00H;送出器件地址
ACALLWRITE
ACALLTACK
ACALLSTART;重复启动
MOVR2,#0A9H;器件地址,并设置为“读”模式
ACALLWRITE
ACALLTACK
ACALLREAD;读取一个字节
ACALLNACK
ACALLSTOP
RET
WRITE:
MOVR4,#08H;写一个字节8位
MOVA,R2
WRLOOP:
CLRSCL
ACALLDELAY0
RLCA
MOVSDA,C
SETBSCL
ACALLDELAY0
DJNZR4,WRLOOP;判断是否8位都已写完
RET
READ:
MOVA,#00H;读取8位数到A
MOVR4,#08H
RDLOOP:
CLRSCL
SETBSCL
ACALLDELAY0
MOVC,SDA
RLCA
DJNZR4,RDLOOP
MOVR3,A;将读到的值存入R3
RET
START:
;产生启动信号
CLRSCL
SETBSDA
SETBSCL
ACALLDELAY0
CLRSDA;产生启动条件
ACALLDELAY0
CLRSCL
RET
STOP:
;产生停止信号
CLRSCL
CLRSDA
SETBSCL
ACALLDELAY0
SETBSDA;产生停止条件
ACALLDELAY0
RET
NACK:
CLRSCL;非应答信号
ACALLDELAY0
SETBSDA
ACALLDELAY0
SETBSCL
ACALLDELAY0
RET
TACK:
;应答信号
CLRSCL
ACALLDELAY0
SETBSDA
ACALLDELAY0
SETBSCL
ACALLDELAY0
TACK2:
MOVC,SDA
JNCTACK1;检测设备是否将SDA拉为低电平
AJMPTACK2
TACK1:
RET;完毕返回
DELAY:
PUSH01H;10ms延时
PUSH05H
MOVR1,#20
DELAY1:
MOVR5,#255
DJNZR5,$
DJNZR1,DELAY1
POP05H
POP01H
RET
DELAY0:
PUSH01H;10us延时
MOVR1,#05H
DJNZR1,$
POP01H
RET
END
C语言源程序:
#include
sbitSDA=P1^0;
sbitSCL=P1^1;
unsignedchart;
unsignedchartemp;//中间变量
unsignedcharr;//存取最后读出的值
/************************************************/
voiddelay()//10ms延时
{
unsignedchari=0x0640;
while(i--)
{;}
}
/*************************************************/
voiddelay0()//10us延时
{
unsignedchari=2;
while(i--)
{;}
}
/***********************************************/
voidstart()//启动
{
SCL=0;
SDA=1;
SCL=1;
delay0();
SDA=0;//产生启动条件
delay0();
}
/**************************************************/
voidstop()
{
SCL=0;
SDA=0;
SCL=1;
delay0();
SDA=1;//产生停止条件
delay0();
}
/**************************************************/
voidwrite(chart)//写一个字节
{
inti=8;
temp=t;
for(i=0;i<8;i++)
{temp=temp<<1;SCL=0;delay0();SDA=CY;delay0();SCL=1;delay0();}
SCL=0;
delay0();
SDA=1;
delay0();
}
/******************************************************/
voidread()//读一个字节
{
unsignedchari,j,k=0;
SCL=0;delay0();SDA=1;
for(i=0;i<8;i++)
{
delay0();
SCL=1;
delay0();
if(SDA==1)
j=1;
else
j=0;
k=(k<<1)|j;
SCL=0;
}
r=k;
}
/*******************************************************/
voidnack()//非应答信号
{
SCL=0;
delay0();
SDA=1;
delay0();
SCL=1;
delay0();
}
/********************************************************/
voidtack()//应答信号
{
SCL=0;
delay0();
SDA=1;
delay0();
SCL=1;
delay0();
while(SDA)
{;}
}
/********************************************************/
voidwrite24()//"写"子程序
{
start();
t=0xa8;
write(t);//设“读”模式
tack();
t=0x00;//写入地址
write(t);
tack();
t=0x09;//送写入数据
write(t);
tack();
stop();//停止
delay();//等待写入完成
}
/*********************************************************/
voidread24()//"读"子程序
{
start();//启动
t=0xa8;//设“写”模式
write(t);
tack();//检测应答模式
t=0x00;//送读取地址
write(t);
tack();
start();//重启动
t=0xa9;//设“写”模式
write(t);
tack();
read();//读数据
nack();//送非应答信号
stop();
}
/*********************************************************/
main()
{
P2=0Xff;
write24();
read24();
if(r==0x09)
P2=0X00;//检验正确,灯亮
while
(1)
{;}
}
2、编制程序,分别按字节模式和页模式向24C02芯片写入数据,比较写入速度的差别。
原理图:
流程图:
字节子程序主程序
一个字节程序I/O端口初始化
NI2C初始化
是否8次定时初始化
Y
返回启动定时0
页模式程序
页模式子程序关闭定时0
发送启动条件启动定时1
送出器件地址,设置字节子程序
“写”模式;关闭定时1
送出写入地址;N
T0 Y 送出写入数据灯亮灯灭 N 是否8次? Y踏步 返回 T0为定时器0的定时时间;T1为定时器T1的定时时间 汇编源程序: /*页模式是一次性写入多字节,字节模式是一次写一字节 现比较同一组数据(假设为8个字节),页模式与字节模式写入速度的快慢 若是页模式比较快,灯亮。 采用定时器0、1分别控制页模式和字节模式,溢出一次寄存器加1,用R0、R1 比较R0/R1,判断速度 */ //调试结果灯亮,即页模式写入速度快 SDAEQUP1.0;数据 SCLEQUP1.1;时钟 ORG0000H AJMPMAIN ORG000BH;定时入口地址 AJMPT0INT ORG001BH AJMPT1INT ORG0030H MAIN: MOVSP,#60H MOVTMOD,#11H;开定时器T0、T1 MOVTL0,#0H MOVTH0,#0H MOVTL1,#0H MOVTH1,#0H SETBET0 SETBET1 SETBEA MOVP2,#0FEH;初始亮一个灯 SETBTR0 ACALLPAGW;页 CLRTR0 SETBTR1 ACALLBITW;字节 CLRTR1 ;比较R0与R1、TH0与TH1、TL0与TL1 MOVA,R0 CLRC SUBBA,R1 JCL CJNEA,#00,M MOVA,TH0 MOVR2,TH1 CLRC SUBBA,R2 JCL CJNEA,#00H,M MOVA,TL0 MOVR2,TL1 CLRC SUBBA,R2 JCL CJNEA,#00H,M L: MOVP2,#00H AJMPOUT M: MOVP2,#0FFH OUT: AJMP$ T0INT: MOVTH0,#0H MOVTL0,#0H INCR0 RETI T1INT: MOVTH1,#0H MOVTL1,#0H INCR1 RETI PAGW: ACALLSTART;启动 MOVR2,#0A8H;送出器件地址,设置为"写"模式 ACALLWRITE ACALLTACK MOVR2,#00H;送出写入地址 ACALLWRITE ACALLTACK MOVR3,#08H;8个字节 PWW: MOVR2,#09H;送出写入数据 ACALLWRITE ACALLTACK DECR3 DJNZR3,PWW ACALLSTOP ACALLDELAY RET BITW: MOVR3,#08H;字节模式 BWW: ACALLIC24_W DECR3 DJNZR3,BWW RET IC24_W: ;“写”一个字节ACALLSTART ACALLSTART MOVR2,#0A8H;送出器件地址,设置为"写"模式 ACALLWRITE ACALLTACK MOVR2,#00H;送出写入地址 ACALLWRITE ACALLTACK MOVR2,#09H;送出写入数据 ACALLWRITE ACALLTACK ACALLSTOP ACALLDELAY RET WRITE: MOVR4,#08H;写一个字节8位 MOVA,R2 WRLOOP: CLRSCL ACALLDELAY0 RLCA MOVSDA,C SETBSCL ACALLDELAY0 DJNZR4,WRLOOP;判断是否8位都已写完 RET START: ;产生启动信号 CLRSCL SETBSDA SETBSCL ACALLDELAY0 CLRSDA;产生启动条件 ACALLDELAY0 CLRSCL RET STOP: ;产生停止信号 CLRSCL CLRSDA SETBSCL ACALLDELAY0 SETBSDA;产生停止条件 ACALLDELAY0 RET TACK: ;应答信号 CLRSCL ACALLDELAY0 SETBSDA ACALLDELAY0 SETBSCL ACALLDELAY0 TACK2: MOVC,SDA JNCTACK1;检测设备是否将SDA拉为低电平 AJMPTACK2 TACK1: RET;完毕返回 DELAY: PUSH01H;10ms延时 PUSH05H MOVR1,#20 DELAY1: MOVR5,#255 DJNZR5,$ DJNZR1,DELAY1 POP05H POP01H RET DELAY0: PUSH01H;10us延时 MOVR1,#05H DJNZR1,$ POP01H RET END C语言源程序: #include sbitSDA=P1^0; sbitSCL=P1^1; #defineTIMEINT0x11//选择T0、T1定时器 unsignedchart; unsignedchartemp;//中间变量 unsignedinta0=0; unsignedinta1=0; /************************************************/ voidtimer0(void)interrupt1using1//定时 { TH0=0x0; TL0=0x0; a0++; } voidtimer1(void)interrupt3using1 { TH1=0x0; TL1=0x0; a1++; } /************************************************/ voiddelay()//10ms延时 { unsignedchari=0x0640; while(i--) {;} } /*************************************************/ voiddelay0()//10us延时 { unsignedchari=2; while(i--) {;} } /***********************************************/ voidstart()//启动 { SCL=0; SDA=1; SCL=1; delay0(); SDA=0;//产生启动条件 delay0(); } /**************************************************/ voidstop() { SCL=0; SDA=0; SCL=1; delay0(); SDA=1;//产生停止条件 delay0(); } /**************************************************/ voidwrite(chart)//写一个字节 { inti=8; temp=t; for(i=0;i<8;i++) {temp=temp<<1;SCL=0;delay0();SDA=CY;delay0();SCL=1;delay0();} SCL=0; delay0(); SDA=1; delay0(); } /********************************************************/ voidtack()//应答信号 { SCL=0; delay0(); SDA=1; delay0(); SCL=1; delay0(); while(SDA) {;} } /********************************************************/ voidwrite24()//"写"子程序,一个字节 { start(); t=0xa8; write(t);//设“写”模式 tack(); t=0x00;//写入地址 write(t); tack(); t=0x09;//送写入数据 write(t); tack(); stop();//停止 delay();//等待写入完成 } /*********************************************************/ voidbitw()//字节模式,写8个字节 { inti=1; while(i<8) { write24(); i++; } } /*********************************************************/ voidpagw() { inti; start(); t=0xa8; write(t);//设“读”模式 tack(); t=0x00;//写入地址 write(t); tack(); for(i=0;i++;i<8) { t=0x09;//送写入数据 write(t); tack(); } stop();//停止 delay();//等待写入完成 } /*********************************************************/ main() { TMOD=TIMEINT;//开启中断 TH0=0x0; TL0=0x0; TH1=0x0; TL1=0x0; ET1=1; ET0=1; EA=1; P2=0xfe; TR0=1;//T0自启动 pagw();//页模式 TR0=0; TR1=1; bitw();//字节模式 TR1=0; if(a0 elseif(a0>a1)P2=0xff; elseif(TH0 elseif(TH0>TH1)P2=0xff; elseif(TL0 elseif(TL0>TL1)P2=0xff; elseP2=0xfe; while (1) {;} }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- I2C 串行 AT24C02 实验