PIC单片机C语言入门实例_第1页
PIC单片机C语言入门实例_第2页
PIC单片机C语言入门实例_第3页
PIC单片机C语言入门实例_第4页
PIC单片机C语言入门实例_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PIC单片机C语言入门1.2.1认识PIC单片机C语言用C语言来开发单片机系统软件最大的好处是编写代码效率高。软件调试直观、维护升级方便、代码的重复利用率高、便于跨平台的代码移植等等,因此C语编程在单片机系统设计中已得到越来越广泛的应用。但在单片机上用 C语言写程序和在 PC机上写程序绝对不能简单等同。珊在的PC机资源十分丰富,运算能力强大,因此,程序员在写PC机的应用程序时,几乎不用关心编译后的可执行代码在运行过程中需要占用多少系统资源,也基本不用担心运行效率有多高。写单片机的C语言程序最关键的一点是单片机内的资源非常有限,控制的实时性要求又很高,因此,如果没有对单片机体系结 构和硬件资源作

2、详尽的了解,以笔者的愚见认为是无法写出高质量实用性很高的C语程序。本书围绕PIC中档系统单机来展开讨论的,Microchip公司自己没有针对PIC中档系列单片机的C语言编译器,但很多专业的第三方公司有众多支持PIC单片机的C语言编译器提供,常见的有Hitech、CCS、IAR、Bytecraft等公司。其中笔者最常用的是Hitech公司的PICC编译器,它稳定可靠,编译生成的代码效率高,在用PIC单片机进行系统设计和开发的工程师群体中得到广泛认可。其正式完全版软件需要购置,但在其网站上有限时的试用版供用户评估。另外,Hitech公司针对广大PIC的业余爱好者和初学者,还提供了完全免费的学习版P

3、ICC-Lite编译器套件。它的使用方式与完全版相同,只是支持的PIC单片机型号限制在 PIC16F84、PIC16F877和PIC16F628等几款。这几款Flash型的单片机因其所具备的丰富的片上资源而最适用于单片机学习入门,因此,笔者建议感兴趣的读者可以从 PICC-Lite入手掌握PIC单片机的C语言编程。我们一起来认识训练项目2跑马灯的仿真与演示的程序LEDS.C。1#i ncludepic.h2int a;/定义整型变量a3void mai n()4 TRISB=0X00;/定义端口 B为输出模式5while(1)/while循环语句6PORTB=OXFE;/1111 11107f

4、or(a=1000;a0;a-);/for循环语句8PORTB=0XFD;/1111 11019for(a=1000;a0;a-);/for循环语句10PORTB=0XFB;/1111 101111for(a=1000;a0;a-);/for循环语句12PORTB=0XF7;/1111 011113for(a=1000;a0;a-);/for循环语句14PORTB=0XEF;/1110 111115for(a=1000;a0;a-);/for循环语句16PORTB=0XDF;/1101 111117for(a=1000;a0;a-);/for循环语句18PORTB=0XBF;/1011 111

5、119for(a=1000;a0;a-);/for循环语句20PORTB=0X7F;/0111 111121for(a=1000;a0;a-);/for循环语句22说明:第1行:#includepic.h是文件包含语句,表示把语句中指定文件的全部内容复制到此处,与当 前的源程序文件链接成一个源文件。该语句中指定的文件 pic.h是Hitech-PICC编译器提供的头文件, 保存在“ C:HT-PICinclude ”路径下,该文件包含了对PIC单片机特殊功能寄存器SFR和位名称的定义。在编写每一个程序时,首先编写的一条语句就是#includepic.h。第2行:int a。是定义一个整型变量a

6、,具体什么是整型变量?有何功能?请看数据与数据类型号中的介绍。第3行:void main()。定义主函数 void main()。其是C语言程序中必不可少的主函数,也是程 序开始执行的第一个函数。函数一般分成两个部分,一个部分为函数名:mai n,另一个部分为函数体:从第4行的到23行的为止。第4行:TRISB=0X00。是给单片机的B端口方向寄存器赋值,使B端口数据方向为输出方向,具体TRISB寄存器功能请查看【知识链接3】PIC单片机I/O接口及其应用。第5行:while(1)。是while()循环语句。第6 行: PORTB=OXFE。是给单片机的B端口寄存器赋值,使B端口寄存器为0XF

7、E,具体PORTB 寄存器功能请查看【知识链接3】PIC单片机I/O接口及其应用。第 7 行:for(a=1000;a0;a-)。是 for 循环语句。第821行都与第6、7行相类似,在此就不再重复,int、while、for等C语言知识接下将一 一介绍。1.2.2数据与数据类型数据是计算机的对象, 任何程序设计都要进行数据处理。具有一定格式的数字或数值称为数据, 数据的不同格式称为数据类型。在C语言中,数据类型可分为:基本数据类型、构造数据类型、指针类型、空类型四大类,如 图1-2-1所示。-单精度型(float).双精度型(double)整型(int)基本类型V 实型(浮点型)、字符型(c

8、har) 厂枚举类型号(enum)数组类型数据类型构造类型= = !=逻辑运算符! & |位运算符&|人赋值运算符=条件运算符?逗号运算符5指针运算符* &求字节数运算符sizeof强制类型转换运算符(类型)下标运算符函数调用运算符()表达式是由运算符及运算对象组成的、具有特定含义的式子。C语言是一种表达式语言,表达 式后面加上分号“;”就构成了表达式语句。这里我们主要介绍在Hitech-PICC编程中经常用到的算术运算、赋值运算、关系运算、逻辑运算、位运算、逗号运算及其表达式。1 运算符的优先级和结合性学习C语言的运算符,不仅要掌握各种运算符的功能,以及它各自可连接的运算对象个数,而 且还要

9、了解各种运算符彼此之间的优先级和结合性,运算符可按其优先级从高到低分为15个等级,如表1-2-4所示。表1-2-4运算符的优先级和结合性优先级运算符含义运算量个数结合性1()-括号运算符下标运算符指向结构体成员运算符成员运算符自左至右2!+ -(类型)* &sizeof逻辑非运算符 按位取反运算符 自加、自减运算符 负号运算符 强制类型转换运算符 指针和地址运算符 取长度运算符单目运算符右结合3* / %乘、除、求余运算符双目运算符自左至右4+ -算术加、减运算符双目运算符自左至右5位左移、右移运算符双目运算符自左至右6=关系运算符双目运算符自左至右7=!=关系运算符双目运算符自左至右8&按位

10、与运算符双目运算符自左至右9A位异或运算符双目运算符自左至右10|位或运算符双目运算符自左至右11&逻辑与运算符双目运算符自左至右12|逻辑或运算符双目运算符自左至右13?:条件运算符三目运算符右结合14=+= -= *=/=%=&=|=A =组合算术运算符组合运算符双目运算符右结合15j逗号运算符自左至右(1)优先级求解表达式时,总是先按运算符的优先次序由高到低进行操作。优先级是用来标志运算符在表 达式中的运算顺序的。相当于加括号,运算时进行脱括号运算。(2) 结合性当一个运算对象两侧的运算符优先级相同时,则按运算符的结合性确定表达式的运算顺序。它 分为两类:一类是运算符的结合性为“从左到右

11、”(大多数运算符是这样的),另一类运算符的结合性为“从右到左”。例如:3-5*2,按运算符的优后次先乘后减,表达式的值为了-7 ; 3*5/2,5的两侧是“ * ”和“/”优先级相同,则按结合性处理,算术运算符的结合性为“从左到右”,则先乘后除,表达式的值为7。C语言规定了各种运算符的结合方向(结合性),关于结合性的概念在其他高级语言中是没有的,这是C语言的特点之一。2 算术运算符与算术表达式Hitech-PICC中的算术运算符如表 1-2-5所示。表1-2-5算术运算符运算符名称功能+加法求两个数的和,例如8+9=17-减法求两个数的差,例如20-7=13*乘法求两个数的积,例如 20*5=

12、100/除法求两个数的商,例如20/5=4%取余求两个数的余数,例如20%9=2+自增1变量自动加1-自减1变量自动减1在使用上述运算符时,应注意以下几点: 要注意除法运算符在进行浮点数相除时,其结果为浮点数,如20.0/5所得值为4.0;而进行两个整数相除时,所得值是整数,如7/3,值为2。 取余运算符(模运算符)“%”要求参与运算的量均为整型,其结果等于两数相除后的余数。 Hitech-PICC提供的自增运算符“ + ”和自减运算符“-”,作用是使变量值自动加1或减1。自增运算和自减运算只能用于变量而不能用于常量表达式,运算符放在变量前和变量后是不同的。后置运算:i+ (或i-)是先使用i

13、的值,再执行i+1 (或i-1 )。前置运算:+i (或-i)是先执行i+1 (或i-1),再使用i的值。 对自增、自减运算的理解和使用是比较容易出错的,应仔细地分析,例如:int i=100,j;j=+i;/j=101,i=101j=i+;/j=101,i=102j=-i;/j=101,i=101戸-;/j=101,i=100编程时常将“+ ”、“-”这两个运算符用于循环语句中,使循环变量自动1;也常用于指针变量,使指针自动加1指向下一个地址。3. 赋值运算符与赋值表达式赋值运算符“=”的作用变是给变量赋值,如“x=10 ;”。用赋值运算符将一个变量与一个表达式连接起来 的式子称为赋值表达式

14、,在表达式后面加“;”便构成了赋值语句。赋值勤语句的格式如下。变量=表达式;例如:k=0xff;将十六进制数FFH赋予变量kb=c=33;/将33冋时赋予变量b和cd=e;/将变量e的值赋予变量df=a+b;将表达式a+b的值赋予变量f由此可见,赋值表达式的功能是计算表达式的值再赋予左边的变量。赋值运算符具有右结合性,因此有下面的语句:a=b=c=5;可以理解为:a=(b=(c=5);按照C语言的规疋上,任何表达式在其末尾加上分号就构成语句。因此x-8;和 a-b-c-5;都是赋值语句。如果赋值运算符两过的数据类型号不相同,系统将自动进行类型转换,即把赋值右边的类型换 成左边的类型。具体规定如

15、下: 实型赋给整型,舍去小数部分。 整型赋给实型,数值不变,但将以浮点开式存放,即增加小数部分(小数部分的值为0)。 字符型赋给整型,由于字符型为1字节,而整型2字节,故将字符 ASCII码值放到整型量的低8位中,高8位为0。 整型赋给字符型,只把低8位赋给字符量。图1-2-4表示了各数据类型自动转换的规则。低高int unsigned long unsigned long doublett,shor、charfloat图1-2-4各种数据类型的高低顺序在C语言程序设计中,经常使用复合赋值运算符对变量进行赋值。复合赋值运算符就是在赋值 符=”之前加上其他运算符,表1-2-4中优先级14就是复合

16、赋值运算符。构成复合赋值表达式的一般形式为:变量 双目运算符 =表达式;它等效于:变量=变量运算符表达式;例如:a+=5;/相当于a=a+5;x*=y+7;/相当于x=x*(y+7);r%=p;/相当于r=r%p;在程序中使用复合赋值运算符,可以简化程序,有利于编译处理,提高编译效率并产生质量较 高的目标代码。4. 关系运算符与赋值表达式在前面介绍过的分支选择程序结构中,经常需要比较两个变量的大小关系,以决定程序下一步 的操作。比较两个数据量的运算符称为关系运算符。C语言提供了 6种关系运算符:大于运算符:;大于等于运算符:=;小于运算符:;小于等于运算符:=;等于运算符:;不等于运算符:!=

17、;条件1条件2逻辑运算ab!aa&ba|b11011100010110100100在关系运算符中,、=的优先级相同,=和!=优先级相同;前者优先级高于后者。例如:“ a=bc;” 应理解为a=(bc); ”。关系运算符优先级低于算术运算符,高于赋值运算符。例如:“ a+bc+d; ”应理解为(a+b)(c+d); ”。关系表达式是用关系运算符连接的两个表达式。它绵一般形式为:表达式关系运算符表达式关系表达式的值只有0和1两种,即逻辑的“真”与“假”。当指定的条件满足时,结果为 1,不满足时结果为0。例如表达式“ 50;”的值为“真”,即结果为1;而表达式“(a=3)(b=5); ”由于35不成

18、立,故其值为“假”,即结果为0。a+bc若a=1,b=2,c=3,则表达式的值为 0 (假)a3/2若x=2,则表达式的值为1 (真)c=5若c=1,则表达式的值为0 (假)5. 关系运算符与赋值表达式C语言中提供了三种逻辑运算符,一般形式有以下三种。 逻辑与运算符:& 逻辑或运算符:|; 逻辑非运算符:!;逻辑表达式的一般形式有以下三种。逻辑与:条件式1&条件式2逻辑或:条件式1|条件式2 逻辑非:!条件式“ & ”和“是双目运算符,要求有两个运算对象,结合方向是从左到右。“!”是单目运算符,只要求一个运算对象,结合方向是从右至左。(1) 逻辑与:a&b ,当且仅当两个运算量的值都为“真”时

19、,运算结果为“真”,否则为“假”。(2) 逻辑或:a|b,当且仅当两个运算量的值都为“假”时,运算结果为“假”,否则为“真”。(3) 逻辑非:!a,当运算量的值为“真”时,运算结果为“假”;当运算量的值为“假”时, 运算结果为“真”。表1-2-6给出了执行逻辑运算的结果表1-2-6执行逻辑运算的结果条件1条件2逻辑运算ab!aa&ba|b11011100010110100100例如:设x=3,则(x0) & (x6)的值为“真”(即为“ 1 ”),而(x6)的值为 “假”(即为“ 0”),!x的值为“假”。逻辑运算符“! ”的优先级最高,其次为“& ”,最低为“|”。具体请读者见表1-2-4运

20、算符的优先级和结合性。6. 位运算符与位运算表达式在PIC系列单片机应用系统设计中,对I /O端口的操作是非常频繁的,因此往往要求程序在位(bit)一级进行运算或处理,因此,汇编语言具有强大灵活的位处理能力。Hitech-PICC 语言直接面对:PIC系列单片机硬件,也提供了强大灵活的位运算功能,使得c语言也能像汇编语言一样对硬件直接进行操作。Hitech-PICC 提供了 6种位运算符: 按位与运算符:&; 按位或运算符:| ; 按位异或运算符:A ; 按位取反运算符:; 右移运算符:; 左移运算符:;位运算符的作用是按二进制位对变量进行运算,表1-2-7是位运算符的真值表。表1-2-7位运

21、算符的真值表位变量1位变量2位运算ababa&ba|baAb0011000011001110010111100110左移运算符“ ”的功能,是把“ ”左边的操作数的各二进制位全部左移若干位,移动的位数由“ ”右边的常数指定,高位丢弃,低位补 Q例如:“a”的功能,是把“ ”左边的操作数的各二进制位全部右移若干位,移 动的位数由“ ”右边的常数指定。进行右移运算时,如果是无符号数,则总是在其左端补“0”;对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补O,而为负数时,符号位为1,最高位是补0还是补1取决于编译系统的规定。例如:设a=Ox98,如果a为无符号数,则“ a2”表示把10

22、011000B右移为001001QB;如果a为有符号数,则“ a2 表示把 10011000B 右移为 11 100110B。在使用位运算符时,有如下技巧:按位与运算通常用来对某些位清零或保留某些位。例如,要保留从PORTB端口的RB0和RB1读入的两位数据,可以执行 control=PORTB&0x03 ;操作(0x03的二进制数为 00000011B);而要清除 PORTB端口的 RB4- RB7为 0,可以执行“ PORTB=PORTB&OxOf操作(0x0f 的二进制数为 00001111B。 同样,按位或运算经常用于把指定位置 1、其余位不变的操作。流水灯控制程序 LEDS.c就是采

23、用移位运算来实现的发光二极管点亮位置的移动。用位运算符改写的流水灯控制程序如下。1#i ncludepic.h2int a;/定义整型变量a3void mai n()4TRISB=0X00;/定义端口 B为输出模式5while(1)/while循环语句6PORTB= PORTB|0XFE;/1111 11107for(a=1000;a0;a-);/for循环语句8PORTB= PORTB|0XFD;/1111 11019for(a=1000;a0;a-);/for循环语句10PORTB= PORTB|0XFB;/1111 101111for(a=1000;a0;a-);/for循环语句12PO

24、RTB= PORTB|0XF7;/1111 011113for(a=1000;a0;a-);/for循环语句14PORTB= PORTB|0XEF;/1110 111115for(a=1000;a0;a-);/for循环语句16PORTB= PORTB|0XDF;/1101 111117for(a=1000;a0;a-);/for循环语句18PORTB= PORTB|0XBF;/1011 111119for(a=1000;a0;a-);/for循环语句20PORTB= PORTB|0X7F;/0111 111121for(a=1000;a0;a-);/for循环语句2223分析上面程序可知,该

25、程序实现的流水灯效果。7 逗号运算符与逗号运算表达式在c语言中逗号“,”也是一种运算符,称为逗号运算符,其功能是把两个表达式连接起来组成 一个表达式,称为逗号表达式,其一般形式为:表达式 1,表达式 2,,表达式 n逗号表达式的求值过程是:从左军右分别求出各个表达式的值,并以最右边的表达式n的值作为整个逗号表达式的值。程序中使用逗号表达式的目的,通常是要分别求逗号表达式内各表达式的值,并不一定 要求整个逗号表达式的值。例如:x=(y=10,y+5);上面括号内的逗号表达式,逗号左边的表达式是将10赋给y,逗号右边的表达式进行y+5的计算,逗号表达式的结果是最右边的表达式“y+5”的结果15赋给

26、X。并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明、函数参数表中的逗号只是用做各变量之间的间隔符,例如:un sig ned int i, j;1.2.6基本语句C语言程序的执行部分由语句组成。C语言提供了丰富的程序控制语句,按照结构化程序设计的基本结构:顺序结构、选择结构和循环结构,组成各种复杂程序。这些语句主要包括表达式语句、 复合语句、选择语句和循环语句等。1 .表达式语句表达式语句是最基本的C语言语句。表达式语句由表达式加上分号“;”组成,其一般形式如下:表达式;执行表达式语句就是计算表达式的值。例如:PORTB=OXFD;/赋值语句,在程序 LEDS.C中将端口 B赋值为O

27、XFDx=y+z;/ y和z进行加法运算后赋值给变量xi+;自增1语句,i增加1后,再赋给变量i在C语言中有一个特殊的表达式语句,称为空语句。空语句中只有一个分号“;”,程序执行空 语句时需要占用一条指令的执行时间,但是什么也不做。在程序中常常把空语句作为循环体,用于 消耗CPU时间等待事件发生的场合。例如,在 LEDS.c函数中,有下面语句:for(a=1000;a0;a-); /for 循环语句上面的for语句后面的“;”是一条空语句,作为循环体出现。在使用“;”时的小技巧: 表达式是由运算及运算对象所组成的、具有特定含义的式子,例如“y+z”。C语言是一种表达式语言,表达式后面加上分号“

28、;”就构成了表达语句,例如“y+z”。C语言中的表达式与表达式语句的区别就是前者没有分号“;”,而后者有“;”。在while或for构成的循环语句后面加一个分号,构成一个不执行其他操作的空循环体。例 如:While(1);上面语句循环条件永远为真,是无限循环;循环体为空,什么也不做。程序设计时,通常把该 语句作为停机语句使用。2.复合语句把多个语句用大括号括起来,组合在一起形成具有一定功能的模块,这种由若干条语句组合 而成的语句称为复合语句。在程序中应把复合语句看在是单条语句,而不是多条语句。复合语句在程序运行时,中的各行单语句是依次顺序执行的。在C语言的函数中,函数体是一个复合语句,例如程序

29、LED.c的主函数中包含两个复合语句:void mai n() TRISB=0X00;/定义端口 B为输出模式while(1)/while循环语句PORTB= PORTB|0XFE;1111 1110for(a=1000;a0;a-);/for循环语句PORTB= PORTB|0XFD;/1111 1101PORTB= PORTB|OX7F;/0111 1111for(a=1000;a0;a-);/for 循环语句 在上面的这段程序中,组成函数体的复合语句内还嵌套了组成while()循环体的复合语句。复合语句允许嵌套,也就是在 中的也是复合语句。复合语句内的各条语句都必须以分号“;”结尾,复合

30、语句之间有分隔,在括号“ ”外,不能家分号。复合语句不仅可由可执行语句组成,还可由变量定义语句组成。在复合语句中所定义的变量,称为局部变量,它的有效范围只在复合语句中。函数体是复合语句,所以函数体内定义的变量,其有效范围也只在函数内部。前面的main()函数体内定义的位变量left和right的有效使用范围局限在mai n()函数内部,与其他函数无关。3 选择语句跑马灯的C程序可以用以下程序代码来实现,即跑马灯先从上到下循环进行。#i nclude pic.h un sig ned char temp=0x01;/*fun ctio n: main()*功能描述:主函数*void mai n(

31、)/设置INTCON的bit7bit0为零:关总中断设置端口 B为输出方式使端口 B输出低电平/按位取反/for循环语句,起延时作用/判断变量temp是否等0x00/if语句成立,给变量 temp赋0x01/if语句不成立/变量temp左移1位 INTCON=OXOO;TRISB=0X00;PORTB=OXff;while(1) PORTB=temp; for(a=1000;a0;a-); if(temp=0x00) temp=0x01;elsetemp=temp1;我们看到,在上述程序中使用了如下if语句:if(temp=0x00)/判断变量temp是否等0x00temp=0x01;/if语

32、句成立,给变量 temp赋0x01else/if语句不成立temp=temp1;/变量temp左移1位执行这些语句时,先判断“ temp=0x00 ”是否成立,如果条件满足,则执行“temp=0x01; ”后,回到“PORTB=temp; ”语句,执行该条语句,temp变量按位取反之后,变为0xFE (即卩11111110B), 则PORTB为0xFE (即RB0引脚为低电平,其余引脚为高电平),所以第一个发光二极管亮,其它 都不亮。如果条件不成立,则执行“ temp=temp0;a-);else if(RD0=0)RB0=0;for(a=5000;a0;a-);else if(RD1=0)RB1=0;for(a=5000;a0;a-);else;RB0=1;RB1=1; for(a=5000;a0;a-);/设置端口 B为输出方式/设置端口 B为高电平输出/设置端口 D为输入方式/while 循环/如果RD0与RD1都为低电平状态/则点亮左转灯和右转灯/for循环语句,起延时作用如果RD0为低电平状态则点亮左转灯/for循环语句,起延时作用如果RD1为低电平状态则点亮

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论