3.1 单片机嵌入式系统的研制步骤和方法
单片机嵌入式系统随其用途不同,硬件和软件均不相同。单片机最初的选型很重要,原则上是选择内部资源丰富、高性价比的单片机。硬件软件化是提供高系统性价比的有效方法,尽量减少硬件成本,多用软件实现相同的功能,这样也可以大大提高系统的可靠性。
虽然单片机的硬件选型不尽相同,软件编写也千差万别,但系统的研制步骤和方法是基本一致的,一般都分为总体设计、硬件电路的构思设计、软件的编制和仿真调试几个阶段。单片机嵌入式系统的研制流程如图3.1所示。
图3.1 单片机嵌入式系统的研制流程
3.1.1 总体设计
1.确立功能和性能指标
不管是工程控制系统还是智能仪器仪表,都必须首先分析和了解项目的总体要求、输入信号类型和数量、输出控制对象及数量、辅助外设种类及要求、使用环境及工作电源要求、产品成本、可靠性要求和可维护性、经济效益等因素,必要时可参考同类产品的技术资料,制定出可行的性能指标。
2.单片机的选型
现在的单片机品种繁多,包括各种专用功能的单片机,给用户带来了许多好处,可以节约很多外接扩展器件。单片机的选型很重要,选择时需考虑其功能是否全部满足规定的要求。例如控制速度、精度、控制端口的数量、驱动外设的能力、存储器的大小、软件编写的难易程度、开发工具的支持程度等。再如要驱动LED显示器,可选用多端口的单片机直接驱动,还可以利用少端口的单片机加扩展电路构成,这就要具体分析选用何种器件有利于降低成本、电路易于制作、软件便于编写等因素。如果要求驱动显示器LCD,可以选用具有直接驱动LCD的单片机,也可使用加外接驱动芯片的办法,这就要求在应用时具体问题具体分析。
此外,选择某种单片机还需要考虑货源是否充足,是否便于批量生产,在考虑性价比的同时,需研究易于实现产品技术指标的因素。
3.软件的编写和支持工具
单片机应用软件的设计与硬件的设计一样重要,没有控制软件的单片机是毫无用处的,它们紧密联系,相辅相成,并且硬件和软件具有一定的互换性,在应用系统中,有些功能既可以用硬件实现,也可以用软件完成。多利用硬件,可以提高研制速度、减少编写软件的工作量、争取时间、争取商机,但这样会增加产品的单位成本,对于以价格为竞争手段的产品不宜采用。相反,以软件代替硬件完成一些功能,最直观的优点是可以降低成本,提高可靠性,增加技术难度而给仿制者增加仿制难度;缺点是同时也增加了系统软件的复杂性,软件的编写工作量大,研制周期可能会加长,同时系统运行的速度可能也会降低等。因此在总体考虑时,必须综合分析以上因素,合理地制定某些功能硬件和软件的比例。
对于不同的单片机,甚至同一公司的单片机,它们的开发工具可能不同或不完全相同。这就要求在选择单片机时,需考虑开发工具的因素。原则上是以最少的开发投资满足某一项目的研制过程,最好使用现有的开发工具或增加少量的辅助器材就可达到目的。当然,开发工具是一次性投资,而形成产品却是长远的效益,这就需要平衡产品和开发工具的经济性和效益性。
3.1.2 硬件系统
根据总体设计中确立的功能特性要求,确定单片机的型号、所需外围扩展芯片、存储器、I/O电路、驱动电路,可能还有A/D和D/A转换电路及其他模拟电路,设计出应用系统的电路原理图。
1.程序存储器
单片机片内程序存储器,按存储的内容的写入(常称为编程)方式可分为固定ROM、可编程的PROM、可擦可编程的EPROM三类。可擦可编程的EPROM又分为UV-EPROM(紫外线擦除可编程,人们常把UV-EPROM称为EPROM)、E2PROM(电擦除可编程)、Flash E2PROM(闪速存储器)。由于Flash E2PROM写入速度快,适合于多次擦写的场合,最适于开发调试阶段,已经成为8~32位单片机的主流存储器配置。
单片机片内程序存储器,按存储容量也分为不同的等级,从几百B到几百KB,这就为它们的应用提供了更为广阔的前景,而且这些单片机的价格也不高。同时,这些内置ROM的单片机基本上均可实现软硬件的程序加密,为保护自己的知识产权提供了强有力的措施,所以这些单片机深得用户喜爱,可以说这类单片机正在逐渐成为市场上的主流产品。
2.数据存储器
现在的单片机基本上都带有内部数据存储器(RAM),容量从几十B到几KB。对于数据存储器容量的要求,各系统之间差别很大,要求也不尽相同,如80C51/52系列的单片机片内置有128B和256B的RAM,这对于一般中小型应用系统(如实时控制系统和智能仪器仪表)已能满足要求。对于RAM的容量要求稍大一点,可采用如外扩芯片8155这样的芯片,8155可同时扩充数量更多的I/O口线。如果是数据采集系统,对RAM容量要求较大的系统则需要采用更大容量的数据存储器,如果要求数据掉电保护,则需要采用Flash E2PROM作为数据存储器。当然,外扩的RAM也以尽可能少的芯片为原则。
3.单片机的系统总线
80C51总共有4个8位I/O口,如果使用内置程序存储器的芯片,可用做I/O口线的就较多,一般均可满足要求。但如需外接ROM和RAM,P0口为标准的双向数据/地址总线口,P2为高8位地址总线口,即使高8位的地址总线口没有完全使用,余下的I/O口也不能另为他用,否则编程将相当麻烦。这样80C51能作为I/O的端口只有16个。此外,中断、串行口和定时器/计数器口又要占用P3口的6个I/O口,剩下的也只有P1口,这8个I/O口就显得相当宝贵。
P0和P2口作为数据和地址总线,一般可以驱动数个外接芯片(视外接芯片要求的驱动电流而异),也即P0和P2口的驱动能力还是有限的,如果外接的芯片过多,负载过重,系统将可能不能正常工作。此时必须加接缓冲驱动器,通常使用74HC573作为地址总线驱动器,使用74HC245双向驱动器作为数据总线驱动器。
4.I/O接口
现在的单片机系列中普遍都有多种I/O口的型号,对I/O口的使用应从其功能和驱动能力上加以考虑。对于仅需增加少量I/O口的情况,最好选用价格低廉的TTL或CMOS电路扩展,这样也可以提高单片机口线的利用率。对于需扩展更多的I/O口,则可以选用标准的I/O口扩展芯片8155、8255等。这些芯片的接口电路简单,编程方便,使用灵活,价格适中。
5.A/D和D/A转换器
现在可使用的A/D转换器数量繁多、品种齐全,各种分辨率、精度及速度的芯片应有尽有,最著名的是美国的模拟数字器件公司(Analog)的一系列转换器,此外还有Motorola和Maxim等公司的产品,这就为使用提供了很多便利条件。还有一种趋势大家都已看到,即现在的各大单片机生产厂商都推出了内带A/D转换器的单片机,这样的芯片性价比一般都较高。由于A/D或D/A转换器与单片机没有外部连线,所以工作就更可靠,体积也更小了。对转换器的控制均可使用软件的方法实现,使用十分方便。如果能满足要求,建议首选这样的机型,而不要外挂转换器件。当然内置转换器的单片机,转换器一般都在12位以下,对那些有更高要求的应用系统,也只能外接转换器芯片。
3.1.3 软件系统
1.系统资源
在单片机嵌入式系统的开发中,软件的设计是最为复杂和困难的,大部分情况下工作量都较大,特别是对那些控制系统比较复杂的情况。如果是机电一体化的设计人员,往往需要同时考虑单片机的软件和硬件资源分配。在考虑一个应用工程项目时就需要先分析该系统完成的任务,明确软件和硬件中的哪个承担哪些工作。实际上这种情况很多,比如一些任务可以用软件完成,也可以用硬件完成,此时还需考虑采用软件或硬件的优势,一般均以最优的方案为首选,定义各输入/输出(I/O)的功能、数据的传输交换形式、与外部设备接口及它们的地址分配、程序存储器和数据存储器的使用区域、主程序和子程序使用的空间、显示(如有的话)等数据暂存区的选择、堆栈区的开辟等因素。
2.程序结构
一个优秀的单片机程序设计人员,设计的软件程序结构是合理、紧凑和高效的。同一任务,有时用主程序完成是合理的,但有时用子程序执行效率会更高,占用CPU资源最少。对一些要求不高的中断任务或在单片机的速度足够高的情况下,则可以使用程序扫描查询,也可以用中断申请执行,这也要具体问题具体分析。对于多中断系统,当它们存在矛盾时,需区分轻重缓急、主要和次要,区别对待,并适当地给予不同的中断优先级别。
在单片机的软件设计中,任务可能很多,程序量很大,是否就意味着程序也按部就班地编写下去呢?答案是否定的,在这种情况下一般都需要把程序分成若干个功能独立的模块,这也是软件设计中常用的方法,即俗称的化整为零的方法。理论和实践都证明,这种方法是行之有效的。这样可以分阶段地对单个模块进行设计和调试,一般情况下单个模块利用仿真工具即可调试好,最后再将它们有机地联系起来,构成一个完整的控制程序,并对它们进行联合调试即可。
对于复杂的多任务实时控制系统,要处理的数据非常庞大,同时又要求对多个控制对象进行实时控制,要求对各控制对象的实时数据进行快速的处理和响应,这对系统的实时性、并行性提出了更高的要求。这种情况下一般要求采用实时任务操作系统,并要求这个系统具备优良的实时控制能力。
3.数学模型
一个控制系统的研制,在明确了各部分需要完成的任务后,此时摆在设计人员面前的就是需要协调解决的问题了。这时设计人员必须进一步分析各输入、输出变量的数学关系,即建立数学模型。这个步骤对一般较复杂的控制系统是必不可少的,而且不同的控制系统,它们的数学模型也不尽相同。
在很多控制系统中,都需要对外部的数据进行采集取样、处理加工、补偿校正和控制输出。外部数据可能是数字量,也可能是模拟量。对于输入模拟量时,通过传感器件进行采样,由单片机进行分析处理后输出。输出的方式很多,可以显示、打印或终端控制。从模拟量的采样到输出的诸多环节中,信号都可能会失真,即产生非线性误差,这些都需要单片机进行补偿、校正和预加重,才能保证输出量达到所要求的误差范围。
现阶段8位单片机仍是主流。对于复杂参数的计算(例如非线性数据、对数、指数、三角函数、微积分运算)如果使用PC(32位)的软件编程相对简单,并且具有大量应用软件可以利用。但单片机要用汇编语言完成这样的运算,程序结构是很复杂的,程序编写也较困难,甚至难以建立数学模型,所以解决这个问题常用的方法多半采用查表法去实现。查表法即事先将测试和计算的数据按一定规律编制成表格,并存于存储器中,CPU根据被测参数值和近似值查出最终所需的结果。查表法是一种行之有效的方法,它可以对输入参数进行补偿校正、计算和转换,程序编制简单,是将复杂的数值运算简化为简单的数据输出的好办法,常被设计人员采用。
值得一提的是,现行大多数的单片机都具有查表指令,这给软件设计提供了技术支持。
4.程序流程
较复杂的控制系统一般都需要绘制一份程序流程图,可以说它是程序编写的纲领性文件,可以有效地指导程序的编写。当然,程序设计开始的流程图不可能尽善尽美,在编制过程中仍需进行修改和完善。认真地绘制程序流程图,可以起到事半功倍的效果。
流程图就是根据系统功能的要求及操作过程,列出主要的各功能模块。复杂程序流向多变,需要在初始化时设置各种标识,根据这些标识控制程序的流向。当系统中各功能模块的状态改变时,只需修改相应的标识即可,无须具体地管理状态变化对其他模块的影响。这些需要在绘制流程图时,清晰地标识出程序流程中各标识的功能。
5.编写程序
上述的工作完成后,就可以开始编写程序了。程序编写时,首先需要对用到的参数进行定义,与标号的定义一样,使用的字符必须易于理解,可以使用英文单词和汉语拼音的缩写形式,这对今后自己的辨读和排错都是有好处的,然后初始化各个特殊功能寄存器的状态,定义中断口的地址区,安排数据存储区,根据系统的具体情况估算中断、子程序的使用情况,预留出堆栈区和需要的数据缓存区,接下来就可以编写程序了。
过去单片机应用软件以汇编语言为主,因为它简洁、直观、紧凑,使设计人员乐于接受。而现在高级语言在单片机应用软件设计中发挥了越来越重要的角色,性能也越来越好,C语言已成为现代单片机嵌入式系统开发中较常用的高级语言。但不管使用何种语言,最终还是需要翻译成机器语言,调试正常后,通过烧录器固化到单片机或片外程序存储器中。至此,程序编写即告完成。