如何仿真单片机的外围设备
摘要:单片机开发需要良好的软件开发环境支持,现国内外已经有若干软件仿真器支持51系列单片机,但外围设备的仿真仍是软件仿真的一个薄弱环节。本文针对目前较为流行的Keil公司的51单片机软件仿真器,介绍如何利用VC++编写动态链接库,仿真单片机外围设备,从而为软件仿真器提出一新思路。
关键词:单片机 仿真 动态链接库
1 问题提出
目前,单片机因其诸多特点,在各行各业中得到了广泛的应用。单片机本身只有一个电子器件,只有和其它器件、设备有机地组合在一起,并配置适当的工作程序(软件)后,才能构成一个单片机的应用系统。因此,单片机的开发包括硬件和软件两个部分。单片机本身没有自开发功能,必须借助于开发工具。近年来,javascript:window.open(this.src);" style="cursor:pointer;"/>随着个人计算机系统的不断普及,国内外推出了不少以PC机为基础的单片机开发系统;而软件模拟仿真器是一种新型的开发方法。这种方法是在PC机上,用软件来实现仿真,并配置一系列相关的服务程序,使用时,只要在PC机上运行该软件包,就可以对目标码程序进行调试。对于那些只是用到单片机内部资源的设计来说,可以在软件仿真器内完成仿真工作。但是,由于目前大多数厂商提供的产品还不能模拟单片机的外围设备(如液晶显示板),所以对于那些用到外部设备的设计来说,软件仿真器则显得力从心了。在这种情况下,笔者利用硬件软化的思想及面向对象、窗口等技术,将外围设备的功能在软件中实现。下面就针对Keil公司的51单片机软件仿真器,介绍如何利用VC++编写动态链接库,仿真单片机外围设备,从而弥补纯软件仿真的不足,最大限度地发挥软件仿真的威力。
2 方案构思
目前,Keil公司出品的51系列单片机软件仿真器已经成为国内流行的软件仿真器之一。Keil uVision2是一个标准的Windows应用程序,集成了C51编译器、A51汇编器、L51连接器、实时操作系统、项目管理器及调试器等,可以完成编辑、编译、链接、调试及仿真等整个开发流程,可以用IDE编译C或汇编源文件。
而单片机软件的设计总要和外部事件打交道,比如响应外部中断,检测某一引脚上输入信号电平的高低,完成A/D转换等;同时某些情况下,还要根据外部信号输出不同的控制信号。如果使用硬件仿真系统或在线调试器时,已有一个实实在在硬件环境,在调试时,可以利用目标系统提供给单片机各种信号的输入,以便测试单片机的实际运行情况。如果使用软件仿真器,没有任何硬件环境可以给出这些外部信号,所以外部信号的输入是面临的一个难题;此外单处常常需要和其它常用器件有机地组合在一起使用,如A/D芯片、液晶显示板等,如何仿真这些常用器件的功能,也是面临的一个难题。
一种解决的方法是,利用Keil提供的调试函数实现。调试函数可以模拟外部设备产生的给CPU的模拟和脉冲输入信号,还可以产生外部中断,周期性更新模拟输入,将串行数据送入片内串行口,解决了外部信号的输入问题。但dScope只支持特殊命令语句及一些特定的表达式,需要花费时间掌握调试命令;而且利用调试函数不能仿真外围设备的界面,不直观。
另一种解决的方法是,利用Keil提供的接口AGSI(Advanced Generic Simulator Interface),用VC++编写动态链接库,仿真单片机外围设备,从而解决外部信号的输入问题及界面问题。Keil提供的SDK是相当于Keil UV2仿真环境的一个插件,以DLL的形式提供在纯软件仿真模式下,仿真A/D芯片、仿真液晶显示板及键盘输入等功能,在PC上就可以开发,调试大部分与界面、功能相关的程序,而不须烧片子来调试、开发,效率将大在提高,成本将大大降低。
另一方面,与单片机配合使用的接口芯片比较固定,接法相对也比较固定,由用户自主开发DLL,模块可以共享,使仿真外围芯片和器件的DLL不断丰富。利用VC++的强大功能以及面向对象,窗口等技术,可以扩展外围设备的仿真功能,实现灵活、通用的面板功能,解决界面不直观的问题。
图3 仿真实现
3 实例分析
下面以传送带控制系统为例,介绍如何编写DLL实时仿真单片机的外围设备,其方法具有普遍意义。
3.1 传送带控制系统的组成原理
图1表示了传送带控制系统的示意图。(漏头中是小球。)
①料箱随传送带按运动方向向前移动。
②当料箱移动到漏斗下方进,传感器B反应,传送带停止运行,漏头落料门打开,单片机对落下的小球计数(通过传感器A计数)。
③当落下的小球数等于装箱数目时,关闭漏斗门,传送带移动。
图4 Debug页
3.2 仿真的具体实现
图2是单片机的硬件电路图。此例中需要仿真的外围设备有:键盘(外供用户输入装箱的小球数目)、传感器(判断料箱是否移动到漏斗下方以及计数)和其它(如传送带)。
具体实现如下:
首先是在调试函数中设置断点,以便查看存储器内容以及控制目标文件与DLL库的执行顺序。其次是DLL的编写:
①加入AGSI.h(其中定义了外部仿真的接口及函数的原型)。
②写初始代码。包括创建AGSI,定义菜单及对话框,定义SFR、VTR,定义中断复位。
③建立用户界面。加入按钮(代表键盘)、指示灯图片(代表传感器)等。
④编写仿真代码,如图3所示。
⑤接口。
*VC中打开菜单Project->Setting,选取Custom Builder页,将编制好的DLL文件拷贝到Keil公司指定的安装路径..下,然后配置环境。
*keil中打开菜单project->Options for Target,选取Debug页,按图4输入。
javascript:window.open(this.src);" style="cursor:pointer;"/>