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 ...
随机推荐
- 深入N皇后问题的两个最高效算法的详解 分类: C/C++ 2014-11-08 17:22 117人阅读 评论(0) 收藏
N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 一. 求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算 ...
- iOS--iOS7摄像头识别二维码功能
iOS–iOS7摄像头识别二维码功能 属性介绍: AVFoundation 框架基于以下几个类实现图像捕捉 ,通过这些类可以访问来自相机设备的原始数据并控制它的组件. AVCaptureDevice ...
- heap堆内存不足
配置jvm内存,加个启动参数 -Xms512m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256m start 下面是这个: -Dcatalina.h ...
- Android&Java的学习新的等
学习资料 很久没写博客了.适逢这次Srtp项目学弟学妹们要学习Java与Android,我就总结一些学习的教材.方法,分享写材料与心得.纯个人观点,如有不周之处欢迎指出,大家共同探讨提高. *** 教 ...
- 发现并认为这是jQuery1.4.4的一个Bug
说起来还觉得丢人,公司的系统开发了两年,目前jquery的版本还是用的1.4.4. mantis上的Bug一堆,今天在改bug的时候发现一个jQuery的Bug. 改bug嘛,一开始总是各种调试,总感 ...
- 关于禁止ViewPager预加载问题【转】
转自:http://blog.csdn.net/qq_21898059/article/details/51453938#comments 我最近上班又遇到一个小难题了,就是如题所述:ViewPage ...
- C# 内存管理优化畅想----前言
C#语法简洁.优雅,类库丰富,是我最喜爱的计算机语言,没有“之一”.但是,经过深入学习后发现,C#的内存管理,也就是通常所说的垃圾回收(GC)机制,虽然跟其他支持GC的语言相比,已经很优秀了,但与手动 ...
- @PostConstruct与@PreDestroy
从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解(Annotion):@PostConstruct和@PreDestroy.这两个注解被用来修饰一个非静态的vo ...
- CSS3 颜色值HSL表示方式&简单实例
HSL色彩模式:就是色调(Hue).饱和度(Saturation).亮度(Lightness)三个颜色通道的改变以及它们相互之间的叠加来获得各种颜色,色调(Hue)色调最大值360,饱和度和亮度有百分 ...
- eclipse代码注释的设置
http://blog.csdn.net/shiyuezhong/article/details/8450578 1. eclipse用户名的设置: 在eclipse的安装路径下,打开eclipse. ...