课程设计报告(1).doc_第1页
课程设计报告(1).doc_第2页
课程设计报告(1).doc_第3页
课程设计报告(1).doc_第4页
课程设计报告(1).doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课 程 设 计 报 告课程设计名称:单片机运用课程设计课程设计题目:基于I2C总线的存储器扩展目录一.课程设计内容介绍 3 1、I2C总线特征3 2、I2C总线术语3 3、I2C总线接口 EEPROM存储器4二.课程设计原理 41.I2C总线工作原理 42.I2C总线器件的寻址方式 53.I2C总线数据操作 54.I2C总线的传送格式 65.I2C总线的传输过程 6三.概要设计 8 1.课设题目粗略分析 82.原理图介绍8 3.模块分析9四.调试与分析 171.调试过程 17一、 课程设计内容介绍I2C(InterIntegrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。1、I2C总线特征、只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL;、每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器; 、它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏; 、串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s; 、连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。2、I2C总线术语发送器:发送数据到总线的器件; 接收器:从总线接收数据的器件; 主机:初始化发送产生时钟信号和终止发送的器件; 从机:被主机寻址的器件; 多主机:同时有多于一个主机尝试控制总线但不破坏传输; 仲裁:是一个在有多个主机同时尝试控制总线但只允许其中一个控制总线并使传输不被破坏的过程; 同步:两个或多个器件同步时钟信号的过程 。3、I2C总线接口 EEPROM存储器目前,市场上I2C总线接口器件有多种,例如A/D转换器、D/A转换器(PCF8591)、时钟芯片和存储器(24C08)等。这里以典型的I2C总线接口的存储器为例进行介绍。I2C总线接口EEPROM存储器是一种采用I2C总线接口的串行总线存储器,这类存储器具有体积小、引脚少、功耗低、工作电压范围宽等特点。目前,Atmel、MicroChip、National等公司均提供各种型号的I2C总线接口的串行EEPROM存储器。在单片机系统中使用较多的EEPROM存储器是24系列串行EEPROM。其具有型号多、容量大、支持I2C总线协议、占用单片机I/O端口少,芯片扩展方便、读写简单等优点。在实际应用中,往往遇到所使用的单片机没有I2C总线接口,例如典型的 51系列单片机。为了让此类单片机用于操作I2C总线器件的能力,需要在程序模拟I2C总线数据传输协议,通常将51系列单片机的P3.4作为SCL,P3.5作为SDA。二、 课程设计原理1、 I2C总线工作原理典型的I2C总线系统结构,如图所示。I2C总线上可以挂接多个器件,其中每个器件必须都支持I2C总线通信协议。2、I2C总线器件的寻址方式由于所有器件都通过SCL和SDA连接在I2C总线上,因此,主器件在进行数据传输前需要通过寻址,选择需要通信的从器件。I2C总线上所有外围器件都需要有唯一的7位地址,由器件地址和引脚地址两部分组成。器件地址是I2C器件固有的地址编码,器件出厂时就已经给定,不可更改。引脚地址是由I2C总线外围器件的地址引脚(A2,A1,A0)决定,根据其在电路中接电源正极、接地或悬空的不同,形成不同的地址代码。3、 I2C总线数据操作在I2C总线上,数据是伴随着时钟脉冲,一位一位地传送的,数据位由低到高传送,每位数据占一个时钟脉冲。I2C总线上的在时钟线SCL高电平期间,数据线SDA的状态就表示要传送的数据,高电平为数据1,低电平为数据0。在数据传送时,SDA上数据的改变在时钟线为低电平时完成,而SCL为高电平时,SDA必须保持稳定,否则SDA上的变化会被当作起始或终止信号而致使数据传输停止。I2C总线在传送数据过程中共有三种类型信号:开始信号、停止信号和应答信号。开始信号:SCL保持高电平的状态下,SDA出现下降沿。出现开始信号以后,总线被认为“忙”。时序:起始信号用于开始I2C总线通信。其中,起始信号是在时钟线SCL为高电平期间,数据SDA上高电平向低电平变化的下降沿信号。起始信号出现以后,才可以进行后续的I2C总线寻址或数据传输等。停止信号:SCL保持高电平的状态下,SDA出现上升沿。停止信号过后,总线被认为“空闲”。时序:终止信号用于终止I2C总线通信。其中,终止信号是在时钟线SCL为高电平期间,数据线SDA上低电平到高电平变化的上升沿信号。终止信号一出现,所有I2C总线操作都结束,并释放总线控制权。终止信号的时序。 起始信号时序 终止信号时序应答信号:接收数据的器件在接收到8位数据后,向发送数据的器件发出特定的低电平脉冲,表示已收到数据。 时序:应答信号用于表明I2C总线数据传输的结束。 I2C总线数据传送时,一个字节数据传送完毕后都必须由主器件产生应答信号。主器件在第9个时钟位上释放数据总线SDA,使其处于高电平状态,此时从器件输出低电平拉低数据总线SDA为应答信号。应答信号的时序, 应答信号时序4、 I2C总线的传送格式I2C总线的传送格式为主从式,对系统中的某一器件来说有四种工作方式:主发送方式、从发送方式、主接收方式、从接收方式。以AT24C08为例,主器件产生开始信号以后,发送的第一个字节为控制字节。前七位为从器件的地址片选信号。最低位为数据传送方向位(高电平表示读从器件,低电平表示写从器件),然后发送一个选择从器件片内地址的字节,来决定开始读写数据的起始地址。接着再发送数据字节,可以是单字节数据,也可以是一组数据,由主器件来决定。从器件每接收到一个字节以后,都要返回一个应答信号(ASK=0)。主器件在应答时钟周期高电平期间释放SDA线,转由从器件控制,从器件在这个时钟周期的高电平期间必须拉低SDA线,并使之为稳定的低电平,作为有效的应答信号。5、 I2C总线的传输过程在I2C总线的传输过程中,发送到SDA信号线上的每个字节必须8位,无论是读操作还是写操作,首先传输的是器件的控制字节,传送完每个字节后必须等待接收器返回的响应信号ACK。控制字节 在起始条件之后,必须是器件的控制字节,其中,高四位为器件类型识别符(不同的芯片类型有不同的定义,E2PROM为1010),接着三位为片选,最低位为读写控制位,为“1”时为读操作,为“0”时为写操作。主机启动数据传输后,将根据主机是向从机写数据还是从从机读取数据开始数据发送或接受。 写操作 写操作分为字节写和页面写两种操作。对于字节写,外部设备(主器件)发送数据传输起始信号,器件地址码和“确认”应答后紧跟一个8位地址,存储器收到地址后,通过SDA发出的确认应答信号,外部设备发送停止信号来结束写信号,此时芯片进入内部定时的写周期。 对于页面写的操作与字节写操作类似,只是数据传输设备不需要在第一个字节输入后发送停止信号,在整个页面的所有字节写完之后,数据传送设备在SDA线上通过发送停止信号来结束页面写操作。写操作时序读操作 读操作有三种基本操作:当前地址读、随机读和顺序读。当前地址读操作:芯片内部有一个地址计数器,它保留接收到的最后地址并能自动加1;在收到器件地址并且R/W位为1时,芯片发出认可信号,并送出8位的数据地址;外部器件不回应确认地址,但回应一个停止信号,芯片接受后不再发送。随机读:随机读需要一个“空”字节操作将芯片内部地址计数器指针调到需要读的位置单元的前一个地址上,芯片确认器件地址码后,将当前地址单元的数据串行输出到SDA线上,数据读取设备后不发送确认信号,而是回应一个停止信号来结束本次操作。顺序读:顺序读可以从“当前地址读取”或“随机读”开始,当数据设备受到一个数据字节后不发送停止信号,而是回答一个“确认”信号,一旦芯片接收到“确认”信号,则将地址计数器的地址加1,并使地址单元中的数据从SDA线上串行输出,只要数据读取设备不发出停止信号,顺序读操作仍继续进行,要终止顺序读操作,设备发出停止信号即可结束本次操作。应当注意的是,为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电平,然后发出停止条件。 顺序读操作时序图三、 概要设计1、 课设题目粗略分析 将80C51单片机的P3.4作为SCL、P3.5作为SDA构造I2C总线。在I2C总线上并联两块AT24C08存储器OP1和OP2。程序执行时,首先从存储器OP1的地址4中读取测试次数num,根据num的值确定应读出的数据:当num为偶数时,从存储器OP1的地址2中读取原始数据到sec变量中,并在数码管P2.0、P2.1显示;采用定时中断方式改变数据sec的值,通过I2C总线将sec数据写入两块存储器的地址2内,同时在数码管P2.6、P2.7显示sec值,按键K6=P33在数码管P2.3、P2.4显示存储器OP2的地址2所存储的数据,验证数据已存储;num为奇数时,从存储器OP2的地址3中读取原始数据到sec变量中,并在数码管P2.6、P2.7显示;采用定时中断方式改变数据sec的值,通过I2C总线将sec数据写入两块存储器的地址3内,同时在数码管P2.6、P2.7显示sec值,按键K6=P33在数码管P2.3、P2.4显示存储器OP1的地址3所存储的数据,验证数据已存储。当一次实验结束后,改变num的值,并将num的值重新写入存储器OP1的地址4。按键K5=P32进行清0。2 原理图介绍功能模块图系统流程图多次循环3、模块分析相关宏定义及参数:#defineOP1_READ 0xa1 /第一块存储器器件地址以及读取操作,0xa1即为1010 0001B#define OP2_READ 0xaf / 第二块存储器器件地址以及读取操作,0xaf即为1010 1111B#defineOP1_WRITE 0xa0 / 第一块存储器器件地址以及写入操作,0xa1即为1010 0000B#define OP2_WRITE 0xae / 第二块存储器器件地址以及写入操作,0xae即为1010 1110Bsbit SCL=P34; /将串行时钟总线SCL位定义在为P3.4引脚sbit SDA=P35; /将串行数据总线SDA位定义在为P3.5引脚unsignedchar code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /定义共阳数码管显示字型码 unsigned char sec=0; /定义计数值,每过1秒,sec加1 unsigned char text=0; /定义测试值unsigned char num=0; /定义实验次数值unsigned int count; /定时中断次数 bit write=0; /写24C08的标志;sbit shiwei_1=P20; /存储器OP1十位选通定义sbit shiwei_2=P26; /存储器OP2十位选通定义sbit gewei_1=P21; /存储器OP1个位选通定义sbit gewei_2=P27; /存储器OP2个位选通定义 sbit shiwei=P23; /测试位十位定义sbit gewei=P24; /测试位个位定义sbit K5=P32; /清0按键sbit K6=P33; /测试按键 a) I2C协议起始信号 始信号用于开始I2C总线通信。其中,起始信号是在时钟线SCL为高电平期间,数据SDA上高电平向低电平变化的下降沿信号。起始信号出现以后,才可以进行后续的I2C总线寻址或数据传输等。模块程序: void start() / 开始位 SDA = 1; /SDA初始化为高电平“1” SCL = 1; /开始数据传送时,要求SCL为高电平“1”起始信号时序 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期_nop_(); /等待一个机器周期 SDA = 0; /SDA的下降沿被认为是开始信号 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期_nop_(); /等待一个机器周期 SCL = 0; /SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递) b) I2C协议终止信号用于终止I2C总线通信。其中,终止信号是在时钟线SCL为高电平期间,数据线SDA上低电平到高电平变化的上升沿信号。终止信号一出现,所有I2C总线操作都结束,并释放总线控制权。程序如下:void stop()/ 停止位 SDA = 0; /SDA初始化为低电平“0” SCL = 1; /结束数据传送时,要求SCL为高电平“1” 终止信号时序 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SDA = 1; /SDA的上升沿被认为是结束信号 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SDA=0; SCL=0;c) I2C协议应答信号时序应答信号用于表明I2C总线数据传输的结束。 I2C总线数据传送时,一个字节数据传送完毕后都必须由主器件产生应答信号。主器件在第9个时钟位上释放数据总线SDA,使其处于高电平状态,此时从器件输出低电平拉低数据总线SDA为应答信号。程序如下:bit Ask() /检测应答 bit ack_bit; /储存应答位 应答信号时序 SDA = 1; / 发送设备(主机),应在时钟脉冲的高电平期间(SCL=1)释放SDA线,以让SDA线转由接收设备(AT24Cxx)控制_nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SCL = 1; /根据上述规定,SCL应为高电平_nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期_nop_(); /等待一个机器周期 ack_bit = SDA; /接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节若送高电平,表示没有接收到,传送异常 结束发送 SCL = 0; /SCL为低电平时, SDA上数据才允许变化(即允许以后的数据传递return ack_bit; / 返回AT24Cxx应答位d) 写操作在字节写模式下 主器件发送起始命令和从器件地址信息 R/W位置零 给从器件 在从器件产生应答信号后 主器件发送16的字节地址 主器件在收到从器件的另一个应答信号后 再发送数据到被寻址的存储单元 再次应答 并在主器件产生停止信号后开始内部数据的擦写。在内部擦写过程中从器件不再应答主器件的任何请求。 写操作时序程序如下:/*函数功能:向AT24Cxx的当前地址写入数据入口参数:y (储存待写入的数据)*/void WriteCurrent(unsigned char y) start();unsigned char i;for(i = 0; i 8; i+)/ 循环移入8个位 SDA = (bit)(y&0x80); /通过按位“与”运算将最高位数据送到S/因为传送时高位在前,低位在后_nop_(); /等待一个机器周期 SCL = 1; /在SCL的上升沿将数据写入AT24Cxx _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SCL = 0; /将SCL重新置为低电平,以在SC线形成传送数据所需的个脉冲y = 1; /将y中的各二进位向左移一位/*函数功能:向两块AT24Cxx中选择一块并从指定地址写入数据入口参数:add (储存指定的地址);dat(储存待写入的数据);OP_WRITE(器件地址)*/void WriteSet(unsigned char add, unsigned char dat,unsigned char OP_WRITE) / 在指定地址addr处写入数据WriteCurrentstart(); /开始数据传递WriteCurrent(OP_WRITE); /选择要操作的AT24Cxx芯片,并告知要对其写入数据 Ask();WriteCurrent(add); /写入指定地址Ask();WriteCurrent(dat); /向当前地址(上面指定的地址)写入数据Ask();stop(); /停止数据传递delaynms(4); /1个字节的写入周期为1ms, 最好延时1ms以上e) 读操作分为当前地址读、随机读和顺序读。为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电平,然后发出停止条件。程序如下:/*函数功能:数据读取函数,从AT24Cxx读取数据。*/unsigned char ReadData() / 从AT24Cxx移入数据到MCUunsigned char i;unsigned char x; /储存从AT24Cxx中读出的数据for(i = 0; i 8; i+)SCL = 1; /SCL置为高电平x=1; /将x中的各二进位向左移一位x|=(unsigned char)SDA; /将SDA上的数据通过按位“或“运算存入x中SCL = 0; /在SCL的下降沿读出数据return(x); /将读取的数据返回/*函数功能:从两块AT24Cxx中选择一块并从当前地址读取数据(当前地址读)入口参数:OP_WRITE(器件地址)出口参数:x (储存读出的数据) */unsigned char ReadCurrent(OP_READ)unsigned char x;start(); /开始数据传递WriteCurrent(OP_READ); /选择要操作的AT24Cxx芯片,并告知要读其数据Ask();x=ReadData(); /将读取的数据存入xstop(); /停止数据传递return x; /返回读取的数据/*函数功能:从两块AT24Cxx中选择一块并指定地址读取数据 (顺序读)入口参数:set_addr OP_WRITE出口参数:x */unsigned char ReadSet(unsigned char set_addr,unsigned char OP_WRITE)/ 在指定地址读取start(); /开始数据传递WriteCurrent(OP_WRITE); /选择要操作的AT24Cxx芯片,并告知要对其写入数据Ask();WriteCurrent(set_addr); /写入指定地址Ask();if(OP_WRITE=OP1_WRITE) return(ReadCurrent(OP1_READ); /从指定地址读出数据并返回else if(OP_WRITE=OP2_WRITE)return(ReadCurrent(OP2_READ);f) LED显示函数利用数码管显示从AT24C08存储器中读出的数据sec,根据num值不同而显示不同存储器数据。其中OP1占用P2.0、P2.1,OP2占用P2.6,P2.7。/*/void LEDshow(int i) /LED显示函数,其中P2.0、P2.1显示存储器OP1的值,P2.6、P2.7显示存储器OP2的值 if(i=2) P0=tablesec/10; shiwei_1=0;shiwei_2=1; delaynms(2); shiwei_1=1; P0=tablesec%10; gewei_1=0;gewei_2=1; delaynms(2); gewei_1=1;else if(i=3) P0=tablesec/10; shiwei_1=1;shiwei_2=0; delaynms(2); shiwei_2=1; P0=tablesec%10; gewei_1=1;gewei_2=0; delaynms(2); gewei_2=1;void LEDshow_text() /LED测试显示函数 P0=tabletext/10; shiwei=0; delaynms(2); shiwei=1; P0=tabletext%10; gewei=0; delaynms(2); gewei=1;g) 主函数读取测试次数num的值进行判断,控制单片机利用定时中断方式改变数据sec的值,并通过I2C总线对两块AT24C08存储器的读取和写入。按键K5=P32进行清0。 void main(void) TMOD=0x01; /定时器0工作在方式1ET0=1; EA=1; TH0=(65536-50000)/256; /对TH0 TL0赋值TL0=(65536-50000)%256; /使定时器0.05秒中断一次 SDA = 1; / SDA=1,SCL=1,使主从设备处于空闲状态SCL = 1;num=ReadSet(4,OP1_WRITE); /从OP1的指定地址读出测试次数numif(num=3) /根据num值确定应读出的数据 num=2;sec=ReadSet(num,OP1_WRITE); /从OP1的地址2读出保存的数据赋于sec text=ReadSet(num,OP2_WRITE);else num=3; sec=ReadSet(num,OP2_WRITE);/从OP2的地址3读

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论