C51单片机程序设计.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第4章KeilC51简介及软件设计4.1Keil开发工具简介4.1.2启动程序4.1.3工作环境介绍4.2单片机软件开发流程创建工程项目-设置项目文件-编译与连接软件-调试软件24.2单片机软件开发流程4.2.1建立工程4.2.2建立源代码文件4.2.3工程设置4.2.4软件的编译与连接4.3软件的调试3第五章C51程序设计基础5.1C程序设计的基本概念•C语言是一种通用的计算机程序设计语言,在国际上十分流行,它既可用来编写计算机的系统程序,也可用来编写一般的应用程序。•C5l是在5l系列单片机上使用的C语言。•C51程序结构与一般C语言没有什么差别。一个C5l程序大体上是一个函数定义的集合,在这个集合中仅有一个名为main的函数(主函数)。主函数是程序的入口,主函数中的所有语句执行完毕,则程序执行结束。•C51中使用的编译器主要是KeilC5l。KeilC51完全支持C的标准指令,并有很多用来优化805l指令结构的C的扩展指令。45.1.1主函数(C51的程序结构)预处理命令#includereg51.h函数说明longfunl();floatfun2();功能函数1fun1(){函数体….}主函数main(){函数体……}功能函数2fun2(){函数体……..}55.1.2标识符和关键字•包括c语言ANSIC标准规定的32个关键字:Auto,break,case,char,const,continue,default,do,double,else,enum,extern,float,for,goto,if,int,long,register,return,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile,while•C51编译器除了支持ANSIC标准的关键字以外,还扩展了13个关键字。6C51扩展的关键字75.1.3数据类型长度•Keil编译器除了少数一些关键地方外,基本类似于ANSIC,差异主要是Keil可以让用户针对8051的结构进行程序设计,其它差异主要是8051的一些局限引起的。•KeilC有ANSIC的所有标准数据类型,除此之外,为了更加有利地利用805l的结构还加入了一些特殊的数据类型。•除了标准数据类型外,C5l编译器还支持一种位数据类型。一个位变量存在于内部RAM的可位寻址区中。可像操作其它变量那样对位变量进行操作。•位数组和位指针是违法的。810特殊功能寄存器的数据类型bit:定义一个位变量或函数(地址自动分配)sbit:定义可位寻址RAM和特殊功能寄存器的位变量(类似给地址一个别名)。例如可:bitksw但不能sbitksw而只能是sbitksw=0x90(地址)bitksw=0(或1)等号后是数值sbitksw=0x90等号后是地址sfr:定义8位特殊功能寄存器。sfrl6:定义16位特殊功能寄存器,如DPTR。通过名字或地址来引用特殊功能寄存器。sbit、sfr和sfrl6为805l硬件和C5l编译器特有,它们不是ANSIC的一部分,也不能用指针对它们进行存取。11例:sfrP0=0x80;/*声明一个变量P0,并把它和位于0x80(805l的端口0)处的特殊功能寄存器联系在一起*/sfrSCON=0x98;/*定义SCON*/sbitSM0=0x9F;/*定义SCON的一位*/125.1.4常量和变量1.常量常量不变的量,如固定的数据表,字库等。常量区分为不同的数据类型,说明如下:(1)整型常量能表示为十进制如123,0,-89等。十六进制则以0x开头如0x34,-0x3B等。长整型就在数字后面加字母L,如104L,034L,0xF340等。(2)浮点型常量可分为十进制和指数表示形式。十进制由数字和小数点组成,如:0.0,.25,5.789,0.13,5.0,300.,-267.8230等均为合法的实数,整数或小数部分为0,能省略但必须有小数点。指数形式由十进制数加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为aEn(a为十进制数,n为十进制整数)其值为a*10n,如:2.1E5(等于2.1*105)。135.1.1常量和变量(3)字符型常量是单引号内的字符,如‘a’,‘d’等,不能显示的控制字符,能在该字符前面加一个反斜杠“\”组成专用转义字符。常用转义字符的含义见表5-4。(4)字符串型常量由双引号内的字符组成,如“test”,“OK”等。当引号内的没有字符时,为空字符串。在使用特殊字符时同样要使用转义字符如双引号。在C语言中字符串常量是做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上“\o”转义字符以作为该字符串的结束符。字符串常量“A”和字符常量‘A’是不一样的,前者在存储时多占用一个字节的字间。(5)位标量,它的值是一个二进制。145.1.1常量和变量2.变量在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储器类型,这样编译系统才能为变量分配相应的存储空间。定义一个变量的格式如下:[存储种类]数据类型[存储器类型]变量名表在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。存储器类型的说明就是指定该变量在单片机c语言硬件系统中所使用的存储区域,并在编译时准确的定位。15变量的存储器类型C51编译器完全支持51系列单片机的硬件结构,可以访问其硬件系统的所有部分,对于每个变量可以准确地赋予其存储器类型,从而可使之能够在单片机系统内准确地定位。表5-5中是C51所能认别的存储器类型。16DATA存储类型•存储区:直接访问的内部数据存储器,RAM的低128个字节,可在一个周期内直接寻址,00H~7FH。访问速度最快,所以应该把使用频率高的变量放在DATA区。由于空间有限,必须注意使用。DATA区除了包含程序变量外,还包含了堆栈和寄存器组。•例:unsignedchardatasystem_status=0;unsignedintdataunit_id[2];chardatainp_string[16];floatdataoutp_Value;mytypedatanewvar;17BDATA存储类型•存储区:可位寻址的内部数据存储器,DATA区的16个字节的可位寻址区,20H~2FH。该区间可以用字节方式也可以用位方式进行访问。•在位寻址区定义变量,这个变量就可进行位寻址,并且声明位变量。这对状态寄存器来说十分有用。•编译器不允许在BDATA段中定义float和double类型的变量。•例:unsignedcharbdatastatus_byte:unsignedintbdatastatus_word;unsignedlongbdatastatus_dword;18IDATA存储类型•存储区:间接访问的内部数据存储器,可以访问所有的内部存储器空间,256个字节,必须采用间接寻址。•IDATA段也可存放使用比较频繁的变量,使用寄存器作为指针进行寻址。在寄存器中设置8位地址,进行间接寻址。和外部存储器寻址比较,它的指令执行周期和代码长度都比较短。•例:unsignedcharidatasystem_status=0:unsignedintidataunit_id[2];charidatainp_string[16];floatidataoutp_value;19PDATA和XDATA存储类型•PDATA存储区:分页的外部数据存储器,256个字节,00H~FFH,使用指令MOVXA,@Ri访问。•XDATA存储区:外部数据存储器,64K个字节,地址0000H~FFFFH,使用指令MOVXA,@DPTR访问。•对PDATA和XDATA的操作相似,对PDATA段寻址比对XDATA段寻址要快,因为对PDATA段寻址,只需要装入8位地址,而对XDATA段寻址,需装入16位地址。所以尽量把外部数据存储在PDATA段中。unsignedcharpdatainp_regl;unsignedcharxdatainp_reg2;voidmain(Void){inp_regl=Pl;inp_reg2=P3;}20CODE存储类型•存储区:程序空间,程序存储区的64K个字节,0000H~FFFFH,通过MOVCA,@A+DPTR访问。•代码段的数据是不可改变的。8051的代码段不可重写,一般代码段中可存放数据表,跳转向量和状态表。•对CODE段的访问和对XDATA段的访问的时间是一样的。代码段中的对象在编译的时候初始化,否则得不到想要的值。•例:unsignedcharcode_str[]={“Howareyou”};21存储模式•存储模式决定了默认的存储器类型,此存储器类型将应用于函数参数,局部变量和定义时未包含存储器类型的变量。定义变量时,使用存储器类型显式定义将屏蔽默认存储器类型。存储模式有三种:•小模式(SMAL)变量默认在8051的内部数据存储器中(data)。此模式下变量访问快速。然而,所有数据对象,包括堆栈都必须放在内部RAM中。堆栈空间面临溢出。•紧凑模式(COMPACT)变量默认在8051的外部RAM的一页中(pdata)。地址高字节通过P2输出。此模式最多只能提供256字节的变量。•大模式(LARGE)变量默认在外部存储器中(xdata)。数据指针225.1.4常量和变量sfr,sfr16变量的定义51系列单片机具有多种内部寄存器,其中有一些是特殊功能寄存器,为了能够直接访问这些特殊功能寄存器,C51编译器扩充了关键字sfr和sfr16,利用这种扩充关键字可以在C语言源程序中直接对51单片机的特殊寄存器进行定义,定义方法如下:sfr特殊功能寄存器名=特殊功能寄存器地址常数;sfr16特殊功能寄存器名=特殊功能寄存器地址常数;例如,P1口的地址是90H,我们能这样定义AT89S52的P1口:sfrP1=0x90;/定义P1扣地址为90H235.1.4常量和变量sfr关键字后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1口能用P1为名,这样程序会变的好读好多。等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH)。sfr是定义8位的特殊功能寄存器,而sfr16则是用来定义16位特殊功能寄存器,如AT89S52的T2定时器,能定义为:sfr16T2=0xCC;/*指定Timer2口地址T2L=0xCC,T2H=0xCD*/用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意的是不能用于定时器0和1。245.1.1常量和变量sbit变量的定义我们能照以下的方法去定义:(1)sbit位变量名=位地址;这种方法将位的绝对地址赋给位变量。位地址必须位于80H-0FFH之间。例如:sbitEA=0x91;/*指定0x91位是EA,即中断允许25(2)Sbit位变量名=特殊功能寄存器名^位位置;当可寻址位位于特殊功能寄存器中时可采用这种方法,“位位置”是一个0~7之间的常数。先定义一个特殊功能寄存器名,再指定位变量名所在的位置,例如:sfrP1=0x90;/*指定P1口地址为0x90sbitP1_1=P1^1;/*指定P1_1为P1口的第2个引脚(3)sbit位变量名=字节地址^位位置;265.1.5运算符与表达式1.赋值运算符对于“=”这个符号我们不会陌生,在C中它的功能是给变量赋值,称之为赋值运算符。它的作用就是但数据赋给变量。例如:a=6;是把6赋值给a。由此可见利用赋值运算符将一个变量与一个表达式连接起来的式子为赋值表达式,在表达式后面加“;”便构成了赋值语句。使用“=”的赋值语句格式如下:变量=表达式;275.1.5运算符与表达式例如:a

1 / 129
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功