基于Proteus的AVR单片机C语言程序设计与仿真
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 AVR单片机与C语言的关系

1.AVR单片机为什么采用C语言编程

单片机以其体积小,质量轻,成本低,功耗低等特点广泛应用于各个领域。C语言作为一种简捷、高效的编译型高级语言,具备可读性好,可靠性高,运算速度快,编译效率高,可移植性好,有功能丰富的函数库等特点,并且可以直接实现对系统硬件的控制。

当前,许多单片机硬件开发人员纷纷舍弃了汇编语言,而改用单片机C语言进行系统编程。汇编语言有执行效率高的优点,但其可移植性和可读性差,而且它本身就是一种编程效率低下的低级语言,这些都使它的编程和维护极不方便,从而导致整个系统的可靠性也较差。而使用C语言进行嵌入式系统的开发,有着汇编语言编程不可比拟的优势,如下所示。

1)编程、调试灵活方便 C语言作为高级语言的特点决定了它灵活的编程方式。它具有丰富的数据结构类型,可以根据需要采用整型、实型(又称浮点数型)、字符型、数组类型、指针类型、结构类型、联合类型、枚举类型等多种数据类型实现各种复杂数据结构的运算。C语言的语法规则不太严格,程序设计的自由度较大,程序的书写格式自由灵活。同时,当前几乎所有系列的嵌入式系统都有相应的C语言级别的仿真调试系统,使得它的调试环境十分方便。

2)生成的代码编译效率高过去长期困扰人们的所谓“高级语言产生代码太长,运行速度太慢,因此不适合单片机使用”的缺点经过多家公司艰苦不懈的努力,已被大幅度地克服,并终于在20世纪90年代开始趋于成熟,现它已成为专业化的单片机高级语言了。目前,单片机上的C语言的代码长度已经做到了汇编水平的1.2~1.5倍。对于代码长度在4KB以上的程序,C语言的优势更能得到发挥。至于执行速度,只要在好的仿真器的帮助下找出关键代码,再进一步用人工优化,就可很简单地达到十分满意的程度。

3)完全模块化 C语言以函数作为程序设计的基本单位,一种功能由一个函数模块完成,这相当于汇编语言中的子程序。其数据交换可方便地约定实现,这样十分有利于多人协同进行大系统项目的合作开发;同时,由于C语言的模块化开发方式,使得用它开发的程序模块可不经修改地被其他项目所用,所以可以很好地利用现成的大量C程序资源与丰富的库函数,从而最大程度地实现了资源共享。

4)可移植性好由于不同系列的嵌入式系统C语言编译工具都是以1983年的ANSI-C作为基础进行开发的,所以在一种C语言环境下所编写的C语言程序,只需对其部分与硬件相关的地方进行适度修改,就可方便地移植到另外一种系列上。对于许多单片机开发人员来说,以前大都是使用汇编语言或C51进行8051单片机的系统开发的,若突然改用AVR单片机,由于AVR单片机也有一套汇编指令集,所以如果再学AVR汇编指令集需要花费大量的时间,但如果采用C语言进行AVR单片机编程,只需将在C51下编写的程序的头文件改写一下,同时做少量的程序修改,便可方便地移植到AVR系列上。也就是说,基于C语言环境下的嵌入式系统能基本达到平台的无关性。

5)便于项目维护管理用C语言开发的代码便于开发小组计划项目、灵活管理、分工合作、后期维护,基本上可以杜绝因开发人员变化而给项目进度或后期维护或升级所带来的影响,从而保证了整个系统的高品质、可靠性及可升级性。

6)可以直接操作单片机硬件 C语言具有直接访问单片机物理的能力,可以直接访问片内或片外存储器。若突然改用AVR单片机,程序开发人员在并不完全懂得AVR单片机的具体硬件的情况下,也能编出符合硬件实际专业水平的程序来。

2.AVR单片机的C编译器简介

AVR单片机既可以采用汇编语言开发,也可以采用C语言开发。有很多第三方厂商为其开发了用于程序开发的C编译器,常用的编译器有AVR Studio,GCCAVR(WinAVR),ICCAVR,CodeVisionAVR,VMLAB,BASCOM-AVR等。国内使用较多的为ICCAVR,GCCAVR,CodeVisionAVR(简称CVAVR)、IARAVR。

AVR Studio是ATMEL公司专门针对AVR单片机开发的汇编级开发调试软件,它集软硬件仿真、调试、下载于一体,包含AVR Assembler编译器,具有AVR Studio调试功能、AVR Prog串行、并行下载功能和JTAG ICE仿真功能。

GCCAVR是Linux的唯一开发语言,就嵌入系统应用来说,几乎所有市面上有一定市场份额的8bit以上MCU都有爱好者移植GCC在其上。GCC的编译器优化程度可以说是目前世界上民用软件中做得最好的。它完全用ANSIC规范写出了超过一万行代码的程序。目前还没有任何一种编译器产生目标代码的速度能比GCC产生代码的速度更快,而且它的bug数量也可以算所有民用C编译器中最少的。就8bit开发而言,GCC有一个很严重的缺陷,就是不支持float数据类型,实际上GCC在所有环境中都把float直接定义为double,这样对8bit环境来说,就显得负担过重了。

目前,GCCAVR有两个平台:WinAVR和ATmanAVR。被移植到Windows平台上,整合了各个组件后的Windows版GCCAVR就是WinAVR。它不是IDE(Integrated Development Environment,集成开发环境),自己定制IDE时需要用到makefile。makefile的重要作用是指定所用的单片机类型,指定编译的文件,设定编译优化条件等。ATmanAVR是一个支持多个模块调试(AVR Studio不支持)的IDE,它也是使用GCCAVR C/C++语言编译器作为集成开发环境的。它采用了可视化编程技术,可自动生成代码。它给应用程序向导、文本编辑器和调试器等工具提供了有力的支持。其工程采用模块化管理,动态修改轻松自如,全面支持AVR最新热门器件。不过ATmanAVR环境是商业软件。GCCAVR编译器较为烦琐,不容易掌握,因此,对于初学者来说,不推荐使用GCCAVR进行开发。

Image Craft公司开发的ICCAVR是一种针对AVR单片机的集成开发环境,是采用符合ANSI标准的C语言来开发微控制器程序的一个程序开发工具。它具有功能合适、使用方便、技术支持强大等优点。当前市面上介绍用ICCAVR编写AVR单片机程序的例程较多。虽然它的各方面性能均不是特别突出,但使用较为方便。该软件主要具有以下特点:①ICCAVR是一个32位的程序,支持长文件名;②ICCAVR是一个综合了编辑器、工程管理器的C编译器的集成工作环境IDE,可在Windows9x/NT/XP下工作;③ICCAVR采用工程项目管理方式,将源文件全部组织到工程之中,文件的编辑和工程的构筑也在这个环境中完成。在编译过程中,若检测到错误,则错误信息将显示在消息窗口中,单击错误信息提示行时,光标会自动跳转到编辑窗口中引起错误的那一行;④其工程管理器还能直接生成可以直接使用的INTEL HEX格式文件,该格式文件可被大多数编程器支持,用户通过下载器可将其固化到芯片中。ICC Demo版在安装的45天内的代码长度不受限制,超过45天后其代码长度被限制在2KB以内。

CodeVisionAVR是一款优秀的嵌入式系统开发工具,其性能高且易适用于Atmel AVR单片机。CodeVisionAVR与KeilC51的代码风格最为相似,集成了较多常用外围器件的操作函数,支持大部分AVR单片机;支持位变量,而其他的AVR编译器没有此功能;集成了串口/并口AVRISP等下载烧写功能;集成代码生成向导,有软件模块。

IARAVR是一个非常有效的集成开发环境,它使用户能充分、有效地开发并管理嵌入式应用工程。在国外有很多人使用它,但它的价格较为昂贵,因此在中国大陆地区使用它的开发人员较少,只有习惯使用IAR的工程师才会使用它。