您好,欢迎访问三七文档
C51程序设计入门*C51的基本数据类型*C51数据的存储类型*C51的运算符*数组*C51的程序的结构*程序的流程控制C-51简介C语言特点:本身不依赖于机器硬件系统;基本上不作修改就可互相移植;提供数学函数、支持浮点运算;增加程序可读性和可维护性。MCS-51单片机的C语言要采用C51编译器,目前最常用的是KeilC51。C源程序C51编译器L51(或BL51)连接/定位生成.HEX目标程序流程(5)具有方便的模块化编程技术,使程序很容易移植。C51优点(1)对指令系统不必深入了解,但对存贮器空间结构需深入了解;(2)寄存器分配、不同存贮器的寻址等细节可由编译器管理;(3)程序有规范的结构,可分解成各种子函数,有利于程序的结构化;(4)库文件中包含许多标准函数,具有较强的数据处理能力;类型符号关键字所占位数数的表示范围整型有(signed)int16-32768~32767有(signed)longint32-2147483648~2147483647无unsignedint160~65535有unsignedlongint320~4294967295实型有float323.4e-38~3.4e38无double641.7e-308~1.7e308字符型有char8-128~127无unsignedchar80~255位型无bit10或11C51的基本数据类型2C51数据的存储类型数组型指针型名存储空间位置位数范围说明data直接寻址片内RAM80~127片内RAM00-7FH的128个字节,访问速度最快bdata可位寻址片内RAM10/1位寻址片内RAM20~2FH,位与字节可混合访问idata间接寻址片内RAM80~25500-FFH的128个片内RAM,及52子系列的高128字节内部RAM。访问方式:MOVA,@Ripdata片外页RAM80~255寻址片外RAM低256字节,由MOVXA,@Ri访问xdata片外RAM160~65535片外RAM全部64KB,由MOVXA,@DPTR访问code程序ROM160~65535ROM区全部64KB,由MOVCA,@A+DPTR访问存储模式说明SMALL默认data,参数及局部变量放入可直接寻址片内RAM的用户区中(最大128字节)。另外所有对象(包括堆栈),都必须嵌入片内RAM。COMPACT默认pdata,参数及局部变量放入分页的外部数据存储区,通过@R0或@R1间接访问,栈空间位于片内数据存储区中。LARGE默认xdata,参数及局部变量直接放入片外数据存储区,使用数据指针DPTR来进行寻址。用此数据指针进行访问效率较低,尤其对两个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度。建议首先选用SMALLC51数据的存储模式(编译模式)(位右移位左移)&|(按位与按位或)^~(按位异或按位取反)+-*/(加减乘除)==(大于大于等于小于小于等于)==!=(测试等于测试不等于)&&||!(逻辑与逻辑或逻辑非)3C51的运算符自增、自减运算符++自增运算符;--自减运算符。j++表示先取值,后加1。相当于j=j+1;J--表示先取值,后减1。相当于j=j-1;复合运算符a+=b;等价于a=a+bx*=a+b;等价于x=x*(a+b)a&=b;等价于a=a&b相当于第1个变量的值等于把等号去掉的运算。4数组一维数组的定义数据类型数组名[常量表达式];例:unsitnedinta[10];它表示定义一个无符号整形数组名为a,此数组有10个元素。说明:1)数组名后是用方括弧括起来的常量表达式,不能用圆括弧。下面用法不对:inta(10);2)常量表达式表示元素的个数,即数组长度。例,在a[10]中,10表示a数组有10个元素,下标从0开始,a[0],a[1],……a[9]。注意不能使用数组元素a[10];3)常量表达式中可以包括常量和符号常量,不能包含变量。也就是说,C51不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例:unsignedchari;unsignedchari=10;a[i];错误定义a[i];正确定义一维数组的初始化对数组元素的初始化可以用以下方法实现:1)在定义数组时对数组元素赋以初值。例:inta[10]={0,1,2,3,4,5,6,7,8,9};2)可以只给一部分元素赋值。例:inta[10]={0,1,2,3,4};定义a数组有10个元素,但花括弧内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0。3)如果想使一个数组中全部元素值为0,可以写成inta[10]={0,0,0,0,0,0,0,0,0,0};不能写成inta[10]={0*10};4)对全部数组元素赋初值时,可以不指定数组长度。例:inta[5]={1,2,3,4,5};可以写成inta[]={1,2,3,4,5}一维数组元素的引用数组必须先定义,后使用。C51语言规定只能逐个引用数组元素而不能一次引用整个数组。数组元素的表示形式为:数组名[下标]下标可以是整型常量或整型表达式。例如:a[0]=a[5]+a[7]-a[2*3]*二维数组的定义二维数组定义的一般形式为数据类型数组名[常量表达式][常量表达式]例:floata[3][4],b[5][10];不能写成floata[3,4],b[5,10];二维数组赋初值:intkey[2][3]={{1,2,4},{2,2,1}};二维数组元素的引用形式为:数组名[行下标表达式][列下标表达式]1)“行下标表达式”和“列下标表达式”的值,都应在已定义数组大小的范围内。假设有数组x[3][4],则可用的行下标范围为0-2,列下标范围为0-3。2)对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的二维数组元素。字符数组用来存放字符量的数组称为字符数组。字符数组类型说明的形式与前面介绍的数值数组相同。例如:charc[5]={`H`,`E`,`L`,`L`,`O`};字符数组charc[6]={`HELLO`};字符串数组*实际上是以上字符的ASCII码。*`\0`为字符串的结束标志,字符串数组会自动加上。7C51的程序设计7.1C51程序结构常用C51的头文件:reg51.h(定义特殊功能寄存器等);math.h(数学函数);ctype.h(字符函数);stdio.h(一般IO函数);stdlib.h(标准函数);absacc.h(绝对地址访问);string.h(串函数)…….func1(){局部变量定义程序体}……funcN(){局部变量定义程序体}main(){局部变量定义程序体}包含头文件函数类型说明全程变量定义西华大学机械工程与自动化学院黄惟公教授编7.2C51流程控制1.选择语句ifif(表达式){语句;}例:if(p1!=0){c=30;}if(条件表达式){语句1;}else{语句2;}例:if(a==b){a++;}else{a--;}当a等于b时,a=a+1,否则a=a-1if(表达式1){语句1;}elseif(表达式2){语句2;}elseif(表达式3){语句3;}……elseif(表达式m){语句m;}else{语句n;}注:语句中为单一语句,可以不用花括弧。西华大学机械工程与自动化学院黄惟公教授编switch(表达式){case常量表达式1:{语句1;}break;case常量表达式2:{语句2;}break;case常量表达式3:{语句3;}break;……case常量表达式n:{语句n;}break;default:{语句n+1;}}例:switch(k){case0:{x=1;}break;case2:{c=6;b=5;}break;case3:{x=12;}break;default:break;}2.switch/case语句3.while语句while(条件表达式真){语句;}while(P0!=0){x=P0;}先判断后循环例do{语句;}while(条件表达式真);intsum=0,i;do{sum=sum+i;i++;}while(i=10)先循环后判断例for语句for([初值设定表达式];[循环条件表达式];[条件更新表达式]){循环语句;}例:inti,sum=0;for(i=0;i=10;i++){sum=sum+i;}8函数的定义与调用函数是语句块的一种封装,可以在程序中多次使用。函数与“子程序”或“过程”是同样的事情。函数用来将一个程序的操作元素分成多个基本部分。这样使程序员可以调试某个元素,然后反复使用。从用户的角度看C语言有两种函数:标准库函数和用户自定义的函数。标准库函数是c编译器提供的,不需要用户进行定义,可以直接调用。函数的一个主要优点就是可以作为库的扩展。它还可在其它程序中重复使用。这样可以节省时间,便于合作。自定义函数的一般形式为:函数类型函数名(形式参数表){局部变量定义;函数体语句;}函数类型:说明了所定义函数返回值的类型。如函数不需要返回值可以写作“void”。形式参数:是指调用函数时要传入到函数体内参与运算的变量,它可以有一个、几个或没有,当不需要形式参数时,括号内可以为空或写入“void”。函数体:可包含有局部变量的定义和程序语句,如函数要返回运算值则要使用return语句进行返回。voiddelayms(uintx){unsignedcharj;while(x--){for(j=0;j123;j++){;}}}例:延时ms的函数/*------------------------------------------------功能:毫秒延时函数参数:当晶振为11.0592MHz时,x为ms数,误差都为16us;如:x=1000为1秒-------------------------------------------------*/voiddelayms(uintx){ucharj;while(x--){for(j=0;j123;j++){;}}}函数调用函数名(实际参数表)函数名:指被调用的函数。实际参数表:可以为零或多个参数,多个参数时要用逗号隔开,每个参数的类型、位置应与函数定义时所的形式参数一一对应,它的作用就是把参数传到被调用函数中的形式参数,例:调用“延时ms函数”delayms(1000);//延时1s
本文标题:C51课件
链接地址:https://www.777doc.com/doc-2891734 .html