单片机C语言.ppt
单片机C语言,认识C语言C51数据类型C语言基本语句C语言数据与运算C51函数,C语言程序以函数形式组织程序结构,C程序中的函数与其他语言中所描述的“子程序”或“过程”的概念是一样的。,C程序基本结构,1、认识C语言,一个C语言源程序是由一个或若干个函数组成,每一个函数完成相对独立的功能。每个C程序都必须有(且仅有)一个主函数main(),程序的执行总是从主函数开始,调用其他函数后返回主函数main(),不管函数的排列顺序如何,最后在主函数中结束整个程序。C语言程序中可以有预处理命令,预处理命令通常放在源程序的最前面。C语言程序使用“;”作为语句的结束符,一条语句可以多行书写,也可以一行书写多条语句。,1、认识C语言,2、C51数据类型,基本数据类型,C51数据类型扩充定义,2、C51数据类型,sfr:特殊功能寄存器声明sfr16:sfr的16位数据声明sbit:特殊功能位声明bit:位变量声明例:sfr SCON=0X98;sfr16 T2=0 xCC;sbit OV=PSW2;,3、C语言基本语句,语言程序的执行部分由语句组成。C语言提供了丰富的程序控制语句,按照结构化程序设计的基本结构:顺序结构、选择结构和循环结构,组成各种复杂程序。这些语句主要包括表达式语句、复合语句、选择语句和循环语句等。,1)表达式语句和复合语句,表达式语句是最基本的C语言语句。表达式语句由表达式加上分号“;”组成,其一般形式如下:表达式;执行表达式语句就是计算表达式的值。在 C 语言中有一个特殊的表达式语句,称为空语句。空语句中只有一个分号“;”,程序执行空语句时需要占用一条指令的执行时间,但是什么也不做。在C51程序中常常把空语句作为循环体,用于消耗CPU时间等待事件发生的场合。,把多个语句用大括号括起来,组合在一起形成具有一定功能的模块,这种由若干条语句组合而成的语句块称为复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句。复合语句在程序运行时,中的各行单语句是依次顺序执行的。在C语言的函数中,函数体就是一个复合语句。,1)表达式语句和复合语句,2)选择语句,基本if语句的格式如下:if(表达式)语句组;if语句执行过程:当“表达式”的结果为“真”时,执行其后的“语句组”,否则跳过该语句组,继续执行下面的语句。,if语句中的“表达式”通常为逻辑表达式或关系表达式,也可以是任何其他的表达式或类型数据,只要表达式的值非0即为“真”。以下语句都是合法的:if(3)if(x=8)if(P3_0)在if语句中,“表达式”必须用括号括起来。在if语句中,花括号“”里面的语句组如果只有一条语句,可以省略花括号。如“if(P3_0=0)P1_0=0;”语句,但是为了提高程序的可读性和防止程序书写错误,建议读者在任何情况下,都加上花括号。,2)选择语句,if-else语句的一般格式如下:if(表达式)语句组1;else 语句组2;if-else语句执行过程:当“表达式”的结果为“真”时,执行其后的“语句组1”,否则执行“语句组2”,2)选择语句,if-else-if语句是由 if else 语句组成的嵌套,用来实现多个条件分支的选择,其一般格式如下:if(表达式1)语句组1;else if(表达式2)语句组2;else if(表达式n)语句组n;else 语句组n+1;,2)选择语句,2)选择语句,多分支选择的switch语句,其一般形式如下:switch(表达式)case常量表达式1:语句组1;break;case常量表达式2:语句组2;break;case常量表达式n:语句组n;break;default:语句组n+1;该语句的执行过程是:首先计算表达式的值,并逐个与case后的常量表达式的值相比较,当表达式的值与某个常量表达式的值相等时,则执行对应该常量表达式后的语句组,再执行break语句,跳出switch语句的执行,继续执行下一条语句。如果表达式的值与所有case后的常量表达式均不相同,则执行default后的语句组。,2)选择语句,while语句用来实现“当型”循环,执行过程:首先判断表达式,当表达式的值为真(非0)时,反复执行循环体。为假(0)时执行循环体外面的语句。,循环体,格式:while(循环继续的条件表达式)语句组;,花括号不能丢掉!,3)循环语句,请问:下述程序实现了什么功能?main()int i,sum=0;while(i=10)sum=sum+i;i+;,3)循环语句,do-while语句用来实现“直到型”循环执行过程:先无条件执行一次循环体,然后判断条件表达式,当表达式的值为真(非0)时,返回执行循环体直到条件表达式为假(0)为止。,绝对不能少分号!,循环体,格式:do 循环体语句组;while(循环继续条件);,花括号不能丢掉!,3)循环语句,请问:下述程序实现了什么功能?main()int i,sum=0;do sum=sum+i;i+;while(i=100);,3)循环语句,总循环次数已确定的情况下,可采用for语句形式为:for语句的一般形式:for(循环变量赋初值;循环继续条件;循环变量增值)循环体语句组;,分隔符为分号,请问:下述程序实现了什么功能?main()int i,y=0;for(i=1;i=10;i+)y=y+i;,3)循环语句,for语句循环执行过程,for语句不仅可用于循环次数已经确定的情况,也可用于循环次数虽不确定,但给出了循环继续条件的情况,它完全可以代替while语句和do-while语句。,for(循环变量赋初值;循环继续条件;循环变量增值)循环体语句组;,分隔符为分号,4、C语言数据与运算,1.赋值运算符2.算术运算符和算术表达式 3.关系运算符和关系表达4.逻辑运算符和逻辑表达式,赋值运算符,赋值语句的作用是把某个常量或变量或表达式的值赋值给另一个变量。符号为=。这里并不是等于的意思,只是赋值,等于用=表示。赋值语句左边必须是变量或寄存器,且必须先定义。常量不能出现左边。,赋值运算符和赋值表达式,简单的赋值运算符:复合的赋值运算符,=,+=、-=、*=、%=、/=,i+=2 等价于 i=i+2 a*=b+5 等价于 a=a*(b+5)x%=3 等价于 x=x%3,算术运算符,(加法运算)(减法运算)*(乘法运算符)(除法运算符)%(求余运算符,或称模运算符)如:4%20+(变量自加1)-(变量自减1),注 意两个整数相除结果为整数,如8/5的结果为1,舍去小数部分。如果参加运算的两个数中有一个数为实数,则结果是实型。求余运算要求%两侧都是整型数据。,自增、自减运算,实战演练:请说明程序运行完后x,y,z,m,n的值分别是多少?main()int x=6,y,z,m,n;y=+x;z=x-;m=y/z;n=y%z;,自增运算符(+)和自减运算符(-):(1)前置运算变量、变量 即先增减、后运算。(2)后置运算变量、变量 即先运算、后增减。,关系运算符,关系运算符 优先级,=,=!=,低,高,关系表达式,用关系运算符将两个表达式(可以是算术表达式、关系表达式、赋值表达式或逻辑表达式)连接起来的式子,称为关系表达式。关系表达式的值为逻辑值“真”或“假”,以1代表“真”,以0代表“假”。例如:(1)关系表达式“8=4”的值为,表达式的值为。(2)关系表达式“50”的值为,表达式的值为。,逻辑运算符及其优先级,逻辑运算符 优先级!(逻辑非)&(逻辑与)|(逻辑或)注意:逻辑运算符与位操作运算符的区别。,逻辑表达式,用逻辑运算符将一个或多个表达式连接起来,进行逻辑运算的式子。逻辑量的真判断非0逻辑量的假判断0,若a=1,b=2,c=3,x=4,y=3,写出下各个表达式的值:(1)a+bc&b=c(2)!ab&b!=c|x+y=3(3)!(x=a)&(y=b)&0,0,0,0,例如:(1)xc 等效于(!a)&(bc),位运算,与操作按位与操作符:主要用途:取(或保留)1个数的某(些)位,其余各位置0。,位运算,或操作按位或操作符:|格式:x|y规则:对应位均为0时才为0,否则为1 例如,i=i|0 x0f;等同于 i|=0 x0f;主要用途:将1个数的某(些)位置1,其余各位不变,位运算,异或操作按位异或操作符:格式:xy规则:对应位相同时为0,不同时为1 例如,i=i0 x0f;等同于 i=0 x0f;主要用途:使1个数的某(些)位翻转(即原来为1的位变为0,为0的变为1),其余各位不变。,位运算,按位取反操作按位取反操作符:格式:x规则:各位翻转,即原来为1的位变成0,原来为0的位变成1 例如,i=i;主要用途:间接地构造一个数,以增强程序的可移植性。,左移运算符“”的功能,是把“”左边的操作数的各二进制位全部右移若干位,移动的位数由“”右边的常数指定。进行右移运算时,如果是无符号数,则总是在其左端补“0”,位运算,分隔符为分号,5、数组的概念,数组属于常用的数据类型,数组中的元素有固定数目和相同类型,数组元素的数据类型就是该数组的基本类型。例如,整型数据的有序集合称为整型数组,字符型数据的有序集合称为字符型数组。数组还分为一维、二维、三维和多维数组等,常用的是一维、二维和字符数组。,构造类形数据:由基本类型数据按照一定规则组成。数组:是有序数据的集合;数组中的每一个元素都属于同一个数据类型,用一个统一的数组名和下标来唯一地确定数组中的元素。应用场合:需要处理的数据为数量已知的若干相同类型的数据时。注意:先定义,后使用。,5、数组的概念,一维数组的定义:一般格式:类型标识符 数组名常量表达式;int array10;unsigned char num7;说明:1)数组名见名知意;数组名中存放的是一个地址常量,它代表整个数组的首地址。同一数组中的所有元素,按其下标的顺序占用一段连续的存储单元。2)方括弧而非圆括弧;3)常量表达式:可以是常量或符号常量;表示数组元素的个数(也称数组长度)。不允许对数组大小作动态定义。4)数组元素下标从0开始。array0,array1,array9;,遵循标识符命名规则,5、数组的概念,数组元素的表达形式:数组名下标表达式Array4=100;array8=34;array10=56;注意:数组下标不能越界!一个数组元素具有和相同类型单个变量一样的属性,可以对它赋值和参与各种运算。,5、数组的概念,一般格式:数据类型 数组名常量表达式初值表1.定义时赋初值;int score5=1,2,3,4,5;2.给一部分元素赋值;int score5=1,2;3.使所有元素为0;int score5=0;4.给全部数组元素赋初值时,可以不指定数组长度;int score=1,2,3,4,5;,5、数组的概念,在C语言程序中,子程序的作用是由函数来实现的,函数是C语言的基本组成模块,一个C语言程序就是由若干个模块化的函数组成的。C程序都是由一个主函数main()和若干个子函数构成,有且只有一个主函数,程序由主函数开始执行,主函数根据需要来调用其他函数,其它函数可以有多个。,6、C51函数,1)标准库函数 标准库函数是由C51的编译器提供的,用户不必定义这些函数,可以直接调用。KEIL C51编译器提供了100多个库函数供我们使用。常用的C51库函数包括一般I/O口函数、访问SFR地址函数等,在C51编译环境中,以头文件的形式给出。2)用户自定义函数 用户自定义函数是用户根据需要自行编写的函数,它必须先定义之后才能被调用。,6、C51函数,函数定义的一般形式是:函数类型 函数名(形式参数表)形式参数说明局部变量定义函数体语句 其中,“函数类型”说明了自定义函数返回值的类型。“函数名”是自定义函数的名字。“形式参数表”给出函数被调用时传递数据的形式参数,形式参数的类型必须要加以说明。ANSI C标准允许在形式参数表中对形式参数的类型进行说明。如果定义的是无参数函数,可以没有形式参数表,但是圆括号不能省略。“局部变量定义”是对在函数内部使用的局部变量进行定义。“函数体语句”是为完成函数的特定功能而设置的语句。,6、C51函数,函数调用就是在一个函数体中引用另外一个已经定义的函数,前者称为主调用函数,后者称为被调用函数,函数调用的一般格式为:函数名(实际参数列表);对于有参数类型的函数,若实际参数列表中有多个实参,则各参数之间用逗号隔开。实参与形参顺序对应,个数应相等,类型应一致。,6、C51函数,在一个函数中调用另一个函数需要具备如下条件:(1)被调用函数必须是已经存在的函数(库函数或者用户自己已经定义的函数。如果函数定义在调用之后,那么必须在调用之前(一般在程序头部)对函数进行声明。(2)如果程序使用了库函数,则要在程序的开头用include预处理命令将调用函数所需要的信息包含在本文件中。如果不是在本文件中定义的函数,那么在程序开始要用extern修饰符进行函数原型说明。,6、C51函数,C51编译器支持在C源程序中直接以函数形式编写中断服务程序。常用的中断函数定义语法如下:void 函数名()interrupt n其中n为中断类型号,C51编译器允许031个中断,n取值范围031。下面给出了8051控制器所提供的5个中断源所对应的中断类型号和中断服务程序入口地址:中断源 n 入口地址外部中断0 0 0003H定时/计数器0 1 000BH外部中断1 2 0013H定时/计数器1 3 001BH串行口 4 0023H,6、C51函数,C51包含的头文件,通常有:reg51.hreg52.hmath.hctype.hstdio.hstdlib.habsacc.h,6、C51函数,常用的有:reg51.h或reg52.h(定义特殊功能寄存器和位寄存器);math.h(定义常用数学运算),