首页 理论教育 嵌入式技术实训教程:单片机系统仿真与实践

嵌入式技术实训教程:单片机系统仿真与实践

时间:2023-12-01 理论教育 版权反馈
【摘要】:第四章单片机系统仿真与实践本章主要介绍MCS51单片机的仿真工具和仿真开发方法,以及几个仿真开发的实例。接下来将分别在本章和下一章通过两个不同层次对基于8位单片机的嵌入式系统设计进行分析和介绍。4.2软件开发环境Kei l u Vision1.Keil u Vision集成开发环境介绍Keil u Vision是凯尔软件公司出品的51系列兼容单片机C语言软件开发系统,是使用接近于传统C语言的语法来开发软件,其C编译器被称KEIL C51。

嵌入式技术实训教程:单片机系统仿真与实践

第四章 单片机系统仿真与实践

本章主要介绍MCS51单片机的仿真工具和仿真开发方法,以及几个仿真开发的实例。通过利用仿真手段,帮助读者学习掌握8位单片的基本原理和系统开发流程,为进一步学习复杂的应用系统奠定基础。

4.1 单片机系统开发简述

8位的单片机在性能上虽然无法与32位的处理器相提并论,但是,极低的开发使用成本、极大的灵活性、丰富的产品型号,使其在嵌入式应用中占有一席之地,特别是在控制领域,8位单片机系统仍然占据着绝大部分的市场。本章将通过两个层次的介绍,来帮助读者学习掌握8位单片机的基本使用和开发手段。

嵌入式系统既然是计算机系统,那么就一定离不开计算机的硬件和软件。对于软件,很多读者都有一定的认识和动手能力。而对于硬件,很多人则存在着畏难情绪,他们认为硬件系统要比软件系统复杂和高深,从而缺乏设计和开发的勇气。实际上,认为硬件系统的设计比软件设计更困难完全是一种误解,至少在单片机这个层次上是不正确的。我们通常所说的嵌入式硬件,包括MCU、存储部件、外围接口电路这几个部分,虽然每个部分确实都相当复杂,国内公司甚至都没有能力生产,但是掌握其使用却并非想像的那么困难。在嵌入式系统中,硬件系统的设计与实现并不是设计每一个单独的部件,而是开发者根据自己的需要,设计合理的解决方法,从五花八门的元器件中选择合适的器件,搭建满足设计需要的硬件平台。而这个过程,除了那些需要进行特殊信号处理的硬件设计外,一般基于单片机的硬件系统设计并不困难。接下来将分别在本章和下一章通过两个不同层次对基于8位单片机的嵌入式系统设计进行分析和介绍。

第一个层次借助于仿真工具,利用PC机以软件仿真的方式学习单片机的一般开发过程,并掌握单片机常用开发中涉及的通用I/O口使用,中断使用,串行通信定时器/计数器使用,LED、LCD驱动,扫描式键盘及相关程序设计等。通过这一系列相对比较单一的系统设计与验证,我们对单片机的使用会有一个初步的认识。

嵌入式系统的开发与传统应用软件的开发具有的很大不同就是需要特定硬件环境的支持,而设计自己需要的硬件系统,对于初学者而言是有一定难度的。而仿真软件则很好地解决了这个问题。通过PC机下的一个软件,我们就可以根据需要搭建起一个虚拟的原理上的嵌入式硬件环境,并在这个硬件上进行相应的开发和学习嵌入式系统的开发技术。这种学习方式的最大特点就是灵活、低成本和直观。当然,仿真仅仅能够解决基本的原理问题,并不能代替真实的硬件平台,如果要真正开发一些产品,还是只能利用定制硬件环境来满足开发和实?现需要。这主要的是因为仿真软件对于一些技术参数的模拟和实时信号的模拟与真实条件还是存在一定差距,有可能在原理上仿真通过了,但是实际开发出来的系统却无法工作。所以,对嵌入式系统的开发,不但原理上要正确,在实际的参数选择、时序控制、多任务管理等方面都要予以考虑,才能够设计出具有实用价值的产品。在第二个层次,我们将通过对一定的开发实例进行介绍,使读者可以通过这些产品的设计与实现,学习到一些细节性的开发技术。

在第二个层次的开发实例介绍中,将从几个实际产品的开发原理、总体设计、硬件设计、代码解析等几个方面的内容来进行。对每个实例的介绍都分为三个部分:一是对系统原理的介绍,包括系统中涉及的相关标准、协议等内容;二是硬件电路的工作原理,主要是电路原理的设计说明等内容,作为实验或验证平台,读者按照书中介绍的步骤完成设计后,可以制作印制板电路,并通过焊接搭建起系统的硬件环境;三是通过对软件部分系统流程和关键函数代码实现的介绍,帮助读者学习和理解单片机环境下的程序开发方法。

有些读者也许会问,为什么在嵌入式系统开发的介绍中需要对特定的硬件平台进行开发和实现,不是每种单片机都可以买到相应的评估板或是开发板一类的现成产品么?这种想法有一定道理,比如说我们的PC机就是一个通用的平台,所有要解决的问题都只需要通过软件设计的方式去完成,很少有人会为了实现一个功能去修改我们的PC机。嵌入式系统中为什么不是这样的呢?只要每一种单片机都固定做一种硬件平台,选择了这种单片机就相当于选择了这个平台,开发者只需要做软件不就成了么?这种观点倒没有什么错误,只是这与嵌入式系统的设计目标有着很大的出入。

首先,嵌入式系统的设计目标不为通用计算,具有一定的专用性。比如,鼠标就只为了读取坐标,打印机就只用于打印信息,汽车上的ABS就只负责管理刹车等。

其次,设计目标的专用性决定了其硬件电路设计的专用性。还是以打印机为例,如果用一个通用的开发板来实现,那么板上的驱动电路、信号读取电路、通信电路等,如何设计才能做到通用呢?所以,真正解决问题的方法就是定制。

最后,由于嵌入式系统应用条件的限制,硬件体积具有很大的灵活性。比如一台用ARM处理器设计的外设,因为可以使用交流市电供电,就可以在体积、能耗、重量等方面设计宽松些。如果用它来做一个手持式的设备,则其供电电源、能耗、体积、重量等诸多方面都受到很大的限制。这样的两种产品用一个通用的开发板来设计显然是不合适的。

嵌入式系统是计算机系统,相对于我们的PC,其最大的特点就是定制。在实际生产中利用嵌入式技术去解决一个特定的问题,往往是通过为其量身定制一个硬件系统,并以此为基础定制一套相应的软件,构成一个完整的系统来实现的。

采用这种方式的主要优点在于:

(1)不会因为使用通用系统而出现功能部件的冗余,减小系统硬件成本;

(2)通过选择更加符合应用要求的器件,减小系统成本、体积和功耗;

(3)通过对系统硬件和软件的优化,提高系统的性能和可靠性

(4)通过对硬件和软件的加密处理,保护相关知识产权

4.2 软件开发环境Kei l u Vision

1.Keil u Vision集成开发环境介绍

Keil u Vision是凯尔软件公司出品的51系列兼容单片机C语言软件开发系统,是使用接近于传统C语言的语法来开发软件,其C编译器被称KEIL C51。Keil u Vision是一个功能强大的集成开发环境,这个集成开发环境包含编译器、汇编器、实时操作系统、项目管理器、调试器等。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。凯尔公司于2007年被安谋国际科技公司收购,因此,u Vision开发环境也能够很好地支持安谋国际科技公司的ARM系列内核编译。目前最高版本的Keil u Vision是u Vision 4,能够支持多显示的联合使用,该版本已经被集成到了最新版的安谋国际科技公司开发环境REALVIEW MDK环境中。

2.Keil C51程序设计简介

Keil C51是专为51系列单片机设计的C语言编译器,支持符合ANSI标准的C程序代码。另外,为了能够更好地符合单片机的结构特点,也进行了一些扩展和处理。本文只针对一些在编程中需要注意的地方作一些说明,其他与编程相关的技术请参考相关的C语言程序设计方面的资料。

(1)Keil C51支持的数据类型除了标准的字符型char、整型int、长整型long、浮点型float、指针型*数据外,还包括位类型bit、特殊功能寄存器sfr、16位特殊功能寄存器sfr16、可寻址位sbit这四种特殊类型。

(2)Keil C51定义的变量类型和存储模式与普通C语言不同,其基本格式如下:

[存储类型]数据类型[存储器类型]变量名表。

存储类型表示变量的操作特征,共4种:自动(auto)、外部(extern)、静态(static)、寄存器(register)。一般情况下默认为自动类型。

存储器类型是指编译后该数据将存放在哪一种数据空间,共6种类型,如表4-1所示。

表4-1 Keil C51编译器识别的存储器类型

存储器类型分为直接寻址片内数据存储器类(DATA)、可位寻址片内数据存储器(BDATA)、间接访问的片内数据存储器(IDATA)、分页寻址的片外数据存储器(PDATA),片外数据存储器(XDATA)。

(3)C51允许通过绝对地址来访问片内或片外地址空间,访问可以利用库函数来完成,只要在程序中包括了“absacc.h”头文件即可。访问的宏如表4-2所示。

表4-2 绝对地址访问存储空间宏定义

(4)寄存器组的切换功能,在51单片机中定义了其最低32字节为4组寄存器,每组8个命名分别为R0~R7,统称为工作寄存器组。利用不同的工作寄存器组可以高效地进行多任务的切换,而不需要对工作寄存器进行压栈等保护操作。因此,在多任务设计时可以利用这一特性。其使用方式是在函数名前加“using N”,其中N表示0~3,即可以实现该函数在编译时会使用不同工作组下的寄存器。但是,由于寄存器组会发生切换,因此,如果要返回函数值,则不能使用寄存器,只能利用数据存储空间来完成。

(5)中断函数定义功能,在C51中可以直接定义中断服务函数,而不需要额外的注册或登记,只需要在函数定义时进行一个声明即可。其基本形式如下:

函数名()interrupt N

函数体

N表示中断号,该中断号通常在芯片相关的头文件中有宏定义。

(6)重入函数定义功能。C51中为完成函数的可重入,定义了特殊的声明方法,只需要和中断函数定义一样在后面加上reentrant关键字即可。但是在定义该函数时应注意遵守以下规定:A,不可传送bit型参数,不可定义局部位变量,也不可操作可位寻址变量;B,与PL/M51兼容的alin函数不可定义为重入函数。

(7)利用_at_进行绝对地址声明,可以对一个绝对地址声明一个标识符以方便使用该地址。其格式如下:

[存储器类型]数据类型标识符_at_地址常数

声明后的标识符相当于一个变量,并指定放在地址常数所在的位置。

以上7点介绍了C51与标准C在语法格式上的一些区别,ANSI标准C的基本语法和格式在C51上基本都能够识别,本节就不再作更多介绍,而读者需要掌握相应的基础知识。

4.3 硬件仿真软件Proteus

Proteus软件是英国Labcenter电子(Labcenter electronics)公司出版的EDA工具软件。它不仅具有其他EDA工具软件的仿真功能,还能仿真单片机及外围器件。该工具可以完成从原理图布图、代码调试到单片机与外围电路的协同仿真和一键切换到PCB设计等强大的功能,是目前唯一可以将电路仿真软件、PCB设计软件和虚拟仿真结合的设计平台。该仿真工具,不但可以支持8位/16位的微处理器如8051、HC11、PIC、AVR、8086和MSP430等,还可以仿真一些高档的32位系统如ARM处理器中的Cortex、ARM7以及DSP系列等,对于处理器的支持还在不断地完善和增加。在软件接口方面,它可以与IAR、Keil和MPLAB等多种编译器进行配合,完成联合开发和调试。

Proteus的主要功能包括以下几个方面。

1.智能原理图设计功能(ISIS)

Proteus由多个部分组成,其中用于原理图设计的工具叫做ISIS,它自带十分丰富的器件库。该元器件库有超过27000种元器件,而且还可以利用它提供的工具方便地创建用户自己的新元件。

2.电路仿真功能(Prospice)

Proteus的电路仿真功能被称为ProSPICE,它是符合SPICE3F5工业标准,可以实现数字/模拟电路的混合仿真。

在Proteus中带有多种信号激励源,如直流、正弦波、脉冲信号、分段线脉冲信号、音频信号(使用wav文件)、指数信号、单频的FM信号、数字时钟信号和码流等,用户甚至可以利用其支持的文件格式进行其他信号的输入。利用这些信号源向设计的电路图进行信号注入,并通过虚拟仪器的观察,可以方便地在硬件上对设计的系统进行原理验证,从而实现硬件系统原理的设计工作。

与信号源相对的另一个虚拟内容当然就是虚拟仪器了,这些虚拟仪器通过可视化的界面,提供可交换的操作功能。Proteus自带有13种虚拟仪器,这些仪器包括示波器、逻辑分析仪、虚拟终端、交流/直流电压/电流表、数字图形发生器、频率计/计数器、逻辑探头、信号发生器、SPI调试器、I2C调试器等。

为了在硬件电路中更直观地看到各工作点的状态,Proteus中采用引脚标识的方式来描述各引脚动态电平状态,不同的颜色表示不同的电压,从而可以非常方便地观察系统是否运行、运行是否正常等信息。

另外,Proteus在电路仿真功能中还提供了一个高级图形仿真功能(ASF),能够精确分析电路的多项指标,如瞬态特性、频率特性、传输特性、工作点、失真、噪声、傅立叶频谱分析等。

3.单片机协同仿真功能(VSM)

对于单片机系统,Proteus提供了一个叫做VSM的仿真功能,这一功能,可以仿真程序代码下载到目标硬件,并在目标硬件上运行调试的过程。目前可以支持一些主流的8位、16位以及少量32位CPU。

Proteus在VSM中提供了一些计算机系统的通用外围设备,如点阵式/字符式的LCD模块、LED点阵、LED7段显示模块、键盘/按键、直流/步进/伺服电机、电子温度计等,通过一个专用的COMPIM(COM口物理接口模型)甚至可以使仿真的系统通过PC机的串口与外部进行双向异步串行通信。

VSM能够支持实时仿真,如UART/USART/EUSARTs仿真、中断仿真、SPI/I2C仿真、MSSP仿真等。

除了对硬件的支持,VSM还支持编译和调试工具,其系统带有8051、AVR、PIC的汇编编译器,可以完成源码的编译和仿真。该仿真工具也可以与第三方集成编译环境(如IAR、Keil和Hitech)结合,作为编译环境的仿真器进行高级语言程序的调试。

4.PCB设计功能

在Proteus下可以完成从电路图到PCB图的设计工作。

Proteus功能十分强大,对其功能的介绍需要单独的一本书,因此在本教程中只介绍与实验相关的内容,其他部分功能和用法,有兴趣的读者可以查阅相关资料作进一步学习。接下来,我们将通过仿真实例的方式对Proteus的使用步骤、方法作一个简要介绍,读者可以根据介绍过程完成一个最基本的Proteus验证过程。

4.4 51单片机仿真过程及实例

在Proteus上面进行仿真的主要步骤包括绘制电路原理图、进行电路检查或电路仿真、调入编写好的程序进行单片机协同仿真、仿真过程中可以进行程序调试直到完成设计目标。下面首先用一个例子来说明其基本过程。

4.4.1 Proteus仿真调试过程(流水灯控制)

1.使用Proteus绘制电路图

本小节将利用AT89C51单片机的I/O端口控制LED,完成一个流水灯电路,并通过设计相应程序实现LED的顺序点亮,形成流水灯效果。

首先需要绘制出流水灯的电路原理图。具体操作步骤如下。

打开Proteus的ISIS软件,进入如下编辑窗口,详见图4-1。

图4-1 Proteus ISIS主窗口

(1)创建一个电路仿真系统的空白模板。点击左边绘图工具栏中的第一个按钮?”,会出现图4-1所示界面。

(2)选择在电路中需要用到的元器件,点击界面中间对象选择按钮“”弹出元器件

选择窗口,详见图4-2。

(3)通过关键字选择各元器件,在Keyword栏空白处输入“AT89C51”,出现与关键字相关的元器件列表,详见图4-3。 ?

图4-2 Proteus元器件选择窗口

图4-3 元器件列表

(4)通过关键字的筛选后,在大窗口中会出现与关键字匹配的系列元器件列表,从列表中选择电路设计所需要的元器件然后双击,如本例中选择了“AT 89C51 MCS8051 MICROCONTROLLER(4KB CODE,33MHZ.2*16-BIT TIMERS UART)”。重复步骤(3)的操作,选择“LED-GREEN”、“RESPACK-8”到项目的备选器件列表,最后点“OK”退出选择窗口。在设计电路时,通常应尽可能将用到的元器件一次选择到位,以便于布局和电路设计。

(5)进行原理电路的布局,在ISIS主窗口中用鼠标左键点击AT89C51,然后在图形编辑窗口中点鼠标左键,将AT89C51放在编辑窗口中。如果需要改变其放置的位置,用鼠标右键点击AT89C51,当其变为红色时,用鼠标左键按住后可以移动鼠标改变该元件的位置,放置好后松开鼠标左键,并在空白处单击鼠标右键,取消对元件的选择。用相同操作放置好发光二极管LED-GREEN、电阻排RESPACK-8,电阻的值可以选择后单击左键进行相关窗口进行修改,布局和参数值修改后如图4-4所示(注意LED的引脚方向与电路电源的方向的一致性)。

图4-4 元件位置布置图

(6)选择接口端子,放置好元件后,接着需要放置电源、地线等接口端子(在默认情况下系列会为单片机提供电源和地线,不需要额外画出)。点击左侧工具栏上的按键出现如下界面,详见图4-5。

(7)放置电源端子,在对象选择窗口中选择“Power”,并放置到合适的位置(在这个例子中未使用外加电源,对电源的介绍供学习参考),详见图4-6。

(8)设置电源端子,在Power上点击鼠标右键使之变为红色然后单击鼠标,将弹出一个窗口,如图4-7所示。在窗口中为Power标上一个标识,最简单的标识是电源使用的电压值,如5V、3.3V、1.8V等。

图4-5 选择终端信号工具项后的界面

图4-6 已布置了POWER连接点的电路

(9)放置地线端子,选择对象窗口中的“Ground”,放置到图形编辑区,见图4-8。

(10)对电源端子进行编辑,以便使每个电源端子连接到正确的电源电压。虽然我们给电源端子做了标识,但这个标识只是一个外在的名称,并不表示这个标识已经连接到电源的某个电压,因此需要作进一步设置以使其连接到合适的电源上。

选择菜单中的“Design”—“Configure Power Rails”命令,出现Power Rail Configuration对话框,如图4-9所示。

图4-7 电源标识输入窗口

图4-8 加入地线后的电路图

在默认的电路中是没有3.3V、1.8V这样的电压值的,需要设计者自己确定。单击“New”按键,在弹出窗口中输入3.3V,如图4-10所示。

图4-9 电源连接设置窗口

图4-10 增加新的电源网络

返回后单击“Power Rail Configuration”窗口下的“Unconnected power nets”中的3.3V,并按下中间的“ADD”按键,加到3.3V的网络连接中去。这样标识为3.3V的端子就真正连接到电压为3.3V的电源网络中去了。详见图4-11。

图4-11 添加到电源网络前和添加后的示意图

同样创建一个1.8V的电源点,并将未连接的1.8V电源头加入到1.8V电源点上,如图4-12所示。

图4-12 将1.8V的电源标号加入到1.8V电源网络中的示意图

(11)进行引脚连接,完成电路。点击工具栏第四个按键”,开始进行线路连接。当鼠标移动到连接引脚时会出“口”标志,可单击鼠标左键。然后移动鼠标到另一连接端,出现“口”时单击鼠标完成连接,连接后的电路图如图4-13、图4-14所示。

图4-13 采用多根线连接的效果

图4-14 采用总线方式连接的效果

(12)如果连接较多且比较杂乱,这种情况下可以考虑使用总线式的线路联接,可以使电路看上去简捷得多。总线连接的基本步骤如下:(www.xing528.com)

点击Proteus左侧工具栏按钮,然后在画总线的位置画出需要的总线,画线时可以在转弯处按住键盘的Ctrl键,这样就可以画出如图4-14所示的45度转角,使电路看上去更美观一点;画出总线后需要进一步画出每个引脚到总线的分线,也同样可以按住Ctrl来画;画出一根线后,其他与之平行的引线只需将鼠标移动到需要画线的引脚处,当鼠标变成一个“╳”的标志时双击鼠标左键即可。

画出连线后还要对每根线之间的连接关系进行设定,其方法是对每根线设定对应的标识。按下工具栏中的按键,然后按下键盘上的“A”键,弹出如图4-15所示窗口。

将String改为需要的标识值,输入“NET=XXX#”,“NET=”是关键字,其中XXX表示这个标号的符号串,在本例中为P,#表示需要自动填入的一个标号数值,这个数据的起点和间距由下面的Count和Increment两个参数决定,见图4-16所示。Count为0,表示起始数值为0;Increment为1,表示每两个标号数值递进1。按OK键后,在电路中将鼠标移动到需要进行标识的总线引脚上,当出现“╳”符号时,单击鼠标左键,系统将从设定的Count值开始为该引脚分配一个标号。设定一侧后,用相同方式设定总线连接的另一侧,这样具有相同标号的引脚就相当于连接在一起了。当然,除了这种方式外,还可以直接画出引脚线,不用总线连接直接用标号进行标识,同样可以实现这种功能。

图4-15 标识设定窗口

图4-16 设置引脚的标号参数

注意将电路图进行保存,可保存到“流水灯”目录下。

电路中使用了一个电阻排,该电阻排由8个电阻封装后组成,每个电阻的阻值相同,用于对LED进行限流。LED是一种对电压敏感的元件,正向导通电压通常为1.8V,工作电压通常为2V左右,工作电流约为10~20m A。工作时电压的小幅波动都可能引起工作电流的大幅变化,为了提高其工作稳定性和可靠性,需要为其串联限流电阻,以保护其不会因过压、过流损坏。在仿真电路中这个电阻可以省略,但在实现硬件设计时必须得加以考虑。

2.编写程序

(1)打开51单片机的开发环境u Vision,单击菜单中的“工程”—“新工程”,在弹出的创建新的工程窗口中,输入新工程名并按“保存”键后,将弹出选择目标芯片的窗口,如图4-17所示。

图4-17 目标芯片选择窗口

选择好芯片后按“确定”键,返回主设计界面。这时可以在左边的工程窗口里看到Target1。

(2)添加源程序到该目标,也可以通过“文件”—“新”来创新一个新文档,创建后存盘,存盘时选择正确的文件扩展名(C语言程序扩展名为.c,汇编程序扩展名为.asm)。然后在Target1—Source Group1上单击鼠标右键,选择添加文件到Source Group1,将刚刚编辑的文件添加即可。

在新工程中编写如下C语言代码:

?

该程序仅仅利用一个无限循环程序,将89C51单片机上P1端口8位I/O引脚的电平逐一置为高电平,从而出现LED发光二极管自右向左逐一点亮,并循环重复的效果。

(3)设定工程编译后的输出结果。在“Project”—“Option for Target‘Target1’”中打开如图4-18所示窗口。

图4-18 目标选项设定窗口

选择“Output”页,如图4-19所示。

在“Name of Executable”处输入生成的可执行文件的文件名;并将Creat HEX Fi前打上勾,然后点“确定”离开,表示在编译完成后将生成符合HEX-80标准的HEX文件。

(4)在Target上单击鼠标右键,选择“Build Target”或“Rebuild Target”,完成对工程的编译。或者单击工具栏中的“”图标,完成系统编译,如果程序没有出错,将全会在当前目录下生成“流水灯.HEX”文件。该文件是一个二进制可执行文件,通过一定的方法下载到单片机后,该程序就可以执行并观察结果了。

图4-19 输出文件类型设定窗口

3.进行相关设置,开始电路仿真

电路及程序编译完成后可以将程序放到目标系统上运行,以观察运行效果。

(1)设置单片机参数及程序。在Proteus ISIS中将流水灯电路打开,在AT89C51上单击鼠标右键,使之成为红色表示被选择,然后单击鼠标左键,弹出窗口如图4-20所示。

图4-20 单片机参数及程序设置

在窗口中的“Program file”栏点击”选择程序所在文件夹下的“流水灯.HEX”文件,完成AT89C51运行程序的选择。

在窗口中的“Clock Frequency”栏输入12MHz,完成对AT89C51芯片的程序选择和主频设置,点“OK”退出设置。

(2)在ISIS主窗口下有仿真演示操作按钮

,点按键可以开始仿真过程。如果程序没有错误,将可以观察到发光二极管自右向左的点亮过程。

4.进行系统联合调试

虽然通过上面的3个步骤可以完成程序到目标硬件的仿真实验,但是程序的运行却是不可控的,如果程序还存在缺陷则需要进行调试。以上步骤只能通过在Proteus上观察效果,然后再到Keil u Vision中进行程序修改,编译后再送到Proteus进行仿真。这个过程显然明显不利于程序开发,进行系统联合调试则可以解决这个问题。Proteus可以作为Keil u Vision的一个外部仿真部件,通过软件接口实现联合调试功能,即Proteus中的电路作为Keil u Vision的目标板连接到Keil u Vision上,进行在线调试。进行这个调试,还需要安装一定的驱动程序,以提供相关的接口和信息交换,相关程序的安装步骤如下。

(1)安装Proteus的驱动模块。在“Proteus”的安装文件夹打开“Keil驱动”—“VDMAGDI.EXE”,完成Proteus驱动的安装。

也可以用以下两步完成驱动的安装:

首先,把安装目录Proteus\MODELS下的VDM51.dll文件复制到Keil安装目录的\C51\BIN目录中;

其次,修改Keil安装目录下的Tools.ini文件,在C51字段加入TDRV5=BIN\VDM51.DLL(“PROTEUS 6 EMULATOR”)并保存。不一定非要使用5这个标识,可以使用一个与原有描述不重复的标识就可以了。括号引号中的内容只是一个说明文字,能够与其他仿真器有所区别就可以了。

(2)驱动安装后,进行相关设置。打开Proteus中相应的电路图,在Proteus的“Debug”菜单中选中“Use Remote Debug Monitor”,使用远程调试监控。

进入Keil环境,打开与电路相应的软件工程文件,在Project菜单Option for Target“工程名”的设置窗口中选择Debug页。

在Debug选项中右栏上部的下拉菜单选中Proteus VSM Simulator。详见图4-21所示。

再点击Settings按键,在弹出窗口中设置IP设为127.0.0.1,端口号为8000,按“OK”退出选择。见图4-22所示。

(3)在Keil中进行调试,通过Proteus观察运行结果。

在Keil u Vision中可以对程序进行设置断点、单步等调试操作,同时,Proteus中将会根据程序的执行得到执行的结果。这种方式的仿真调试甚至比实物上的仿真更加方便,而且几乎不需要考虑成本,可以作为学习51单片机原理和应用设计的入门手段。

图4-21 调试对象选择

图4-22 设置目标服务器地址

5.单片机程序设计的基本思想

很多读者都对PC机上的程序设计有比较多的了解,但是在单片机上运行的程序,往往没有PC机上功能完善的操作系统支持,因此,在程序设计上有其自身的特点和方式。在单片机上的程序主要包括两种方式,一种是没有调度程序的方式;另一种是有调度程序的方式(或者叫操作系统方式)。

在没有调度程序的方式下,程序的流程一般如图4-23所示。

在这种方式下,所有任务都在一个死循环中,程序运行时根据不同的参数状态来处理不同的任务。对于任务不多、相互关系比较清晰、工作流程固定的系统,采用这种方式是比较好的一个选择。这种方式下,由于任务比较集中,便于实施和控制,任务的实时性比较好保证。

在有调度程序的方式下,程序的结构可以分为两类:一类是属于简单操作系统环境;另一类是属于复杂操作系统环境。在简单操作系统环境下,操作系统的主要工作只负责对任务的管理、调度、任务间通信、时钟管理以及驱动程序等内容。这种环境下的程序通常需要有一个比较固定的结构,配合操作系统来完成任务的调度、通信等工作,以确保良好的实时性。其流程如图4-24所示。而在复杂操作系统环境下,操作系统不但要管理任务和驱动,还要管理内存、外设、文件系统、通信系统等。而这里的任务通常不需要对操作系统本身的工作了解太多,也没有固定结构,只需要考虑完成的任务就可以了,因此其实时性并不是很好。

图4-23 采用死循环方式的程序流程图

图4-24 简单操作系统下的任务流程图

图中(a)描述的反复运行任务也是一个死循环,但是循环将通过挂起操作进入事件等队列,从而交由操作系统在事件发生时唤醒,避免了在无操作系统条件下任务间需要通过复杂的交叉调用来完成任务的运行触发动作。而图中(b)则描述了单次运行的任务在操作系统中只运行一次后由任务将自己杀死或退出,如系统初始化任务通常就是这样,只需要在系统上电时执行一次任务就可以退出了。

4.4.2 外部中断功能仿真实例

本小节将用一个仿真实验介绍51单片机的外部中断功能仿真功能。通过本实验,可以帮助读者了解在C语言程序设计中,如何实现一个中断处理程序。

1.使用Proteus绘制电路图

使用Proteus绘制电路图详见图4-25。

电路中所使用的元器件详见图4-26。

该电路原理如下:

7474是D触发器,利用该触发器将按键上的按键值转换成一个触发信号,该触发信号Q连接到51单片机的外部中断0。在本实验中,外部中断的触发方式使用了电平触发,也就是说,当Q值为低电平时可以触发51单片的外部中断。为避免出现重复中断的问题,51单片机的P2.0引脚连接到了D触发器的S端,发生中断后,可利用程序在P2.0发出低电平脉冲,将Q端的低电平值置为高电平,从而为下一个按键中断做准备。当然,读者也可以将51单片机的触发方式改为边沿触发,这样可以不使用7474作为触发保持电路。

图4-25 中断实例电路原理图

图4-26 中断实例使用元器件图

2.仿真运行程序

按照上节操作方式,将已编译好的程序代码“中断.hex”在该仿真电路上运行。通过用鼠标按键模拟按下触发开关,可以观察到每一次中断都会使发光二极管的点亮状态发生一次变化。

3.实例程序代码分析

4.4.3 LED电子钟设计仿真实例

本小节将介绍一个基于51单片机的LED电子时钟设计的仿真实例,该实例具有一定综合性,包括定时器及其中断使用、LED6位8段数据管驱动、分离式按键读取、时钟编辑、蜂鸣器报警等功能。

1.使用Proteus绘制电路图

使用Proteus绘制电路图详见图4-27所示。

图4-27 LED电子钟实例电路原理图

电路中使用的元器件详见图4-28。

图4-28 LED电子钟实例使用元器件

该电路原理如下:

6位8段数码管,采用共阳极控制方式,共1~6引脚代表6位8段数据码管的共阳端与89C51的P0.7~P0.2共连接。51单片机利用这6个引脚控制选择6位8段数码管的每一位的显示与否,当51的引脚为高时,对应的一位8段数据码管可以被点亮,否则无法显示(注意在实际设计中,应考虑每个引脚的负载能力,通常单片机的驱动能力不超过25m A,而每个发光二极管工作时,电流为10m A左右,因此,共阳端最好使

用驱动电路进行驱动,这里仅为说明原理,未设驱动电路和限流电阻,读者可根据所学的模拟或数字电路知识完善该电路,在实际设计中驱动和限流电路必不可少)。6位8段数码管的a~dp共8个引脚,连接到51单片机的P1.0~P1.7,用于驱动每一位8段数码管的8个显示段,8段码值与对应1~6的位选结合,就可以得到不同位置上的显示值。如果要进行多位的显示,则需要采用扫描显示方式,逐个循环点亮每一位的不同值。只要循环时间足够短,从人眼看来就是同时将多位8段数码管点亮了。

电路中设计了4个按键,用于提供一定的设置功能。具体参数见代码介绍。实例程序代码分析:

这里的程序使用了一个十分简单的按键读取方式进行按键识别,在实际使用中可以采用中断方式来实现,效果会更好。在程序中只显示了分钟和小时,读者可以在读懂代码的基础上将秒的显示和设置功能也加入到程序中。

4.4.4 LCD电子计算器仿真实例

本小节将介绍一个LCD电子计算器的实例,使读者对于LCD驱动、4*4键盘扫描及读取进行学习和理解。本例中我们将用到液晶显示模块LCD1602,及一个Keypad 4 *4键盘,通过编程来完成基本的四则运算过程。电路图如图4-29所示。51单片机通过P1脚与LM016L连接传递数据和命令,通过P3口提供三根控制信号,即使能信号E、读写信号R/W、数据指令信号RS。P2脚的高四位和低四位分别接到键盘的行线和列线上,利用程序扫描行线的方式来读取键盘上的值。关于LCD的特点和控制命令在第三章已经作了介绍,这里就不再作更多的说明。

图4-29 LCD计算器电路图

1.基本程序流程

LCD计算器流程如图4-30所示。

图4-30 LCD计算器流程图

系统总体流程比较简单,在完成初始化工作后,就可以进入循环状态等待按键,再根据按键的值进行相应处理。

2.代码说明

LM016L是一个能够显示两行16个字符的显示模块,使用该模块可以完成两个ASCII码的显示功能,每行能够显示16个ASCII码。对该模块的操作可分为命令操作和数据操作两种,在本例中其代码分别如下。

(1)向LCD写入命令的函数代码

读者可以在本实例的基础上,引入科学计算的键盘(系统内自带Keypad计算器键盘),及相关科学计算的功能进一步学习嵌入式的应用开发。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈