C的C语言程序设计基础实用_第1页
C的C语言程序设计基础实用_第2页
C的C语言程序设计基础实用_第3页
C的C语言程序设计基础实用_第4页
C的C语言程序设计基础实用_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

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

文档简介

会计学1C的C语言程序设计基础实用教学目的通过本章学习,使学生:理解单片机上的C语言和普通C语言的区别熟悉C51种关于中断函数和变量的存储类型、存储模式的特殊性掌握单片机实际应用过程中,将原来汇编语言写的源程序改写成C的源程序,最后能到自己用C语言独立完成实际任务的程序设计。第1页/共85页第5章 80C51的C语言程序设计基础单片机设计语言有:机器语言汇编语言高级语言第2页/共85页机器语言特点:单片机能直接识别面向机器的硬件不同厂家、不同系列的单片机其指令系统也不同;第3页/共85页汇编语言特点:是一种用文字助记符来表示机器指令的符号语言最接近机器码的一种语言优点:利于初学者掌握微机的硬件资源占用资源少、程序执行效率高、容易优化直接操作机器的硬件指令的执行速度快缺点:不易移植,可读性不强,不易于维护。第4页/共85页高级语言特点:它兼顾了多种高级语言的特点,并具备汇编语言的功能。有功能丰富的库函数、运算速度快、编译效率高、有良好的可移植性,而且可以直接实现对系统硬件的控制。编译器丰富典型的是美国Franklin软件公司推出的FranklinC51就是专为MCS-51系列单片机设计的C编译器。第5页/共85页第5章 80C51的C语言程序设计基础5.1 C51程序设计的基础知识FranklinC51编译器是标准的FranklinC语言编译器专门为MCS-51系列的单片机量身定做的一套精简的编译器,这就是通常所说的C51。它为C语言在嵌入式系统上的应用,提供了一种用编程的方法和途径。而这种简化的C语言又完全符合C语言的ANSI标准。第6页/共85页5.1.1 C51的特点可以直接操作微机硬件程序可读性好,易于维护编程效率高目标代码质量高可移植性好模块化的程序设计在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。开发工具齐全第7页/共85页5.1.2 C51中的标识符和关键字1 标识符标识符是用来标识源程序中某个对象的名字的,这些对象可以是语句、数据类型、函数、变量、常量、数组等等。标识符由字符串,数字和下划线等组成。2 关键字关键字则是编程语言保留的特殊标识符,它们具有固定名称和含义,在程序编写中不允许标识符与关键字相同。在KEILuVision2中的关键字除了有ANSIC标准的32个关键字外(见表5-1),根据51单片机的特点,又扩展了如表5-2所列举的13个特殊关键字。其实在KEILuVision2的文本编辑器中编写C程序,系统可以把保留字以不同颜色显示,缺省颜色为天蓝色。第8页/共85页标识符建立和定义的时候,要注意以下四点:标识符的长度最长可以达到255个字符尽量要做到见名思义严格区分大小写第一个字符必须是字母或下划线第9页/共85页C51编译器中能识别的扩展关键字关键字用途说明bit位标量声明声明一个位标量或位类型的函数sbit位标量声明声明一个可位寻址变量Sfr特殊功能寄存器声明声明一个8位的特殊功能寄存器Sfr16特殊功能寄存器声明声明一个16位的特殊功能寄存器data存储器类型说明说明一个变量在直接寻址的内部数据存储器bdata存储器类型说明说明一个变量在可位寻址的内部数据存储器idata存储器类型说明间接寻址的内部数据存储器pdata存储器类型说明分页寻址的外部数据存储器xdata存储器类型说明说明一个变量在外部数据存储器code存储器类型说明程序存储器interrupt中断函数说明定义一个中断函数reentrant再入函数说明定义一个再入函数using寄存器组定义定义80C51芯片的工作寄存器第10页/共85页5.2 C51中的数据类型char字符类型nt整型long长整型float浮点型指针型bit位标量sfr特殊功能寄存器sfr1616位特殊功能寄存器sbit特殊功能位第11页/共85页5.2 C51中的数据类型数据类型名称长度值域unsignedchar无符号字符单字节0~255signedchar有符号字符单字节-128~+127unsignedint无符号整型双字节0~65535signedint有符号整型双字节-32768~+32767unsignedlong无符号长整型四字节0~4294967295signedlong有符号长整型四字节-2147483648~+2147483647float浮点型四字节±1.175494E-38~±3.402823E+38*一般指针1~3字节对象的地址bit位型位0或1sfr8位特殊功能寄存器单字节0~255sfr1616位特殊功能寄存器双字节0~65535sbit可编程的位位0或1第12页/共85页5.2.1、char字符类型长度:一个字节功能:定义处理字符数据的变量或常量分类:无符号字符类型unsignedchar有符号字符类型signedchar默认值为signedchar类型注意:当定义一个变量为字符数据类型时,在程序使用该变量不应使它的值超过它的值域不能赋超出0~255第13页/共85页5.2.2 int整型长度:两个字节功能:存放一个双字节数据分类:符号整型signedint无符号整型unsignedint默认值为signedint类型。第14页/共85页5.2.2 int整型(续)范围:signedint:-32768~+32767字节中最高位表示数据的符号,“0”表示正数,“1”表示负数unsignedint:范围是0~65535。注意:如果C51的程序,出现延时或循环体次数的错误,都可能是因为字符型和整型的数据类型运用得不恰当,解决的办法是可以把变量的类型由原来的字符型或整型换成另外一种。第15页/共85页关于整型和字符型,可以通过下面的程序继续得以区分:main(){char i;//char和int这里的时间延时是不一样的P1=0X55;while(1){P1=~P1;for(i=0;i<1000;i++);}}char类型下面的for语句执行一次循环要3个机器周期int类型则要5个机器周期第16页/共85页5.2.3 long长整型长度:四个字节功能:存放一个四字节数据分类:有符号长整型signedlong无符号长整型unsignedlong默认值为signedlong类型分为:signedint:-2147483648~+2147483647,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数unsignedlong:0~4294967295第17页/共85页5.2.4 float浮点型长度:四个字节依次存放数的符号(占用1位)阶码(占用8位)尾码(占用23位)功能:存放一个4字节的数据第18页/共85页float浮点数据类型在内存中具体的存放格式如下:字节地址+3+2+1+0浮点数内容格式SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMMS代表数的符号位“1”表示负“0”表示正E代表阶码占用8个位,E大于127,则将结果减127作为2的指数,若小于127,则用127减结果然后作为2的指数;M代表精度为23位的尾数第19页/共85页5.2.5 指针型长度:一般为1~3个字节特点:指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占据一定的内存单元分类:一般指针(GenericPointer)存储器指针(Memory_SpecificPointer)第20页/共85页1 一般指针特点:一般指针的声明和使用均与标准C相同,不过同时还可以说明指针的存储类型一般指针本身用3个字节存放,分别存放:存储器类型高位偏移低位偏移量例句:long*state;为一个指向long型整数的指针,而state本身则依存储模式存放。第21页/共85页2 存储器指针特点:利用存储类型的关键字指定存储类型指针本身只需一个字节或2个字节存放偏移量例如:char data *str;str指向data区中char型数据int xdata*pow;pow指向外部RAM的int型整数。char *xdataptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区。第22页/共85页5.2.6 bit位标量长度:一个二进制位范围:只有两个结果:不是“0”就是“1”功能:存储一些单片机的中间位处理结果注意:bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。第23页/共85页5.2.7 sfr特殊功能寄存器长度:一个字节范围:是0~255功能:利用sfr可以访问51单片机内部的所有特殊功能寄存器第24页/共85页5.2.7 sfr特殊功能寄存器(续)具体格式为:sfr 特殊功能寄存器名=特殊功能寄存器地址常数;特点:这种数据类型通常用在C51的头文件中,用来定义特殊功能寄存器,这样在C的源程序中,就可以直接引用这些特殊功能寄存器了。第25页/共85页表5-4 51系列单片机的特殊功能寄存器符号地址注释*ACCE0H累加器*BF0H乘法寄存器*PSWD0H程序状态字SP81H堆栈指针DPL82H数据存储器指针低8位DPH83H数据存储器指针高8位*IEA8H中断允许控制器*IPD8H中断优先控制器*P080H端口0*P190H端口1*P2A0H端口2*P3B0H端口3PCON87H电源控制及波特率选择*SCON98H串行口控制器SBUF99H串行数据缓冲器*TCON88H定时器控制TMOD89H定时器方式选择TL08AH定时器0低8位TL18BH定时器1低8位TH08CH定时器0低8位TH18DH定时器1高8位第26页/共85页5.2.8 sfr1616位特殊功能寄存器长度:占用两个内存单元范围:是0~65535功能:定义两个字节长度的特殊功能寄存器具体格式为:sfr16 特殊功能寄存器名=特殊功能寄存器地址常数;第27页/共85页5.2.9 sbit特殊功能位长度:一个二进制位功能:访问芯片内部RAM中可寻址的空定义单片机某些I/O引脚,以完成对单片机的I/O控制例句:sbit key=P1^0;if(key)……便可对P1端口的P1.1引脚进行直接操作第28页/共85页5.3 C51中的常量定义:常量是在程序执行过程中其值不能改变的量。分类:整型常量浮点型常量字符串型常量位标量第29页/共85页5.3.1 整型常量表示方法:八进制用0开头十六进制则以0x开头而默认的格式是十进制数在C51中不能直接处理二进制常量。例句:十进制数100,表示成十六进制是0x64八进制就应该写成0144第30页/共85页5.3.2 浮点型常量分类:十进制基本型组成:数字小数点如0.888,3345.345,0.0等特点:整数或小数部分为0,可以省略但必须有小数点。指数标准形式[±]数字[.数字]e[±]数字如125e3,7e9,-3.0e-3。第31页/共85页5.3.3 字符型常量特点:单引号内的字符不可以显示的控制字符,可以在该字符前面加一个反斜杠“\”,组成专用转义字符,进而使之显示,常用转义字符表请看表5-5所示。例句:如‘a’,‘d’第32页/共85页表5-5常用转义字符转义字符含义ASCII码(16/10进制)\o空字符(NULL)00H/0\n换行符(LF)0AH/10\r回车符(CR)0DH/13\t水平制表符(HT)09H/9\b退格符(BS)08H/8\f换页符(FF)0CH/12\'单引号27H/39\"双引号22H/34\\反斜杠5CH/92第33页/共85页5.3.4 字符串型常量特点:由双引号内的字符组成引号内的没有字符时,为空字符串在C中字符串常量是字符串常量"A"和字符常量'A'是不同的,前者在存储时多占用两个字节的空间,而后者只占用一个字节的空间。功能:做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上\o转义字符,以作为该字符串的结束符。例句:如“test”,“OK”等,都属于字符串类型的常量第34页/共85页5.3.5 位标量取值:位标量的值是一个二进制数。定义的语法结构:bit 标量名作用:是定义一个标量,用来表示某个二进制位的值例句:bit

flag//定义一个位标量flag,作为程序中的一个标志位第35页/共85页5.3.6 常量的定义常量的定义最常使用的方式有以下两种:1、用宏定义语句#difineFalse0x0;//用预定义语句可以定义常量#difineTrue0x1;//这里定义False为0,True为1//在程序中用到False编译时自动用0替换,同理True替换为1第36页/共85页5.3.6 常量的定义(续)常量的定义最常使用的方式有以下两种:2、用赋值语句unsignedintcodea=100;//这一句用code把a定义在程序存储器中并赋值,因为程序存储器只读的特性,所以a在程序执行的过程中值始终都是100,不允许修改,这样a也相当于一个常量。constunsignedintc=100;//用const定义c为无符号int常量并赋值第37页/共85页5.4 C51中的变量及其存储模式5.4.1 C51中的变量 定义:变量是在程序执行过程中其值可以变化的量。特点:变量的值可能因为程序执行不同的语句,而有不同的结果,也可能由硬件的动作状态所制约要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。第38页/共85页定义一个变量的格式定义一个变量的格式如下:[存储种类]数据类型[存储器类型]变量名表1、存储种类有四种:自动(auto)外部(extern)静态(static)寄存器(register)缺省类型为自动(auto)2、数据类型和我们在前面提到的名种数据类型的定义是一样的。第39页/共85页5.4.2 C51中存储器类型数据类型决定变量的空间大小存储器类型决定变量的空间位置第40页/共85页5.4.2.1 存储器类型KEILuVision2中给用户提供了3大块儿不同的存储空间:程序存储器空间片内数据存储器空间片外数据存储器空间存储类型的分类:CODEDATABDATAIDATAXDATA如图5-1所示,给出了每块儿存储器空间上分布的相应存储器类型。第41页/共85页图5-1 51单片机内部存储空间对应的存储类型第42页/共85页1、CODE存储器类型变量位置:程序存储器的整个64K字节范围特点:变量的值只能访问和引用,不能修改如同汇编语言中以下两天指令:MOVC A,@A+DPTRMOVC A,@A+PC第43页/共85页2、DATA存储器类型变量位置:变量存储在内部低128字节RAM地址空间特点:在这个区内,指令用一个或两个周期来访问数据,是所有区内访问速度最快的一个使用比较频繁的变量或局部变量存储在DATA区中必须节省使用DATA区的空间,因为它的空间毕竟有限的。第44页/共85页3、BDATA存储器类型变量位置:片内数据存储器从地址20H开始到2FH特点:包括16个字节,共128个可以寻址的位每一位都可单独寻址第45页/共85页4、IDATA存储器类型变量位置:片内数据存储器空间间接寻址区特点:可以访问全部内部数据存储器空间在IDATA区内的变量,在汇编语言中只能通过间接寻址来访问。在汇编语言中是通过R0和R1采用间接寻址,来访问这个区的,R0和R1被作为指针,将要恢复或改变字节的地址放入R0或R1中。根据源操作数和目的操作数的不同,执行指令需要一个或两个周期。第46页/共85页5、XDATA存储器类型变量位置:外部RAM一些I/O接口范围:64K字节特点:读写操作需要至少两个处理周期使用DPTR、R0或R1汇编语言指令,都可以定义成属于这个区域的变量第47页/共85页5.4.3 C51中存储模式作用:决定了变量的默认存储类型C51提供了这3种存储器模式来存储变量:SMALLCOMPACTLARGE如果省略存储器类型第48页/共85页1、SMALL存储模式名称:这是C51默认的一种模式,也叫小模式特点:C51把所有函数变量和局部数据段,以及所有参数传递,都放在内部数据存储器DATA区中数据访问非常快地址空间受限第49页/共85页2、COMPACT存储模式名称:又称为压缩的存储模式特点:所有的函数和程序变量和局部数据段定位在51单片机系统的外部数据存储区外部数据存储区分页访问,每页256字节,最多256页如果不加说明的变量,将被分配在PDATA区中将扩充能够使用的RAM数量,对XDATA区以外的数据存储仍然是很快的第50页/共85页3 LARGE存储模式名称:也叫大模式特点:所有函数和过程的变量和局部数据段,都定位在51单片机系统的外部数据存储器中容量最多可支持64KB要求使用DPTR数据指针访问数据或定义成XDADA的存储器类型。第51页/共85页关于存储模式的设置,我们要注意以下点:(1)如果用参数传递和分配再入函数的堆栈,应尽量使用SMALL存储模式(2)可以使用混合存储模式第52页/共85页5.5 C51中的中断函数C51中的函数声明除了一般函数以外,还对标准的C作了扩展,具体包括:中断函数再入函数第53页/共85页5.5.1 一般函数组成:函数说明函数体一般结构如下:[函数类型] 函数名(函数参数表)/*函数说明*/{ 说明语句部分;执行语句部分;/*函数体部分*/}第54页/共85页5.5.1 一般函数(续)其中:[...]表示可选项(即可以指定,也可以缺省)类型和变量的数据类型相同,表示函数的返回值。函数说明部分,由函数类型、函数名和函数参数表三部分组成,其中函数参数表的格式为:数据类型形参[,数据类型形参2……]在函数说明部分的下面、大括号(必须配对使用)内的部分。函数体第55页/共85页函数体一般由说明语句和执行体两部分构成:1、说明语句部分组成变量定义自定义类型定义自定义函数说明外部变量说明2、执行体执行体一般由若干条可执行语句构成。还可以强行指定函数的存储模式,主要由small、compact及large来说明,例如:voidfun1(void)small{}第56页/共85页5.5.2 中断函数中断函数的功能:提高系统的运行效率声明格式:函数类型函数名(参数表)[interruptn] [usingn]其中关键字interrupt后面的n是中断号,n的取值范围是0~31。编译器从8n+3处,正好是对应中断源的入口地址处,产生中断向量,具体的中断号n和中断向量取决于不同的51系列单片机芯片。80C51的中断源和中断向量如表5-6所示。第57页/共85页表5-6常用的中断源和中断向量n中断源中断向量8n+30外部中断源00003H1定时器T0中断000BH2外部中断源10013H3定时器T1中断001BH4串行口中断0023H第58页/共85页定义和使用中断函数,需要注意以下几点:1、为提高代码的容错能力和系统的抗干扰能力,通常把没用到的中断源,写成下列形式的中断函数。voide xtern0_ISR()interrupt0{}/*notused*/Voidtimer0_ISR()interrupt 1{}/*notused*/Voidextern1_ISR()interrupt 2{}/*notused*/void timer1_ISR()interrupt3{}/*notused*/void serial_ISR()interrupt 4{}/*notused*/第59页/共85页定义和使用中断函数,需要注意以下几点(续)2、中断函数没有返回值3、中断函数不能进行参数传递。4、中断函数在任何情况下,都不能被其他任何函数直接调用。5、在中断函数中可以调用其它非中断函数。但要注意其它非中断函数和中断函数必须使用一个工作寄存器组。第60页/共85页5.5.3 再入函数定义:可以在函数体内直接或间接调用其自身的一种函数。特点:在一个一般的函数后面加个扩展的关键字reentrant第61页/共85页可以用以下两种方法解决函数重入:1、在相应的函数前使用前述“#pragmadisable”声明,即只允许主程序或中断之一调用该函数;2、将该函数说明为可再入的。如下:voidfunc(param...)reentrant;注意:通常中断使用与主程序不同的工作寄存器组。另外,对可再入函数,在相应的函数前面加上开关“#pragmanoaregs”,以禁止编译器使用绝对寄存器寻址,可生成不依赖于寄存器组的代码。第62页/共85页5.6 C程序和汇编语言程序的结合结合原因:假设你要执行的操作很难用C代码来完成具体过程:KeilC51的某个项目文件,对应的选项卡上,找到“GenerateAssemblerSRCFile”和“AssembleSRCFile”两项检查是否设为有效,若是有效的,则点击使检查框变成无效状态,这样再次编译这个项目文件,到此你已经得到汇编函数的主体,修改函数里面的汇编代码就得到你所需的汇编函数了第63页/共85页5.6 C程序和汇编语言程序的结合(续)在C51源代码中嵌入如下汇编代码即可:#pragmaASM汇编语言的指令序列#pragmaENDASM注意这里的大小写第64页/共85页5.7 典型设计要求的C语言实现方法这里我们用一个电子日历的实际例子,来具体介绍怎样用C51程序,完成实际任务的设计。例子中用四位数码管显示日历中的月份和日期,分别由四片74LS164连接,受单片机的串行口控制。详细电路原理图,见图5-2所示。第65页/共85页图5-2 电子日历电路原理图第66页/共85页电子日历源程序下面是用C语言写的源程序:li()//判断月份是否大于12月,如果大于再次从1月显示void timer0() interrupt 1//定时器T0的中断函数disp()//控制串行口输出显示的函数main()//系统的主函数第67页/共85页5.8 C51程序设计的几点注意事项1 在软件编程和调试时尽可能使用Small模式编译2 在仿真前做好充分的准备3 使用库函数4 使用const5 使用static6 不要忽视编译器的警告编译器的给出的警告都是有的放矢,在没有查清引起警告的真正原因之前,不要忽视它。7 代码优化第68页/共85页1、在软件编程和调试时尽可能使用Small模式编译对比起Large模式和Compact模式,Small模式能生成更为紧凑的代码。在Small模式下,C51编译器将没有使用关键词,如idata、pdata、xdata特殊声明的变量通通放在data单元中。第69页/共85页2、在仿真前做好充分的准备程序编完后,对代码仔细逐行检查对每个子函数进行单独测试如果代码有修改,再次对代码进行检查。有可能的话,进行软件仿真——KeilC的软件仿真功能十分强大。第70页/共85页3、使用库函数重用代码,尤其是是标准库的代码,而不是手工编写你自己的代码。这样更快、更容易也更安全。KeilC中提供了多个库函数,这些库函数的用法在KeilC的帮助文件中有详细的描述。第71页/共85页4、使用const意义:可以防止,无意中错误的赋值可以防止,在作为参数,将指针传递给函数时,可能会修改了本不想改变的指针所指向对象的值。例如:const int num=7;num=9;/*可能得到编译器的警告。*/第72页/共85页5、使用static意义:命名冲突的有用工具将不会和其他模块,可能具有相同名称的函数和变量,在模块连接时,产生名称冲突。将子程序中的变量使用static修饰时,表示这个变量在程序开始时分配内存,在程序结束时释放,它们在程序执行期间保持它们的值。第73页/共85页6、不要忽视编译器的警告编译器的给出的警告都是有的放矢,在没有查清引起警告的真正原因之前,不要忽视它。第74页/共85页7、代码优化具体可以从以下几个方面考虑:采用短变量使用无符号类型避免使用浮点指针使用位变量用局部变量代替全局变量为变量分配内部存储区使用特定指针使用调令使用宏替代函数合理选择存储器类型。充分利用运行库第75页/共85页本章小结这章主要介绍了用C51编程的一些基础知识C51关键字五种存储类:DATA、BDATA、IDATA、XDATA和CODE三个存储模式:SMALL、COMPACT和LARGE中断函数具体格式是:函数类型 函数名(函数参数表)[interruptn] [usingn]第76页/共85页本章习题5.1 、在C51中,有几种存储类型?分别是什么?有几种存储器类型?有什么作用?他们的名称是什么?什么又是存储模式?有何意义?可以分成哪些模式?5.2、51单片机对应的五个中断源它们的中断函数因该怎样定义?5.3、中断函数可否定义成再入函数?第77页/共85页本章习题(续1)5.4 在定义函数的时候能否强行指定存储模式,如果能应怎样把某个函数指定成压缩的存储模式?5.5 在汇编语言中MOV DPTR,#4000HMOVX @DPTR,A两条语句想实现什么功能,如果用C语言语句编程也实现同样的功能,应如何编程?第78页/共85页本章习题(续2)5.6

温馨提示

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

评论

0/150

提交评论