第一章 AVR单片机开发工具
1.1 概述
典型单片机应用系统框图
单片机应用系统开发包括硬件(电路)系统开发和软件系统开发,硬件系统的开发一般包括电路原理设计,PCB(印刷电路板)设计制作两个部分,使用Protel等软件实现。由于现在单片机系统的一个未来的发展趋势就是外围电路最简化,最终实现单片系统,某些高档单片机已经集成了很多的外部设备的功能,如AVR单片机集成了ROM、RAM、RC震荡电路、PWM波输出功能、AD转换器功能、模拟比较器功能等,如Atmega64单片机,所以单片机的外围电路变得非常的简单,简单的单片机系统只要一片单片机便足够了,所以对单片机的硬件系统开发,我们在此不在进行详细的讲解。
1.2 单片机软件系统开发流程
开发单片机软件系统,一般来说都要经历以下的过程:
编写代码—〉编译器编译—〉仿真器仿真—〉烧写器烧写/在线下载
对于AVR系列单片机,可以使用汇编编程,也可以使用C语言和BASIC语言开发,我们选择C语言编程开发,Atmel公司和它的合作伙伴提供了一整套开发工具:
C语言编写: ICCAVR (仿真软件: AVR Studio) 下载软件: Progisp
开发流程大致如下(括号中所注为所使用的软件名):
编写指令代码(ICCAVR)编译器编译(ICCAVR)仿真器仿真(AVRStudio)烧写器烧写器件/在线下载(Progisp)反复修改直至符合要求工作不正常上电单片机开始工作 单片机系统开发流程
1.3 编程:C语言编程环境
1.3.1 AVR单片机编译软件ICCAVR简介
(1) ImageCraft 的ICCAVR 介绍
ImageCraft 的ICCAVR 是一种使用符合ANSI 标准的C 语言来开发微控制器MCU 程序的一个工具。它有以下几个主要特点:
ICCAVR 是一个综合了编辑器和工程管理器的集成工作环境IDE,其可在以下系统 WINDOWS9X/NT中应用,源文件全部被组织到工程之中。文件的编辑和工程的构筑也在这个环境中完成,编译错误显示在状态窗口中,并且当你用鼠标单击编译错误时,光标会自动跳转到编辑窗口中引起错误的那一行。
(2) ICCAVR 中的主要文件类型及其扩展名
文件类型是由它们的扩展名决定的。IDE 和编译器可以使用以下几种类型的文件:
.c 扩展名----表示是C 语言源文件
.h 扩展名----表示是C 语言的头文件
.prj 扩展名----工程文件,这个文件保存由IDE 所创建和修改的一个工程的有关信息;
.hex扩展名----INTEL HEX 格式文件,器件目标文件,这个文件可被大多数的编程器所支持,用于下载程序到芯片中去使得单片机上电开始执行。
.cof扩展名----AVRStudio仿真文件格式,在AVRStudio的仿真时使用;
1.3.2 ICCAVR使用方法
打开ICCAVR主界面,在主窗口中选择打开、编辑、查找、视图、工程、RCS、工具、终端、帮助等菜单,进入相应的子菜单:
其中保存、打开、关闭文件等的操作都在打开菜单中。 (1)打开工程或者新建工程。在工程中创建文件:
新建工程
(2)建立源文件:
建立源文件可以用两种方式,一种是自己编写全部代码,另外一种是使用应用程序向导建立初始化代码,而后添加自己的代码,这样可以省去查阅寄存器的麻烦,而且格式比较好。下面介绍第二种方式:点击
(应用程序向导)打开器件初始设置窗口,这里包括CPU设置,I/O端口初始设置,Timer0、Timer1、
Timer2、Timer3设置窗口,UART设置窗口以及同步串行口SPI和模拟比较器设置窗口。
在这里填写11.0592晶振频率 在这里选择M64 在这里修改IO口数据方向和数值
芯片功能初始化设置
(3)向工程中添加文件:
向工程中增添文件
添加完毕
(4)编译工程,生成目标文件:
工程编译设置:
在Project\\Options…中选择器件型号、输出文件类型、保存目录。在显示的主界面中完成程序 编制或者修改,保存所做的工作。
选择器件我们选择ATMega64 库目录 输出文件保存格式选择COF/HEX
ICCAVR软件输出设置
编译:
单击进行仿真。
或者按下图使用菜单执行编译操作。生成的*.hex这种文件可以被PonyProg下载软件识别并通过
少写器或者下载线,在线下载入单片机的程序FLASH ROM中;另外生成的.cof文件可以被AVR Studio打开
[注]:增量编译常常出现奇怪错误,建议每次使用全部重新编译
1.3.3 AVR单片机的C语言编程
AVR单片机的C语法和标准C语言的语法相兼容的。但是单片机的语法中还增加了一些专门针对单片机硬
件的一些关键字,有些还可能针对某些特定种类的单片机有专门的定义,这些定义一般已经在单片机的C编译器中做了相应的定义。像著名的Keil C就集成了几乎是所有的51系列单片机定义,而我们所使用的ICCAVR也是一样集成了AVR单片机的定义。在编译器中选择器件类型实际上就是在做这样的工作,包括定义头文件、库文件、寄存器等等。
下面是简单的ICCAVR C语法的举例:(注释方法和普通的C语言是一样的)
代码及注释 具体解释 #include
char c; ◎定义变量
DDRB = 0xFF; /* PortB 输出*/ ◎DDR×表示×IO口的8位方向寄存器,0xFF表示FFH,即8位全
是1时表示8位输出,(反之表示输入)此句可以实现8位IO口PortB全部用于输出
for(;;) /* 死循环*/ ◎单片机特色,无限死循环 {
c = PIND; /* 读Port D */ ◎PIN×是×IO口的8位输入缓冲寄存器,此句可以实现将D口数据
读入存在变量c中
PORTB = c; /* 回写到Port B */ ◎将数据写到B口 } }
访问I/O寄存器:
? 读I/O: temp = PIND;
? 写I/O: PORTC = 0x4F; //转化为十进制数为79 ? I/O 的位设置与清除
?I/O置1,如B口第0位置1,其余不变:
PORTB |= 0x01;
? I/O清0,如D口第3位清零,其余不变:
PORTD &= ~(0x08);或者PORTD &=0xF7; ? I/O取反,如C口第6、7位取反,其余不变:
PORTC =PORTC^0xC0; //(^异或运算符)
计数或者循环:
int count= 5; do{
}while(--count);
延时:
void delay(int time) { }
unsigned int i,j; for(i=0;i