找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1839|回复: 0
打印 上一主题 下一主题
收起左侧

基于单片机I2C总线数字存储IC卡设计资料

[复制链接]
跳转到指定楼层
楼主
随着单片机扩展越来越多,单片机的存储单元和数据总线传输端口并不足够支持外部设备的扩展和数据的传输。如何解决单片机外部总线和存储器的扩展成为一个必须解决的问题之一。
本文基于I2C总线数字存储IC卡设计,以AT89S52单片机为核心,以汇编语言作为软件设计程序的外部存储IC卡设计。I2C总线是一种简单、双向二线制同步串行总线,它只需要两条线(串行时钟线和串行数据线)即可在连接于总线上的器件之间的传送信息。主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。本设计并辅以键盘进行数据的写入和地址的选择,由LCD进行写入数据的选择和显示。在单片机端加入读写提示指示灯使用户能够更好的知道单片机的工作状况。LCD、键盘、指示灯更大程度的提高了I2C总线数字存储IC卡使用时的人机交互。使本装置更加偏向实用。
本设计以Keil软件进行程序的编写,再联调Proteus软件进行物理仿真,深化和扩充了在单片机原理及相关方面的基本知识、基本理论和基本技能熟悉设计过程,了解设计步骤,掌握设计内容,培养设计电路、实现软件编程和编写设计说明书能力的目的,为今后从事相关方面的实际工作打下良好基础。

1.2 I2C总线的主要特性
1.总线只有两条线,串行时钟线和串行数据线;
2.每个连到总线上的器件都可由软件以唯一的地址寻址,并建立简单的主-从关系,主器件既可作为发送器,也可作为接收器;
3.它是一个真正的多主总线,带有竞争检测和仲裁电路,可使多主机任意同时发送而不破坏总线上的数据;
4.同步时钟允许器件通过总线以不同的波特率进行通信;
5.同步时钟可以作为停止和重新启动串行口发送的握手方式;
6.连接到同一总线的集成电路数只受400 pF的最大总线电容的限制;
I2C总线极大地方便了系统设计者,无须设计总线接口,因为总线接口已经集成在片内了,而使设计时间大为缩短,并且从系统中移去或增加集成电路芯片对总线上的其他集成电路片没有影响。I2C总线的简单结构便于产品改型或升级,改型或升级时只需从总线上取消或加相应的集成电路芯片即可。

1.使用AT89C52单片机、I2C串行AT24C02存储器、4×4键盘、6位LED显示器和2个发光二极管(D1和D2)设计一个基于I2C总线数字存储IC卡。
2.通过键盘向IC卡写入256个任意数据,并在6位LED显示器上显示存储单元和写入的相应数据,例如:10H:66,写入一个数据点亮一次发光二极管D1。
3.通过键盘输入存储单元地址,将已写入IC卡该单元的数据读出,并在6位LED显示器上显示存储单元和读出的相应数据,例如:30H:88,读出一个数据点亮一次发光二极管D2。
4.鼓励新创意,增加新功能。

设计内容和设计要求
1.采用AT89C52单片机作为主控芯片,设计硬件电路。
2.采用AT89C52单片机汇编语言,完成软件编程。
3.采用Keil和Proteus软件完成系统的硬件设计、软件编程及系统调试。
2.3 功能说明
利用AT89C52单片机作为核心部件,对AT24C02存储卡进行指定地址的内容写入。数据的读取和写入通过键盘来进行控制。写入数据时,由键盘给出要写入的数据,单片机进行地址的给定,写入数据指示灯亮,LCD第一行显示写入的数据,第二行显示该数据所存储的地址。读取数据时,由键盘给出要读取数据的地址,单片机通过I2C进行数据的读取,读取数据指示灯亮,LCD第一行显示你所输入的数据的地址,第二行显示该地址所存储的数据。按键的输入采用矩阵式查询方法进行按键的输入,LCD通过对位的控制进行分别显示。24C02C存储卡进行数据的存储,通过过SCK和SDA来控制。

3.1 利用I2C总线进行系统扩展

I2C总线接口的电气结构如图3.1所示,组成I2C总线的串行数据线SDA和串行时钟线SCL必须经过上拉电阻Rp接到正电源上,连接到总线上的器件的输出级必须为“开漏”或“开集”的形式,以便完成“线与”功能。SDA和SCL都为双向I/O口线,总线空闲时皆为高电平。总线上数据传送最高速率可达100KB/s。


图3.1 I2C总线接口电气结构

I2C总线上可以实现多主双向同步数据传送,所有主器件都可发出同步时钟,但由于SCL接口的“线与”结构,一旦一个主器件时钟跳变为低电平,将使SCL线保持为低电平直至时钟达到高电平,因此SCL线上时钟低电平期间由各器件中时钟最长的低电平时间决定,而时钟高电平时间则由高电平时间最短的器件决定。

为了使多个主机数据能够正确传送,I2C总线中带有竞争检测和仲裁电路。总线竞争的仲裁及处理由内部硬件电路来完成。当两个主器件发送相同数据时,不会出现总线竞争。当两个主器件发送不同数据时,才出现总线竞争。其竞争过程如图3.2所示。当某一时刻主器件1发送高电平,而主器件2发送低电平, 此时由于SDA的“线与”作用,主器件1发送的高电平在SDA线上反映的是主器件2的低电平状态,这个低电平状态通过硬件系统反馈到数据寄存器中,与原有状态比较,因不同而退出竞争。

图3.2 总线竞争过程

I2C总线可以构成多主数据传送系统,但只有带CPU的器件可以成为主器件。主器件发送时钟、启动位、数据工作方式,从器件则接收时钟及数据工作方式。接收或发送由数据的传送方向决定。I2C总线上数据传送时的启动、结束和有效状态都由SDA、SCL的电平状态决定,在I2C总线规程中启动和停止条件规定如下。

①启动条件:在SCL为高电平时,SDA出现一个下降沿,则启动I2C总线。

②停止条件:在SCL为高电平时,SDA 出现-一个上升沿,则停止使用I2C总线。

除了启动和停止状态,在其余状态下,SCL 的高电平都对应于SDA的稳定数据状态。每一个被传送的数据位由SDA线上的高、低电平表示,对于每一个被传送的数据位都在SCL线上产生一个时钟脉冲。时钟脉冲在高电平期间时,SDA线上的数据必须稳定,否则将被认为是控制信号。SDA只能在时钟脉冲SCL为低电平期间时改变。

启动条件执行后总线为“忙”,在结束信号过后的一定时间内总线被认为是“空闲”的。在启动和停止条件之间可传送的数据不受限制,但每个字节必须为8位。首先传送最高位,采用串行传送方式,但在每个字节之后必须跟一个响应位。主器件收/发每个字节后产生一个时钟应答脉冲,在这期间,发送器必须保证SDA为高,由接收器将SDA拉低,称为应答信号(ACK)。主器件为接收器时,在接收了最后一个字节之后不发应答信号,也称为非应答信号(NOT ACK)。当从器件不能再接收另外的字节时,也会出现这种情况。I2C总线的数据传送如图3.3所示。

图3.3 I2C总线的数据传送

3.2 24C02与AT89C52单片机接口的Proteus仿真电路3.2.1仿真电路

如图3.4所示为24C02与AT89C52单片机接口的Proteus仿真电路,给出一个采用普通AT89C52单片机模拟IC总线时序来扩展串行外部EEPROM存储器24C02。24C02 是一种I2C接口EEPROM器件,它具有256x8位的存储容量,工作于从器件方式,每个字节可擦/写100万次,数据保存时间大于40年。写入时具有自动擦除功能,还有页写入功能,可一次写入16字节。24C02 芯片采用8脚DIP封装,有Vcc、Vss 电源引脚,SCL、SDA通信引脚,A0、A1、A2地址引脚和WP写保护引脚。WP脚接Vcc时,禁止写入高位地址(100H~1FFH), WP脚接Vss时,允许写入任何地址。A1和A2决定芯片的从机地址,可接Vcc或Vss, A0不用,应接Vcc或Vss。

图3.4 24C02C与AT89C52单片机接口电路的仿真电路图


  1. ACK     BIT   10H        ;应答标志位
  2. SLA     EQU  50H        ;器件地址字
  3. SUBA    EQU  51H        ;器件子地址
  4. NUMBYTE EQU  52H        ;读/写字节数
  5. SDA     BIT   P1.7
  6. SCL     BIT   P1.6       ;单片机i/o口线定义
  7. MTD     EQU   30H        ;发送数据缓存区首地址(30H~3FH)
  8. MRD     EQU   40H        ;接收数据缓存区首地址(40H~4FH)
  9.         ORG   0000H
  10.                   LJMP  MAIN        ;跳转到主程序
  11.                   ORG   0030H
  12. ;***********************************************************
  13. ; IWRNBYTE子程序
  14. ; 功能:向器件指定子地址写n个数据
  15. ; 相关入口参数:器件地址字SLA(代表哪个器件),子地址SUBA(代表数据要往哪放),发送区首地址 MTD,发送的字节数NUMBYTE
  16. ;***********************************************************
  17. IWRNBYTE: MOV    R3,#NUMBYTE
  18.           LCALL  START       ;启动总线
  19.           MOV    A ,#SLA
  20.                               LCALL  WRBYTE      ;发送器件地址(这一步是为了找到是哪个拓展)
  21.                               LCALL  CACK        ;当ACK=1时说明有应答
  22.                               JNB    ACK,RETWRN   ;如果没有应答的话,直接退出
  23.                               MOV    A, #SUBA       ;把数据要放到哪给了寄存器A
  24.                               LCALL  WRBYTE       ;这一步是为了找到要放的地方(寄存器)
  25.                               LCALL  CACK        
  26.                               MOV    R1,#MTD      ;这一步事单片机要从哪个地方取数据
  27. WRDA:                MOV    A,@R1
  28.           LCALL  WRBYTE        ;要把A里面的数据发送出去,就发送到刚刚找到的单元
  29.           LCALL  CACK                             
  30.                               JNB    ACK,IWRNBYTE   ;如果没有应答则需要重新来过
  31.                               INC    R1             ;有应答的话,则次数加1
  32.                               DJNZ   R3,WRDA
  33. RETWRN:   LCALL STOP
  34.           RET

  35. ;****************************************************************
  36. ; IRDNBYTE子程序
  37. ; 功能:从器件指定子地址读n个数据
  38. ; 相关入口参数:器件地址字SLA(代表哪个器件),子地址SUBA(代表数据要往哪放),接收区首地址 MTD,接收的字节数NUMBYTE
  39. ;***************************************************************
  40. IRDNBYTE: MOV    R3,#NUMBYTE
  41.           LCALL  START       ;启动总线
  42.           MOV    A,#SLA
  43.                               LCALL  WRBYTE      ;发送器件地址(这一步是为了找到是哪个拓展)
  44.                               LCALL  CACK        ;当ACK=1时说明有应答
  45.                               JNB    ACK,RETRDN   ;如果没有应答的话,直接退出
  46.                               MOV    A,#SUBA       ;把数据要放到哪给了寄存器A
  47.                               LCALL  WRBYTE       ;这一步是为了找到要放的地方(寄存器)
  48.                               LCALL  CACK
  49.           LCALL  START       ;重新启动总线                           
  50.           MOV    A,#SLA            
  51.           INC    A
  52.                               LCALL  WRBYTE
  53.                               LCALL  CACK
  54.                               JNB    ACK,IRDNBYTE
  55.                               MOV    R0,#MRD      ;这一步是单片机要从哪个地方取数据
  56. RON1:                LCALL  RDBYTE
  57.           MOV    @R0,A
  58.                               DJNZ   R3,SACK
  59.                               LCALL  MNACK        ; 功能:发送非应答信号子程序
  60. RETRDN:   LCALL STOP
  61.           RET
  62. SACK:                LCALL  MACK                    ; 功能:发送应答信号子程序
  63.           INC R1
  64.                               SJMP RON1
  65.                              
  66. ;***************************************************************
  67. ; 名称:START子程序
  68. ; 功能:启动iic总线子程序,发送iic起始条件
  69. ;***************************************************************
  70. START:  SETB  SDA          ;发送起始条件数据信号
  71.         NOP                ;起始条件建立时间大于4.7us
  72.                             SETB  SCL           ;发送起始条件的时钟信号
  73.                             NOP
  74.         NOP
  75.                             NOP
  76.                             NOP
  77.                             NOP                  ;起始条件锁定时间大于4.7us
  78.                             CLR   SDA            ;发送起始信号
  79.                             NOP
  80.         NOP
  81.                             NOP
  82.                             NOP
  83.                             NOP                  ;起始条件锁定时间大于4.7us
  84.                             CLR   SCL            ;钳住iic总线,准备发送或者接收数据
  85.                             NOP
  86.                             RET

  87. ;****************************************************************
  88. ; 名称:STOP子程序
  89. ; 功能:停止iic总线子程序,发送iic停止条件
  90. ;*****************************************************************
  91. STOP:   CLR  SDA           ;发送停止条件的数据信号
  92.         NOP                ;起始条件建立时间大于4.7us
  93.                             SETB  SCL           ;发送停止条件的时钟信号
  94.                             NOP
  95.         NOP
  96.                             NOP
  97.                             NOP
  98.                             NOP                  ;时间大于4.7us
  99.                             SETB   SDA            ;发送停止信号
  100.                             NOP
  101.         NOP
  102.                             NOP
  103.                             NOP
  104.                             NOP                  ;延迟时间大于4.7us
  105.                             NOP
  106.                             RET

  107. ;**************************************************************
  108. ; 名称:WRBYTE子程序
  109. ; 功能:发送字节子程序,发送的前面必须是字节数据放入acc
  110. ; ★必须牢牢把握住,我们SDA不管是传送高电平还是低电平,都必须是它先有了值,然后把时钟线置位高电平,就开始传送
  111. ;**************************************************************
  112. WRBYTE:MOV R0,#08H
  113. WLP:    RLC A                 ;取数据位
  114.         JC  WRI
  115.                             SJMP WRO               ;判断数据位
  116. WLP1:   DJNZ R0,WLP
  117.         NOP
  118.                             RET
  119. WRI:    SETB SDA                ;发送1  
  120.         NOP
  121.         SETB SCL
  122.         NOP
  123.         NOP
  124.                             NOP
  125.                             NOP
  126.                             NOP                  ;延迟时间大于4.7us
  127.                             NOP
  128.                             CLR SCL
  129.                             SJMP WLP1
  130. WRO:    CLR SDA                ;发送0
  131.         NOP
  132.         SETB SCL
  133.         NOP
  134.         NOP
  135.                             NOP
  136.                             NOP
  137.                             NOP                  ;延迟时间大于4.7us
  138.                             NOP
  139.                             CLR SCL
  140.                             SJMP WLP1
  141. ;******************************************************************
  142. ; 名称:RDBYTE子程序
  143. ; 功能:读取字节子程序,读出的字节数据放入acc
  144. ; ★这里需要记住的就是,SDA的高低电平就是咱要读取的数据
  145. ;******************************************************************
  146. RDBYTE: MOV R0,#08H
  147. RLP:    SETB SDA
  148.         NOP
  149.                             SETB SCL ;时钟线为高,接收数据位
  150.                             NOP
  151.                             NOP
  152.                             MOV C,SDA
  153.                             MOV A,R2
  154.                             CLR SCL   ;将SCL拉低,时间大于4.7us
  155.                             RLC A
  156.                             MOV R2,A
  157.                             NOP
  158.                             NOP
  159.                             NOP
  160.                             DJNZ R0,RLP
  161.                             RET

  162. ;*****************************************************************
  163. ; 名称:CACK子程序
  164. ; 功能:检查应答位子程序,返回值 ACK=1时表示有应答
  165. ;★这里要注意的是,我们SCL上的时钟信号是按照系统的自己的频率有一个脉冲
  166. ;******************************************************************
  167. CACK: SETB SDA
  168.       NOP
  169.                 NOP
  170.                 SETB SCL
  171.                 CLR ACK
  172.                 NOP
  173.                 NOP
  174.                 MOV C,SDA
  175.                 JC CEND
  176.                 SETB ACK               ;判断应答位
  177. CEND: NOP               
  178.       CLR SCL
  179.                 NOP
  180.                 RET
  181. ;******************************************************************
  182. ; 名称:MACK子程序
  183. ; 功能:发送应答信号子程序
  184. ;******************************************************************
  185. MACK: CLR SDA         ;将SDA置0
  186.       NOP
  187.                 NOP
  188.                 SETB SCL
  189.                 NOP
  190.                 NOP
  191.                 NOP
  192.                 NOP
  193.                 NOP
  194.       CLR SCL
  195.                 NOP
  196.                 NOP
  197.                 RET

  198. ;***************************************************************
  199. ; 名称:MNACK子程序
  200. ; 功能:发送非应答信号子程序
  201. ;***************************************************************
  202. MNACK: SETB SDA         ;将SDA置1
  203.        NOP
  204.                  NOP
  205.                  SETB SCL
  206.                  NOP
  207.                  NOP
  208.                  NOP
  209.                  NOP
  210.                  NOP
  211.        CLR  SCL
  212.                  NOP
  213.                  NOP
  214.                  RET
  215. ;************************************************************
  216. ; 名称:主程序
  217. ;************************************************************
  218. MAIN:  MOV R4,#0F0H       ;延时等待其它芯片复位完成
  219.        DJNZ R4,$
  220. ;发送数据缓存区初始化,将16个连续字节赋值为00H-0FH
  221.        MOV A,#34H
  222.                  MOV R0,#30H
  223. S1:    MOV @R0,A
  224.        INC R0
  225.                  ;INC A
  226.                  CJNE R0,#40H,S1
  227.                  ;
  228.                  ;MOV R0,#32H
  229.                  ;MOV A,@R0
  230.                  ;MOV P3,A
  231.                  ;SJMP $
  232.                
  233. ;向24C02C中写数据,数据存放在24C02C中50H开始的16个字节中
  234.        MOV SLA,0A0H     ;24C02C芯片地址
  235.                  MOV SUBA, 50H    ;片内地址
  236.                  MOV NUMBYTE ,16   ;传送数据字节数
  237.                  LCALL IWRNBYTE      ;写数据
  238.                
  239. DELAY: MOV R5,#20
  240. D1:    MOV R6,#248
  241. D2:    MOV R7,#248
  242.        DJNZ R7,$
  243.                  DJNZ R6,D2  
  244.                  DJNZ R5,D1
  245. ;从24C02C中读数据,数据存放在单片机中50H开始的16个字节中
  246.        MOV SLA,0A0H     ;24C02C芯片地址
  247.                  MOV SUBA, 50H    ;片内地址
  248.        MOV NUMBYTE ,16   ;传送数据字节数
  249.                  LCALL  IRDNBYTE
  250.                  ;SJMP [        DISCUZ_CODE_9        ]nbsp;                             
  251.                  MOV R0,#50H
  252.                  MOV A,@R0
  253.                  MOV P2,A
  254.                  SJMP $
  255.                  END
复制代码

仿真图丢失了,大家自己画一下吧.
Word格式文档51黑附件下载:
单片机51hei设计 1.0版.docx (1.05 MB, 下载次数: 9)


评分

参与人数 1黑币 +40 收起 理由
admin + 40 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表