微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > I2C串行总线在单片机8031应用系统中的设计与实现

I2C串行总线在单片机8031应用系统中的设计与实现

时间:01-30 来源:互联网 点击:

××× ;程序开始地址。
 SCL  EQU P1.1    ;选择P1.1作时钟线。
 SDA  EQU P1.0    ;选择P1.0作数据线。
  功能:WRITE是写入程序。将R1指示的R7个片内字节写入AT24C02中,写入首址由R0指示。
 WRITE:ACALL STAR    ;发出起始信号。
     MOV A,#0A0H   ;发出写命令。
     ACALL OUTB
     JC WBE      ;无回答,结束操作。
     MOV A,R0    ;发出E2PROM首址。
     ACALL OUTB
     JC WBE      ;无回答,结束操作。
 WR1: MOV A,@R1    ;取一字节内容。
     ACALL OUTB    ;写入E2PROM中。
     JC WBE      ;无回答,结束操作。
     INC R1      ;指向下一字节。
     DJNZ R7,WR1   ;写完全部字节。
 WBE: AJMP STOP    ;发出结束信号。
  功能:READ是读出程序。将R1指示的R7个E2PROM字节读入片内RAM中,首址由R0指示。
 READ: ACALL STAR    ;发出起始信号。
     MOV A,#0A0H   ;发出写命令。
     ACALL OUTB
     JC RDE      ;无回答,结束操作。
     MOV A,R1    ;发出E2PROM首址。
     ACALL OUTB
     JC RDE      ;无回答,结束操作。
     ACALL STOP    ;发出结束信号。
     NOP       ;延时。
     NOP
     ACALL STAR    ;再次发出起始信号。
     MOV A,#0A1H   ;发出读命令。
     ACALL OUTB
     JC RDE      ;无回答,结束操作。
 RD1: MOV B,#08H   ;每移出8位组成一字节。
 RD2: CLR SCL     ;移出一个时钟脉冲。
     NOP
     SETB SCL     ;时钟脉冲上升沿。
     NOP
     MOV C,SDA    ;读入一位。
     RLC A      ;拼装到累加器中。
     NOP
     DJNZ B,RD2   ;拼完一字节。
     MOV @R0,A    ;存入片内。
     INC R0      ;指向下一地址。
     CLR SCL     ;时钟脉冲下降沿。
     CJNE R7,#1,RD3 ;是最后一个字节吗?
     SETB SDA     ;最后一个字节不给回答信号。
     SJMP RD4
 RD3: CLR SDA     ;准备好回答信号。
 RD4: NOP
     SETB SCL     ;时钟脉冲上升沿。
     NOP       ;等待E2PROM读取回答信号
     NOP
     CLR SCL     ;回答完毕。
     SETB SDA     ;准备读入下一字节。
     DJNZ R7,RD1   ;读完全部字节。
     CLR C
 RDE: AJMP STOP    ;发出结束信号。
  功能:OUTB是向E2PROM发出一字节信息的子程序。
 OUTB: MOV B,#08H   ;一字节8位。
 OUT1: CLR SCL     ;将时钟线拉低。
     RLC A      ;移出一位。
     MOV SDA,C    ;放到数据线上。
     SETB SCL     ;将时钟线升高。
     NOP       ;等待一位信息送入E2PROM中。
     DJNZ B,OUT1   ;发送完8位。
     CLR SCL     ;将时钟线拉低。
     SETB SDA     ;准备接收回答信号。
     SETB SCL     ;将时钟线升高。
     NOPMOV C,SDA  ;接收回答信号。
     CLR SCL     ;将时钟线拉低。
     RET
  功能:STAR是起始信号。
 STAR: SETB SDA     ;将数据线升高。
     SETB SCL     ;将时钟线升高。
     NOP       ;延时。
     CLR SDA     ;将数据线拉低,发出起始信号。
     NOP       ;延时。
     CLR SCL     ;将时钟线拉低。
     RET
  功能:STOP是结束信号。
 STOP: CLR SCL     ;将时钟线拉低。
     CLR SDA     ;将数据线拉低。
     NOP
     SETB SCL     ;将时钟线升高。
     NOP
     SETB SDA     ;将数据线升高,发出结束信号。
     RET
     END

4 结束语

  本文给出了用8031汇编语言模拟I2C总线的时序的起始、停止及主控器向I2C总线的发送和接收R7字节的程序,读者也可根据I2C总线的操作时序在ATMEL89系列、68HC05系列等单片机及其外设接口如8255、8155或74LS377上实现I2C总线的操作,具有一定的通用性,且易于嵌入移植。

参考文献
 1 Atmel Integrated Circuit Date Book,1994
 2 武汉力源公司.CMOS串行EEPROM原理及应用
 3 王卓人,邓晋钧,刘宗祥.IC卡的技术与应用.北京:电子工业出版社,1999.2

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top