锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

单片机汇编实验六:I2C串行总线存储器读写实验

时间:2024-05-04 19:37:09

实验要求:由AT89S52内部定时器1,按方式1工作,每1秒钟24C02的0001H单元内容加2,以作为外部中断输入信号,有键按下时,读取0001H单元内容并由LED显示。

//This is the sixth program of the homework;
//Name :Wang Qi Date:2013/3/11 北京化工大学 自实1001
SDA EQU P2.0
SCL EQU P2.1
ORG 0000H //主函数入口
SJMP MAIN
ORG 0013H //外部中断1入口
LJMP WZD0
ORG 001BH //1入口
LJMP WT1
ORG 0050H
MAIN: MOV ,#60H
MOV TMOD,#10H //设置T1工作方式
MOV TH1,#4CH //设初值
MOV ,#00H
MOV R7,#10 //
SETB EA //全局中断
SETB ET1 //允许定时器1
SETB TR1 //启动定时器1
SETB IT1 //外部中断跳变触发方式
SETB EX1 //允许外部中断1
OK: MOV C,P3.4 //扫描键盘
JNC OK1
MOV C,P3.5
JNC OK1
MOV C,P3.6
JNC OK1
MOV C,P3.7
JNC OK1
SJMP OK
OK1: CLR P3.3 //中断信号
SETB P3.3
SJMP OK
WZD0:
SETB P3.3 //中断程序
PUSH TH1 //保护现场
PUSH TL1
CLR TR1 //停止T1计数
MOV R2,#01H
CALL DU
MOV P1,R3
POP TL1
POP TH1
SETB TR1
R
WT1: MOV TH1,#4CH //定时函数
MOV TL1,#00H
DJNZ R7,RET0
MOV R7,#10 //1秒到来了
INC 30H
INC 30H
mov R2,#01H
MOV R3,30H
CALL XIE
RET0: RE

//////////////I2C协议摘自网络 Thanks to the author
XIE: //写数据子程序,R2是要写入的24c02的字节位置地址,R3是要写入的内容
LCALL AR;起始条件
MOV A,#10100000B //寻址24C02的总线硬件地址并使用写入命令
LCALL SDATA //传输数据A给24C02
MOV A,R2 //确定要写入的字节位置地址
LCALL SDATA //传输数据A给24C02
MOV A,R3 //把数据R3写入刚指定的字节地址
LCALL SDATA //传输数据A给24C02
LCALL STOP //写入结束
LCALL CHULI //提供2ms给24C02内部处理刚写入的数据
RET
DU: ;读数据子程序,R2是要读的24c02的字节位置地址,读完后A传给R3
LCALL STAR;起始条件
MOV A,#10100000B//寻址24C02的总线硬件地址并使用写入命令
LCALL SDATA //传输数据A给24C02
MOV A,R2 //注意,这里是使24C02的字节地址指针变成R2的值,也就是确定要读取的字节位置地址
LCALL SDATA //传输数据A给24C02
LCALL STAR //重复起始条件
MOV A,#10100001B//寻址24C02的总线硬件地址并使用读出命令(这里正式发起读命令)
LCALL SDATA//传输数据A给24C02
LCALL RDATA//从之前指定的字节地址中读出字节内容到A
LCALL STOP //读取完毕(这里并没有连续读取,只能读一个字节,要多个字节连续读取,请自己在R2上做变址读取循环)
MOV R3,A //读出的字节传给R3
RET
STAR:SETB SDA //起始条件子程序
SETB SCL
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
RET
SDATA:MOV R0,#08H //向24C02传输数据子程序
LOOP0:CLR SCL
RLC A
MOV SDA,C
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
DJNZ R0,LOOP0
CLR SCL
NOP
SETB SDA
NOP
NOP
SETB SCL
REP:MOV C,SDA
JC REP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
RDATA:MOV R0,#08H //从24C02读取数据子程序(读取一个字节以后不做应答)
LOOP1:SETB SCL
NOP
NOP
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
NOP
NOP
NOP
NOP
DJNZ R0,LOOP1
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
RET
STOP:CLR SDA ;结束条件
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
RET
CHULI: //1999uS ;这里是用于写完数据以后留给24C02的内部数据处理时间,2ms是一个非常保险的时间,最短需要1ms
MOV R6,#04H
WR0:
MOV R5,#0F8H
DJNZ R5,$
DJNZ R6,WR0
RET
END


-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章