1、PIC 单片机 C 语言编程教程 作者:佚名 来源:不详 录入:Admin 更新时间:2008-7-26 17:03:52 点击数:3 【字体: 】 PIC 单片机 C 语言编程简介用 C 语言来开发单片机系统软件最大的好处是编写代码效率高、软件调试直观、维护升级方便、代码的重复利用率高、便于跨平台的代码移植等等,因此 C 语言编程在单片机系统设计中已得到越来越广泛的运用。针对 PIC 单片机的软件开发,同样可以用 C 语言实现。但在单片机上用 C 语言写程序和在 PC 机上写程序绝对不能简单等同。现在的 PC 机资源十分丰富,运算能力强大,因此程序员在写 PC 机的应用程序时几乎不用关心编译
2、后的可执行代码在运行过程中需要占用多少系统资源,也基本不用担心运行效率有多高。写单片机的 C 程序最关键的一点是单片机内的资源非常有限,控制的实时性要求又很高,因此,如果没有对单片机体系结构和硬件资源作详尽的了解,以笔者的愚见认为是无法写出高质量实用的 C 语言程序。这就是为什么前面所有章节中的的示范代码全部用基础的汇编指令实现的原因,希望籍此能使读者对 PIC 单片机的指令体系和硬件资源有深入了解,在这基础之上再来讨论 C 语言编程,就有水到渠成的感觉。本书围绕中档系列 PIC 单片机来展开讨论,Microchip 公司自己没有针对中低档系列 PIC 单片机的 C 语言编译器,但很多专业的第
3、三方公司有众多支持 PIC 单片机的 C 语言编译器提供,常见的有 Hitech、CCS、IAR、Bytecraft 等公司。其中笔者最常用的是 Hitech 公司的 PICC 编译器,它稳定可靠,编译生成的代码效率高,在用 PIC 单片机进行系统设计和开发的工程师群体中得到广泛认可。其正式完全版软件需要购置,但在其网站上有限时的试用版供用户评估。另外,Hitech 公司针对广大 PIC 的业余爱好者和初学者还提供了完全免费的学习版 PICC-Lite 编译器套件,它的使用方式和完全版相同,只是支持的 PIC 单片机型号限制在 PIC16F84、PIC16F877 和 PIC16F628 等几
4、款。这几款 Flash 型的单片机因其所具备的丰富的片上资源而最适用于单片机学习入门,因此笔者建议感兴趣的读者可从 PICC-Lite 入手掌握 PIC 单片机的 C 语言编程。在此列出几个主要的针对 PIC 单片机的 C 编译器相关连接网址,供读者参考:Hitech-PICC: IAR:CCS: Hitech-PICC 编译器的一些基本概念,由于篇幅所限将不涉及 C 语言的标准语法和基础知识介绍,因为在这些方面都有大量的书籍可以参考。重点突出针对 PIC 单片机的特点而所需要特别注意的地方。11.2Hitech-PICC 编译器PICC 基本上符合 ANSI 标准,除了一点:它不支持函数的递
5、归调用。其主要原因是因为 PIC 单片机特殊的堆栈结构。在前面介绍 PIC 单片机架构时已经详细说明了 PIC 单片机中的堆栈是硬件实现的,其深度已随芯片而固定,无法实现需要大量堆栈操作的递归算法;另外在 PIC 单片机中实现软件堆栈的效率也不是很高,为此,PICC 编译器采用一种叫做“静态覆盖”的技术以实现对 C 语言函数中的局部变量分配固定的地址空间。经这样处理后产生出的机器代码效率很高,按笔者实际使用的体会,当代码量超过 4K 字后,C 语言编译出的代码长度和全部用汇编代码实现时的差别已经不是很大( bsf= bcf0x20,70x20,3if (tmpunsigned b1: 1; u
6、nsigned b2: 1;unsigned b3: 1;unsigned b4: 1;unsigned b5: 1;unsigned : 2; /最高两位保留 oneBit;unsigned char allBits; myFlag;例 11-3 定义位变量于同一字节需要存取其中某一位时可以myFlag.oneBit.b3=1; /b3 位置 1一次性将全部位清零时可以myFlag.allBits=0; /全部位变量清 0当程序中把非位变量进行强制类型转换成位变量时,要注意编译器只对普通变量的最低位做判别:如果最低位是 0,则转换成位变量 0;如果最低位是 1,则转换成位变量 1。而标准的
7、ANSI-C 做法是判整个变量值是否为 0。另外,函数可以返回一个位变量,实际上此返回的位变量将存放于单片机的进位位中带出返回。11.5.6 PICC 中的浮点数PICC 中描述浮点数是以 IEEE-754 标准格式实现的。此标准下定义的浮点数为 32 位长,在单片机中要用 4 个字节存储。为了节约单片机的数据空间和程序空间, PICC 专门提供了一种长度为 24 位的截短型浮点数,它损失了浮点数的一点精度,但浮点运算的效率得以提高。在程序中定义的 float 型标准浮点数的长度固定为 24 位,双精度 double 型浮点数一般也是 24 位长,但可以在程序编译选项中选择 double 型浮
8、点数为 32 位,以提高计算的精度。一般控制系统中关心的是单片机的运行效率,因此在精度能够满足的前提下尽量选择24 位的浮点数运算。11.5.7 PICC 中变量的绝对定位首先必须强调,在用 C 语言写程序时变量一般由编译器和连接器最后定位,在写程序之时无需知道所定义的变量具体被放在哪个地址(除了 bank 必须声明) 。真正需要绝对定位的只是单片机中的那些特殊功能寄存器,而这些寄存器的地址定位在PICC 编译环境所提供的头文件中已经实现,无需用户操心。编程员所要了解的也就是 PICC是如何定义这些特殊功能寄存器和其中的相关控制位的名称。好在 PICC 的定义标准基本上按照芯片的数据手册中的名称描述进行,这样就秉承了变量命名的一贯性。一个变量绝对定