C51 I2C接口驱动,IO口模拟I2C(主+从)
Master.asm
;/*------------------------------------------------------------------*/ ;/* --- STC MCU International Limited -------------------------------*/ ;/* --- STC 1T Series MCU Simulate I2C Master Demo ------------------*/ ;/* --- Mobile: (86)13922805190 -------------------------------------*/ ;/* --- Fax: 86-755-82944243 ----------------------------------------*/ ;/* --- Tel: 86-755-82948412 ----------------------------------------*/ ;/* --- Web: www.STCMCU.com -----------------------------------------*/ ;/* If you want to use the program or the program referenced in the */ ;/* article, please specify in which data and procedures from STC */ ;/*------------------------------------------------------------------*/ SCL BIT P1. SDA BIT P1. ;---------------------------- ORG MOV TMOD,#20H ;初始化串口为(9600,n,8,1) MOV SCON,#5AH ;-18432000/12/32/9600 MOV TH1,A MOV TL1,A SETB TR1 MAIN: CALL UART_RXDATA ;接收下一个串口数据 MOV R0,A ;临时保存到R0 ;读取I2C设备IDATA 80H的数据 CALL I2C_START ;开始读取 MOV A,#01H CALL I2C_TXBYTE ;发送地址数据+读信号 CALL I2C_RXACK ;接收ACK CALL I2C_RXBYTE ;接收数据 SETB C CALL I2C_TXACK ;发送NAK CALL I2C_STOP ;读取完成 CALL UART_TXDATA ;将读到的数据发送到串口 ;将R0的数据写入I2C设备IDATA 80H CALL I2C_START ;开始写 MOV A,#00H CALL I2C_TXBYTE ;发送地址数据+写信号 CALL I2C_RXACK ;接收ACK MOV A,R0 CALL I2C_TXBYTE ;写数据 CALL I2C_RXACK ;接收ACK CALL I2C_STOP ;写完成 JMP MAIN ;---------------------------- ;等待串口数据 ;---------------------------- UART_RXDATA: JNB RI,$ ;等待接收完成标志 CLR RI ;清除标志 MOV A,SBUF ;保存数据 RET ;---------------------------- ;发送串口数据 ;---------------------------- UART_TXDATA: JNB TI,$ ;等待上一个数据发送完成 CLR TI ;清除标志 MOV SBUF,A ;发送数据 RET ;---------------------------- ;发送I2C起始信号 ;---------------------------- I2C_START: CLR SDA ;数据线下降沿 CALL I2C_DELAY ;延时 CLR SCL ;时钟->低 CALL I2C_DELAY ;延时 RET ;---------------------------- ;发送I2C停止信号 ;---------------------------- I2C_STOP: CLR SDA SETB SCL ;时钟->高 CALL I2C_DELAY ;延时 SETB SDA ;数据线上升沿 CALL I2C_DELAY ;延时 RET ;---------------------------- ;发送ACK/NAK信号 ;---------------------------- I2C_TXACK: MOV SDA,C ;送ACK数据 SETB SCL ;时钟->高 CALL I2C_DELAY ;延时 CLR SCL ;时钟->低 CALL I2C_DELAY ;延时 SETB SDA ;发送完成 RET ;---------------------------- ;接收ACK/NAK信号 ;---------------------------- I2C_RXACK: SETB SDA ;准备读数据 SETB SCL ;时钟->高 CALL I2C_DELAY ;延时 MOV C,SDA ;读取ACK信号 CLR SCL ;时钟->低 CALL I2C_DELAY ;延时 RET ;---------------------------- ;接收一字节数据 ;---------------------------- I2C_TXBYTE: ;8位计数 TXNEXT: RLC A ;移出数据位 MOV SDA,C ;数据送数据口 SETB SCL ;时钟->高 CALL I2C_DELAY ;延时 CLR SCL ;时钟->低 CALL I2C_DELAY ;延时 DJNZ R7,TXNEXT ;送下一位 RET ;---------------------------- ;发送一字节数据 ;---------------------------- I2C_RXBYTE: ;8位计数 RXNEXT: SETB SCL ;时钟->高 CALL I2C_DELAY ;延时 MOV C,SDA RLC A CLR SCL ;时钟->低 CALL I2C_DELAY ;延时 DJNZ R7,RXNEXT ;收下一位 RET ;---------------------------- ;2 6(200K) 1(400K) [18'432'000/400'000=46] DJNZ R0,$ ;---------------------------- END
Slave.asm
;/*------------------------------------------------------------------*/ ;/* --- STC MCU International Limited -------------------------------*/ ;/* --- STC 1T Series MCU Simulate I2C Slave Demo -------------------*/ ;/* --- Mobile: (86)13922805190 -------------------------------------*/ ;/* --- Fax: 86-755-82944243 ----------------------------------------*/ ;/* --- Tel: 86-755-82948412 ----------------------------------------*/ ;/* --- Web: www.STCMCU.com -----------------------------------------*/ ;/* If you want to use the program or the program referenced in the */ ;/* article, please specify in which data and procedures from STC */ ;/*------------------------------------------------------------------*/ SCL BIT P1. SDA BIT P1. ;---------------------------- ORG RESET: SETB SCL SETB SDA CALL I2C_WAITSTART ;等待起始信号 CALL I2C_RXBYTE ;接收地址数据 CLR C CALL I2C_TXACK ;回应ACK SETB C ;读/写 IDATA[80H - FFH] RRC A ;读/写位->C MOV R0,A ;地址送入R0 JC READDATA ;C=1(读) C=0(写) WRITEDATA: CALL I2C_RXBYTE ;接收数据 MOV @R0,A ;写入IDATA INC R0 ;地址+1 CLR C CALL I2C_TXACK ;回应ACK CALL I2C_WAITSTOP ;等待停止信号 JMP RESET READDATA: MOV A,@R0 INC R0 CALL I2C_TXBYTE ;发送IDATA数据 CALL I2C_RXACK ;接收ACK CALL I2C_WAITSTOP ;等待停止信号 JMP RESET ;---------------------------- ;等待起始信号 ;---------------------------- I2C_WAITSTART: JNB SCL,$ ;等待时钟->高 JB SDA,$ ;等待数据线下降沿 JB SCL,$ ;等待时钟->低 RET ;---------------------------- ;等待结束信号 ;---------------------------- I2C_WAITSTOP: JNB SCL,$ ;等待时钟->高 JNB SDA,$ ;等待数据线上升沿 RET ;---------------------------- ;发送ACK/NAK信号 ;---------------------------- I2C_TXACK: MOV SDA,C ;送ACK数据 JNB SCL,$ ;等待时钟->高 JB SCL,$ ;等待时钟->低 SETB SDA ;发送完成 RET ;---------------------------- ;接收ACK/NAK信号 ;---------------------------- I2C_RXACK: SETB SDA ;准备读数据 JNB SCL,$ ;等待时钟->高 MOV C,SDA ;读取ACK信号 JB SCL,$ ;等待时钟->低 RET ;---------------------------- ;接收一字节数据 ;---------------------------- I2C_RXBYTE: ;8位计数 RXNEXT: JNB SCL,$ ;等待时钟->高 MOV C,SDA ;读取数据口 RLC A ;保存数据 JB SCL,$ ;等待时钟->低 DJNZ R7,RXNEXT ;收下一位 RET ;---------------------------- ;发送一字节数据 ;---------------------------- I2C_TXBYTE: ;8位计数 TXNEXT: RLC A ;移出数据位 MOV SDA,C ;数据送数据口 JNB SCL,$ ;等待时钟->高 JB SCL,$ ;等待时钟->低 DJNZ R7,TXNEXT ;送下一位 RET ;---------------------------- END
另外Slave.asm
SCL BIT P1. SDA BIT P1. ;---------------------------- ORG MAIN: MOV TMOD,#20H;设T1工作方式2 MOV TH1,#0FDH;赋记数初值 MOV TL1,#0FDH;赋记数值 SETB TR1;启动定时器T1 MOV PCON,#80H;设SMOD=1 MOV SCON,#0D0H;置串行口方式3,允许接收 ; RESET: SETB SCL SETB SDA CALL I2C_WAITSTART ;等待起始信号 CALL I2C_RXBYTE ;接收地址数据 CLR C CALL I2C_TXACK ;回应ACK SETB C ;读/写 IDATA[80H - FFH] RRC A ;读/写位->C MOV R0,A ;地址送入R0 JC READDATA ;C=1(读) C=0(写) WRITEDATA: CALL I2C_RXBYTE ;接收数据 MOV @R0,A ;写入IDATA INC R0 ;地址+1 CLR C CALL I2C_TXACK ;回应ACK CALL I2C_WAITSTOP ;等待停止信号 JMP RESET READDATA: MOV A,@R0 INC R0 CALL I2C_TXBYTE ;发送IDATA数据 CALL I2C_RXACK ;接收ACK CALL I2C_WAITSTOP ;等待停止信号 ; DJNZ R2,RX; JMP RESET ;RX: ; MOV C,P; ; MOV TB8,C; ; MOV SBUF,A;发送数据 ; JNB TI,$; ; CLR TI; ; MOV R2,#8; ; RET ;---------------------------- ;等待起始信号 ;---------------------------- I2C_WAITSTART: JNB SCL,$ ;等待时钟->高 JB SDA,$ ;等待数据线下降沿 JB SCL,$ ;等待时钟->低 RET ;---------------------------- ;等待结束信号 ;---------------------------- I2C_WAITSTOP: JNB SCL,$ ;等待时钟->高 JNB SDA,$ ;等待数据线上升沿 RET ;---------------------------- ;发送ACK/NAK信号 ;---------------------------- I2C_TXACK: MOV SDA,C ;送ACK数据 JNB SCL,$ ;等待时钟->高 JB SCL,$ ;等待时钟->低 SETB SDA ;发送完成 RET ;---------------------------- ;接收ACK/NAK信号 ;---------------------------- I2C_RXACK: SETB SDA ;准备读数据 JNB SCL,$ ;等待时钟->高 MOV C,SDA ;读取ACK信号 JB SCL,$ ;等待时钟->低 RET ;---------------------------- ;接收一字节数据 ;---------------------------- I2C_RXBYTE: ;8位计数 RXNEXT: JNB SCL,$ ;等待时钟->高 MOV C,SDA ;读取数据口 RLC A ;保存数据 MOV SBUF,A;发送数据 JNB TI,$; CLR TI; JB SCL,$ ;等待时钟->低 DJNZ R7,RXNEXT ;收下一位 RET ;---------------------------- ;发送一字节数据 ;---------------------------- I2C_TXBYTE: ;8位计数 TXNEXT: RLC A ;移出数据位 MOV SDA,C ;数据送数据口 JNB SCL,$ ;等待时钟->高 JB SCL,$ ;等待时钟->低 DJNZ R7,TXNEXT ;送下一位 RET ;---------------------------- END
C51 I2C接口驱动,IO口模拟I2C(主+从)的更多相关文章
- MSP430的IO口模拟I2C总线对AT24C25进行读写程序
功能: 实现MSP430口线模拟I2C总线协议与24C04通信. ** 描述: 主系统工作时钟为12MHz,I2C工 ...
- 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)
版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...
- stm32 普通IO口模拟串口通信
普通IO口模拟串口通信 串口通信协议 串口传输 默认 波特率9600 1起始位 1停止位 其他0 数据位是8位(注意图上的给错了). 传输时,从起始位开始,从一个数据的低位(LSB)开始发送,如图从左 ...
- 为 MaixPy 加入软 I2C 接口(移植 MicroPython 的 I2C)
起因 本文的重心为讲解如何为一款芯片移植和实现 micropython 的通用组件,但会顺带解释不同芯片的工作方式和特性. 国际惯例,先有起因,再谈问题的解决,所以记得上次总结的 关于 K210 Ma ...
- 驱动之SPI,UART,I2C的介绍与应用20170118
这篇文章主要介绍基本的驱动也是用的最多的协议类驱动中的SPI,I2C和UART.首先从最简单的UART也就是串口讲起: 1.UART UART由两根线也就是TX,RX以及波特率产生器组成,操作比较简单 ...
- C51单片机模拟I2C总线驱动程序设计
/********************************** I2C总线驱动 ******************************** 模块名:I2C总线驱动 型号:I2C 功能描述 ...
- Linux I2C设备驱动编写(二)
在(一)中简述了Linux I2C子系统的三个主要成员i2c_adapter.i2c_driver.i2c_client.三者的关系也在上一节进行了描述.应该已经算是对Linux I2C子系统有了初步 ...
- 【转】Linux I2C设备驱动编写(二)
原文网址:http://www.cnblogs.com/biglucky/p/4059582.html 在(一)中简述了Linux I2C子系统的三个主要成员i2c_adapter.i2c_drive ...
- i2c设备驱动注册
Linux I2C设备驱动编写(二) 原创 2014年03月16日 23:26:50 在(一)中简述了Linux I2C子系统的三个主要成员i2c_adapter.i2c_driver.i2c ...
随机推荐
- WebLogic Server的单点登陆功能--转载
在WebLogic 8.1最新的 SP4版本中,最引人注目的要算是在安全方面,提供了用于和Microsoft Windows客户端进行Single Sign-On的Single Pass Negoti ...
- Java设计模式02:常用设计模式之工厂模式(创建型模式)
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Fact ...
- android 实现垂直的ProgressBar
I had recently come across the need for a vertical progress bar but was unable to find a solution us ...
- 10.8 noip模拟试题
1.花 (flower.cpp/c/pas) [问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的 ...
- java的List接口的实现类 ArrayList,LinkedList,Vector 的区别
Java的List接口有3个实现类,分别是ArrayList.LinkedList.Vector,他们用于存放多个元素,维护元素的次序,而且允许元素重复. 3个具体实现类的区别如下: 1. Array ...
- C#中的三种 加密解密
刚刚学会的C#的加密与解密(三种)MD5加密/RSA加密与解密/DES加密.也是刚刚申请的blog随便发布一下. (一).MD5加密 MD5 md5 = new MD5CryptoServicePro ...
- 判断浏览器是否支持FileReader
1.js代码: //判断浏览器是否支持FileReader if (typeof FileReader == "undefined") { document.write(" ...
- 获取Android studio中的SHA1
因为想要弄一下百度地图. 然后要申请一个key. 需要SHA1. 按window键 +R 输入cmd 进入C:\Users\Administrator路径 输入cd .android,进行.andro ...
- asp.net 实现对xml文件的 读取,添加,删除,修改
用于修改站内xml文件 已知有一个XML文件(bookstore.xml)如下:<?xml version="1.0" encoding="gb2312" ...
- VsSharp:一个VS扩展开发框架(上)
上篇:设计 一.引子 自2008年起开发SSMS插件SqlSharp(er)的过程中,有一天发现多数代码都大同小异,就像这样. Commands2 commands = (Commands2)_app ...