




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验八 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-4us2、 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 SCLLOP0: JNB SDA,LOP DJNZ R4,LOP0 ;循环255次LOP: ACALL DEL CLR SCL RET接收时的应答信号ACK1: CLR SDA ;数据线置低 SETB SCL ;时钟线置高 NOP NOP CLR SCL ;时钟线置低 SETB SDA ;数据线置高 RET3、 字节的发送和接收写周期时序图 一字节数据发送子程序,流程如下:开始时钟线置低累加器左移一位数据传送时钟线置高一个应答信号周期结束8位信号完否?YN图6-22 发送子程序流程图(2)一字节数据接收子程序,流程如下:开始数据线置高时钟线置高数据传送累加器左移一位时钟线置低结束8位信号完否YN图6-23 接收子程序流程图7、写操作(1)字节写图6-24 字节写时序图流程如下:写器件命令应答信号器件地址应答信号数据地址应答信号停止信号延时结束开始信号图6-25 字节写的流程图(2)页写图6-26 页写时序图页写流程如下:写器件命令应答信号器件地址应答信号数据地址应答信号停止信号开始信号写数据字节初值数据地址-1数据写完否?YN7图6-27 页写流程图8、读操作(1)选择读图6-28 选择读时序图图6-29 NO ACK时序图(2)连续读图6-30 连续读时序图四、 实验原理图: I2C总线电路图五、 实验例题:例题一 编写一程序,实现I2C的指定字节读写,用24C08来记录单片机复位或者开机的次数,并将复位或者开机的次数显示在数码管上。程序分析 本程序利用单片机复位时程序总是从0000H开始执行的特性。用24C08的一个单元来存储开机的次数,程序一开始就将次数读出来,加上本次的开机,显示在数码管上。再将加1之后的数据存入24c08的对应单元。程序代码 ;*;*程序功能:实现对24C08的字节读写,用24C08记录开机次数,显示在数码管上;*程序编写: 李代勇;*编写日期: 2007/2/04;*;*;初始化数据设置;* SDAEQU P1.7 ;定义数据线为P1.7(实验板上已固定,不可更改) SCLEQU P1.6 ;定义始终线为P1.6 I2C_AddrEQU10H ;定义地址缓冲区,存储要读写24C08的单元地址 I2C_Data EQU12H ;用于缓冲要读写的数据 D_BUF0EQU55H ;数码管显示缓冲区(个位) D_BUF1EQU56H ;数码管显示缓冲区(十位) D_BUF2EQU57H ;数码管显示缓冲区(百位) FLAGBIT00H ;定义标志位,确定百位是否等于0,不等于0置1;*;程序段:主程序;* ORG 0000H LJMP START ORG 0030HSTART: 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 ;数据加工WAIT: LCALL DISPLAY ;显示数据 AJMP WAIT;*;函数名称:DATAEDIT;输入参数:I2C_Data;输出参数:D_BUF0,D_BUF1,D_BUF2;函数功能:处理数据,确定每一位数码管要显示的数字,; 因为01,只要求显示1,10只要求显示10(而不是显示010); 101要求显示101;*DATAEDIT: MOV A,I2C_Data MOV B,#100 DIV AB JZ L1 ;根据百位是否等于0确定百位的显示 MOV D_BUF2,A ;百位不等于0,直接显示百位的数字 SETB FLAG ;百位不等于0,标志位置1 AJMP NEXL1: MOV D_BUF2,#25 ;百位等于0,对百位赋一个超过段码个数的值NEX: MOV A,B ;对十位数的处理 MOV B,#10 DIV AB ;根据十位是否等于0确定十位的显示 JZ L2L3: MOV D_BUF1,A ; 十位等于0,百位不等于0,显示十位的数字 AJMP NEX1L2: JB FLAG,L3 ;十位等于0,判断百位是否也为0 MOV D_BUF1,#22 ;百位、十位等于0,十位赋超过段码个数的值NEX1: MOV D_BUF0,B ;个位的赋值 RET;*;函数名称:DISPLAY;输入参数:D_BUF0,D_BUF1,D_BUF2;输出参数:无;占用资源:R6,R7,R0;函数功能:将D_BUF0,D_BUF1,D_BUF2显示在数码管上;*DISPLAY:MOV R6,#3 MOV R7,#0FEH MOV DPTR,#TAB MOV R0,#D_BUF0LOPP1: MOV A,R0 MOVC A,A+DPTR MOV P0,A MOV P2,R7 LCALL DELAY5MS ;动态扫描延时,消除余辉效应 INC R0 MOV A,R7 RL A MOV R7,A DJNZ R6,LOPP1 NOP RET;*;函数名称:DELAY5MS;输入参数:无;输出参数:无;占用资源:60H,61H,62H;函数功能:延时5MS(24MHz晶振);*DELAY5MS: MOV 60H,#1DDD2: MOV 61H,#20DDD1: MOV 62H,#248 DJNZ 62H,$ DJNZ 61H,DDD1 DJNZ 60H,DDD2 RET;*;函数名称:I2C_WRITE;输入参数:I2C_Addr,I2C_data;输出参数:无;函数功能:24C08字节写,将I2Cdata写入24C08的Address地址单元;*I2C_WRITE: I2C_WRITE_A: ACALL I2C_START MOV A,#10100000B LCALL I2C_SEND8BIT LCALL I2C_ACK JC I2C_WRITE_ARS_ADDR:MOV A,I2C_Addr LCALL I2C_SEND8BIT LCALL I2C_ACK JC RS_ADDRRS_DATA:MOV A,I2C_Data LCALL I2C_SEND8BIT LCALL I2C_ACK JC RS_DATA LCALL I2C_STOP LCALL DELAY10MS RET;*;函数名称:I2C_READ;输入参数:I2C_Addr;输出参数:I2C_Data;函数功能:24C08指定字节读,将24C08的Address地址单元的内容读到I2Cdata;*I2C_READ: I2C_READ_A: LCALL I2C_START MOV A,#10100000B LCALL I2C_SEND8BIT LCALL I2C_ACK JC I2C_READ_ARS_ADDR2:MOV A,I2C_Addr LCALL I2C_SEND8BIT LCALL I2C_ACK JC RS_ADDR2 LCALL I2C_STARTREAD_ADDR: MOV A,#10100001B LCALL I2C_SEND8BIT LCALL I2C_ACK JC READ_ADDR ACALL I2C_RECEIVE8BIT MOV I2C_Data ,A ACALL I2C_ACK LCALL I2C_STOP RET;*;函数名称:I2C_START;输入参数:无;输出参数:无;函数功能:实现24C08启动时序的编写;*I2C_START: SETB SCL SETB SDA NOP ;TSU:STA 延时时间最少0.6us,另外还有一个值为4us NOP CLR SDA NOP ;THD:STA 延时时间最少0.6us,另外还有一个值为4us NOP CLR SCL NOP NOP NOP RET;*;函数名称:I2C_STOP;输入参数:无;输出参数:无;函数功能:实现24C08停止时序的编写;* I2C_STOP: CLR SDA SETB SCL NOP ;TSU:STO 延时时间最少0.6us,另外还有一个值为4us NOP SETB SDA NOP ;TBUF 新的发送开始前的总线空闲时间,1.2us,还有一个为4.7us NOP NOP RET;*;函数名称:I2C_ACK;输入参数:无;输出参数:C;函数功能:实现24C08应答时序的编写;*I2C_ACK: SETB SDA SETB SCL NOP NOP JB SDA,I2C_ACK0 CLR C AJMP I2C_ACK_ENDI2C_ACK0: SETB CI2C_ACK_END: CLR SCL RET;*;函数名称:I2C_SEND8BIT;输入参数:A;输出参数:无;函数功能:24C08发送8位数据;*I2C_SEND8BIT: MOV B,#08HI2C_SEND8BIT_A: RLC A MOV SDA,C SETB SCL NOP NOP CLR SCL DJNZ B,I2C_SEND8BIT_A RET;*;函数名称:I2C_RECEIVE8BIT;输入参数:无;输出参数:A;函数功能:24C08接收8位数据;*I2C_RECEIVE8BIT: MOV B,#08H CLR A SETB SDAI2C_RECEIVE8IT_A: SETB SCL NOP NOP MOV C,SDA RLC A CLR SCL DJNZ B,I2C_RECEIVE8IT_A RET;*;函数名称:DELAY10MS;输入参数:无;输出参数:无;函数功能:实现10MS延时(24MHz晶振);*DELAY10MS: MOV 40H,#2D2: MOV 41H,#20D1: MOV 42H,#248 DJNZ 42H,$ DJNZ 41H,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 林芝市中石化2025秋招笔试模拟题含答案炼化装置操作岗
- 2025年法院辅警招聘真题及答案
- 中国联通哈密市2025秋招市场与服务类专业追问清单及参考回答
- 西安市中石油2025秋招面试半结构化模拟题及答案市场营销与国际贸易岗
- 东莞市中石油2025秋招面试半结构化模拟题及答案油品分析质检岗
- 中国移动岳阳市2025秋招笔试行测题库及答案供应链采购类
- 丹东市中石化2025秋招面试半结构化模拟题及答案新材料与新能源岗
- 白城市中石化2025秋招笔试模拟题含答案油田工程技术岗
- 漯河市中石油2025秋招网申填写模板含开放题范文
- 2025年船厂挂钩考试题及答案
- 建设工程各方安全管理制度清单及法规依据
- 医疗设备备品备件保障方案
- 小红书种草营销师(初级)认证考试真题试题库(含答案)
- 人教版数学四年级上册-第五单元《平行四边形和梯形》练习题(含答案)
- 零工市场(驿站)运营管理 投标方案(技术方案)
- 新《全面质量管理(习题集)》考试题库(含答案)
- 农村建房的邻居协议书模板
- 水杨酸软膏剂的制备
- 《铁皮石斛的介绍》课件
- JCT478.2-2013 建筑石灰试验方法 第2部分 化学分析方法
- 大数据、智慧城市与智慧交通(上)
评论
0/150
提交评论