PIC单片机C语言编程教程精品资料.doc
《PIC单片机C语言编程教程精品资料.doc》由会员分享,可在线阅读,更多相关《PIC单片机C语言编程教程精品资料.doc(76页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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 等几款。这几款 F
4、lash 型的单片机因其所具备的丰富的片上资源而最适用于单片机学习入门,因此笔者建议感兴趣的读者可从 PICC-Lite 入手掌握 PIC 单片机的 C 语言编程。在此列出几个主要的针对 PIC 单片机的 C 编译器相关连接网址,供读者参考:Hitech-PICC: IAR:CCS:ByteCraft:本章将介绍 Hitech-PICC 编译器的一些基本概念,由于篇幅所限将不涉及 C 语言的标准 语法和基础知识介绍,因为在这些方面都有大量的书籍可以参考。重点突出针对 PIC 单片机的特点而所需要特别注意的地方。11.2Hitech-PICC 编译器PICC 基本上符合 ANSI 标准,除了一点
5、:它不支持函数的递归调用。其主要原因是因为 PIC 单片机特殊的堆栈结构。在前面介绍 PIC 单片机架构时已经详细说明了 PIC 单片机中的堆栈是硬件实现的,其深度已随芯片而固定,无法实现需要大量堆栈操作的递归算法;另外在 PIC 单片机中实现软件堆栈的效率也不是很高,为此,PICC 编译器采用一种叫做“静态覆盖”的技术以实现对 C 语言函数中的局部变量分配固定的地址空间。经这样处理后产生出的机器代码效率很高,按笔者实际使用的体会,当代码量超过 4K 字后,C 语言编译出的代码长度和全部用汇编代码实现时的差别已经不是很大( bsf= bcf0x20,70x20,3if (tmp&0xfe)=
6、btfsc 0x20,0即所有只对变量中某一位操作的 C 语句代码将被直接编译成汇编的位操作指令。虽然编程时可以不用太关心,但如果能了解编译器是如何工作的,那将有助于引导我们写出高效简介的 C 语言原程序。在有些应用中需要将一组位变量放在同一个字节中以便需要时一次性地进行读写,这一功能可以通过定义一个位域结构和一个字节变量的联合来实现,例如:union struct unsigned b0: 1; unsigned b1: 1; unsigned b2: 1; unsigned b3: 1; unsigned b4: 1; unsigned b5: 1; unsigned : 2; /最高两位
7、保留 oneBit; unsigned char allBits; myFlag;例 11-3 定义位变量于同一字节需要存取其中某一位时可以myFlag.oneBit.b3=1; /b3 位置 1一次性将全部位清零时可以myFlag.allBits=0; /全部位变量清 0当程序中把非位变量进行强制类型转换成位变量时,要注意编译器只对普通变量的最低位做判别:如果最低位是 0,则转换成位变量 0;如果最低位是 1,则转换成位变量 1。而标准的 ANSI-C 做法是判整个变量值是否为 0。另外,函数可以返回一个位变量,实际上此返回的位变量将存放于单片机的进位位中带出返回。11.5.6 PICC 中
8、的浮点数PICC 中描述浮点数是以 IEEE-754 标准格式实现的。此标准下定义的浮点数为 32 位长,在单片机中要用 4 个字节存储。为了节约单片机的数据空间和程序空间,PICC 专门提供了一种长度为 24 位的截短型浮点数,它损失了浮点数的一点精度,但浮点运算的效率得以提高。在程序中定义的 float 型标准浮点数的长度固定为 24 位,双精度 double 型浮点数一般也是 24 位长,但可以在程序编译选项中选择 double 型浮点数为 32 位,以提高计算的精度。一般控制系统中关心的是单片机的运行效率,因此在精度能够满足的前提下尽量选择24 位的浮点数运算。11.5.7 PICC
9、中变量的绝对定位首先必须强调,在用 C 语言写程序时变量一般由编译器和连接器最后定位,在写程序之时无需知道所定义的变量具体被放在哪个地址(除了 bank 必须声明)。真正需要绝对定位的只是单片机中的那些特殊功能寄存器,而这些寄存器的地址定位在PICC 编译环境所提供的头文件中已经实现,无需用户操心。编程员所要了解的也就是 PICC是如何定义这些特殊功能寄存器和其中的相关控制位的名称。好在 PICC 的定义标准基本上按照芯片的数据手册中的名称描述进行,这样就秉承了变量命名的一贯性。一个变量绝对定位的例子如下:unsigned char tmpData 0x20; /tmpData 定位在地址 0
10、x20千万注意,PICC 对绝对定位的变量不保留地址空间。换句话说,上面变量 tmpData 的地址是 0x20,但最后 0x20 处完全有可能又被分配给了其它变量使用,这样就发生了地址冲突。因此针对变量的绝对定位要特别小心。从笔者的应用经验看,在一般的程序设计中用户自定义的变量实在是没有绝对定位的必要。如果需要,位变量也可以绝对定位。但必须遵循上面介绍的位变量编址的方式。如果一个普通变量已经被绝对定位,那么此变量中的每个数据位就可以用下面的计算方式实现位变量指派:unsigned char tmpData 0x20; /tmpData 定位在地址 0x20bit tmpBit0 tmpDat
11、a*8+0; /tmpBit0 对应于 tmpData 第 0 位bit tmpBit1 tmpData*8+1; /tmpBit0 对应于 tmpData 第 1 位bit tmpBit2 tmpData*8+2; /tmpBit0 对应于 tmpData 第 2 位如果 tmpData 事先没有被绝对定位,那就不能用上面的位变量定位方式。11.5.8 PICC 的其它变量修饰关键词&O1540; extern 外部变量声明如果在一个 C 程序文件中要使用一些变量但其原型定义写在另外的文件中,那么在本文件中必须将这些变量声明成“extern”外部类型。例如程序文件 code1.c 中有如下定
12、义:bank1 unsigned char var1, var2; /定义了 bank1 中的两个变量在另外一个程序文件 code2.c 中要对上面定义的变量进行操作,则必须在程序的开头定义:extern bank1 unsigned char var1, var2; /声明位于 bank1 的外部变量&O1540; volatile 易变型变量声明PICC 中还有一个变量修饰词在普通的 C 语言介绍中一般是看不到的,这就是关键词“volatile”。顾名思义,它说明了一个变量的值是会随机变化的,即使程序没有刻意对它进行任何赋值操作。在单片机中,作为输入的 IO 端口其内容将是随意变化的;在中
13、断内被修改的变量相对主程序流程来讲也是随意变化的;很多特殊功能寄存器的值也将随着指令的运行而动态改变。所有这种类型的变量必须将它们明确定义成“volatile”类型,例如:volatile unsigned char STATUS 0x03;volatile bit commFlag;“volatile”类型定义在单片机的 C 语言编程中是如此的重要,是因为它可以告诉编译器的优化处理器这些变量是实实在在存在的,在优化过程中不能无故消除。假定你的程序定义了一个变量并对其作了一次赋值,但随后就再也没有对其进行任何读写操作,如果是非volatile 型变量,优化后的结果是这个变量将有可能被彻底删除以
14、节约存储空间。另外一种情形是在使用某一个变量进行连续的运算操作时,这个变量的值将在第一次操作时被复制到中间临时变量中,如果它是非 volatile 型变量,则紧接其后的其它操作将有可能直接从临时变量中取数以提高运行效率,显然这样做后对于那些随机变化的参数就会出问题。只要将其定义成 volatile 类型后,编译后的代码就可以保证每次操作时直接从变量地址处取数。&O1540; const 常数型变量声明如果变量定义前冠以“const”类型修饰,那么所有这些变量就成为常数,程序运行过程中不能对其修改。除了位变量,其它所有基本类型的变量或高级组合变量都将被存放在程序空间(ROM 区)以节约数据存储空
15、间。显然,被定义在 ROM 区的变量是不能再在程序中对其进行赋值修改的,这也是“const”的本来意义。实际上这些数据最终都将以“retlw”的指令形式存放在程序空间,但 PICC 会自动编译生成相关的附加代码从程序空间读取这些常数,编程员无需太多操心。例如:const unsigned char name=”This is a demo”; /定义一个常量字符串如果定义了 “const”类型的位变量,那么这些位变量还是被放置在 RAM 中,但程序不能对其赋值修改。本来,不能修改的位变量没有什么太多的实际意义,相信大家在实际编程时不会大量用到。&O1540; persistent 非初始化变量
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC单片机C语言编程教程 精品资料 PIC 单片机 语言 编程 教程 精品 资料
限制150内