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(主+从)的更多相关文章

  1. MSP430的IO口模拟I2C总线对AT24C25进行读写程序

    功能: 实现MSP430口线模拟I2C总线协议与24C04通信.                                           ** 描述: 主系统工作时钟为12MHz,I2C工 ...

  2. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

     版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...

  3. stm32 普通IO口模拟串口通信

    普通IO口模拟串口通信 串口通信协议 串口传输 默认 波特率9600 1起始位 1停止位 其他0 数据位是8位(注意图上的给错了). 传输时,从起始位开始,从一个数据的低位(LSB)开始发送,如图从左 ...

  4. 为 MaixPy 加入软 I2C 接口(移植 MicroPython 的 I2C)

    起因 本文的重心为讲解如何为一款芯片移植和实现 micropython 的通用组件,但会顺带解释不同芯片的工作方式和特性. 国际惯例,先有起因,再谈问题的解决,所以记得上次总结的 关于 K210 Ma ...

  5. 驱动之SPI,UART,I2C的介绍与应用20170118

    这篇文章主要介绍基本的驱动也是用的最多的协议类驱动中的SPI,I2C和UART.首先从最简单的UART也就是串口讲起: 1.UART UART由两根线也就是TX,RX以及波特率产生器组成,操作比较简单 ...

  6. C51单片机模拟I2C总线驱动程序设计

    /********************************** I2C总线驱动 ******************************** 模块名:I2C总线驱动 型号:I2C 功能描述 ...

  7. Linux I2C设备驱动编写(二)

    在(一)中简述了Linux I2C子系统的三个主要成员i2c_adapter.i2c_driver.i2c_client.三者的关系也在上一节进行了描述.应该已经算是对Linux I2C子系统有了初步 ...

  8. 【转】Linux I2C设备驱动编写(二)

    原文网址:http://www.cnblogs.com/biglucky/p/4059582.html 在(一)中简述了Linux I2C子系统的三个主要成员i2c_adapter.i2c_drive ...

  9. i2c设备驱动注册

      Linux I2C设备驱动编写(二) 原创 2014年03月16日 23:26:50   在(一)中简述了Linux I2C子系统的三个主要成员i2c_adapter.i2c_driver.i2c ...

随机推荐

  1. 使用 asp.net mv4开发企业级办公OA

    大家好!这是我第一次写asp.net 开发笔记,哪里写的不好,请见谅! 本程序是一个在线办公(OA)系统 B/S项目: 项目开发环境:Microsoft Visual Studio 2012 + Sq ...

  2. Markdown写接口文档,自动添加TOC

    上回说到,用Impress.js代替PPT来做项目展示.这回换Markdown来做接口文档好了.(不敢说代替Word,只能说个人感觉更为方便)当然,还要辅之以Git,来方便版本管理. Markdown ...

  3. JAVA导出Excel封装

    1.数据bean public class ExcelBean { private String name; private String sheetName; private ExcelTitle[ ...

  4. Html5新增的语义化标签(部分)

    2014年10月29日,万维网联盟宣布,经过接近8年的艰苦努力,html5的标准规范终于制定完成.这是互联网的一次重大变革,这也许是一个时代的来临! 总结一些h5新增的语义化标签,记录下来方便自己学习 ...

  5. Linux试玩指令开机关机

    Linux内核最初只是由芬兰人李纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的. Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和U ...

  6. win2008 64位下.net 无法访问oracle

    这两天换了台新机子,就想弄个新系统win2008 64bit来测试下,也尝尝新鲜,结果是碰的头破血流啊,哈哈就像挖宝似的 环境:win2008 64bit + IIS7+.net2.0 +ORACLE ...

  7. SQL server 使用触发器跨数据库备份数据

    create database TriggerTest create table transInfo2 --交易信息表 ( cardID ) not null, --卡号 transType ) no ...

  8. Android OpenGL ES 3.0 纹理应用

    本文主要演示OpenGL ES 3.0 纹理演示.接口大部分和2.0没什么区别,脚本稍微有了点变化而已. 扩展GLSurfaceView package com.example.gles300; im ...

  9. angularjs-ngTable select filter

    jsp <td title="'Status'" filter="{status: 'select'}" filter-data="fn.sta ...

  10. OpenSSL安装及目录介绍

    1. 下载安装OpenSSL 2. 根据需要下载安装Visual C++ Redistributable 3. 安装完成OpenSSL后,目录结构如下所示 其中,bin文件夹下是OpenSSL主程序的 ...