I2C串行AT24C02实验.doc_第1页
I2C串行AT24C02实验.doc_第2页
I2C串行AT24C02实验.doc_第3页
I2C串行AT24C02实验.doc_第4页
I2C串行AT24C02实验.doc_第5页
免费预览已结束,剩余13页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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存所读值*/SDA EQU P1.0;数据SCL EQU P1.1 ;时钟ORG 0000HAJMP MAINORG 0030HMAIN:MOV P2,#0FFHACALL IC24_WRITE ;写入一个字节ACALL IC24_READ ;读取一个字节CJNE R3,#09H,LOOPMOV P2,#00HLOOP:AJMP $IC24_WRITE: ;“写”一个字节ACALL STARTMOV R2,#0A8H ;送出器件地址,设置为写模式ACALL WRITEACALL TACKMOV R2,#00H ;送出写入地址ACALL WRITEACALL TACKMOV R2,#09H ;送出写入数据ACALL WRITEACALL TACKACALL STOPACALL DELAYRETIC24_READ: ;“读”一个字节ACALL STARTMOV R2,#0A8H ;送出器件地址,并设置为“写”模式ACALL WRITEACALL TACKMOV R2,#00H ;送出器件地址ACALL WRITEACALL TACKACALL START ;重复启动MOV R2,#0A9H ;器件地址,并设置为“读”模式ACALL WRITEACALL TACKACALL READ ;读取一个字节ACALL NACKACALL STOPRETWRITE: MOV R4,#08H ;写一个字节8位MOV A,R2 WRLOOP:CLR SCLACALL DELAY0RLC AMOV SDA,CSETB SCLACALL DELAY0DJNZ R4,WRLOOP;判断是否8位都已写完RETREAD: MOV A,#00H;读取8位数到AMOV R4,#08HRDLOOP:CLR SCLSETB SCLACALL DELAY0MOV C,SDARLC ADJNZ R4,RDLOOPMOV R3,A ;将读到的值存入R3RETSTART: ;产生启动信号CLR SCLSETB SDASETB SCL ACALL DELAY0CLR SDA ;产生启动条件ACALL DELAY0CLR SCLRETSTOP: ;产生停止信号CLR SCLCLR SDASETB SCLACALL DELAY0SETB SDA ;产生停止条件ACALL DELAY0RETNACK:CLR SCL ;非应答信号ACALL DELAY0SETB SDAACALL DELAY0SETB SCLACALL DELAY0RETTACK: ;应答信号CLR SCLACALL DELAY0SETB SDAACALL DELAY0SETB SCLACALL DELAY0TACK2:MOV C,SDAJNC TACK1 ;检测设备是否将SDA拉为低电平AJMP TACK2TACK1:RET ;完毕返回DELAY: PUSH 01H;10ms延时PUSH 05HMOV R1,#20DELAY1:MOV R5,#255DJNZ R5,$DJNZ R1,DELAY1POP 05HPOP 01HRETDELAY0:PUSH 01H;10us延时MOV R1,#05HDJNZ R1,$POP 01HRETEND C语言源程序:#includesbit SDA=P10;sbit SCL=P11;unsigned char t;unsigned char temp; /中间变量unsigned char r; /存取最后读出的值/*/void delay() /10ms延时 unsigned char i = 0x0640; while(i-) ;/*/void delay0()/10us延时 unsigned char i = 2; while(i-) ; /*/void start() /启动 SCL = 0; SDA = 1; SCL = 1; delay0(); SDA = 0;/产生启动条件 delay0();/*/void stop() SCL = 0; SDA = 0; SCL = 1; delay0(); SDA = 1;/产生停止条件 delay0();/*/void write(char t) /写一个字节 int i = 8; temp = t; for (i=0;i8;i+) temp=temp1; SCL=0; delay0(); SDA=CY; delay0(); SCL=1; delay0(); SCL=0; delay0(); SDA=1; delay0();/*/void read()/读一个字节 unsigned char i,j,k=0; SCL=0; delay0(); SDA=1; for (i=0;i8;i+) delay0(); SCL=1; delay0(); if (SDA=1) j=1; else j=0; k=(k1)|j; SCL=0; r=k;/*/void nack() /非应答信号 SCL = 0; delay0(); SDA = 1; delay0(); SCL = 1; delay0();/*/void tack() /应答信号 SCL = 0; delay0(); SDA = 1; delay0(); SCL = 1; delay0(); while(SDA) ; /*/void write24() /写子程序 start(); t= 0xa8; write(t); /设“读”模式 tack(); t=0x00; /写入地址 write(t); tack(); t= 0x09; /送写入数据 write(t); tack(); stop(); /停止 delay(); /等待写入完成/*/void read24()/读子程序 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端口初始化 N I2C初始化 是否8次 定时初始化 Y 返回 启动定时0 页模式程序 页模式子程序 关闭定时0 发送启动条件 启动定时1 送出器件地址,设置 字节子程序 “写”模式; 关闭定时1 送出写入地址; N T0T1 Y 送出写入数据 灯亮 灯灭 N 是否8次? Y 踏步 返回T0 为定时器0的定时时间;T1为定时器T1的定时时间 汇编源程序:/* 页模式是一次性写入多字节,字节模式是一次写一字节 现比较同一组数据(假设为8个字节),页模式与字节模式写入速度的快慢若是页模式比较快,灯亮。采用定时器0、1分别控制页模式和字节模式,溢出一次寄存器加1,用R0、R1比较R0/R1,判断速度*/调试结果灯亮,即页模式写入速度快SDA EQU P1.0;数据SCL EQU P1.1 ;时钟ORG 0000HAJMP MAINORG 000BH ;定时入口地址AJMP T0INTORG 001BHAJMP T1INTORG 0030HMAIN:MOV SP,#60HMOV TMOD,#11H ;开定时器T0、T1MOV TL0,#0HMOV TH0,#0HMOV TL1,#0HMOV TH1,#0HSETB ET0SETB ET1SETB EAMOV P2,#0FEH ;初始亮一个灯SETB TR0ACALL PAGW ;页CLR TR0SETB TR1ACALL BITW;字节CLR TR1;比较R0与R1、TH0与TH1、TL0与TL1MOV A,R0CLR CSUBB A,R1JC LCJNE A,#00,MMOV A,TH0MOV R2,TH1CLR CSUBB A,R2JC LCJNE A,#00H,MMOV A,TL0MOV R2,TL1CLR CSUBB A,R2JC LCJNE A,#00H,ML:MOV P2,#00HAJMP OUTM:MOV P2,#0FFHOUT:AJMP $T0INT:MOV TH0,#0HMOV TL0,#0HINC R0RETIT1INT:MOV TH1,#0HMOV TL1,#0HINC R1RETIPAGW:ACALL START ;启动MOV R2,#0A8H ;送出器件地址,设置为写模式ACALL WRITEACALL TACKMOV R2,#00H ;送出写入地址ACALL WRITEACALL TACKMOV R3,#08H ;8个字节PWW:MOV R2,#09H ;送出写入数据ACALL WRITEACALL TACKDEC R3DJNZ R3,PWWACALL STOPACALL DELAYRETBITW:MOV R3,#08H;字节模式BWW:ACALL IC24_WDEC R3DJNZ R3,BWWRETIC24_W: ;“写”一个字节ACALL STARTACALL STARTMOV R2,#0A8H ;送出器件地址,设置为写模式ACALL WRITEACALL TACKMOV R2,#00H ;送出写入地址ACALL WRITEACALL TACKMOV R2,#09H ;送出写入数据ACALL WRITEACALL TACKACALL STOPACALL DELAYRETWRITE: MOV R4,#08H ;写一个字节8位MOV A,R2 WRLOOP:CLR SCLACALL DELAY0RLC AMOV SDA,CSETB SCLACALL DELAY0DJNZ R4,WRLOOP;判断是否8位都已写完RETSTART: ;产生启动信号CLR SCLSETB SDASETB SCL ACALL DELAY0CLR SDA ;产生启动条件ACALL DELAY0CLR SCLRETSTOP: ;产生停止信号CLR SCLCLR SDASETB SCLACALL DELAY0SETB SDA ;产生停止条件ACALL DELAY0RETTACK: ;应答信号CLR SCLACALL DELAY0SETB SDAACALL DELAY0SETB SCLACALL DELAY0TACK2:MOV C,SDAJNC TACK1 ;检测设备是否将SDA拉为低电平AJMP TACK2TACK1:RET ;完毕返回DELAY: PUSH 01H;10ms延时PUSH 05HMOV R1,#20DELAY1:MOV R5,#255DJNZ R5,$DJNZ R1,DELAY1POP 05HPOP 01HRETDELAY0:PUSH 01H;10us延时MOV R1,#05HDJNZ R1,$POP 01HRETEND C语言源程序:#includesbit SDA=P10;sbit SCL=P11;#define TIMEINT 0x11/选择T0、T1定时器unsigned char t;unsigned char temp; /中间变量unsigned int a0=0;unsigned int a1=0;/*/void timer0(void) interrupt 1 using 1 /定时 TH0=0x0; TL0=0x0; a0+;void timer1(void) interrupt 3 using 1 TH1=0x0; TL1=0x0; a1+;/*/void delay() /10ms延时 unsigned char i = 0x0640; while(i-) ;/*/void delay0()/10us延时 unsigned char i = 2; while(i-) ; /*/void start() /启动 SCL = 0; SDA = 1; SCL = 1; delay0(); SDA = 0;/产生启动条件 delay0();/*/void stop() SCL = 0; SDA = 0; SCL = 1; delay0(); SDA = 1;/产生停止条件 delay0();/*/void write(char t) /写一个字节 int i = 8; temp = t; for (i=0;i8;i+) temp=temp1; SCL=0; delay0(); SDA=CY; delay0(); SCL=1; delay0(); SCL=0; delay0(); SDA=1; delay0(); /*/void tack() /应答信号 SCL = 0; delay0(); SDA = 1; delay0(); SCL = 1; delay0(); while(SDA)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论