c51程序设计基础

上传人:ning****hua 文档编号:243662785 上传时间:2024-09-28 格式:PPT 页数:62 大小:399.50KB
返回 下载 相关 举报
c51程序设计基础_第1页
第1页 / 共62页
c51程序设计基础_第2页
第2页 / 共62页
c51程序设计基础_第3页
第3页 / 共62页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,公选课,单片机基础及应用,主讲:张宏伟,一、,C,及,C51,语言概述,二、,C51,基础知识,三、,C,程序的规范化设计,一、,C,及,C51,语言概述,常用编程语言,用什么语言最好?这主要取决于应用领域,每种语言都有自已的长处和不足。,1,)汇编语言和,C,语言在单片机及工控领域用较多。另外,C,语言也是一种通用语言,是学,C+/c#,的起点。,2,),C+,系统编程等多个方面,最常用的编译器是,VC,。,3,),C#/Java,网络编程方面新兴的。,4,),VB,通用。,C,及,C51,语言的特点,语言简洁,使用方便灵活。,可移植性好。,表达能力强。,表达方式灵活。,可进行结构化程序设计。,可以直接操作计算机硬件。,生成的目标代码质量高。,什么是,ANSI C,ANSI,就是美国国家标准协会(,American National Standards Institute,),ANSI C,就是美国国家标准协会制定的一个,C,语言的标准 。,单片机,C,语言和,ANSI C,的区别和联系,“单片机C语言” 通常和ANSI C间关系只是存在一个交集。也就是说,它们分别都存在着自己的特定内容。,由于ANSI C是一般C的基础,,所以某些“单片机C语言”可能会舍去部分ANSI C中的标准,以简化编译。,但反过来,某些“单片机C语言”还会增加一些单片机特有的语言特性,以方便针对单片机的编程,二、,C51,基础知识,1,、标识符,2,、关键字,3,、,C51,编译器所支持的数据类型,4,、,C51,对内部资源的定义,5,、常量,6,、变量,7,、数组,8,、运算符,9,、,C51,绝对地址访问,10,、,C51,的基本语句,11,、中断服务程序,1,、标识符,标识符,是用来标识源程序中某个对象的名字,这些对象可以是函数、变量、数组等。,C,语言对,大小些敏感,, 如“,Timer1”,、“,TIMER1”,是完全不同定义的标识符。,标识符由字符串、数字和下划线等组成,注意的是第一个字符必须是字母或下划线。,标识符在命名时应当简单,含义清晰,这样有助于阅读理解程序。,2,、关键字,关键字,则是编程语言保留的特殊标识符,它们具有固定名称和含义,在程序编写中不允许标识符与关键字亦同。,在,KEIL uVision2,中的关键字除了有,ANSI C,标准的,32,个关键字外还根据,51,单片机的特点扩展了相关的关键字。,关键字,用途,说明,bit,位标量声明,声明一个位标量或位类型的函数,sbit,位标量声明,声明一个可位寻址变量,sfr,特殊功能寄存器声明,声明一个特殊功能寄存器,sfr16,特殊功能寄存器声明,声明一个,16,位的特殊功能寄存器,data,存储器类型说明,直接寻址的内部数据存储器,bdata,存储器类型说明,可位寻址的内部数据存储器,idata,存储器类型说明,间接寻址的内部数据存储器,pdata,存储器类型说明,分页寻址的外部数据存储器,xdata,存储器类型说明,外部数据存储器,code,存储器类型说明,程序存储器,interrupt,中断函数说明,定义一个中断函数,reentrant,再入函数说明,定义一个再入函数,using,寄存器组选择,选择单片机的工作寄存器组,_at_,绝对地址说明,为非位变量指定存储空间绝对地址,small,存储模式选择,参数及局部变量放入可直接寻址的内部,RAM,compact,存储模式选择,参数及局部变量放入分页外部数据存储区,large,存储模式选择,参数及局部变量放入分页外部数据存储区,关键字 :,数据类型,长度,值域,unsigned char,单字节,0,255,signed char,单字节,-128,+127,unsigned int,双字节,0,65535,signed int,双字节,-32768,+32767,unsigned long,四字节,0,4294967295,signed long,四字节,-2147483648,+2147483647,float,四字节,1.175494E-38,3.402823E+38,*,1,3,字节,对象的地址,bit,位,0,或,1,sfr,单字节,0,255,sfr16,双字节,0,65535,sbit,位,0,或,1,3,、,KEIL C51,编译器所支持的数据类型,1,),char,字符类型,char,类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。,unsigned char,:,0,255,。,signed char,:,字节中最高位字节表示数据的符号,,“,0”,表示正数,,“,1”,表示负数,负数用补码表示。所能表示的数值范围是,-128,+127,。,unsigned char,常用于处理,ASCII,字符或用于处理小于或等于,255,的整型数。,2,),int整型,int整型长度为两个字节,用于存放一个双字节数据。,signed int,:,-32768+32767,unsigned int,:,065535,3,),long,长整型,long,长整型长度为四个字节,用于存放一个四字节数据。分有,signed long,和,unsigned long,4,),float,浮点型,float,浮点型在十进制中具有,7,位有效数字,是符合,IEEE,754,标准的单精度浮点型数据,占用四个字节。,5,)*指针型,指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。,6,),bit,位标量,C51,编译器的,扩充数据类型,利用,bit,位标量可定义一个位标量,,但不能定义位指针,也不能定义位数组。,它的值是一个二进制位,不是,0,就是,1,,类似高级语言中的,Boolean,类型中的,True,和,False,。,7,),sfr,特殊功能寄存器,sfr,也是一种,扩充数据类型,占用一个内存单元,值域为,0,255,。利用它可以访问,51,单片机内部的所有特殊功能寄存器。,其用法:,sfr,特殊功能寄存器名,=,特殊功能寄存器地址常数;,如,sfr,P1 = 0x90,;,/*,定义,P1 I/O,口,其地址,90H*/,。,如用,P1 = 255,/*,把,FFH,送入,P1,中(对,P1,端口的所有引脚置高电平)*,/,。,8,),Sfr16,16,位特殊功能寄存器,sfr16,占用两个内存单元,值域为,0,65535,。,sfr16,和,sfr,一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节,的寄存器。,用法:,sfr16,特殊功能寄存器名,=,特殊功能寄存器地址常数;,如,8052,的,T2,定时器,可以定义为:,sfr16 T2 = 0xCC;,/*,这里定义,8052,定时器,2,,地址为,T2L=CCH,T2H=CDH*/,9,),sbit,可寻址位,sbit,是,C51,中的一种扩充数据类型,利用它可以访问芯片,内部,RAM,中的可寻址位或特殊功能寄存器中的可寻址,位。,9,),sbit,可寻址位,sbit,的用法有三种:,(1),sbit,位变量名,=,位地址,例如:,sbit,P1_1 = 0x91;,(2),sbit,位变量名,=,特殊功能寄存器名,位位置,例如:,sfr,P1 = 0x90;,sbit,P1_1 = P1 1;,/*P1_1,为,P1,中的,P1.1,引脚*,/,(3)sbit,位变量名字节地址,位位置,(,位序号,),例如:,sbit,P1_1 = 0x90 1;,4,、,C51,对内部资源的定义,MCS-51,内部资源定义函数是,MCU,中寄存器的地址映射,。,MCS-51,单片机提供,128,字节的,SFR,寻址区,地址为,80HFFH,,,51,单片机中,,除了程序计数器,PC,和,4,组通用寄存器组之外,,其他所有的寄存器均为,SFR,,并位于片内特殊寄存器区。,这个区域可位寻址、字节寻址或字寻址,用来,控制定时,/,计数器、,I/O,口、串行口,等部件。,特殊功能寄存器在,C51,语言中的声明,由几个,关键字,来完成。,4,、,C51,对内部资源的定义,MCS-51单片机所有标准的寄存器的使用都是已经由C51,头文件,定义完成,编程人员可以直接使用符号的定义。,在使用C51已定义的寄存器符号时,要用预编译命令,#include,将有关“头文件”包括到源文件中。,4,、,C51,对内部资源的定义,Keil,软件中提供实现此功能的头文件很多,如,“,reg51.h”,、“,reg52.h”,、“,AT89X51.H”,、“,AT89X52.H,”等,,可自行选型。,使用,MCS-51,内部资源定义时要用到,“,reg51.h”,文件,因此源文件开头应有以下预编译命令:,#include ,或,#include ”reg51.h”,。,思考:这两种格式有何不同?,4,、,C51,对内部资源的定义,寻找头文件时候的路径顺序不同,使用尖括号,先去找系统库目录,使用分号,先去找当前目录,为了更快的找到头文件,加快编译速度,建议:,自定义头文件用引号,系统头文件用尖括号,例,1,:利用,MCS-51,单片机的,P1,引脚,P1.0,引接一只,LED,送“,0”,点亮,送“,1”,灭。则要求点亮,程序如下:,例,1,:利用,MCS-51,单片机的,P1,引脚,P1.0,引接一只,LED,送“,0”,点亮,送“,1”,灭。则要求点亮,程序如下:,#include “reg51.h”,sbit,P1_0=P10;,void main(),P1_0=0;,main(),函数:也称为主函数。,C,语言都是从,main,()函数开始执行的。前面加了一个,void,是说明该函数是没有返回值的。,#include,代表的是,加载头文件,,头文件是,C,编译器中带的已经定义的函数的集合或自定义的一个函数的集合。,程序中加载一个,reg51.h,的文件,那么打开,reg51.h,里边的内容是什么呢?,如编码器在,C,盘下,C51,文件夹内,则,REG51.h,文件的路径是,C:KeilC51INCreg51.h,。,例如:,P1,定义为,sfr,P1 = 0x90;,上例中,符号,P1,(代表,P1,锁存器)已经在头文件“,reg51.h”,中有定义。,P1_0,表示,P1.0,引脚,它没有被事先定义好,所以需要使用,sbit,进行定义。,注意:,AT89X51.H,头文件中有,P1_0,的位定义。,例,1,:利用,MCS-51,单片机的,P1,引脚,P1.0,引接一只,LED,送“,0”,点亮,送“,1”,灭。则要求点亮,程序如下:,#include ,void main(),P1_0=0;,思考:如果点量8个灯,如何编程序。,5,、常量,常量是在程序运行过程中不能改变值的量,而变量是可以在程序运行过程中不断变化的量,。,变量的定义可以使用所有,C51,编译器支持的数据类型,常量的数据类型只有,整型、浮点型、字符型、字符串型和位标量,。,5,、常量,1,)整型常量,整型常量可以表示为:,十进制,如,123,、,0,、,89,等。,十六进制,则以,0x,开头,如,0x34,-0x3B,等。,长整型就在数字后面加字母,L,,如,104L,等。,5,、常量,2,)浮点型常量:,可分为十进制和指数表示形式。,十进制由数字和小数点组成,如,0.888,3345.345,0.0,等,整数或小数部分为,0,,可以省略但,必须有小数点,。,常量可用在不必改变值的场合,如固定的数据表,字库等。常量的定义方式有几种:,#difine False 0x0; /,用,预定义语句可以定义常量,#difine True 0x1; /,这里定义,False,为,0,True,为,1,/,在程序中用到,False,编译时自动用,0,替换,同理,True,替换为,1,unsigned int,code,a=100;,/,这一句用,code,把,a,定义在程序存储器中并赋值,const,unsigned int c=100;,/,用,const,定义,c,为无符号,int,常量并赋值,以上两句它们的值都保存在程序存储器中,,而程序存储器在运行中是不允许被修改的,,所以如果在这两句后面用了类似,a=110,,,a+,这样的赋值语句,编译时将会出错。,6,、变量,变量就是一种在程序执行过程中其值能不断变化的量。要在程序中使用变量必须先用,标识符,作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。,6,、变量,定义一个变量的格式如下:,存储种类,数据类型,存储器类型,变量名表,在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。,存储种类是指变量在程序执行过程中的作用范围。存储种类有四种:,自动(,auto,),外部(,extern,),静态(,static,)和寄存器(,register,),,缺省类型为自动,(auto),6,、变量,存储器类型,的说明就是指定该变量在,C51,硬件系统中所使用的存储区域,,并在编译时准确的定位。,KEIL,所能认别的存储器类型,存储器 类型,说 明,地 址,data,直接访问内部数据存储器(,128,字节,),访问速度最快,00H,7FH,bdata,可位寻址内部数据存储器(,16,字节),允许位与字节混合访问,20H,2FH,idata,间接访问内部数据存储器(,256,字节),允许访问全部内部地址,00H,FFH,pdata,分页访问外部数据存储器(,256,字节),用,MOVX ,Ri,指令访问,00H,FFH,xdata,外部数据存储器,(64KB),,用,MOVX DPTR,指令访问,0000H,FFFFH,code,程序存储器(,64KB,),用,MOVC A+DPTR,指令访问,0000H,FFFFH,如果省略存储器类型,系统则会按,编译模式,SMALL,COMPACT,或,LARGE,所规定的默认存储器类型去指定变量的存储区域。,无论什么存储模式都可以声明变量在任何的,8051,存储区范围,,然而把最常用的命令如循环计数器和队列索引放在内部数据区可以显著的提高系统性能。,还有要指出的就是变量的,存储种类,与,存储器类型,是完全无关的。,例:,数据类型 存储类型 变量,Char data var1;,bit bdata flags;,unsigned char xdata vextor10;,7,、数组,数组是同一类型变量的有序集合。先定义后使用,一维的定义格式:,数据类型 数组名,常量表达式,;,unsigned,int,xcount,10; /,定义无符号整形数组,有,10,个数据单元,char,inputstring,5; /,定义字符形数组,有,5,个数据单元,8,、运算符,与,C,语言基本相同:,1,)算术运算:,+ - * /,%,: (加 减 乘 除,取余运算符,),2,)关系运算, = ,: (位右移 位左移),& |,:,(,按位与 按位或,), ,:,(,按位异或 按位取反,),9,、,C51,绝对地址访问,1,)绝对宏:,在程序中,用,“,include ”,即可使用其中定义的宏来访问绝对地址,包括:,CBYTE,、,XBYTE,、,PWORD,、,DBYTE,、,CWORD,、,XWORD,、,PBYTE,、,DWORD,具体使用可参看附录中“,absacc.h,”,内容便知。,9,、,C51,绝对地址访问,例如:,#include “absacc.h”,#define PA XBYTE0xffec,main(),PA=0x3A;,/*,将数据,3AH,写入地址为,0xffec,的存储单元或,I/O,端口*,/,10,、,C51,的基本语句,与标准,C,语言基本相同:,if,选择语言,switch/case,多分支选择语言,while,循环语言,do-while,循环语言,for,循环语言,11,、中断服务程序,函数名(),interrupt n using m , ,Void int0demo(void) interrupt 0 using 2,/*,外部中断,0,的服务函数定义,使用第二组工作寄存器组*,/,8051,的中断向量和中断号,中断号,中断源,中断向量,0,外部中断,0,0003H,1,定时器,/,计数器,0,000BH,2,外部中断,1,0013H,3,定时器,/,计数器,1,001BH,4,串行口,0023H,注意:,函数不能直接调用中断函数,;,不能通过形参传速参数,;,但中断函数允许调用其它函数,两者所使用的寄存器组应相同。,三、,C,程序的规范化设计,在单片机,C,程序设计中,项目一般按功能进行结构化设计。将一个项目划分为多个功能,每个功能的相关程序放在一个,C,程序文档中,称之为一个模块(,group,),对应的文件名即为模块名。,一个模块通常由两个文档组成:,一个为头文件,.h,,,对模块中的数据结构和函数原型进行描述;,另一个则为,C,文件,.c,,,对数据实例或对象定义,以及函数算法具体实现。,(,1,),C51,库函数与,H,头文件,C51,编译器的运行库中包含有丰富的库函数,使用库函数可以大大简化用户的程序设计工作,提高编程效率。,每个库函数都在相应的头文件中给出了函数原型说明,用户如果需要使用库函数,必须在源程序的开始处采用预处理器指令,#include,将有关的头文件包含进来。,C51,包含的头文件,常用头文件有,:,reg51.h,(定义特殊功能寄存器和位寄存器);,math.h,数学函数库(定义常用数学运算);,absacc.h,绝对地址访问头文件,(,定义一些宏用来对存储器空间进行绝对地址访问,),intrins.h,内部函数库,(,包含变量循环移位、位操作等函数,),(,2,),C51,的程序结构,与一般,C,语言的结构相同,以,main(),函数为程序人口,程序体中包含若干语句还可以包含若干函数。,C51,的程序结构如下,全局变量说明,函数声明,Main(),数据说明部分,语句执行部分,包括可能的函数调用语句等,函数类型 函数名(参数表),/*,函数,1*/,数据说明部分,语句执行部分,包括可能的函数调用语句等,函数类型 函数名(参数表),/*,函数,N*/,数据说明部分,语句执行部分,包括可能的函数调用语句等,编程规范:,遵循好的,C51,编程规范能够提高可读性,提高源程序的编写、调试和修改的效率,减少开发过程中的不利因素。,1,)注释,注释内容应简练、清楚、明了,对于一目了然的语句不加注释。,编程规范:,2,)符号命名,对于常量、变量和函数等的命名要有一定的意义,能够一目了然,反映其功能、作用或数据类型。对于常量一般使用大写字母命名;对于变量一般使用简写的类型名作为前缀,反映变量意义的第一个字母大写,其他小写;对于函数名,将组成函数名的各个单词的首字母大写,其他小写。,编程规范:,3,)编程风格,编程风格是在长期的程序编写过程中遵循并养成的代码编写习惯,它包含了以上注释的方法和命名的方法的使用习惯,以及语句格式的编辑风格,主要体现在缩进,对齐方式和空格的使用。,C51,开发技巧,使用一些技巧是,C51,编译器能够从,C,源程序中产生高度优化的代码,提高单片机的运行效率。,1,)使用短变量,对于,51,单片机来说,大部分数据的处理都是以,字节,为单位的,那么,8,位,能够处理的数据尽量定义成字符型,而且是,unsigned char,型。,例如:,定义一个循环变量,如果循环次数不超过,255,次,那么就不要使用,int,型,因为,int,类型占用,16,位空间,对于,8,为单片机来说是极大的浪费。这样减小变量的长度能够很好的提高代码效率。,2,)使用无符号类型,51,单片机本身并不支持符号运算,所以在程序中如果使用了带符号变量,就会无形中增加额外的代码来处理这些,C51,所使用的带符号数。,因此,在程序编写过程中没有必要的话,不使用带符号类型的变量。,3,)减少使用指针,避免使用浮点指针,在源码中使用指针,那么在编译后,代码量就会增加。在程序中使用指针时,应指定指针的类型,并确定它们指向的区域,入,XDATA,或,IDATA,区,使用这种特定指针编译器就不必去确定指针所指向的存储区,所以代码更加紧凑。,4,)使用位标量,对于一些,标志位,,使用位标量完全可以取代,unsigned char,型变量,这样可以节省,7,位存储空间,而且访问位标量,只需一个机器周期,,提高了空间利用率和效率。,但是要注意,bit,类型不能声明一个,using,关键字指定的函数返回值,同时也没有,bit,类型的指针和数组。,5,)用局部变量代替全局变量,局部变量比全局变量更有效率,因为局部变量在编译过程中都被分配在内部存储区,这样能够保证变量的访问速度。另外如果过多的使用全局变量也会给编程带来一定的难度。,6,)合理使用宏定义,对于小段代码,可以通过宏来替代函数,使程序有更好的可读性,同时可以减少调用函数所造成的时间浪费;对于常数可使用宏来进行定义,来完成程序上下文的统一性和可维护性。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!