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

下载本文档

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

文档简介

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公司针又t广大PIC的业余爱好者和初学者,还提

3、供了完 全免费的学习版PICC-Lite编译器套件。它的使用方式与完全版相同,只是支持的PIC单片机型号限制在PIC16F84 PIC16F877和PIC16F628等几款。这几款Flash型的单片机因 其所具备的丰富的片上资源而最适用于单片机学习入门,因此,笔者建议感兴趣的读者可 以从PICC-Lite入手掌握PIC单片机的C语言编程。我们一起来认识训练项目2跑马灯的仿真与演示的程序1 #include""2 int a;7F1.2.2 1-2-11-2-11-2-11-2-1整_在本类型Y实力U (浮点Y单精度型双 精 度 型1字口枚_符型举类型号数据类型4陶造类型数4

4、尤什米刑结,共构体类理 用体类用1 |=| k 1 J J 十、仝英型(void )1.2.3 1-2-2 符号二65表示数据的最1-2-21-2-3图1-2-3点实数在内存中的存放形式指数(5)字符型变量字符型变量用来存放字符常量,注意只能存放一个字符。例如:char c1,c2,c3,c4,c5;1.2.5 1-2-31-2-31-2-41-2-4括号运算符下标运算符指向结构体成员运算符成员运算符自左至右2!+ -逻辑非运算符按位取反运算符自加、自减运算符单目运算符右结合-(旧)* &sizeof负号运算符强制类型转换运算符指针和地址运算符取长度运算符3* / %乘、除、求余运算符

5、双目运算符自左至右4+ -算术加、减运算符双目运算符自左至右5<< >>位左移、右移运算符双目运算符自左至右6< <=> >=关系运算符双目运算符自左至右7=!=关系运算符双目运算符自左至右8&按位与运算符双目运算符自左至右9A位异或运算符双目运算符自左至右101位或运算符双目运算符自左至右11&&逻辑与运算符双目运算符自左至右12II逻辑或运算符双目运算符自左至右13?:条件运算符三目运算符右结合14=+= -= *=/= %=<<=>>=&= |=A=组合算术运算符组合运算符双目运算符右

6、结合15,逗号运算符自左至右(1)优先级求解表达式时,总是先按运算符的优先次序由高到低进行操作。优先级是用来标志运 算符在表达式中的运算顺序的。相当于加括号,运算时进行脱括号运算。(2)结合性当一个运算对象两侧的运算符优先级相同时,则按运算符的结合性确定表达式的运算 顺序。它分为两类:一类是运算符的结合性为“从左到右”(大多数运算符是这样的),另一类运算符的结 合性为“从右到左”。例如:3-5*2 ,按运算符的优后次先乘后减,表达式的值为了 -7 ; 3*5/2 , 5的两侧是和“/”优先级相同,则按结合性处理,算术运算符的结合性为“从左到 右”,则先乘后除,表达式的值为7。C语言规定了各种运

7、算符的结合方向(结合性),关于 结合性的概念在其他高级语言中是没有的,这是C语言的特点之一。2 .算术运算符与算术表达式Hitech-PICC中的算术运算符如表1-2-5所示。表1-2-5算术运算符运算符名称功能+加法求两个数的和,例如8+9=17-减法求两个数的差,例如20-7=13*乘法求两个数的积,例如20*5=100/除法求两个数的商,例如20/5=4%取余求两个数的余数,例如20%9=2+自增1变量自动加1-自减1变量自动减1在使用上述运算符时,应注意以下几点:要注意除法运算符在进行浮点数相除时,其结果为浮点数,如 5所得值为;而进行 两个整数相除时,所得值是整数,如 7/3 ,值为

8、2。取余运算符(模运算符)“%要求参与运算的量均为整型,其结果等于两数相除后 的余数。Hitech-PICC提供的自增运算符“ +”和自减运算符“-",作用是使变量值自动加1或减1。自增运算和自减运算只能用于变量而不能用于常量表达式,运算符放在变量前和 变量后是不同的。后置运算:i+ (或i-)是先使用i的值,再执行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=

9、101,i=101j=i-;/j=101,i=100编程时常将“ +”、“-”这两个运算符用于循环语句中,使循环变量自动1;也常用于指针变量,使指针自动加1指向下一个地址。3 .赋值运算符与赋值表达式赋值运算符“二”的作用变是给变量赋值,如“ x=10;”。用赋值运算符将一个变量与一 个表达式连接起来 的式子称为赋值表达式,在表达式后面加“;”便构成了赋值语句。赋 值勤语句的格式如下。变量=表达式;例如:k=0xff;/将十六进制数FFH赋予变量kb=c=33;/将33同时赋予变量b和cd=e;/将变量e的值赋予变量df=a+b;/将表达式a+b的值赋予变量f由此可见,赋值表达式的功能是计算表

10、达式的值再赋予左边的变量。赋值运算符具有 右结合性,因此有下面的语句:a=b=c=5;可以理解为:a=(b=(c=5);按照C语言的规定上,任何表达式在其末尾加上分号就构成语句。因此“ x=8;”和 “a=b=c=5;"都是赋值语句。如果赋值运算符两过的数据类型号不相同,系统将自动进行类型转换,即把赋值右边 的类型换成左边的类型。具体规定如下:实型赋给整型,舍去小数部分。 整型赋给实型,数值不变,但将以浮点开式存放,即增加小数部分(小数部分的值 为0)。 字符型赋给整型,由于字符型为1字节,而整型2字节,故将字符ASCII码值放到 整型量的低8位中,高8位为0。整型赋给字符型,只把低

11、8位赋给字符量。图1-2-4表示了各数据类型自动转换的规则低高int -unsgne_>- lon unsigneddoubleI图1-2-4各种数据类型的高低顺序Tshor 、float在C语言程序设计中,经常使用复合赋值运算符对变量进行赋值。复合赋值运算符就 是在赋值符“二”之前加上其他运算符,表1-2-4中优先级14就是复合赋值运算符。构成复合赋值表达式的一般形式为:变量 双目运算符=表达式;它等效于:变量=变量运算符表达式;例如:a+=5;/ 相当于 a=a+5;x*=y+7;/ 相当于 x=x*(y+7);r%=p;/ 相当于 r=r%p;在程序中使用复合赋值运算符,可以简化程

12、序,有利于编译处理,提高编译效率并产 生质量较高的目标代码4 .关系运算符与赋值表达式在前面介绍过的分支选择程序结构中,经常需要比较两个变量的大小关系,以决定程序下一步的操作。比较两个数据量的运算符称为关系运算符。C语言提供了 6种关系运算符:大于运算符::>=:小于运算符::小于等于运算符:二:不等于运算符:在关系运算符中, 、=、=的优先级相同,=和!二优先级相同;前者优先级高于例如:"a=bc;” 应理解为 “ a=(bc);关系运算符优先级低于算术运算符,高于赋值运算符。例如:"a+bc+d;” 应理解为 “(a+b)(c+d); ”。关系表达式是用关系运算符

13、连接的两个表达式。它绵一般形式为:表达式关系运算符表达式关系表达式的值只有0和1两种,即逻辑的“真”与“假”。当指定的条件满足时,结 果为1,不满足时结果为 0o例如表达式“ 50; ”的值为“真”,即结果为1;而表达式(a=3)>(b=5); ”由于3>5不成立,故其值为“假”a+b>c/若a=1,b=2,c=3,则表达式的值为0 (假)a>3/2若x=2,则表达式的值为1 (真)c=5/若c=1,则表达式的值为0 (假)5 .关系运算符与赋值表达式C语言中提供了三种逻辑运算符,一般形式有以下三种逻辑与运算符:&&逻辑或运算符:| ;逻辑非运算符:!;

14、逻辑表达式的一般形式有以下三种逻辑与:条件式1&除件式2逻辑或:条件式1|条件式2逻辑非:!条件式"&&'和“| ”是双目运算符,要求有两个运算对象,结合方向是从左到右。“一是单目运算符,只要求一个运算对象,结合方向是从右至左。(1)逻辑与:a&&h当且仅当两个运算量的值都为“真”时,运算结果为“真”,否则为“假”结果(2)逻辑或:条件1条件2逻辑运算ab!aa&&ba|b11011100010110100100两个运算量的值都当运算量的值为为“假”;当运算运算结果为表1-2-6给出了执行逻辑运算的量的值为“假”时,算结

15、果为“假”,否为“假”时,运“真”时,运算结果(3)逻辑非:!a,则为“真”。a|b ,当且仅当表1-2-6执行逻辑运算的结果例如:设 x=3,则(x>0) && (x<6)的值为“真”(即为 “1”),而(x<0) && (x>6)的 值为“假”(即为“0”),!x的值为“假”。逻辑运算符1”的优先级最高,其次为“&&',最低为“| ”。具体请读者见表1-2-4运 算符的优先级和结合性。6 .位运算符与位运算表达式在PIC系列单片机应用系统设计中,对I /O端口的操作是非常频繁的,因此往往要求程 序在位(bit)

16、 一级进行运算或处理,因此,汇编语言具有强大灵活的位处理能力。Hitech-PICC语言直接面对:PIC系列单片机硬件,也提供了强大灵活的位运算功能,使得c语言也能像汇编语言一样对硬件直接进行操作。Hitech-PICC 提供了 6种位运算符:按位与运算按位或运算按位异或运按位取反运右移运算符:左移运算符:位运算符的作用条件1条件2逻辑运算符:&符:I ;算符:八;算符:;>>;<<;是按二进制位对ab!aa&&ba|b11011100010110100100变量进行运算,表1-2-7是位运算符的真值表。表1-2-7位运算符的真值表位及量1位及量

17、2位运算ababa&ba|baAb0011000011001110010111100110左移运算符“ <<”的功能,是把“ <<”左边的操作数的各二进制位全部左移若干位,动的位数由“ <<”右边的常数指定,高位丢弃,低位补 Q例如:"a<<4是指把a的各二 进制位向左移动4位。如a=000000llB(十进制数3),左移4位后为00110000B(十进制数 48)。右移运算符“>>”的功能,是把“>>”左边的操作数的各二进制位全部右移若干位,移动的位数由“>>”右边的常数指定。进行右移运算时

18、,如果是无符号数,则总是在其左端补“0”;对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补O,而为负数时,符号位为1,最高位是补0还是补1取决于编译系统的规定。例如:设 a=Ox98如果a为无符号数,则" a>>2'表示把B右移为0010011OB;如果a为有符号数,则" a>>2''表示把B右移为11 100110B。在使用位运算符时,有如下技巧:按位与运算通常用来对某些位清零或保留某些位。例如,要保留从PORTBS口的RB0和RB1读入的两位数据,可以执行"control=PORTB&0x0

19、3;"操作(0x03的二进制数为00000011B);而要清除 PORT端口的 RBCRB7为 0,可以执行 “ PORTB=PORTB&QXO操 彳(0x0f的二进制数为00001111R同样,按位或运算经常用于把指定位置1、其余位不变的操作。1234567891011121314流水灯控制程序就是采用移位运算来实现的发光二极管点亮位置的移动。用位运算符“ |”改写的流水灯控制程序如下#include""int a;/void main() TRISB=0X00;while(1) PORTB= PORTB|0XFE;for(a=1000;a>0;a

20、-);PORTB= PORTB|0XFD;for(a=1000;a>0;a-);PORTB= PORTB|0XFB;for(a=1000;a>0;a-);PORTB= PORTB|0XF7;for(a=1000;a>0;a-);定义整型变量a/定义端口 B为输出模式/while循环语句/1111 1110/for循环语句/1111 1101/for循环语句/1111 1011/for循环语句/1111 0111/for循环语句/1110 1111PORTB= PORTB|0XEF;15for(a=1000;a>0;a-);/for循环语句16PORTB= PORTB|0

21、XDF;/1101 111117for(a=1000;a>0;a-);/for循环语句18PORTB= PORTB|0XBF;/1011 111119for(a=1000;a>0;a-);/for循环语句20PORTB= PORTB|0X7F;/0111 111121for(a=1000;a>0;a-);/for循环语句2223 分析上面程序可知,该程序实现的流水灯效果7 .逗号运算符与逗号运算表达式在c语言中逗号”也是一种运算符,称为逗号运算符,其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式,其一般形式为:表达式1,表达式2,表达式n逗号表达式的求值过程是:从左

22、军右分别求出各个表达式的值,并以最右边的表达式n的值作为整个逗号表达式的值。程序中使用逗号表达式的目的,通常是要分别求逗号表达式内各表达式的值,并不一止要求整个逗号表达式的值。例如:x=(y=10,y+5);上面括号内的逗号表达式,逗号左边的表达式是将10赋给y,逗号右边的表达式进行y+5的计算,逗号表达式的结果是最右边的表达式“ y+5”的结果15赋给x。并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明、函数参数表中的逗 号只是用做各变量之间的间隔符,例如:unsigned int i, j;1.2.6基本语句C语言程序的执行部分由语句组成。C语言提供了丰富的程序控制语句,按照结构化

23、程 序设计的基本结构:顺序结构、选择结构和循环结构,组成各种复杂程序。这些语句主要 包括表达式语句、复合语句、选择语句和循环语句等。1 .表达式语句表达式语句是最基本的C语言语句。表达式语句由表达式加上分号“;”组成,其一般 形式如下:表达式;执行表达式语句就是计算表达式的值。例如:PORTB=0XFD;/赋值语句,在程序中将端口 B赋值为0XFDx=y+z;/ y和z进行加法运算后赋值给变量xi+;/ 自增1语句,i增加1后,再赋给变量i在C语言中有一个特殊的表达式语句,称为空语句。空语句中只有一个分号“;”,程序执行空语句时需要占用一条指令的执行时间,但是什么也不做。在程序中常常把空语句

24、作为循环体,用于消耗CPU寸间等待事件发生的场合。例如,在函数中,有下面语句:for(a=1000;a>0;a-);/for循环语句上面的for语句后面的“;”是一条空语句,作为循环体出现。在使用“;”时的小技巧:表达式是由运算及运算对象所组成的、具有特定含义的式子,例如“ y+z”。C语言 是一种表达式语言,表达式后面加上分号“;”就构成了表达语句,例如“ y+z”。C语言中 的表达式与表达式语句的区别就是前者没有分号“;”,而后者有“;”。在while或for构成的循环语句后面加一个分号,构成一个不执行其他操作的空循 环体。例如:While(1);上面语句循环条件永远为真,是无限循环

25、;循环体为空,什么也不做。程序设计时, 通常把该语句作为停机语句使用。2 .复合语句把多个语句用大括号括起来,组合在一起形成具有一定功能的模块,这种由若干条 语句组合而成的语句称为复合语句。在程序中应把复合语句看在是单条语句,而不是多条 语句。复合语句在程序运行时,中的各行单语句是依次顺序执行的。在 C语言的函数中, 函数体是一个复合语句,例如程序的主函数中包含两个复合语句:void main() TRISB=0X00;while(1) PORTB= PORTB|0XFE;for(a=1000;a>0;a-);PORTB= PORTB|0XFD;PORTB= PORTB|0X7F;/定义

26、端口 B为输出模式/while循环语句/1111 1110/for循环语句/1111 1101/0111 1111/for循环语句for(a=1000;a>0;a-);在上面的这段程序中,组成函数体的复合语句内还嵌套了组成 while()循环体的复合语 句。复合语句允许嵌套,也就是在中的。也是复合语句。复合语句内的各条语句都必须以分号“;”结尾,复合语句之间有分隔,在括号“ 外,不能家分号。复合语句不仅可由可执行语句组成,还可由变量定义语句组成。在复合语句中所定义 的变量,称为局部变量,它的有效范围只在复合语句中。函数体是复合语句,所以函数体 内定义的变量,其有效范围也只在函数内部。前面

27、的 main()函数体内定义的位变量left 和right的有效使用范围局限在 main()函数内部,与其他函数无关。3 .选择语句跑马灯的C程序可以用以下程序代码来实现,即跑马灯先从上到下循环进行。#include ""unsigned char temp=0x01;/*function: main()*功能描述:主函数*void main() INTCON=0X00;/设置INTCON勺bit7bit0 为零:关总中断TRISB=0X00;设置端口 B为输出方式PORTB=0Xff;/使端口 B输出低电平while(1) PORTB=temp;/ 按位取反for(a=1

28、000;a>0;a-);/for循环语句,起延时作用if(temp=0x00)/ 判断变量 temp 是否等 0x00temp=0x01;/if 语句成立,给变量temp赋0x01else/if 语句不成立temp=temp<<1;/ 变量 temp 左移 1 位我们看到,在上述程序中使用了如下if语句:if(temp=0x00)/判断变量temp是否等0x00temp=0x01; /if 语句成立,给变量temp赋0x01else/if 语句不成立temp=temp<<1;/ 变量 temp 左移 1 位执行这些语句时,先判断“temp=0x00是否成立,如果条

29、件满足,则执行“temp=0x01;” 后,回到“ PORTB=tem0;语句,执行该条语句,temp变量按位取反之后,变为0xFE (即 B),则PORT的0xFE (即RB0弓唧为低电平,其余引脚为高电平),所以第一个发光二极 管亮,其它都不亮。如果条件不成立,则执行“ temp=temp<<1;",将变量temp的值左移一 位再赋给变量本身,假设当时temp=0x02 (即00000010B),左移之后变成 0x04 (即00000100B),再回到“ PORTB=tem6;语句,执行该条语句,temp变量按位取反之后,变 为0xFB (即00001011B), W

30、J PORT的0xFB (即RB2弓唧为低电平,其余引脚为高电平),所以第一个发光二极管凫,其它都不凫,上述程序的流程如图1-2-5所示,图1-2-5跑马灯程序可以看出,处理实际问 或条件选择,程序设计时 判断,从而选择不同的处 行判断,并根据判断结果 称为选择结构程序。流程题时总是伴随着逻辑判断 就要根据给定的条件进行 理路径。对给定的条件进 选择应执行的操作程序,在C语言中,选择结构程序设计一般用if语句或switch语句来实现。If语句又有if、if-else 和if-else-if三种不同的形式,下面分别进行介绍。(1)基本if语句基本if语句的格式如下:if(表达式)语句1;语句2;

31、语句n;if语句的执行过程:当“表达式”的结果为“真”时,执行其后的 中的语句1至语句n,否则跳过该语组,继续执行下面的语句,执行过程如图1-2-6所示。例如:if(x=3) a=b;b=c;if(x=7) b=c;c=a;如果“x=3”不成立,则跳过“ a=b;b=c; "语句,执行下条语句。在使用基本if语句,一定要注意以下几项:在if语句中,“表达式”必须用括号括起来;在if语句中,花括号“ ”里面的语句组如果只有一条语句,可以省略花括号,如:“ if(temp=0x00) temp=0x01; ”语句。但是为了提高程序的可读性和防止程序书写错 误,建议大家在任何情境下,都加上

32、花括号。4 2) if-else 语句if-else 语句的一般格式如下:if(表达式) 语句组1; else语句组2;if-else 语句的执行过程:当“表达式”的结果为“真”时,执行其后的“语句组1”,否则执行“语句组2”,执行过程如图EfJ6;ji 流程 丫 (3) if-elsg-if 语斗箱旬if-else-if语句是由 if else一«格式如下:1-2-7 日。iFt-fse>'Yj 执行流程语句组1语句组21什语句组成的嵌套,用于实现多个条件分支的选择,其if(表达式1) 语句组1;else if( 表达式2)语句组2;else if( 表达式n)语句组

33、n;else语句组n+1;执行该语句时,依次判断“表达式i”的值,当“表达式i”值为“真”时,执行其对 应用的“语句组i”跳过剩余的if语句组,继续执行语句下面的一个语句。如果所有表达 式的值均为“假”,则执行最后一个else后的“语句组n+1”,然后再继续执行其下面的一 个语句,执行过程如图1-2-8所示。采用if-else-if语句实现汽车转向灯控制的 C程序,程序代码如下:产*note:模拟汽车转向灯控制程序(用if-else-if语句控制)*#include "" unsigned int a;产*mian()* TRISB=0X00;main()/设置端口 B为输

34、出方式PORTB=0XFF;/设置端口B为高电平输出TRISD=0XFF;/设置端口D为输入方式while(1)/while循环 if(RD0=0&&RD1=0)/如果RD叫 RD1都为低电平状态 RB0=0;RB1=0;for(a=5000;a>0;a-);else if(RD0=0) RB0=0;/for(a=5000;a>0;a-);else if(RD1=0) RB1=0;/for(a=5000;a>0;a-);else;/则点亮左转灯和右转灯/for循环语句,起延时作用/如果RD0为低电平状态则点亮左转灯/for循环语句,起延时作用/如果RD1为低电

35、平状态则点亮右转灯/for循环语句,起延时作用空语句RB0=1;/ 熄灭左转灯RB1=1;/熄灭右转灯for(a=5000;a>0;a-);/for 循环语句,起延时作用选择【程序】? Proteus 7 Professional 】? ISIS 7 Professional 】命令,启动 PROTEUS 仿真软件,在ISIS 7 professional图形编辑窗口,绘制汽车转向灯仿真电路。并选择【程 序】? Microchip ?【MPLABDE ?【MPLABDE】命令,启动MPLABDE集成开发环境; 新建工程。选择菜单栏中的【Project ? Build All 命令或直接点

36、击工具栏中的“ I西” 图标,对程序进行编译、修改,直到“Out put ”窗口没有错误为止。再把文件添加到Proteus 中,会出现如图1-2-9所示的汽车转向灯仿真效果。图1-2-9汽车转向灯仿真效果if语句使用过程中的注意事项else语句是if语句的子句,它是if语句的一部分,不能单独使用else语句总是与在它上面跟它最近的if语句相配对。表达式“ RD0=0&&RD1=01由两个关系表达式“ RD0=0和"RRD1=0组成的 逻辑表达式,其中符号“ &&'是逻辑运算符,其运算规则是:当且仅当左右两过的值都为“真”时,运算结果为“真”,否

37、则为“假”。在上面的表达式中,当且仅当 RD丽RD1都 为“0”时,该表达式的值才为“真”,否则为“假”。关于逻辑表达式的介绍请参见“关系 运算符与赋值表达式”的内容。(4) switch 语句if语句一般用做单一条件或分支数目较少的场合, 如果使用if语句来编写超过3个以 上分支的程序,就会降低程序的可读性。C语言提供了一种用于多分支选择的 switch语句, 一般形式如下:switch (表达式) case常量表达式1:语句组1; break;case常量表达式2:语句组2; break; case 常量表达式 n: 语句组 n; break;default:语句组 n+1;该语句的执行过

38、程是:首先计算表达式的值,并逐个与case后的常量表达式的值相比较,当表达式的值与某个常量表达式的值相等时,则执行对应常量表达式后的语句组,再 执行break语句,跳出switch语句的执行,继续执行下一语句。如果表达式的值与所有 case后的常量表达式均不相同,则执行 default后的语句组。用switch语句改写汽车转向灯控制的 C语言源程序,如下所示:产*note:模拟汽车转向灯控制程序(用 switch语句控制)*/#include ""unsigned int a;unsigned char contr_led;/定义转向灯控制变量/* *mian()*main

39、()/设置端口 B为输出方式/设置端口 B为高电平输出/设置端口 D为输入方式/while 循环/读PORTDJ状态送到contr_led 变量/与操作,屏蔽掉高6位无关位,取/和RD1状态如果RD0与RD1都为0,则点亮左、右/如果RD1为低电平状态,则点亮右/如果RD0为低电平状态,则点亮左 TRISB=0X00;PORTB=0XFF;TRISD=0XFF;while(1) contr_led=PORTD;contr_led= contr_led&0x03;出RD0switch(contr_led) case 0: RB0=0; RB1=0;break; 灯case 1: RB1=

40、0;break;转灯case 2: RB0=0;break;转灯default:for(a=5000;a>0;a-);RB0=1;RB1=1;for(a=5000;a>0;a-);/for循环语句,起延时作用/熄灭左转灯/熄灭右转灯/for循环语句,起延时作用/空语句,什么都不做在上述程序中,定义了一个无符号字符变量contr_led ,长度为1个字节,其最低两位用来表示RDOffi RD1引脚对左、右转向灯的控制状态。语句“contr_led=PORTD;”将PORTED的8个引脚状态保存到变量 contr_led 中,冉 执行“与”操作语句“ contr_led= contr_

41、led&0x03; ”,把无关位清零,一般称之屏蔽。然 后,采用switch(contr_led)语句来判断变量contr_led的值与哪个case语句中的常量表达式的值相同,点亮相应的转向灯;如果都不相等,则执行 default后的语句。case语句使用过程中的注意事项在case后的各常量表达式的值不能相同,否则会出现同一个条件有多种执行方案 的矛盾。在case语句后,允许有多个语句,可以不用括起来。例如:case 0: RB0=0; RB1=0;break;case和default语句的先后顺序可以改变,不会影响程序的执行结果“case常量表达式”只相当于一个语句标号,表达式的值和

42、某标号相等则转向该标号执行,但在执行完该标号的语句后,不会自动跳出整个switch语句,加break语句,使得执行完该case语句后可以跳出整个switch语句的执行。default语句是在不满足case语句情况下的一个默认执行语句。如default语句后 面是空语句,表示不做任何处理,可以省略。4.循环语句在结构化程序设计中,循环程序结构是一种很重要的程序结构,几乎所有的应用程序 都包含循环结构。循环程序的作用是:对给定的条件进行判断,当给定的条件成立时,重 复执行给定的程序段,直到条件不成立时为止。给定的条件称为循环条件,需要重复执行 的程序段称为循环体。前面介绍的函数中使用了 for循环

43、,其循环体为空语句,用来消耗 CPU时间来产生延时效果,这种延时方法称为软件延时。软件延时的缺点是占用CPU寸间,使得CPUft延时过程中不能做其他事情。解决的方法是使用单片机中的硬件定时器实现延时功能。在C语言中,可以用下面三个语句来实现循环程序结构:while语句、do-while语句和for语句,下面分别对它们加以介绍(1) while 语句while语句用来实现“当型”循环结构,即当条件为就执行循环体。while语句的一般形式为:while(表达式)语句组;循环体其中,“表达式”通常是逻辑表达式或关系表达式,为循环条件,“语句组”是循环体,即被重复执行的程序段。该语句的执行过程是:首先

44、计算机“表达式”的值勤,当值为“真”(即非0)时,执行循环体“语句组”,流程图如1-2-10所示。图1-2-10 while 语句流程在循环程序设计中,要特别注意循环的边界问题,即循环的初值和终值要非常明确。例如:下面的程序段是求整数 1100的累加和,变是i的取值范围为1100,所以,初值没有为1, while语句的条件为“ i<=100; ",符号“<二"为关系运算符“小于等于"。main() int i,sum;/循环控制变量i初始值为1/累加和变量sum初始值为0i=1;sum=0;while(i<=100) sum=sum+i; / 累

45、力口和i+;/自增1,修改循环控制变量while语句使用过程中的注意事项使用while语句时要注意,当表达式的值为“真”时,执行循环体,循环体执行一 次完成后,再次回到while ,进行循环条件判断,如果仍然为“真”,则重复执行循环体程 序;为“假”则退出整个 while循环语句。如果循环条件一开始就为“假",那么while后面的循环体一次都不会执行。 如果循环条件总为真,例如:while (1),表达式为常量“1”,非“0”即为“真”, 循环条件永远成立,则为无限循环,即死循环。在单片机C语言程序设计中,无限循环是一个非常有用的语句,在上述程序示例中都使用了该语句。 除非特殊应用的

46、情况,在使用 while语句进行循环程序设计时,通常循环体包含修 改循环条件的语句,以使循环逐渐趋于结束,避免出现死循环。(2) do-while 语句前面所述的while语句是在执行循环体之前判断循环条件,如条件不成立,则该循环 不会初执行。实际情况往往需要先执行一次循环体后,再进行循环条件的判断,“直到型”do-while语句可以满足这种要求。do-while语句的一般格式如下:do语句组;循环体 while(表达式);该语句的执行过程是:先执行循环体“语句组” 一次,再计算“表达式”的值,如果“表达式”为“真”(非0),继续执行循环体“语句组”,直到表达式为“假” (0)为止do-whi

47、le语句流程如图1-2-11所示。do-while在使用if语句、while语句时,表达式括号后面都不能加分号“;”,但在do-while 语句的表达式括号后必须加分号do-while语句与while语句相比,更适合于处理不论条件是否成立,都需先执行 次的循环体的情况(3) for语句在上述程序中,我们使用了 for语句,实现了循环,重复执行若干次空语句循环体, 以达到延时的目的。在C语言中,当循环次数明确时候,使用for语名比while和do-while 语句更为方便。For语句一般格式如下:for(循环变量赋值;循环条件;修改循环变量)语句组;循环体关键字for后面的圆括号内通常包括三个表

48、达式:循环变量赋值、循环条件和修改循环变量,三个表达式之间用“;”隔开。花括号内是循环体“语句组”。for执行过程如下:先执行第一个表达式,给循环变量赋值,通常这里是一个赋值表达式。利用第二个表达式判断循环条件是否满足,通常是关系表达式或逻辑表达式,若其 值为“真”(非0),则执行循环体“语句组” 一次,再执行下面第步;若其值为"假”(0), 则转到第步循环结束。 计算机第三个表达式,修改循环控制变量,一般也是赋值语句。跳到上面第步继续执行。 循环结束,执行for语句下面的语句。图1-2-12 for语句流程以上过程流程图如图1-2-12所示。举例:用for语句求1100累加和,程序如下:main() int i;int sum=0;/定义累加和变量for(i=1;i<=100;i+) sum=sum+i;上述for语句的执行过程如下:先给i赋值为1,判断i是否小于等于100,若是,则 执行循环体"sum=sum+i;”语句一次,然后i增1,再重新判断,直到i=101时,条件i<=100 不成立,循环结束。i语句相当于如下 while语句:i=1;while(i<=100) sum=sum+i;i+;因此,for语句的一般形式也可以改写为:表达式1;循环变量赋值while(表达 2)语句组;循环体表达3;修改循环控制

温馨提示

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

最新文档

评论

0/150

提交评论