您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第3章 C51语言程序设计基础
第3章C51语言程序设计基础C51—用高级语言干低级语言的事带有单片机的电子系统是个软硬结合的产物,软件编写十分重要,某种意义上讲软件设计决定了该电子系统的功能水平和产品档次。3.1C语言和MCS-51单片机一、单片机和MCS-51单片机单片机程序可以用机器语言、汇编语言、高级语言。机器语言:机器能够识别的由0、1组成的机器码。汇编语言:符号化了的“机器语言”,是计算机专业人员必须掌握的基本功。高级语言:C语言既可以直接对单片机硬件进行操作,又有高级语言的特点。汇编语言和C语言编写出来的程序单片机并不认识,必须用相应的编译工具将其编译成单片机认识的代码,编译工具通常我们使用Keil软件,生成*.hex文件。二、C51与标准C语言的差异不同的嵌入式C语言与ANSIC语言(标准C)都有不同的地方,主要是由于它们所针对的硬件系统不同,对于MCS-51系列单片机,其所用C称为C51语言,其不同点主要体现在以下几方面:①C51语言中新增少量的有针对性的库函数比如:reg51.h(reg52.h),reg51.h中包含了所有51子系列单片机的SFR及其位定义,reg52.h中包含了所有52子系列单片机的SFR及其位定义。一般系统中都必须包含reg51.h或reg52.h。②在C51语言中增加了几种针对MCS-51单片机特有的数据类型。例如:bit:声明位变量,值为0或1;sbit:声明特殊功能寄存器中的特殊功能位,值为0或1;sfr:声明特殊功能寄存器,sfr的字节地址为0—255;sfrl6:声明16位特殊功能寄存器,字地址为0—65535。③C51语言中的存储模式与MCS-51单片机的存储器结构密切相关。code、data、xdata、idata,以及根据51单片机特点而设定的pdata类型等。存储区描述DATA片内RAM的低128单元BDATA片内RAM的位空间,20H~2FH共16个字节IDATA片内RAM的256单元,必须采用间接寻址XDATA外部数据存储器,使用DPTR间接寻址PDATA外部数据存储器的前256字节,只要通过P0口的地址进行寻址CODE程序存储器,使用DPTR寻址存储区地址范围功能说明内部RAM(256Byte)00H-1FH内部使用DATA区,四个工作寄存器组(4*8=32Byte),用于内部参数传递20H-2FHBDATA区,DATA区的16个字节的可位寻址区30H-7FH用户可用非位寻址DATA区,可在一个周期内直接寻址80H-FFHIDATA区,用户可用的内部RAM区的高128个字节,必须采用间接寻址80H-FFH可以进行位寻址的特殊功能寄存器(SFR)外部扩展RAM(最大64KByte)00H-FFHPDATA区,外部存储区的256个字节通过P0口的地址对其寻址,需要两个指令周期00H-FFFFHXDATA区(外部存储区),使用DPTR寻址ROM(最大64KByte)00H-FFFFHCODE区(程序存储区),使用DPTR寻址51单片机存储区分配如下:在定义变量时,如果省略存储类型,编译程序会自动选择默认存储类型。默认存储类型有小模式(Small)、紧缩模式(Compact)、巨模式(Large)。三种存储模式及相关说明存储模式参数及局部变量分配默认存储类型/空间大小Small放入可直接寻址的片内数据存储区data/128BCompact放入片外数据分页存储区pdata/256BLarge放入片外数据存储区xdata/64k④C51语言与标准C语言的输入/输出处理不一样。C51语言的输入/输出是通过MCS-51单片机的串行口来完成的。因此输入/输出指令执行前必须对串行口进行初始化。⑤C51语言中有专门的中断函数。返回值类型函数名(形参表)interruptn[usingm]三、C51语言对单片机内部资源的控制51单片机提供了21个SFR。除了程序计数器PC和4组通用寄存器组之外,其他所有的寄存器均为SFR,并位于片内数据存储器的高128字节、地址为80H-FFH的区域内。在C51语言中,除了可以直接引用编译器提供的头文件来实现对SFR的访问以外,特殊功能寄存器可通过以下几种关键字访问:1.使用关键字sfr定义SFR语法如下:sfr特殊功能寄存器名字=特殊功能寄存器地址例如:sfrTMOD=0x89;sfrSCON=0x98;sfrP0=0x80;2.使用关键字sfr16定义16位的SFR在51单片机中,有时用用两个连续地址的SFR来组合成一个16位的SFR,而且高字节地址直接位于低字节地址之后。例如51单片机中的DPTR(DPH+DPL)和52子系列中的T2(TH2+TL2)就是这种情况。这时可以用关键字sfr16进行定义。例如:sfr16DPTR=0x82;//DPTR的低8位地址为82H,高8位地址为83Hsfr16T2=0xCC;//T2的低8位地址为0CCH,高8位地址为0CDH注意:这种方法不能用于T0和T1,因为TH0和TL0的地址不连续,TH1和TL1的地址也不连续。3.使用sbit进行特殊功能位的定义在51单片机应用中,经常需要单独访问SFR中的特殊功能位。(1)sbit位名=特殊功能寄存器名^位置例如:sbitCY=PSW^7;//指定PSW的第7位为CYsbitEA=IE^7;//指定lE的第7位为EA(2)sbit位名=字节地址^位置(3)sbit位名=字节地址^位置4.通过头文件访问特殊功能寄存器和特殊功能位为了用户处理方便,C51语言编译器将MCS-51单片机中常用的特殊功能寄存器和特殊功能位进行了定义,存放在一个名为reg51.h或reg52.h的头文件中。该头文件定义了51单片机所有的特殊功能寄存器及中断。当用户需要使用时,只需要在使用之前用一条预处理命令“#includereg51.h”或“#includereg52.h”将这个头文件包含到程序中,就可以使用特殊功能寄存器和特殊功能位了。例如:#includereg51.hvoidmain(void){TL0=0xB0;TH0=0x3C;TR0=1;…}5、绝对地址的访问片内RAM的使用、片外RAM及I/O口的使用又称为绝对地址访问。C51提供了两种比较常用的访问绝对地址的方法。(1)绝对宏C51语言编译器提供了一组宏定义来对51单片机的code、data、pdata和xdata空间进行绝对寻址。在程序中,用“#includeabsacc.h”即可使用其中声明的宏来访问绝对地址,包括CBYTE、CWORD、DBYTE、DWORD、XBYTE、XWORD、PBYTE、PWORDCBYTE:以字节形式对code区寻址;CWORD:以字形式对code区寻址;DBYTE:以字节形式对data区寻址;DWORD:以字形式对data区寻址;XBYTE:以字节形式对xdata区寻址;XWORD:以字形式对xdata区寻址;PBYTE:以字节形式对pdata区寻址;PWORD:以字形式对pdata区寻址;例如:#includeabsacc.hrva1=CBYTE[0x0002]//指向程序存储器0002h地址rva2=XBYTE[0x0002]//指向外部RAM的0002h地址(2)_at_关键字可以使用关键字_at_对指定的存储器空间的绝对地址进行访问,格式如下:[存储类型]数据类型标识符变量名_at_地址常数例如:structidatalist_at_0x40;//指定list结构从内部RAM的40H开始charxdatatext[256]_at_0xE000;//指定text数组从外部RAM的E000H单元开始【例3.4】将片外RAM6000H开始的连续10个单元清0。程序如下:#includeabsacc.hunsignedcharxdatabuffer[10]_at_0x6000;voidmain(void){unsignedcharindex;for(index=0;index10;index++){buffer[index]=0;}}四、位变量的C51语言定义除了通常的C语言数据类型外,C51语言编译器支持bit数据类型。1.位变量的C51语言定义采用关键词bit对位进行定义。如:bitdirection_bit;2.函数可以包含类型为bit的参数,也可以将其作为返回值例如:bitfunc(bitb0,bitb1){return(b1);}3.可位寻址对象可位寻址对象指可以字节或位寻址的对象。该对象位于51单片机片内可位寻址RAM区(20H~2FH)中。C51语言编译器允许数据类型为idata的对象放入片内可位寻址RAM区。位变量的存储类型只能是bdata,使用时应先说明字节对象的数据类型和存储类型,然后可使用bit定义可独立寻址访问的对象位。3.4C51语言的基本运算与控制语句一、C51基本运算C51语言的基本运算类似于标准C语言,主要包括算术运算、关系运算、逻辑运算、位运算和赋值运算及其表达式等。1.C51语言的算术运算用算术运算符和括号将运算对象连接起来的式子称为算术表达式,其中的运算对象包括常量、变量、函数、数组、结构等。例如,(2a+3b)*c/d。如果一个算术运算符两侧的数据类型不同,必须通过数据类型转换将数据转换成同种类型。转换方式有自动类型转换和强制类型转换两种(1)C51语言基本的算术运算符加法运算符:+减法运算符:-乘法运算符:*除法运算符:/模运算或取余运算符:%注意:取余运算符两侧的操作数均为整形数据,所得结果的符号与左侧操作数的符号相同。(2)自增、自减运算符自增运算符:++自减运算符:--示例:#includestdio.hvoidmain(){inti,j,x,y;i=105;j=2;x=i+j*2;y=(i-j*2)%3;printf(“x=%d\ny=%d\n”,x,y);}2.C51语言的关系运算两个表达式用关系运算符连接起来的式子称为关系表达式,例如,ab、a=3等,又称比较运算。关系表达式的值为逻辑值,其结果只能取真(用1表示)和假(用0表示)两种。小于:小于等于:=大于:大于等于:=等于:==不等于:!=例:#includestdio.hvoidmain(){inta,b,c,d;a=27;b=237;c=a(b-200);d=(a!=(b-100));printf(“c=%d\nd=%d\n”,c,d);}3.C51语言的逻辑运算两个式子用逻辑运算符连接起来称为逻辑表达式,运算对象可以是表达式或逻辑量,表达式可以是算术表达式、关系表达式、逻辑表达式。逻辑表达式的值也为逻辑值,即真或假。逻辑与:&&逻辑或:||逻辑非:~4.C51语言的位运算按位与:&按位或:|按位异或:^按位取反:!位左移:位右移:位运算的操作对象只能是整形和字符型数据。位操作是51单片机的重要特点。注意,位左右移位运算符用来将一个字节的二进制数全部左移或右移若干位,移位后空白位补0,溢出的位舍弃。例:#includestdio.hvoidmain(){inta,b,c,d,e;floatf1,f2;a=7;b=9;c=!a;d=a||b;f1=2.3;f2=5.7;e=(f1!=f2);printf(“c=%d\nd=$d\ne=%d\n”,c,d,e);}//c=0,d=1,e=15.C51语言的赋值运算赋值符号“=”完成的操作即为赋值运算。将一个变量与表达式用赋值符号连接起来就构成赋值表达式。在赋值运算中,当“=”两侧的数据类型不一致时,系统自动将右侧表达式的值转换成左侧变量的类型。赋值符号前加上其它运算符构成复合运算符号。有以下10种:+=、-=、*=、/=、%=、&=、|=、^=、=、=二、C51分支结构控制语句大多数的实际问题一般都要伴随着一定的逻辑判断或条件选择,要求计算机能根据相应的情况,选择不同的处理途径,从而表现出某种智能。分支选择结构是程序设计的3种基本结构之一,通过分支选择结构,可以使计算机能够按照在
本文标题:第3章 C51语言程序设计基础
链接地址:https://www.777doc.com/doc-3170105 .html