集成开发环境概述
80年代单片机进入我国,当时较有影响的是INTEL的NCS-48系列和Zilog公司的Z80系列,20多年来单片机获得了飞速的发展,现在单片机已经渗入到工农业生产,国防军事,教育科研等诸多领域,已经形成了计算机领域的一个重要分支。
单片机的应用首先要考虑的是它的开发平台,也即我们常说的开发环境。由于INTEL公司的MCS-51系列较早进入我国,事实上已形成了工业标准,MCS-51的单片机应用场合随处可见,它的软件资源相当丰富,硬件的支持也很完善,价廉物美的开发器材随处可取。现阶段,国内的大部分单片机开发工程技术人员还是普遍使用汇编语言编写程序。汇编语言有其缺陷性,但它编写的代码最小,最直接,效率也最高,所以还深得用户接受。但是,它有着固有的缺陷,必须十分了解所用单片机的硬件结构,程序编写困难,代码难以理解,不易于识读,难于移植,排错困难,编写程序花的时间相当多,调试不便等等。随着国内单片机开发环境的完善,开发技术水平不断提高,现在已有相当的开发器材支持高级语言的使用和调试,为单片机的开发应用提供了更好的物质条件。高级语言(如C语言)具有开发周期短,易于识读,容易移植,也便于初学着掌握。诚然,高级语言也有它不足之处,就是高级语言产生的代码过长(也即研制人员常称的“废话太多”),对于早期单片机不大的ROM来说,可是非常突出的矛盾,另外它的运行速度太慢,对于本来主频不高的单片机是致命的弱点。但现在这方面的研制工作也取得了较大的进展,高级语言的弱点也已被较大的克服,象MCS-51上的C语言的代码长度,如果未加上人工优化条件,也可做到最优汇编程序水平的120%—150%,这也相当可观了。可以说相当于中等汇编程序员的水平。
C语言是可以在高级计算机、个人电脑(PC)和单片机使用的唯一一种高级语言,现在很多类型的单片机已经具备了C语言编译软件和实时多任务操作系统。C语言功能十分强大,可以塑造一种良好的开发环境,在一种单片上编制的程序比较容易移植到另一种单片机上。
目前的C语言编译器有很多,常见的有MICRO-C51、American automation、Franklin、Archimedes、BSO/TASKING、Micro computer controls等等。C51 C语言编译器早在80年代就已经出现,但并非所有的C语言编译器都产生相应单片机的有效源代码,它们各有所长,下面我们略作简介。
American automation 编译器通过#asm和endasm预处理选择支持汇编语言,汇编速度慢,要求汇编的中间环节。
Franklin它的前身是Keil,它以代码紧凑领先,可产生最少的代码。它支持浮点和长整数,重入和递归。它不提供库的源代码,不能生成能汇编的汇编代码,仅产生混合代码,只能修改后汇编。若使用汇编语言,必须分开汇编程序,然后手工连接。keil/Franklin专业级开发工具PK51,支持DOS话Windows环境。
Archimedes 它的鼻祖是瑞典的IAR,是支持分组开关(Bank)的编译器,集成环境类似于Borland和Turbo,C编译器可产生一个汇编语言文件,然后再用汇编器。
BSO/TASKING 它是一家专业开发和销售嵌入式系统软件工具的公司。它生产基于Windows的集成开发环境、调试器和交叉模拟器,支持鼠标,介面友好。软件格式符合IntelOMF-51和Intel Hex标准,它的汇编器和Intel汇编器兼容。
Micro computer controls 它不支持浮点数,长整数,结构和多维数组,定义不允许有参数,生成的源文件需由Intel或MCC的8051汇编器汇编。
单片机应用系统的开发
单片机的应用系统随着其用途不同,其硬件和软件均不相同,也即单片机的最初的选型都很重要,原则上是选择高性价比的单片机,硬件软件化是提供系统性价比的有效方法,尽量减少硬件成本,多用软件来实现相同的功能,这样也可大大提高系统的可靠性。
虽然单片机的硬件选型不尽相同,软件编写也千差万别,但系统的研制步骤和方法是基本一致的,一般都分为总体设计、硬件电路的构思设计、软件的编制和仿真调试几个阶段,下面我们作简要介绍。
[1].总体设计
·确立功能特性指标
不管是工程控制系统还是智能仪器仪表,都必须先分析和了解项目的总体要求,输入信号的类型和数量,输出控制的对象及数量,辅助外设(如传感器)的种类及要求,使用的环境及工作的电源要求,产品的成本,可靠性要求和可维护性及经济效益等等因素,必要时可参考同类产品的技术资料,制定出可行的性能指标。
·单片机的选型
现在的单片机数量品种繁多,各种专用功能的单片机基本上都有,这给用户者带来的好处很多,至少可节约很多外接扩展器件。单片机的选型很重要,选择时需考虑其能全部满足规定的要求,例如控制速度、精度、控制端口的数量、驱动外设的能力、存储器的大小,软件编写的难易程度、开发工具的支持程度等等。再如要驱动LED显示器,可选用多端口的单片机直接驱动,还可利用少端口加扩展电路构成,这就具体的分析选用何种器件有利于降低成本、电路易于制作、软件便于编写等等因素。再有,如果要求驱动LCD显示器,也可选用具有直接驱动LCD的单片机,也可加外接驱动芯片的办法。这些要求在应用时具体问题具体分析。
此外,选择某种单片机还需考虑货源是否充足,是否便于批量生产,在考虑性价比的时候同样需研究易实现产品技术指标的因素。
·软件的编写和支持工具
单片机的应用软件的设计与硬件的设计一样重要,没有控制软件的单片机是毫无用处的,它们紧密联系,相辅相成。并且硬件和软件具有一定的互换性,在应用系统中,有些功能既可用硬件来实现,也可以软件来完成,多利用硬件,可以提高研制速度,减少编制软件的工作量,争取时间,争取商机。诚然这样会增加产品的单位成本,对于以价格为竞争手段的产品就不宜采用。相反,以软件代替硬件来完成一些功能,最直观的是降低成本,提高可靠性,增加技术难度而给仿制者增加仿制难度,这是好的一面,不利的一面是同时也增加了系统软件的复杂性,软件的编制工作量大,研制周期可能会加长,同时系统运行的速度可能也会降低等。因此在总体考虑时,必须综合分析以上因素,合理地制定某些功能硬件和软件的比例。
不同的单片机甚至同一公司的单片机它们的开发工具不一定相同或不完全相同,这就要求在选择单片机时,需考虑开发工具的因素,原则上是以最少的开发投资满足某一项目的研制过程,最好是使用现有的开发工具或增加少量的辅助器材就可达到目的的。当然,开发工具是一次性投资,而形成产品却是长远的效益,这就需平衡产品和开发工具的经济性和效益性。
[2].硬件电路设计
总体设计中确立的功能特性要求,确定单片机的型号,所需外围扩展芯片、存储器、I/O电路、驱动电路、可能还有A/D和D/A转换电路以及其它模拟电路,设计出应用系统的电路原理图。
·程序存储器
随着微电子技术的发展,现在可用作程序存储器的类型相当多,各大半导体公司都推出了一系列程序存储器,象EPROM、EEPROM、FLASH存储器以及OTP存储器等等。这些存储器各有特点,互有所长。EEPROM和FLASH适合于多次擦写的场合,最适于开发调试阶段,当然它们的价格也稍比其他的高些。对于批量生产已成熟的应用系统最好选用EPROM和OTP的存储器,最主要的原因是它们的价格稍低,对降低产品的成本是相对有利的。
值得一提的是,现在的单片机普遍都带有程序存储器,容量也分有不同的等级,从几百字节到几百kB都有,这为它们的应用提供了更为广阔的前景。而且这些单片机价格也贵不了多少,同时,这些内置ROM的单片机基本上均可实现软硬件的程序加密,为保护自己的知识产权提供了强有力的措施,所以这些单片机深得用户喜爱,可以说这类单片机逐渐成为市场的主流产品。
·数据存储器
现在的单片机基本上都带内部数据存储器(RAM)的,从几十字节到几KB字节都有,对于数据存储器容量的要求,各个系统之间差别很大,要求也不尽相同,象8051/52系列的单片机片内置有128和256字节的RAM,这对于一般中小型应用系统(如实时控制系统和智能仪器仪表)已能满足要求。对于RAM的容量要求稍大一点,可采用外扩芯片8155这样的芯片,8155可同时扩充数量更多的I/O口线。如果是数据采集对RAM容量要求较大的系统则需要采用更大容量的数据存储器,当然,外扩的RAM也以尽可能少的芯片为原则。
·单片机的系统总线
8051总共有32个I/O口,如果使用内置程序存储器的芯片,可用于作I/O口线的就较多,一般均可满足要求。但如需外接ROM和RAM,P0口为标准的双向数据/地址总线口,P2为高8位地址总线口,即使高8位的地址总线口没有完全使用,余下的I/O口也不能当作它用,否则编程将相当麻烦。这样8051能作I/O的端口只有16个。此外,P3口它的中断功能更为重要,一般在使用中都用作中断处理,剩下的也只有P1口,这8个I/O口就显得相当宝贵。
P0和P2口作数据和地址总线,一般可驱动数个外接芯片(视外接芯片要求的驱动电流而异),也即P0和P2口的驱动能力还是有限的,P0口为LSTTL电路,P2口为4个LSTTL电路,如果外接的芯片过多,负载过重,系统将可能不能正常工作,此时必须加接缓冲驱动器予以解决。图2为使用74LS244和74LS245三态缓冲驱动器的应用电路。供使用时参考。
·I/O接口
现在的单片机系列中普遍都有多I/O口的型号,对I/O口的使用应从其功能和驱动能力上加以考虑,对于仅需增加少量的I/O口,最好是选用价格低廉的TTL或CMOS电路扩展即可,这样也可提高单片机口线的利用率。对于需扩展更多的I/O口,则可选用标准的I/O口扩展芯片8155、8255和8279等芯片,这些芯片接口电路简单,编程方便,使用灵活,价格适中。
·A/D和D/A转换器
现在可使用的A/D转换器数量繁多,品种齐全,各种分辨率、精度及速度的芯片应有尽有。最著名的是美国的模拟数字器件公司(Analog)的一系列转换器,此外还有MOTOROLA和MAXIM公司等,这给使用提供了很多便利的条件。还有一种趋势大家都已看到,即现在的各大单片机生产厂商都推出了内带A/D转换器的单片机,这样的芯片性价比一般都较高。由于A/D或D/A转换器与单片机没有外部连线,工作也更可靠,体积更小。对转换器的控制均可使用软件的方法实现,使用十分方便,如果能满足要求,建议首选这样的机型,而不要外挂转换器件。当然内置转换器的单片机,转换器一般都在12位以下,对那些有更高要求的应用系统,也只能外接转换器芯片。 [3].软件设计
系统资源
在单片机应用系统的开发中,软件的设计是最复杂和困难的,大部分情况下工作量都较大,特别是对那些控制系统比较复杂的情况。如果是机电一体化的设计人员,往往需要同时考虑单片机的软硬件资源分配。软件设计一般可按如下步骤进行,设计流程图可口参见图2。
在考虑一个应用工程项目时就需先分析该系统完成的任务,明确软硬件个承担哪些工作,有时,实际上这种情况很多,就是一些任务可用软件完成,也可以用硬件构成,还需考虑采用软件或硬件它们优势,一般均以最优的方案为首选。象虚定义各输入/输出(I/O)的功能、数据的传输交换形式、与外部设备接口及它们的地址分配、程序存储器和数据存储器的使用区域、主程序子程序使用的空间、显示(如有的话)等数据暂存区的选择、堆栈区的开辟等等因素。
程序结构
一个优秀的单片机程序设计人员,设计的软件程序结构是合理、紧凑和高效的。同一种任务,有时用主程序完成是合理的,但有时需子程序执行效率最高,占用CPU资源最少。一些要求不高的中断任务或单片机的速度足够高,可以使用程序扫描查询也可以用中断申请执行,这也要具体的问题具体分析。对于多中断系统,但它们存在矛盾时,需区分轻重缓急,主要和次要的区别对待。并适当地授权予不同的中断优先级别。
在单片机的软件设计中,任务可能也很多,程序量很大,是否意味着程序也按部就班从头到尾编写下去呢?答案是否定的,在这种情况下一般都需把程序分成若干个功能独立的模块,这也是软件设计中常用的方法,这也即俗称的“化整为零”的方法。理论和实践都证明,这种方法是行之有效的。这样可以分阶段地对单个模块进行设计和调试,一般情况下单个模块利用仿真工具即可将它们调试好,最后再将它们有机的联系起来,构成一个完整的控制程序,并对它们进行联合调试即可。
对于复杂的多任务实时控制系统,要处理的数据就非常庞大,同时又要求对多个控制对象进行实时控制,要求对各控制对象的实时数据进行快速的处理和响应,这对系统的实时性、“并行性”提出了更高的要求。这种情况下一般要求采用实在时地任务操作系统,并要求这个系统具备优良的实时控制能力。
数学模型
一个控制系统的研制,明确了它们需完成的任务,那么摆在设计人员面前的就是一堆需要协调解决的问题了,这是设计人员必须进一步分析各输入输出变量的数学关系,也即建立数学模型,这个步骤对一般较复杂的控制系统是必不可少的,而且不同的控制系统,它们的数学模型也不尽相同。
在很多控制系统中都需要对外部的数据进行采集取样、处理加工、补偿校正和控制输出。外部数据可能是数字量也可能是模拟量,对于模拟量的输入,则通过传感器件进行采样,由单片机进行分析处理后输出,输出的方式很多,可以显示、打印或终端控制,从模拟量的采样到输出的诸多环节,这些信号都可能会“失真”——即产生非线性误差,这些都需要单片机进行补偿、校正和预加重,才能保证输出量达到我们所要求的误差范围。
现阶段8位单片机仍是主流,对于复杂参数的计算,例如非线性数据、对数、指数、三角函数、微积分运算,如使用PC机(32位)的软件编程相对简单,并且具有大量的应用软件可利用。但单片机要用汇编语言完成这样的运算,程序结构是很复杂的,程序编写也较困难,甚至难以建立数学模型,解决这个问题,常用的方法多半采用查表法实现之。查表法即事先将测试和计算的数据按一定规律编制成表格,并存于存储器中,CPU根据被测参数值和近似值查出最终所需的结果。查表法是一种行之有效的方法,它可对输入参数进行补偿校正,计算和转换。程序编制简单,将复杂的数值运算简化为简单的数据输出的好办法,常被设计人员采用。
值得一提的是,现行的单片机,大多数的单片机都具有查表指令,这给软件设计提供了技术条件。
程序流程
较复杂的控制系统一般都需要绘制一份程序流程图,可以这样说它是程序编制的纲领性文件,可以有效地知道程序的编写。当然,程序设计伊始,流程图不可能尽善尽美,在编制过程中仍需进行修改和完善,认真地绘制程序流程图,可以起到事倍功半的效果。
流程图就是根据系统功能的要求及操作过程,列出主要的各功能模块,复杂程序程序流向多变,需要在初始化时设置各种标志,程序根据重些标志控制程序的流向。当系统中各功能模块的状态改变时,只须修改相应的标志即可,无须具体地管理状态变化对其他模块的影响,这些需要在绘制流程图时,清晰地标识出程序流程中各标志的功能。
编制程序
上述的工作做好了,就可以开始编制程序了,程序编写时,首先需对用到的参数进行定义,和标号的定义一样,使用的字符必须易于理解,可以使用英文单词和汉语拼音的缩写形式,这对今后自己的辨读和排错都是有好处的。然后初始化各特殊功能寄存器的状态,中断口的地址区定义,数据存储区的安排,根据系统的具体情况,估算中断、子程序的使用情况,预留出堆栈区,和需要的数据缓存区,接下来就开始编写程序了。
现在的单片机程序还是以汇编语言为主,因为它以简洁、直观、紧凑仍被设计人员乐于接受。高级语言(如C语言)也在单片机设计中发挥越来越重要的角色,性能也越来越好,但不管是使用何种语言,最终还是需要汇编成机器语言,调试正常后,通过烧录器固化到单片机或ROM中。至此,程序编写即告完成。
CodeCruiser for EasyPack51集成开发环境