1【知识链接2】PIC单片机C语言入门1.2.1认识PIC单片机C语言用C语言来开发单片机系统软件最大的好处是编写代码效率高。软件调试直观、维护升级方便、代码的重复利用率高、便于跨平台的代码移植等等,因此C语编程在单片机系统设计中已得到越来越广泛的应用。但在单片机上用C语言写程序和在PC机上写程序绝对不能简单等同。珊在的PC机资源十分丰富,运算能力强大,因此,程序员在写PC机的应用程序时,几乎不用关心编译后的可执行代码在运行过程中需要占用多少系统资源,也基本不用担心运行效率有多高。写单片机的C语言程序最关键的一点是单片机内的资源非常有限,控制的实时性要求又很高,因此,如果没有对单片机体系结构和硬件资源作详尽的了解,以笔者的愚见认为是无法写出高质量实用性很高的C语程序。本书围绕PIC中档系统单机来展开讨论的,Microchip公司自己没有针对PIC中档系列单片机的C语言编译器,但很多专业的第三方公司有众多支持PIC单片机的C语言编译器提供,常见的有Hitech、CCS、IAR、Bytecraft等公司。其中笔者最常用的是Hitech公司的PICC编译器,它稳定可靠,编译生成的代码效率高,在用PIC单片机进行系统设计和开发的工程师群体中得到广泛认可。其正式完全版软件需要购置,但在其网站上有限时的试用版供用户评估。另外,Hitech公司针对广大PIC的业余爱好者和初学者,还提供了完全免费的学习版PICC-Lite编译器套件。它的使用方式与完全版相同,只是支持的PIC单片机型号限制在PIC16F84、PIC16F877和PIC16F628等几款。这几款Flash型的单片机因其所具备的丰富的片上资源而最适用于单片机学习入门,因此,笔者建议感兴趣的读者可以从PICC-Lite入手掌握PIC单片机的C语言编程。我们一起来认识训练项目2——跑马灯的仿真与演示的程序LEDS.C。1#includepic.h2inta;//定义整型变量a3voidmain()4{TRISB=0X00;//定义端口B为输出模式5while(1)//while循环语句6{PORTB=0XFE;//111111107for(a=1000;a0;a--);//for循环语句8PORTB=0XFD;//111111019for(a=1000;a0;a--);//for循环语句10PORTB=0XFB;//1111101111for(a=1000;a0;a--);//for循环语句12PORTB=0XF7;//1111011113for(a=1000;a0;a--);//for循环语句14PORTB=0XEF;//1110111115for(a=1000;a0;a--);//for循环语句16PORTB=0XDF;//1101111117for(a=1000;a0;a--);//for循环语句18PORTB=0XBF;//1011111119for(a=1000;a0;a--);//for循环语句20PORTB=0X7F;//0111111121for(a=1000;a0;a--);//for循环语句22}223}说明:第1行:#includepic.h是文件包含语句,表示把语句中指定文件的全部内容复制到此处,与当前的源程序文件链接成一个源文件。该语句中指定的文件pic.h是Hitech-PICC编译器提供的头文件,保存在“C:\HT-PIC\include”路径下,该文件包含了对PIC单片机特殊功能寄存器SFR和位名称的定义。在编写每一个程序时,首先编写的一条语句就是#includepic.h。第2行:inta。是定义一个整型变量a,具体什么是整型变量?有何功能?请看数据与数据类型号中的介绍。第3行:voidmain()。定义主函数voidmain()。其是C语言程序中必不可少的主函数,也是程序开始执行的第一个函数。函数一般分成两个部分,一个部分为函数名:main,另一个部分为函数体:从第4行的{到23行的}为止。第4行:TRISB=0X00。是给单片机的B端口方向寄存器赋值,使B端口数据方向为输出方向,具体TRISB寄存器功能请查看【知识链接3】PIC单片机I/O接口及其应用。第5行:while(1)。是while()循环语句。第6行:PORTB=0XFE。是给单片机的B端口寄存器赋值,使B端口寄存器为0XFE,具体PORTB寄存器功能请查看【知识链接3】PIC单片机I/O接口及其应用。第7行:for(a=1000;a0;a--)。是for循环语句。第8—21行都与第6、7行相类似,在此就不再重复,int、while、for等C语言知识接下将一一介绍。1.2.2数据与数据类型数据是计算机的对象,任何程序设计都要进行数据处理。具有一定格式的数字或数值称为数据,数据的不同格式称为数据类型。在C语言中,数据类型可分为:基本数据类型、构造数据类型、指针类型、空类型四大类,如图1-2-1所示。图1-2-1C语言的数据类型在进行PIC单片机程序设计时,支持的数据类型与编译器相关。Hitech-PICC编译器所支持的数据类型如表1-2-1所示,其遵循Little-endian标准,多字节变量的低字节放在存储空间的低地址,高字节放在高地址。数据类型单精度型(float)双精度型(double)整型(int)实型(浮点型)字符型(char)基本类型构造类型枚举类型号(enum)数组类型结构体类型(struct)共用体类型(union)指针类型空类型(void)3表1-2-1Hitech-PICC编译器所支持的数据类型序号数据类型名称长度(位数)值域1位类型bit1B0或12有符号字符型char8B-128~+1273无符号字符型unsignedchar8B0~2554有符号整型short16B-32768~+327675无符号整型unsignedshort16B0~655356有符号整型int16B-32768~+327677无符号整型unsignedint16B0~655358有符号长整型long32B-2147483648~+21474836479无符号长整型unsignedlong32B0~429496729510浮点型float24B-2147483648~+214748364711双精度浮点型double24B或32B-8388608~+8388607或-2147483648~+2147483647注:Hitech-PICC编译器缺省认定double型变量为24位长,但可以改变编译选项改成32位长1.2.3常量与变量单片机程序中处理的数据有常量和变量两种形式,二者的区别在于:常量的值在程序执行期间是不能发生变化的,而变量的值在程序执行期间可以发生变化。1.常量在程序运行的过程中,其值不能改变的量称为常量。常量的数据类型有整型、浮点型、字符型和字符串型。(1)整型常量可以表示为十进制数、十六进制数或八进制数等,例如:十进制数12、-60等;十六进制数以0x开关,如0x13、0xAB等;八进制数以字母o开关,如o14、o17等。若要表示长整型,就在数字后面加字母L,如104L、o34L、0Xf340L等。(2)浮点型常量可以分为十进制表示形式和指数表示形式两种,如0.888、3345.345、123e3、-2.4e-2等。(3)字符型常量是用单引号括起来的单一字符,如‘a’、‘9’等。(4)字符串型常量是用双引号括起来的一串字符,如“test”、“ok”等。字符串是由多个字符连接起来组成的。2.变量在程序运行中,其值可以改变的量称为变量。一个变量主要由两部分构成;一个是变量名,一个是变量值。每个变量都有一个变量名,在内存中占据一定的存储单元(地址),并在该内存单元中存放该变量的值。下例为对符号常量和变量进行说明:1#defineCONST602voidmain()3{intvariable,result;4variable=20;5result=variable*CONST;6}第1行:#defineCONST60。这一行定义了一个符号常量CONST,其值为60。这样在后面的程序中,凡是出现CONST的地方,都代表常量60。4第2行:variable和result就是变量。它们的数据类型为整型(int)。注意:符号常量与变量的区别在于,符号变量的值在作用域(本例中为主函数)中,不能改变,也不能用等号赋值,习惯上,总将符号常量名用大写,变量名用小写,以示区别。(1)变量的定义变量必须先定义后使用,用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。变量的定义格式如下:[存储种类]数据类型[存储器类型]变量名表;其中,数据类型和变量名表是必须的,存储种类和存储类型是可选项。存储种类有四种:auto(自动变量)、extern(外部变量)、static(静态变量)和register(寄存器变量)。默认类型为auto(自动变量)。例如:inta;/*定义a为整型变量*/intm,n;/*定义m和n为整型变量*/floatx,y,z;/*定义x,y,z单精度实型变量*/charch;/*定义ch为字符变量*/longintt;/*定义t为长整型变量*/staticintr;/*定义r为静态的整型变量*/进行变量定义时,应注意以下几点:①允许在一个数据类型标识符后,说明多外相同类型的变量,各变量名之间用逗号隔开;②数据类型标识符与变量名之间至少用一个空格隔开;③最后一个变量名后必须以分号“;”结尾;④变量说明必须放在变量使用之前,一般放在函数体的开头部分;⑤在同一个程序中变量不允许重复定义。例如:intx,y,z;inta,b,x;/*变量x被重得定义*/(2)变量的初始化在定义变量的同时可以给变量赋初值,称为变量的初始化。变量初始化的一般格式为:数据类型标识符变量名1=常量1[,变量名2=常量2,…………,变量名n=常量n];例如:intm=3,n=5;/*定义m和n为整型变量,同时m,n分别赋初值3,5*/floatx=0,y=0,z=0;/*定义x,y,z为单精度实型变量,同时x,y,z都赋初值为0*/charch=’a’;/*定义ch为字符型变量,同时赋初值字符’a’*/longinta=1000,b;/*定义a,b为长整型变量,同时a赋初值1000*/(3)整型变量整型变量的基本类型符为int,可以根据数值的范围将整型变量定义为基本整型变量、短整型变量或长整型变量。①基本整型变量用int表示;②短整型变量用shortint表示(或用short)表示;③长整型变量用longint表示(或用long)表示。在计算机(或单片机)中数据是以二进制形式表示的,基本整型变量占用内存2个字节,即165位。16位中最左边的一位表示符号,该位0,表示正数;该位1,表示负数。一个基本整型变量的值范围为-215~(215-1),即-32768~32767。实际应用时注意整型变量的值不能超出范围,否则容易出错,为了充分利用变量表示数据的范围,可以将变量定义为“无符号”类型。归纳起来,可以使用以下6种整型变量:带符号基本整型变量[signed]int无符号基本整型变量unsignedint带符号短整型变量[signed]shortint无符号短整型变量unsignedshort[int]带符号长整型变量[signed]long[int]无符号长整型变量unsignedlong[int]如果在定义整型变量时不指定unsigned,则隐含为有符号(signed)。假设定义两个变量a和b如下:inta;usignedintb;则变量a的取范围为了-32768~32767。而变量b的取值范围为0~65535。图1-2-2(a)表示有符号的基本整型变量a的最大值(32767),图1-2-2(b)表示无符号的基本整型变量b的最大值(65535)。0111111111111111(a)有符号整型变量1111111111111111(b)无符号整型变