第1章 PIC单片机系统的设计与开发环境
自从1946年美国宾夕法尼亚大学研制了世界上第一台数字电子计算机ENIAC (Electronic Numerical Integrator And Computer)以来,计算机的发展经历了4个时代。在短短的几十年中,已发展成大规模/超大规模集成电路的计算机,运算速度每秒钟可达上万亿次。近年来,计算机更是朝着巨型化、智能化、网络化、微型化的方向发展。
微型化的发展也就是微型计算机的发展。在微型计算机中,单片微型计算机 (简称单片机)是其重要的成员之一。单片机的发展也非常迅速,它依靠一定的硬件基础,根据特定环境,能完成一定的需求。因其结构比较简单,工作任务针对性较强,使得在国民经济各个领域中都有它的踪迹。
自从1974年美国仙童 (Fairchild)公司运用计算机技术生产了世界上第一块单片机(F8)以来,在短短的几十年中,单片机作为微型计算机中的一个重要分支,其应用面极广,发展速度极快。
1.1 PIC单片机简介
PIC (Peripheral Interface Controller)系列单片机是由美国微型公司 (Microchip Technology Inc.)推出的一种用于开发控制外围设备的集成电路 (IC),它是一种具有分散作用 (多任务)功能的CPU。
PIC系列单片机的CPU采用RISC指令集,使用Harvard (哈佛)双总线结构,具有指令集简洁、简单易学、速度快、功能强、功耗低、价格低廉、体积小巧、适用性好及抗干扰能力强等特点。PIC系列单片机大量应用于汽车电气控制、电动机控制、工业控制和仪表、通信、家电、玩具等领域。
1. PIC单片机的优势
当今,单片机厂商繁多,产品性能各异。与其他系列单片机相比,PIC单片机主要具有以下优势。
【型号多种,满足各种需求】 PIC不搞单纯的功能堆积,而是从实际出发,重视产品的性价比,靠发展多种型号来满足不同层次的应用要求。PIC单片机分为8位、16位和32位,每种类型又有很多型号供用户选择。例如,一个摩托车的点火器需要一个I/O较少、RAM及ROM存储空间不大、可靠性较高的小型单片机,若采用40脚且功能强大的单片机,会造成资源浪费,使用起来也不方便。PIC12C508单片机仅有8个引脚,是世界上最小的单片机。该型号有512B ROM、25B RAM、一个8位定时器、一根输入线、5根I/O线,正适合像摩托车点火器这样的应用场合。PIC16C74(尚不是其最高档型号)有40个引脚,其内部资源为ROM共4KB、192B RAM、8路A/D、3个8位定时器、2个CCP模块、3个串行口、1个并行口、11个中断源、33个I/O引脚,这样一个型号的单片机可以和其他品牌的高档型号单片机相媲美。
【精简指令集,执行效率高】 基于8051内核的微控制器采用了复杂指令系统CISC(Complex Instruction Set Computing)体系。CISC结构的单片机是传统的冯·诺依曼(Von-Neumann)结构,这种结构又称为普林斯顿(Princeton)体系结构。其片内程序空间和数据空间合在一起,取指令和操作数都是通过同一簇总线分时进行,当高速运算时,取指令和操作数不能同时进行,否则会造成传输通道上的瓶颈现象。
PIC单片机采用精简指令集RISC(Reduced Instruction Set Computing)的Harvard(哈佛)双总线结构。该结构的数据总线和指令总线分离,使指令具有单字长的特性,且允许指令码的位数可多于8位的数据位数,这与传统的采用CISC结构的8位单片机相比,可以实现2:1的代码压缩,速度可以提高4倍。
【产品上市零等待】 采用PIC的低价OPT(One Time Programmable,一次性可编程)芯片,可使单片机在其应用程序开发完成后立刻使产品上市。
【开发环境优越,实时性好】 OTP单片机开发系统的实时性是一个重要的指标。普通51单片机的开发系统大都采用高档型号仿真低档型号,其实时性不尽理想。PIC在推出一款新型号的同时推出相应的仿真芯片,所有的开发系统由专用的仿真芯片支持,实时性非常好。就作者个人的经验来看,还没有出现过仿真结果与实际运行结果不同的情况。
【引脚具有瞬态抑制能力】 PIC单片机的引脚具有防瞬态能力,通过限流电阻可以接至220V交流电源,可以直接与继电器控制电路相连,不需要加光耦合器进行隔离,抗干扰能力强。
【保密性强】 PIC以保密熔丝来保护代码,用户在烧入代码后熔断熔丝,其他人再也无法读出程序代码,除非恢复熔丝。目前,PIC采用熔丝深埋工艺,恢复熔丝的可能性极小。
【内置看门狗】 PIC单片机的片内带看门狗定时器,可用于提高程序运行的可靠性。
【睡眠和低功耗模式】 PIC单片机可以工作在睡眠和低功耗模式下,特别是在便携式设备中,可以满足电池供电场合的应用。虽然PIC在这方面不能与新型的MSP430单片机相比,但也能满足一些低功耗场合的应用。
2. PIC单片机命名规则
PIC单片机型号较多,但是这些单片机的命名均遵循一定的规则。PIC单片机的命名由前缀、系列号、器件类型等部分组成,如下所示。
【前缀】 PIC Microchip公司产品代号。注意,“dsPIC”为集成DSP功能的新型PIC单片机。
【系列号】 10、12、16、18、24、30、33,其中PIC10、PIC12、PIC16、PIC18为8位单片机;PIC24、dsPIC30、dsPIC33为16位单片机;PIC32为32位单片机。
【器件类型】 C表示CMOS电路;CR表示CMOS ROM;LC表示小功率CMOS电路;LCS表示小功率保护;AA表示工作电压为1.8V;LCR表示小功率CMOS ROM;LV表示低电压;F表示快闪可编程存储器;HC表示高速CMOS;FR表示FLEX ROM。
【改进类型或选择】 主要有54A、58A、61、62、620、621、622、63、64、65、71、73、74、42、43、44等。
【晶体标示】 LP为小功率晶体;RC为电阻电容;XT为标准晶体/振荡器。
【工作频率】 -02表示2MHz;-04表示4MHz;-10表示10MHz;-16表示16MHz;-20表示20MHz;-25表示25MHz;-33表示33MHz。
【温度范围】 空白表示0~70℃;1表示-45~85℃;E表示-40~125℃。
【封装形式】 L表示PLCC封装;JW表示陶瓷熔封双列直插,有窗口;P表示塑料双列直插;PQ表示塑料四面引线扁平封装;W表示大圆片;SL表示14引脚微型封装,引脚间隔为150mil;JN表示陶瓷熔封双列直插,无窗口;SM表示8引脚微型封装,引脚间隔为207mil;SN表示8引脚微型封装,引脚间隔为150mil;VS表示超微型封装8mm×13.4mm;SO表示微型封装,引脚间隔为300mil;ST表示薄型缩小的微型封装,引脚间隔为4.4mm;SP表示横向缩小型塑料双列直插;CL表示68引脚的陶瓷四面引线,有窗口;SS表示缩小型微型封装;PT表示薄型四面引线扁平封装;TS表示薄型微型封装8mm×20mm;TQ表示薄型四面引线扁平封装。
3. PIC单片机的种类及选型
Microchip公司的PIC系列单片机分为8位单片机、16位单片机、32位单片机和超低功耗单片机,本书仅介绍8位单片机的相关知识。
8位单片机在其整个8位机家族中分为基本级、中级、高级3档,对应的内部指令宽度分别是12位、14位、16位。
12位指令宽度的低档单片机结构简单、价格低廉。如PIC16C5x系列的PIC16C54C、PIC16C57C等,适用于一些控制任务相对简单且对价格敏感的家电产品。又如PIC12C5xx系列的PIC12C508A、PIC12C509等,是世界上较早出现的8引脚低价单片机,因其体积小,完全可以适用于以前不能使用单片机的家电产品中。
14位指令宽度的中档单片机是目前型号最丰富的品种系列,其片内功能模块种类齐全,组合灵活多变,如内部带有A/D变换器、E2 PROM数据存储器、比较器输出、PWM输出、I2C和SPI等接口;外部结构形式较丰富,有8引脚到68引脚的各种封装。该档产品性能很高,适用于各种高、中和低档电子产品的设计。代表型号如PIC16F7x系列的PIC16F73、PIC16F74、PIC16F76、PIC16F77;PIC16F87xA系列的PIC16F873A、PIC16F874A、PIC16F876A、PIC16F877A等。
16位指令宽度的高档单片机在命名上以PIC18开头,整个内核体系在PIC16系列基础上有很大提高,最高指令流可达10MIPS(单条指令执行时间为100ns),达到部分16位单片机的性能,适用于要求高速数字运算的高端产品。
由于实际项目对单片机的功能要求不同,所以在使用前要根据实际需求选择合适的PIC单片机型号。本节以引脚 (pin)数目为索引列出PIC系列8位单片机的产品列表。
表1-1所示是8/14引脚的单片机选型表,该类单片机的突出特点是体积微小、功能丰富,主要用于低成本、体积敏感型应用领域。
表1-1 8/14引脚单片机选型表
表1-2所示是18/20引脚的单片机选型表,这类单片机是产品设计中常用的,其特点是体积小,不同型号的功能特色明显,主要应用于低成本控制领域。
表1-2 18/20引脚单片机选型表
表1-3所示是28引脚单片机选型表,这类单片机也是产品中常用的,其特点是体积小、功能强,不同型号的功能特色明显。
表1-3 28 引脚单片机选型表
表1-4所示是40/44引脚单片机选型表,这是PIC单片机中主要用于教学、科研的一类型号,其特点是功能齐全,性价比高。
表1-4 40/44引脚单片机选型表
表1-5所示是64/68引脚单片机选型表,这类单片机主要用于液晶显示模块、CAN总线控制等领域。
表1-5 64/68引脚单片机选型表
表1-6所示是80/84引脚单片机选型表,这类单片机主要应用于LCD控制、高精度A/D转换、CAN总线等多输入/输出 (Input/Output,I/O)引脚控制领域。
表1-6 80/84引脚单片机选型表
尽管PIC单片机种类很多,但不同家族、不同型号之间的源代码移植非常方便。这完全得益于PIC单片机内核设计的一致性,使其指令上下兼容,具备相同的功能模块操作方式,更重要的是其表现出的电气特性也一致。目前,国内单片机的应用方向还主要定位在中低端的产品设计中,自然PIC16系列成为广大设计工程师关注的焦点。本书就以PIC家族中最典型的中档产品PIC16F877/PIC16F877A为立足点展开深入讨论。
PIC16F877是Microchip公司于1998年年底推出的一款Flash单片机,这款单片机以高性价比、适合于学习研究而著称。后来Microchip公司又推出了改进版本PIC16F877A,对PIC16F877做了细微的优化和改进,但二者的使用方法基本相同。本书所述内容同时适用于PIC16F877和PIC16F877A单片机,书中对这两款单片机不作区分。
1.2 PIC单片机与C语言的关系
1. PIC单片机采用C语言编程的原因
单片机以其体积小、质量轻、成本低、功耗低等特点广泛应用于各个领域。C语言作为一种简洁高效的编译型高级语言,具备可读性好、可靠性高、运算速度快、编译效率高、可移植性好、有功能丰富的函数库等特点,并且可以直接实现对系统硬件的控制。
当前,许多单片机硬件开发人员纷纷舍弃了汇编语言,而改用单片机C语言进行系统编程。汇编语言有执行效率高的优点,但其可移植性和可读性差,并且它本身就是一种编程效率低下的低级语言,这些都使它的编程和维护极不方便,从而导致整个系统的可靠性也较差。而使用C语言进行嵌入式系统的开发,有着汇编语言编程不可比拟的优势。
【编程、调试灵活方便】 C语言作为高级语言的特点决定了它灵活的编程方式。它具有丰富的数据结构类型,可以根据需要采用整型、实型(又称为浮点数型)、字符型、数组类型、指针类型、结构类型、联合类型、枚举类型等多种数据类型实现各种复杂数据结构的运算。C语言的语法规则不太严格,程序设计的自由度较大,程序的书写格式自由灵活。同时,当前几乎所有系列的嵌入式系统都有相应的C语言级别的仿真调试系统,使得它的调试十分方便。
【生成的代码编译效率高】 过去长期困扰人们的所谓“高级语言产生代码太长,运行速度太慢,因此不适合单片机使用”的缺点经过多家公司艰苦不懈的努力,已被大幅度地克服,终于在20世纪90年代开始趋于成熟,现已成为专业化的单片机高级语言。目前,单片机上C语言的代码长度已经做到了汇编水平的1.2~1.5倍。代码长度在4KB以上的程序,C语言的优势更能得到发挥。至于执行速度的问题,只要有好的仿真器的帮助,找出关键代码,进一步用人工优化,就可以很简单地达到十分完美的程度。
【完全模块化】 C语言以函数作为程序设计的基本单位,一种功能由一个函数模块完成,这相当于汇编语言中的子程序。数据交换可以方便地约定实现,这样十分有利于多人协同进行大系统项目的合作开发;同时,由于C语言的模块化开发方式,使得用它开发的程序模块可不经修改就被其他项目所用,可以很好地利用现成的大量C程序资源与丰富的库函数,从而最大程度地实现资源共享。
【可移植性好】 由于不同系列的嵌入式系统C语言编译工具都是以1983年的ANSI C作为基础进行开发的,因此,一种C语言环境下所编写的C语言程序,只需将部分与硬件相关的地方进行适度修改,就可以方便地移植到另外一种系列上。对于许多单片机开发人员来说,以前大都使用汇编语言或C51进行8051单片机的系统开发,若一下子改用PIC单片机,由于PIC单片机也有一套汇编指令集,如果再学PIC汇编指令集,这样会花费大量的时间,若采用C语言进行PIC单片机编程,则只需将C51下编写的程序改写头文件,同时做少量的程序修改,即可方便地移植到PIC系列上。也就是说,基于C语言环境下的嵌入式系统能基本达到平台的无关性。
【便于项目维护管理】 用C语言开发的代码便于开发小组计划项目、灵活管理、分工合作,以及后期维护,基本上可以杜绝因开发人员变化而给项目进度或后期维护或升级带来影响,从而保证了整个系统的高品质、可靠性及可升级性。
【可以直接操作单片机硬件】 C语言具有直接访问单片机物理区域的能力,可以直接访问片内或片外存储器。当一下子改用PIC单片机时,程序开发人员即使并不完全懂得PIC单片机的具体硬件,也能够编出符合硬件实际专业水平的程序。
2. PIC单片机的C编译器简介
PIC单片机既可以采用汇编语言开发,也可以采用C语言开发。由于PIC10、PIC12、PIC16等系列的8位单片机片内程序区较小,Microchip公司没有推出针对这些中、低档系列PIC单片机的C语言编译器,而只提供针对PIC18、PIC24、dsPIC、PIC32系列单片机的C语言编译器MCC (MCC18/MCC30/MCC32)。但很多专业的第三方公司提供众多支持PIC单片机的C语言编译器,常见的有HITECH、CCS等公司。HITECH公司 (现已成为Microchip旗下的一家全资子公司)的PICC编译器稳定可靠,编译生成的代码效率高,在用PIC单片机进行系统设计和开发的工程师群体中得到了广泛认可。
HI-TECH PICC是一款高效的C编译器,支持Microchip PICmicro 10/12/14/16/17系列控制器。它是一款强劲的标准C编译器,完全遵守ISO/ANSI C,支持所有的数据类型 (包括24 and 32 bit IEEE标准浮点类型)。由于PIC单片机特殊的堆栈结构,使得HI-TECH PICC不支持函数的递归调用。PIC单片机中的堆栈是硬件实现的,其深度已随芯片固定,无法实现需要大量堆栈操作的递归算法;另外,在PIC单片机中实现软件堆栈的效率也不是很高。为此,HI-TECH PICC编译器采用一种“静态覆盖”技术,以实现对C语言函数中的局部变量分配固定的地址空间。经过这样处理后产生出的机器代码效率很高。当代码量超过4KB后,C语言编译出的代码长度与全部用汇编代码实现的差别已经不是很大 ( <10%),当然前提是在整个C代码编写过程中需时时注意所编写语句的效率。
本书中所使用的MPLAB -IDE软件包中默认情况下已经安装了HI-TECH PICC LITE V9.60PL1版本的编译器。此编译器是HI-TECH PICC的精简版本,能够支持PIC16F877、PIC16F877A、PIC16F873等几款常见芯片的C语言源代码编译,但是有ROM和RAM的使用限制: ①目标文件ROM使用量小于2KB;②目标文件RAM仅能使用Bank0和Bank1 (2个体256B);③目标文件优化程度低,占用ROM/RAM较多。
但是,这些限制不影响初学者对PIC单片机C语言的学习,所以本书还是以此版本为例介绍PIC单片机C语言的基础和编程。如果用于实际项目的开发,建议购买正版HI-TECH PICC编译器或使用更高版本的精简版,那样就可以利用所有单片机的资源并充分发挥编译器的优化能力。
CCS PIC虽然也是一款高效的C语言编译器,但因为头文件不同,所以它的程序和HI-TECH PICC、MCC都不一样,三者的程序不能混着编译,比如针对CCS PIC编写的程序只能用CCS PIC的编译器编译,用HI-TECH PICC编译可能报错。
1.3 MPLAB-IDE的使用
要进行单片机应用系统的开发,必须有一个容易使用的软件开发环境作为基础。PIC单片机的开发环境有许多,最常用的是Microchip公司为其用户免费提供的MPLAB-IDE。
MPLAB集成开发环境 (IDE)是综合的编辑器、项目管理器和设计平台,适用于使用Microchip的PIC系列单片机进行嵌入式设计的应用开发。MPLAB-IDE是以项目为导向的综合模拟调试开发环境软件,它把文本编辑器、链接器、项目管理器和一系列调试器全部集成到一个模拟开发环境下,从而形成了一套不仅功能丰富并且使用方便的软件包。通过MPLAB-IDE,单片机项目开发者可以在计算机中对PIC系列的单片机进行源程序编写、编译,甚至还能实现目标程序的模拟运行和动态调试等操作。
1. MPLAB-IDE软件安装
本书用的是MPLAB-IDE V8.33,如果想用最新版本,可以到相关网站进行下载。将MPLAB-IDE V8.33软件解压缩后,双击Install MPLAB_8_33文件进行安装,在安装过程中会弹出如图1-1所示对话框,询问是否安装HI-TECH C编译器,如果单击“是 (Y)”按钮,HI-TECH C编译器会内嵌在MPLAB -IDE软件中。MPLAB -IDE安装完成后出现MPLAB图标,双击该图标即可启动MPLAB-IDE开发工具。
图1-1 询问是否安装HI-TECH C编译器
2. MPLAB-IDE项目生成
启动MPLAB-IDE软件后,里面是空的,首先必须创建项目,这类软件都是以项目为目标进行统一管理的。
执行菜单命令“Project”→“Project Wizard”,弹出如图1-2所示的项目创建向导窗口。单击“下一步”按钮,弹出如图1-3所示窗口,在此窗口中单击“Device”右侧的下拉列表按钮,可以查看各种型号的器件名称,用户可根据需要选择合适的目标芯片型号。选择完目标芯片型号后,单击“下一步”按钮,出现如图1-4所示窗口,要求用户选择合适的编译器。如果用户使用汇编语言编程,可单击“Active Toolsuite”右侧的下拉列表按钮并选择默认的“Microchip MPASM ToolSuite”,即Microchip公司的PIC单片机汇编语言编译器;如果用户使用C语言编程,可单击“Active Toolsuite”右侧的下拉列表按钮并选择默认的“HI -TECH Universal ToolSuite”,即选择HI-TECH PICC编译器。选择完编译器后,单击“下一步”按钮,出现创建项目文件窗口,如图1-5所示。在该窗口中单击“Browse…”按钮,并选择项目文件创建的路径 (注意路径不能含有中文,本项目命名为“LED test.mcw”),然后单击“下一步”按钮,出现如图1-6所示窗口。在该窗口中,要求添加已有文件到项目中,如果事先没有现成的文件或用户不想加入已有文件,可以直接单击“下一步”按钮。接着出现项目创建完成窗口,如图1-7所示。在该窗口中将会显示这一项目的摘要情况,包括所选择的目标器件、选用的编译器、项目路径及项目名称。如果确认没有问题,则单击“完成”按钮建立项目;否则可单击“上一步”按钮,再一步一步地退回并更改相应内容。
图1-2 项目创建向导窗口
图1-3 选择目标芯片
图1-4 选择编译器
图1-5 创建项目文件
图1-6 添加已有文件到项目中
图1-7 项目创建完成
项目创建后,回到MPLAB-IDE的主界面,如图1-8所示。如果并没有显示出如图1-8所示的“LED test.mcw”项目窗口,则可执行菜单命令“View”→“Project”,以打开该窗口。
图1-8 创建好项目后回到主界面
注意:
在图1-8所示的项目窗口中并没有包含任何文件,需要用户创建源程序文件。
执行菜单命令“File”→“New”,打开一个空白的源程序编辑窗口。在此窗口中输入源程序,输入完后将其保存。在保存时源程序的文件名由用户自己定义 (在此定义为LED_test.c),如果编写的是C语言程序,则文件的扩展名为.c。
注意:
文件名不能含有中文。
编写完源程序后,必须将该源程序加入项目中。在项目窗口中右击“Source Files”,出现快捷菜单,如图1-9所示,选择“Add Files…”,即出现如图1-10所示的对话框,选择“LED_test.c”,单击“打开”按钮,即可将该文件加入到项目中。
图1-9 向项目中添加文件
图1-10 将源程序加入项目中
文件加入项目后,执行菜单命令“Project”→“Build”或按F10功能键,即可对项目中的源程序进行编译。编译、链接的结果如图1-11所示。如果源程序代码书写有错误,则会在“Output”窗口中输出错误信息,并指定错误所在行。用户在错误原因上双击即可自动定位到源程序代码出错行位置,根据错误原因修改即可。建议读者要养成先修改第一个错误的好习惯,因为后续错误有可能是第一个错误引起的,第一个错误改正后,其后错误也许就没有了。
图1-11 编辑、链接完成的结果
至此,这个程序已建立完毕,并编译、链接通过,生成了名为LED_test.cof的目标代码文件。该文件可供调试器调用,以进行源码级的调试。同时,还生成了名为LED_test.hex的目标文件。如果有硬件电路,可以将LED_test.hex文件通过下载器固化到目标芯片中。
3. MPLAB-IDE模拟调试
在MPLAB-IDE内部集成了模拟调试软件MPLAB SIM,通过该调试软件可以模拟仿真源程序的运行过程。
为了更好地分析代码,有时需在源程序代码的左侧显示行号。显示行号的操作如下: 执行菜单命令“Edit”→“Properties”,弹出“Editor Properties”对话框,在此对话框中选择“‘C’ File Types”选项卡,并选中“Line Numbers”复选框,如图1-12所示。
图1-12 “Editor Properties”对话框
执行菜单命令“Debugger”→“Select Tool”→“MPLAB SIM”后,进入MPLAB SIM的调试状态。在调试状态下,MPLAB -IDE窗口底部的状态栏改变为“MPLAB SIM”;在Debugger菜单栏中将出现更多的菜单项;在Debug工具栏中出现调试工具栏图标;在Output窗口中增加了一个MPLAB SIM选项卡。调试工具栏的图标含义如表1-7所示。
表1-7 调试工具栏的图标含义
在调试状态下,执行菜单命令“Debugger”→“Reset”→“MCLR Reset”,可对MCLR复位;执行菜单命令“Debugger”→“Reset”→“Watchdog Timer Reset”,可对看门狗定时器复位;执行菜单命令“Debugger”→“Reset”→“Brown Out Reset”,进行欠压复位;执行菜单命令“Debugger”→“Reset”→“Processor Reset”,进行处理器复位。
在源程序的行前双击,可添加或删除断点,设置好断点后单击合适的调试图标可进入断点调试运行。
执行菜单命令“View”→“Watch”,空白的Watch窗口将出现。在Watch窗口的顶部有两个下拉框,标记为Add SFR的下拉框可以用来在Watch窗口中添加特殊功能寄存器;标记为Add Symbol的下拉框可以用来添加来自程序的符号 (源程序中的变量)。图1-13所示的“Watch”窗口中添加了“PORTD”端口及“delayms ms”变量。
图1-13 “Watch”窗口
执行菜单命令“View”→“File Registers”,可查看文件寄存器组中的内容,如图1-14所示。
图1-14 文件寄存器组窗口
用C语言编写的程序会占用程序存储器的一些空间。程序存储器中每个地址基本上只能存放一行汇编代码。当使用C语言编写的源程序代码项目被编译时,将产生一个列表文件 (.lst),它给出了C代码转换成汇编和机器语言代码。列表文件可用来评估使用了程序存储器多少空间。执行菜单命令“View”→“Disassembly Listing”,进入反汇编列表,可查看列表文件。图1-15为LED test.c源程序的反汇编列表,从图中可以看出断点也出现在反汇编列表中,列表文件给出了每行C代码产生的汇编开销,同时还显示了每条汇编指令在程序存储器中的地址及指令的十六进制值 (机器语言代码)。
图1-15 反汇编列表
执行菜单命令“View”→“Program Memory”,可以查看程序存储器的使用情况,如图1-16所示。执行此命令,汇编语言和机器语言代码都将显示,包括代码在程序存储器中所占用的地址。
图1-16 程序存储器窗口
执行菜单命令“View”→“Special Function Register”,将弹出如图1-17所示的特殊功能寄存器窗口。在此窗口中,可以查看相应的特殊功能寄存器中的状态。
图1-17 特殊功能寄存器窗口
有时要分析一些断点的运行时间,如子延时函数的延时时间。在调试状态下,可以先执行菜单命令“Debugger”→“Settings”,在弹出的仿真设置窗口中选择“Osc/Trace”选项卡,更改晶振工作频率,如图1-18所示。再执行菜单命令“Debugger”→“Stopwatch”,弹出如图1-19所示的对话框。然后单击调试工具栏中的相应图标,即可观看每次执行的时间。
图1-18 仿真设置窗口
图1-19 跑表窗口
1.4 下载软件
在MPLAB-IDE中生成了程序目标代码文件后,将.hex文件通过下载器固化到单片机中时需要相应的下载软件。目标文件的固化又称为器件编程、器件下载等。
1. PICkit 2下载软件
PICkit 2编程器可以将程序目标代码文件下载到各种基于闪存的PIC单片机的Flash程序存储器中,以实现在线下载功能。
1)PICkit 2窗口简介 将PICkit 2 Starter kit CD ROM插入光驱后,按照计算机屏幕上的指示可以安装PICkit 2下载软件。当PICkit 2下载软件安装好后,双击该软件,将出现如图1-20所示的下载界面窗口。该窗口主要由菜单栏、器件配置、状态条、进度条、器件VDD、程序存储器、EEPROM等部分组成。
图1-20 PICkit 2下载界面
【菜单栏】 PICkit 2编程下载软件的菜单栏中主要有File(文件)、Device Family(器件系列)、Programmer(编程)、Tools(工具)、View(查看)、Help(帮助)菜单。
【器件配置】 器件配置区域主要包含Device(器件)、Configuration(配置字)、User IDs(用户ID)、Checksum(校验和)、OSCCAL和BandGap(带隙)等信息。对于基本级(12位内核)的PIC器件,用户必须从Device Family菜单中选择器件,而其他系列的器件都通过器件ID进行检测,器件名会显示在Device行中。OSCCAL和BandGap(带隙)两项仅针对具有这些特性的器件时才会显示相关内容。
【状态条】 状态条以文本形式显示当前操作的状态。如果操作成功,则状态条会显示绿色背景;如果操作失败,则状态条会显示粉红色背景;如果操作引起警告提示,则状态条会显示黄色背景。
【进度条】 进度条显示任务操作的进度。
【器件VDD】 在VDD PICkit 2区域,通过单击复选框On(使能)可以打开或关闭PICkit 2编程器的VDD,在右边框中直接输入数字或调节上下箭头(每次1/10V)可以设置VDD的电压。允许设置的VDD范围根据目标器件的不同而有所不同。
【程序存储器】 执行菜单命令“File”→“Import Hex”,可将程序代码加载到PICkit 2编程软件中;或者单击Read(读)按钮从器件中读取程序代码。代码的来源显示在存储器源Source文本框中。Program Memory区域仅显示十六进制的程序代码,不能在此区域对代码进行编辑。Program Memory区域左上角的Enable复选框仅在具有EEPROM数据存储器的器件上提供。如果选中该复选框,则程序存储器、用户ID和配置字将写入器件或从器件中读取,并在器件上进行校验。如果未选中该复选框,则程序存储器、用户ID和配置字在写操作中不会被擦除或更改,也不会被读取或校验。该复选框不影响擦除器件或空白检查操作。不能同时清除Program Memory和EEPROM Data两个存储器区域中的Enable复选框。
【EEPROM数据存储器】 执行菜单命令“File”→“Import Hex”,可将程序代码加载到PICkit 2编程软件中;或者单击Read(读)按钮从器件中读取程序代码。代码的来源显示在存储器源Source文本框中。EEPROM Data区域仅显示十六进制的程序代码,不能在此区域对代码进行编辑。EEPROM Data区域左上角的Enable复选框控制读、写或校验EEP-ROM数据存储器。如果选中该复选框,则器件EEPROM中的内容将用该区域中的数据覆盖;如果未选中该复选框,则器件EEPROM中的内容在写操作中不会被擦除或更改。该复选框不影响擦除器件或空白检查操作。
2)下载目标文件 将PICkit 2下载器与单片机正确连接好,并在PICkit 2下载软件中进行相应设置后,就可以下载目标文件。下载目标文件时,首先执行菜单命令“File”→“Import Hex”(如图1-21所示),找到目标文件 (如LED test.hex),将该文件内容装载到PICkit 2软件中,在程序存储器区域中显示出所装载的目标文件内容。然后单击Write按钮,将程序下载到单片机的内部程序存储器中。
图1-21 导入目标文件
器件配置区域下面的状态条显示“编程 (下载)”操作的状态,如果编程 (下载)成功,状态条会变成绿色并显示“Programming Successful”(编程成功);如果编程失败,状态条中会以粉红色的背景显示编程失败的提示信息。显示编程成功的信息时,目标程序文件就已经固化到PIC单片机中了,而PIC单片机也可以运行该程序了。
2. PonyProg2000下载软件
PonyProg2000是一款功能强大的ISP下载软件,它可以下载/编程AVR、PIC等系列单片机和很多类型的EEPROM。由于该软件在启动时会出现一只马头,因此,有人将该软件称为小马软件。
1)PonyProg2000的安装 PonyProg2000软件的安装可按以下步骤操作。
(1)双击安装文件Setup.exe,弹出如图1-22所示的欢迎信息框,单击“Next”按钮继续。
图1-22 欢迎信息框
(2)在弹出的软件授权许可界面中选择“I accept the agreement”(我接受许可协议),再单击“Next”按钮,如图1-23所示。
图1-23 软件授权许可界面
(3)在弹出的对话框中单击“Change”按钮更改安装路径,或直接单击“Next”按钮按照默认路径进行安装,直到安装结束。
2)PonyProg2000的使用 使用PonyProg2000软件将已编译生成的Hex文件下载到PIC单片机中时,一般需要按以下步骤操作。
(1)启动PonyProg2000软件: 执行菜单命令“开始”→“程序”→“PonyProg”→“PonyProg2000”,进入图1-24所示的PonyProg2000的启动界面。在“About PonyProg2000”界面中选择“Disable sound”复选框,将取消音效马叫声。
图1-24 PonyProg2000启动界面
(2)选择下载器件型号: 在About PonyProg2000界面中单击“OK”按钮后,执行菜单命令“De-vice”→“PIC 16 micro”→“PIC16F877A”,选择下载目标芯片型号为PIC16F877A。
(3)端口设置: 在PonyProg2000界面执行菜单命令“Setup”→“Interface Setup”,弹出如图1-25所示的对话框。在该对话框中可设置下载方式和选择控制线的极性,然后单击“OK”按钮。PonyProg2000支持的下载方式有并行下载和串行下载。
图1-25 端口设置
(4)端口校正: 端口设置好后,在PonyProg2000界面执行菜单命令“Setup”→“Calibration”,弹出如图1-26所示的对话框。在该对话框中单击“Yes”按钮开始端口校正,校正完成后会弹出提示窗口,单击“OK”按钮即可。
图1-26 端口校正
(5)编程设置: PIC16F877A单片机的程序存储器是Flash存储器,在下载程序前必须先对其进行擦除操作。在PonyProg2000界面执行菜单命令“Command”→“Program Op-tions”,在弹出的对话框中选中“Reload Files”、 “Erase”、“Write Program memory (FLASH)”3个复选框,如图1-27所示,然后单击“OK”按钮。
图1-27 编程设置
(6)装载编程文件: 在PonyProg2000界面执行菜单命令“File”→“Open Program (FLASH)Files”,弹出“Open Pro-gram (FLASH)content file”对话框。在该对话框中指定文件类型为“*.hex”,在查找范围中找到已通过MPLAB-IDE编译并生成的目标文件 (如LED test.hex),PonyProg2000的编辑窗口中显示已装载的编程文件,如图1-28所示。
图1-28 装载目标文件
(7)下载程序: 在PonyProg2000界面执行菜单命令“Command”→“Program”,可将图1-28中装载的编程文件下载到PIC16F877A中。如果删除、下载、确认等没有异常,就会弹出Program successful消息框,表示程序下载成功。