51单片机的单CPU仿真器的设计

发布者:Wanderlust123最新更新时间:2011-10-27 手机看文章 扫描二维码
随时随地手机看文章
引言

  单片机以它的廉价、体积小、可塑性强、稳定性高的特性,有着广阔的市场前景。 在用单片机开发产品时,虽然许多厂家设计了可编程ISP单片机,但是从安全与便捷方面考虑,单片机仿真器仍然是开发人员不可或缺的工具。单片机仿真器在产品开发阶段可用来替代单片机进行软硬件调试,从而迅速发现、纠正程序中的错误,大大缩短单片机开发的周期。但实际中仿真器过于昂贵,因此,设计制作出一款廉价且实用的仿真器有着广泛的市场。

  传统的单片机仿真器硬件系统一般有三种实现方法。一、采用专用仿真的单片机。二、采用两套单片机,一个单片机用于仿真,并完成诸如通讯,中断等功能;另一个单片机则用于目标单片机,这样其资源不会被占用。三、用目标单片机作为仿真器,单片机即仿真器也作目标机的单片机用,其实质是一种ROM监控器。第三种方法会占用单片机的部分资源,但结构简单,对于特定的开发者来说,实用性强,性价比高,且易于自行制作。本文开发设计的仿真器正是基于第三种原理,巧妙实现了数据空间与程序空间的互换,设计出一款实用廉价的仿真器,工程实践性强。

原理及系统结构

  仿真器工作时,要把程序从PC机下载到仿真器的存储器中。在此先详细分析51单片的存储器结构和寻址方法,再分析片外存储器的扩展,最后给出设计原理并分析系统结构。


图1 存储空间分布

51单片机存储器结构分析

  8051单片机的存储器在物理结构上分为程序存储器空间和数据存储器空间,共有4个存储空间:片内程序存储器、片外程序存储器以及片内数据存储器、片外数据存储器空间。这种程序存储和数据存储分开的结构形式被称为哈佛结构。但从用户的角度,8051存储器地址空间可分为3类:片内、片外统一编址0000H~FFFFH的64KB程序存储器地址空间(用16位地址);64KB片外数据存储器地址空间,地址也从0000H~FFFFH(用16位地址)编址;256B片内数据存储器地址空间(用8位地址)。

  上述4个存储空间地址是重叠的,如图1所示。8051的指令系统设计了不同的数据传送指令以区别这4个不同的逻辑空间:CPU访问片内、片外ROM指令用MOVC,访问片外RAM指令用MOVX,访问片内RAM指令用MOV。

  程序存储器用于存放编好的程序和表格常数。程序通过16位程序计数器寻址,寻址能力为64KB。这使得指令能在64KB的地址空间内任意跳转,但不能使程序从程序存储器空间转移到数据存储器空间。

  实际上,当引脚EA接高电平时,8051的程序计数器PC执行片内ROM中的程序,当指令地址超过片内ROM地址时,就自动转向片外ROM中去取指令。当引脚EA接低电平(接地)时,8051片内ROM不起作用,CPU只能从片外ROM中取指令,地址可以从0000H开始编址。8051从片内程序存储器和片外程序存储器取指时的执行速度相同。

存储器外扩 

  用P0口作地址/数据复用总线,用P2口的口线作高位地址线,最多可以扩展64KB的存储器。控制信号线包括:使用ALE作为地址锁存的选通信号,以实现低8位地址的锁存;以PSEN信号作为扩展程序存储器的读选通信号;以EA信号作为内、外程序存储器的选择信号;以EA和作为扩展数据存储器和I/O端口的读、写选通信号。执行MOVX指令时,RD和WR信号分别自动有效。片外数据存储器RAM的读和写由8051的RD(P3.7)和WR(P3.6)信号控制,而片外程序存储器的输出允许(OE)由读选通PSEN信号控制。尽管片外数据存储器和片外程序存储器共处同一地址空间,但由于控制信号及使用的数据传送指令不同,故不会发生总线冲突。


图2 仿真器原理图

仿真器原理与结构

  由于现在以8051为内核的单片机几乎都带有内部的FLASH程序存储器。如本设计中要用到的AT89C51或AT89S51均自带4KB的FLASH程序存储器,有的单片机带有20KB甚至更大容量的程序存储器。因此在单片机开发中,很少用专门的程序存储器芯片来扩展外部程序存储器,通常也没有必要。基于以上这些因素,下面分析本文中的仿真器实现的原理。

  下载程序时,EA接高电平,单片机执行内部ROM中的程序,把PC机的程序数据下载到片外的RAM62256中;当程序数据下载完后,在保持RAM62256不掉电的情况下,将单片机的EA接低电平,并把单片机复位。这样单片机就只能从片外存储器中读数据。然后利用RD与PSEN相“与”来选通RAM62256的读允许片选端OE,使得单片机能够从RAM62256中读出程序。这样就实现了仿真功能。因为单片机从片内程序存储器和片外程序存储器取指时的执行速度相同,所以这个设计方案下的仿真器性能比起传统仿真器毫不逊色。

  总系统电路原理如图2所示,系统由单片机AT89C51、地址锁存器74LS373、片外存储器62256、接口电平转换芯片MAX232和相关控制电路组成。

  其中AT89C51就是仿真器的核心部件,晶体振荡电路和复位电路与普通单片机系统相同。不同的是:EA接一个单刀双投开关,表面上没有扩展ROM。RAM62256的与OE普通单片机系统的接法有所不同,系统中把RD与PSEN相“与”,令其选通RAM62256的读允许片选端OE,就能促成RAM(注意:整个过程中RAM不掉电)由数据空间的角色向程序空间的角色转换。在执行MOVX指令时,产生RD,WR信号,写入程序信息。在执行RAM中的程序时,由PSEN信号与RD信号选通RAM62256的OE端,实现从RAM62256中程序的读入。

软件设计

  PC机(上位机)软件可以参考Windows驱动程序开发、串口调试助手等相关书籍;也可以利用现成的KEIL C51的Windows集成开发环境~VISION51和软件仿真器DSCOPE51完成。

  下位机软件的主要任务就是设置串口和接收上位机串口发送来的数据,并将数据存入外部“数据”存储器中。

单片机主程序如下:
MOV  SCON,#50H  ;串口方式 1
MOV  TMOD,#20H  ;T1 方式 1
MOV  TL1,#0FDH  ;波特率 9600 的常数
MOV  TH1,#0FDH
SETB  TR1          ;开中断
SETB   ET1
SETB    ES
SETB    EA
系统“写”时用如下指令:
MOVX  @DPTR,A
MOVX  @Ri, A

  在中断服务子程序中,为区别所接收的信号是联络信号还是字节数、是数据还是校验和,需要设立不同的标志位如下:
 FLAG0  BIT  00H ;接收联络信号标志位
 FLAG1  BIT  01H ;接收字节数标志位
 FLAG2  BIT  02H ;接收数据标志位
 FLAG3  BIT  03H ;接收文件结束标志位    

  程序流程如图3所示,其中R7为接收到的字节数,接收的数据一定要存入片外RAM从0000H开始的单元中。当单片机复位后,把RAM当作程序存储器时,PC是从0000H开始的。


图3 单片机接收中断服务子程序流程图

几点讨论

(1) 系统中不需要单独的仿真器电源,也不需要晶振电路。
(2) 下位机的片外存储器在重复写数时不用擦除,每次重新下载程序时,总是用覆盖的方式。新下载的程序都有END为结束,就算新下载的程序比原来的短,也不会执行多余的代码。
(3) 在实际中,可以进一步改进电路,当文件下载完之后,通过串口备用的信号线产生控制信号来控制和复位,从而使得全过程均由上位机控制。
(4) 由于内部结构的限制,被仿真的产品不能扩展片外的程序存储器,但由于片外可以扩展64KB的数据存储器,文中只用了32KB,因此还可以扩展一定的外设。
(5) 被仿真产品的E(--)A(--)的接法有一定的限制,不能直接接地或接电源正极,实际中只要加上一个合适的限流电阻(如10K?)就可以了。实际上这种方案可以适用于任何可以外扩存储器的单片机。

结束语

  对以上的设计进行分析不难发现,整个系统各个功能模块技术非常成熟:在硬件方面,各子电路均有现存的电路套用,而且各个元器件的参数容易确定;在软件方面,仅涉及到COM口的串行通信程序及上位机的界面程序。在实际的制作过程中,系统的元器件数目少且价格低廉,容易调试,成功率高,性能稳定。

引用地址:51单片机的单CPU仿真器的设计

上一篇:基于8051单片机的函数发生器的设计
下一篇:基于单片机的具有通讯口的智能温控表设计

小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved