分享

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

 共同成长888 2015-07-18

实验要求:由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 SP,#60H
                   MOV TMOD,#10H  //设置T1工作方式
                  MOV TH1,#4CH   //设初值
   MOV TL1,#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  
 RETI
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: RETI
 
//////////////I2C协议摘自网络  Thanks to the author
XIE: //写数据子程序,R2是要写入的24c02的字节位置地址,R3是要写入的内容
LCALL STAR;起始条件
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
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章