当前位置:文档之家› 实验八 IIC通信协议

实验八 IIC通信协议

实验八I2C通信协议

一、实验目的:

1、培养学生阅读资料的能力;

2、加深学生对I2C总线通信协议的理解;

3、加强学生对模块化编程的理解;

二、实验环境:

1、硬件环境:PC机一台、单片机实验板一块、母头串口交叉线、USB电源线;

2、软件环境:keil uVision2集成开发环境;

STC-ISP下载上位机软件;

三、实验原理:

要学会I2C通信协议的编程,关键是要看懂并掌握其时序图,理解对I2C通信协议相关子程序的实验编写。I2C通信协议的总线时序图如下所示:

I2C总线时序图

I2C相关子程序的详细介绍

1、起始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

2、结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

起始信号和结束信号的时序图如下所示:

起始信号和结束信号的时序图

起始信号的流程如下:

1、SCL和SDA拉高,保持时间约为0.6us-4us;

2、拉低SDA,保持时间为约为0.6us-4us;

3、拉低时钟线

结束信号的流程如下:

1、SCL置高电平,SDA置低电平,保持时间约为0.6us-4us

2、SDA拉高,保持时间约为1.2-4us;

应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。

若未收到应答信号,由判断为受控单元出现故障。应答信号的时序图如下所示:

应答时序图

发送时的应答信号

;**********应答信号**********

ACK: SETB SDA ;数据线置高

SETB SCL ;时钟线置高

ACALL DELAY

JB SDA,$ ;等待数据线变低

ACALL DELAY

CLR SCL ;时钟线置低

RET

注意:这里如果数据线一直为高将进入死循环,所以一般我们都会在这做一个容错的处理。具体的程序如下:

ACK: MOV R4,#00H

SETB SDA

SETB SCL

LOP0: JNB SDA,LOP

DJNZ R4,LOP0 ;循环255次

LOP: ACALL DEL

CLR SCL

RET

接收时的应答信号

ACK1: CLR SDA ;数据线置低

SETB SCL ;时钟线置高

NOP

NOP

CLR SCL ;时钟线置低

SETB SDA ;数据线置高

RET

3、字节的发送和接收

写周期时序图一字节数据发送子程序,流程如下:

图6-22 发送子程序流程图

(2)一字节数据接收子程序,流程如下:

图6-23 接收子程序流程图

7、写操作

(1)字节写

图6-24 字节写时序图流程如下:

图6-25 字节写的流程图(2)页写

图6-26 页写时序图页写流程如下:

8、读操作

(1)选择读

图6-28 选择读时序图

图6-29 NO ACK时序图

(2)连续读

图6-30 连续读时序图

四、实验原理图:

I2C总线电路图

五、实验例题:

例题一编写一程序,实现I2C的指定字节读写,用24C08来记录单片机复位或者开机的次数,并将复位或者开机的次数显示在数码管上。

程序分析本程序利用单片机复位时程序总是从0000H开始执行的特性。用24C08的一个单元来存储开机的次数,程序一开始就将次数读出来,加上本次的开机,显示在数码管上。再将加1之后的数据存入24c08的对应单元。

程序代码

;************************************************************************** ;****程序功能:实现对24C08的字节读写,用24C08记录开机次数,显示在数码管上;****程序编写: 李代勇

;****编写日期: 2007/2/04

;************************************************************************** ;************************************************************************** ;初始化数据设置

;************************************************************************** SDA EQU P1.7 ;定义数据线为P1.7(实验板上已固定,不可更改)SCL EQU P1.6 ;定义始终线为P1.6

I2C_Addr EQU 10H ;定义地址缓冲区,存储要读写24C08的单元地址I2C_Data EQU 12H ;用于缓冲要读写的数据

D_BUF0 EQU 55H ;数码管显示缓冲区(个位)

D_BUF1 EQU 56H ;数码管显示缓冲区(十位)

D_BUF2 EQU 57H ;数码管显示缓冲区(百位)

FLAG BIT 00H ;定义标志位,确定百位是否等于0,不等于0置1

;************************************************************************** ;程序段:主程序

;************************************************************************** ORG 0000H

LJMP START

ORG 0030H

START: MOV SP,#70H

MOV I2C_Data ,#00H

MOV I2C_Addr,#0FH

ACALL I2C_READ

MOV I2C_Data ,A ;读出数据

INC I2C_Data

MOV I2C_Addr ,#0FH ;更新数据

ACALL I2C_WRITE

LCALL DATAEDIT ;数据加工

相关主题