《嵌入式课程设计doc》由会员分享,可在线阅读,更多相关《嵌入式课程设计doc(15页珍藏版)》请在金锄头文库上搜索。
1、1嵌入式系统嵌入式系统 课程设计课程设计专专 业:业: 电子信息工程电子信息工程 班班 级:级: 1205 班班 学学 号:号: 姓姓 名:名: 设计题目:设计题目: 2015 年年 10 月月2课程设计评分表姓 名班 级学 号课设题目指导教师评分项目满分分值得分封面5页面布局10目录格式5图表质量8文档格式页眉页脚2内容完整性10内容逻辑性10设计文档(60分)文档内容内容正确性10程序功能14编程规范8编程文档8程序代码/实物演示(40 分)实物演示10总评成绩指导教师评语签名: 年 月 日3EEPROM 读写设计读写设计(一)设计要求(一)设计要求本课设计题所的系统要求实现以下功能。 串
2、口会打印信息:写入的数据和读出的数据是一致的。(二)设计目的(二)设计目的了解 I2C 总线的工作原理; 学习 I2C 总线与单片机的接口方法; 学习串行 EEPROM 芯片 24CXX 系列的读写方法。(3)所用仪器设备所用仪器设备电脑、keil51 和 proteus 软件(4)方案选择方案选择由于用 IIC 串行总线读写 EEPROM 我们不能直观的观察他们的读写现象,所以我们 选择的是用液晶 1602 进行读写显示,用 4*4 矩阵键盘进行读写控制和数字的输入,选用 AT89C51 为主控制器,选用 AT24C02 进行存储。所以这个课程设计主要分为三个模块:1、 IIC 串行总线读写
3、 EEPROM 模块; 2、2、 液晶显示模块; 3、3、 矩阵键盘控制模块:(五)系统设计(五)系统设计1 1写操作写操作写数据过程: 1)主控在检测到总线空闲的状况下,首先发送一个 START 信号掌管总线; 2)发送一个控制字节(包括 7 位器件地址码和一位 R/W);(某些器件的地址字节可 能带有其他功能) 3)当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);4)主控收到 ACK 后开始发送第一个数据字节; 5)被控器收到数据字节后发送一个 ACK 表示继续传送数据,发送 NACK 表示传送数据 结束; 6)主控发送完全部数据后,发送一个停止位 STOP,结
4、束整个通讯并且释放总线;写 数据时序。(1 1)字节写操作)字节写操作字节写操作以来自于主器件的起始位开始, 4 位控制码紧随其后(图 3)。接下来 的 3 位是存储块寻址位(不带地址输入引脚的器件)或片选位(带地址输入引脚的器件) 。然后主发送器将 R/W 位(该位为逻辑低电平)发送到总线。从器件在第九个时钟周期4产生一个确认位,主器件发送的第二个字节是地址字节或高位地址字节。24XX 器件会对 每一个地址字节作出确认,并把地址位锁存进器件内部的地址计数器。对于 24XX00 器 件,只使用地址字节的低 4 位。高 4 位可为任意值。送出最后一个地址字节后, 24XX 器件发出确认信号 AC
5、K。主器件在接收到该确认信号后即发送数据字,该数据字将被写 入已寻址的存储器位置。24XX 器件再次发出确认信号,之后主器件产生停止条件,启动 内部写周期。如果在 WP 引脚保持高电平时进行存储器写操作,器件会确认命令,但不 会启动写周期,也不会写入数据,而会立即接受新的命令。写命令为一个字节,在发送 写命令后,内部地址计数器增加,指向下一个要寻址的位置。写周期期间, 24XX 不会 对命令进行确认。(注:图中控制字节指器件地址码和读写控制位;地址字节指器件内部的储存器地址。 下同。)(2 2)页写入操作)页写入操作页写入操作时,被控器件完成一个写字节操作后内部地址计数器自动加一。写控制 字节
6、、字地址字节和首个数据字节以和写操作字节基本相同的方式发送给 24XX 器件 (见图 4 )。不同的是,主器件发送的是多至一整页的数据字节(1),而不是停止条 件,这些数据字节临时存储在片内页缓冲器中。在主器件发送停止条件之后,这些数据 将被写入存储器。每接收一个字,内部地址计数器加一。如果在停止条件产生前,主器 件有超出一页的数据要发送,地址计数器将会翻转,先前写入的数据将被覆盖。对于字 节写操作,一旦接收到停止条件,内部写周期开始。在写周期期间, 24XX 器件不会对 命令作出确认。页写入操作在一页内可以写入任意个数的数据(最多为一页),并且可 以在此页中的任意地址开始写入。被寻址的数据只
7、能在该页内变动。如果在 WP 引脚保 持高电平时进行存储器写操作,器件会确认命令,但不会启动写周期,也不会写入数据, 而是立即接受新的命令。图 3 字节写操作图 4 页写入操作52 2确认查询确认查询在写周期期间器件不会对命令作出确认,这可用来确定写周期何时完成(这个特点 可以优化总线的吞吐量,使其最大化) 。如果主器件已经发出写命令的停止条件,器件 将启动内部定时写周期。可以随时进行确认查询。这包括在主器件发出起始条件后,再 发送用于写命令(R/W = 0)的控制字节。如果器件仍处在写周期内,则不返回确认信号。 一旦没有返回确认信号,起始位和控制字节必须重新发送。如果写周期结束,器件返回 确
8、认信号,主器件就可以执行下一个读或写命令。参见流程图( 图 9)。3 3读操作读操作读数据过程: 1)主控在检测到总线空闲的状况下,首先发送一个 START 信号掌管总线; 2)发送一个控制字节(包括 7 位器件地址码和一位 R/W);(某些器件的地址字节可 能带有其他功能) 3)当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);4)主控收到 ACK 后释放数据总线,开始接收第一个数据字节; 5)主控收到数据后发送 ACK 表示继续传送数据,发送 NACK 表示传送数据结束; 6)主控发送完全部数据后,发送一个停止位 STOP,结束整个通讯并且释放总线; 除了控制寄存
9、器的 R/W 位设置为1外,读操作与写操作基本相同。有三种基本 的读操作:当前地址的读操作、随机读操作和连续读操作 。 (1 1)当前地址的读操作)当前地址的读操作 当前地址的读操作,被控器件内部储存器地址计数器保留最后一次访问的地址。 24XX 内置一个自动加1地址计数器,该计数器保留最后一次访问的地址。因此,如 果先前对地址n(n 为任意合法地址)进行读或写操作,则下一条读操作命令将可能 从地址n+1 访问数据。接收到R/W 位设置为1的控制字节后,24XX 发出确认信号, 并发送 8 位数据字节。主器件不会对数据传输作出确认,但会产生停止条件,24XX 即 停止数据发送(图5)(2 2)
10、随机读操作)随机读操作随机读操作允许主器件以随机方式访问任意存储器,主控器件先发写命令,然后发 要读的地址,然后发读命令。执行该指令前必须先设置地址字节。作为写操作的一部分, 通过发送字节地址给24XX 来完成地址字节的设置(R/W 设置为0)。字节地址发送 完后,主器件一接收到确认信号即产生起始条件。内部地址计数器设置完之后写操作即 被终止。主器件再次发送控制字节,而该字节中 R/W 位设置为1。之后24XX 会发出图 5 当前地址读操作6确认信号, 并发送8 位数据字节。主器件不会对数据传输作出确认,但会产生停止条件,24XX 即停止数据发送(图6)。在随机读取命令之后,内部地址计数器加1
11、 指向下一条 地址。(3 3)连续读操作)连续读操作连续读操作的起动过程和随机读操作相同,只是在24XX发送完第一个数据字节后, 主器件发出确认信号,而在随机读操作中发送的是停止条件,在连续读操作时被控器件 完成一个读字节操作后内部地址计数器自动加一。确认信号指示24XX 器件发送下一个连 续地址的数据字节(图7)。在24器件向主器件发送完最后一个字节后,主器件不会产生 确认信号,而是产生停止条件。为了可以进行连续读操作, 24XX 器件内置了一个地址 指针,在每次操作完成后该指针加1。地址指针允许一次操作连续读取整个存储器的内容。 在达到最后一个地址字节后,地址指针将翻转到地址 0x00。六
12、具体设计过程六具体设计过程1 1程序流程图程序流程图图 6 随机读操作图 7 连续读操作7启动 I2C 总线发送控制字节检测应答信号 ACK发送第一个数据字节检测应答信号 ACK继续传送数据发送停止位,释放 I2C 总线完成数据的写操作传送数据结束NYNY图 8 写数据的流程图8发送写命令发送停止条件 以启动写周期发送起始位发送控制字节 (其中 R/W = 0)下一步操作器件确认否? (ACK = 0)?NY图 9 确认查询流程图9启动 I2C 总线发送控制字节检测应答信号 ACK释放总线,接收第一个数据字节检测应答信号 ACK继续接收数据发送停止位,释放 I2C 总线完成数据的读操作传送数据
13、结束NYNY2 2系统组成模块结构及功能系统组成模块结构及功能(1 1)函数定义)函数定义 函数定义是对各个基础函数的定义,并且设置需要运用的信息,便于调用 #include #include#include #define DELAY_TIME 60 /*延时时间*/#define TRUE 1/*设置ACK*/ #define FALSE 0/*定义0为错误*/ sbit SCL=P17; sbit SDA=P16; /*假设由P1.7和P1.6控制*/ void DELAY(unsigned int t) /*延时函数*/ void I2C_Start(void) /*启动I2C总线*/
14、 void I2C_Stop(void) /*终止I2C总线*/ void SEND_0(void) /* 设置时钟,发送0,在SCL为高电平时使SDA信号为低*/ void SEND_1(void) /* 设置时钟,发送1,在SCL为高电平时使SDA信号为高*/10bit Check_Acknowledge(void) /*发送完一个字节后检验设备的应答信号*/ void WriteI2CByte(char b)reentrant/*向I2C总线写一个字节*/ char ReadI2CByte(void)reentrant/*从I2C总线读一个字节*/ void Write_One_Byte
15、(char addr,char thedata) /*字节写入函数*/ void Write_A_Page(char *buffer,char addr) /*页写入函数*/ char Read_One_Byte(char addr) /*随机读函数*/ void Read_N_Bytes(char *buffer,char n,char addr) /*顺序读函数*/(2 2)主函数)主函数 main(main( ) )主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,然后 初始化图形系统,调用函数 Write_One_Byte(char addr,char thedata
16、) 完成字节写入, 调用Write_A_Page(char *buffer,char addr) 完成页写入,调用 Read_One_Byte(char addr) 完成随机读,调用Read_N_Bytes(char *buffer,char n,char addr) /*完成顺序 读*/。 void main() int i;char mybyte;char myarray8;char myarray28;char rdarray16;for(i=0;i#include#include #define DELAY_TIME 60 /*经实验,不要小于 50!否则可能造成时序混乱*/#define TRUE 1#define FALSE 0 sbit SCL=P17;/*假设由 P1.7 和 P