理工大学学士学位论文
议。
(1)I2C总线时序分析
I2C总线具有以下几点特征:
<1> 只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL; <2> 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器;
<3> 它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏;
<4> 串行的8位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s;
<5> 连接到相同总线的IC数量只受到总线的最大电容400pF 限制。 数据位的有效性
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
图3.12 I2C总线的位传输
启示和停止条件
在I2C总线中,定义了起始条件S和停止条件P两种情况,如图3.13所示。当SCL线是高电平时,SDA线从高电平向低电平切换产生下降沿,这个情况表示起始条件。当SCL线是高电平时,SDA线由低电平向高电平切换产生上升沿,这个情况表示停止条件。起始条件和停止条件一般是由主机产生,总线在起始条件后被认为处于忙的状态,在停止条件的时间里总线被认为处于空闲状态。如果产生重复起始条件而不产生停止条件,总线会一直处于忙的状态,此时的起始条件(S)和重复起始条件(Sr) 在功能上
22
理工大学学士学位论文
是一样的。
图3.13 起始和停止条件
如果连接到总线的器件合并了必要的接口硬件,那么用它们检测起始和停止条件是十分简便的,但是如果没有这种接口的微控制器在每个时钟周期至少要采样SDA线两次来判别是否有电平切换发生。
字节格式
通信过程中发送到SDA线上的每个字节必须为8位,每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位(0是应答,1是非应答)。首先传输的是数据的最高位(MSB),如果从机要完成一些其他功能后才能接收或发送下一个完整的数据字节,可以使时钟线SCL保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL后数据传输继续。
应答响应
数据传输必须带响应,相关的响应时钟脉冲由主机产生。在响应的时钟脉冲期间发送器释放SDA线(高)。在响应的时钟脉冲期间,接收器必须将SDA 线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。通常被寻址的接收器在接收到的每个字节后,除了用CBUS 地址开头的数据,必须产生一个响应。当从机不能响应从机地址时,从机必须使数据线保持高电平,然后主机产生一个停止条件终止传输或者产生重复起始条件开始新的传输。
如果从机接收器响应了从机地址,但是在传输了一段时间后不能接收更多数据字节,主机必须再一次终止传输。这个情况用从机在第一个字节后没有产生响应来表示。从机使数据线保持高电平,主机产生一个停止或重复起始条件。
如果传输中有主机接收器,它必须通过在从机不产生时钟的最后一个字节不产生一
23
理工大学学士学位论文
个响应,向从机发送器通知数据结束。从机发送器必须释放数据线,允许主机产生一个停止或重复起始条件。
读写数据过程
单片机进行写操作时,首先发送该器件的7位地址码和写方向位“0”(共8位,即一个字节),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器在确认是自己的地址后,在SDA线上产生一个应答信号,单片机在收到应答信号后开始传送数据。
单片机进行读数据时,首先发送该器件的7位地址码和写方向位“0”(伪写),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器在确认是自己的地址后,在SDA线上产生一个应答信号。然后,再发送一个字节要读出存储区的首地址,收到应答后,单片机要重复一次起始信号并发出器件地址和读方向位(“1”),收到器件应答后就可以读出数据字节,每读出一个字节,单片机都要回复应答信号。当最后一个字节数据读完后,单片机应返回“非应答”信号(高电平),并发出终止信号结束读操作。
(2)单片机I/O端口作为I2C总线接口
目前,51、96系列的单片机在开发中应用非常广泛,但是由于它们都不具备I2C总线接口,因此限制了具有I2C总线接口的器件在这些系统中使用。通过上面对I2C总线时序的分析,可以用51单片机的两个I/O端口来模拟I2C总线接口[13],实现I2C总线的功能。按照I2C总线的规定:SCL线和SDA线是各设备对应输出状态相“与”的结果,设备可以用输出低电平的方法来延长SCL的低电平时间,以迫使高速设备进入等待状态,从而实现不同速度设备间的时钟同步。因此,即使时钟脉冲的高、低电平时间长短不一,也能实现数据的可靠传送,可以用软件控制I/O口做I2C接口。该毕业设计就是利用单片机的通用I/O口作为I2C总线接口,并由软件控制实现单片机与传感器之间的数据传送。
在该单片机系统中,时钟线是由单片机驱动的,因此用89C52的一根I/O线P2.4作为SCL的信号线,将其设置为输出方式,并由软件控制产生串行时钟信号。另一根I/O线P2.3作为I2C总线的串行数据线,可在软件控制下在时钟的低电平期间读取或输出数据。系统传输数据的过程如下:先由单片机发出一个起始数据信号,接着送出要访问器件的7位地址数据,并等待传感器的应答信号。在收到应答信号之后,根据访问要求进行相应的操作。如果是读入数据,则SDA线可一直设为输入方式,中间不需要改
24
理工大学学士学位论文
变SDA线的工作方式,每读入一个字节均要依次检测应答信号;如果是输出数据,则首先要将SDA设置为输出方式,当发送完一个字节后,需要改变SDA线为输入方式,此时读入传感器的应答信号就完成了一个字节的传送。当所有数据传输完毕后,应向SDA发出一个停止信号,以结束该次数据传输。 3.2.2 液晶显示驱动程序设计
单片机通过对RS、R/W、使能端E和数据总线DB信号的控制,实现将单片机处理后的数据显示在屏幕上的功能。在本毕业设计中,LCD显示四行数据,这就要求不仅要成功控制四个信号,还需要设定合理的显示位置。表3.3是RS、R/W的配合选择决定控制界面的4种模式,表3.4是改变E引脚信号配合读写指令的执行。
表3.3 RS、R/W状态改变4种模式
RS L L H H
表3.4 E信号状态改变功能
E状态 高→低 高 低/低→高
执行动作 I/O缓冲→DR DR→I/O缓冲 无动作
结果
配合/W进行写数据或指令 配合R进行读数据或指令
R/W L H L H
功能说明
单片机写指令到指令暂存器(IR)
读出忙标志(BF)及地址计数器(AC)的状态 单片机写入数据到数据暂存器(DR) MCU从数据寄存器中读出数据
12864液晶显示屏总共有11条基本指令,在驱动程序初始化中只要实现六条指令就能成功显示符号[14]。这六条指令主要包括功能设置、清屏、显示开关控制、输入方式位置、DDRAM地址设置、写数据,它们的指令码描述如表3.5所示。
25
理工大学学士学位论文
表3.5 基本指令表
指令 清除显示 功能设置 显示状态开关 进入点设定 设定DDRAM地址 写数据到RAM 指令码 RS 0 0 0 0 0 1 R/W 0 0 0 0 0 0 D7 0 0 0 0 1 D6 0 0 0 0 0 D5 0 1 0 0 AC5 D4 0 DL 0 0 AC4 D3 0 - 1 0 AC3 数据 D2 0 RE D 1 AC2 D1 0 - C I/D AC1 D0 1 - B S AC0 在这些指令中,清除显示的功能是将DDRAM填满“20H”,并且设定DDRAM的地址计数器到“00H”。功能设置指令中DL=0时,选择4位数据,DL=1时,选择4位数据,RE=1时,选择扩充指令操作,而RE=0时,选择基本指令操作。显示状态开关中,D=1、C=1、B=1分别表示整体显示开关打开、游标打开和游标位置反白允许。进入点设定表示指令在数据读出与写入时,设定游标的移动方向及指令显示位置。设定DDRAM地址的第一行是80H-87H,第二行是90H-97H。写数据到RAM则代表将数据D7-D0的数据写入到内部的RAM中。
在熟悉了LCD显示屏的指令和引脚状态之后,设计该显示模块程序的时候还要遵循以下几点原则:
(1)欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。
(2)显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。
(3)当字符编码为2字节时,应先写入高位字节,在写入低位字节。
(4)模块在接受指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时,BF需为“0”才可接受新指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间要参考指令表中的指令执行时间说明。
液晶显示驱动程序: #ifndef __LCD12864_H__
26