您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C语言基础与C51程序设计电脑
锐普PPT论坛chinakui转载:【例4.2】分别使用三种方法编写下面三个函数。起始地址为80H的片外RAM中起始地址为80H的片内RAM中说明:第4章有以下印刷错误,请给予修正1.C51语言概述1.1汇编语言与C51汇编语言:•直接操纵系统的硬件资源•编写比较复杂的数值计算程序就非常困难•可读性不强,修改困难,效率不高C51语言:•易于开发复杂的单片机程序•易于移植★汇编语言程序ORG0000HL00:MOVR0,#10H;查找16个字节MOVR1,#00HMOVDPTR,#2000HL11:MOVXA,@DPTRCJNEA,#00H,L16;取出内容与00H相等吗?INCR1;取出个数加1L16:INCDPTRDJNZR0,L11;未完继续MOVDPTR,#2100HMOVA,R1MOVX@DPTR,A;相同数个数送2100HL1E:SJMPL1E例:查找零的个数(在2000H--200FH中查出有几个字节是零,把个数放在2100H单元中)★查找零的个数C-51程序#includereg51.hmain(){unsignedcharxdata*p=0x2000;/*指针p指向2000H单元*/intn=0,i;for(i=0;i16;i++){if(*p==0)n++;/*若该单元内容为零,则n+1*/p++;/*指针指向下一单元*/}p=0x2100;/*指针p指向2100H单元*/*p=n;/*把个数放在2100H单元中*/}1.2MCS-51与标准C(1)C51中定义的库函数和标准C语言定义的库函数不同。标准的C语言定义的库函数是按通用微型计算机来定义的,而C51中的库函数是按MCS-51单片机相应情况来定义的;(2)C51中的数据类型与标准C的数据类型也有一定的区别,在C51中还增加了几种针对MCS-51单片机特有的数据类型;(3)C51变量的存储模式与标准C中变量的存储模式不一样,C51中变量的存储模式是与MCS-51单片机的存储器紧密相关;(4)C51与标准C的输入输出处理不一样,C51中的输入输出是通过MCS-51串行口来完成的,输入输出指令执行前必须要对串行口进行初始化;(5)C51与标准C在函数使用方面也有一定的区别,C51中有专门的中断函数。2.C51语言的基本语法1.C51数据类型2.变量的存储种类及存储类型3.绝对地址访问4.C51运算符和表达式2.1C51的数据类型基本数据类型类型符号关键字数的表示范围所占位数整型字符型实型有无(signed)int16-32768~32767(signed)short16-32768~32767(signed)long32-2147483648~214748364716unsignedint0~65535320~4294967295unsignedlongintunsignedshortint160~65535有float323.4e-38~3.4e38有double641.7e-308~1.7e308有char8-128~127无unsignedchar80~255C51的数据类型扩充定义sfr:特殊功能寄存器定义sfr16:sfr的16位数据定义sbit:可位寻址字节或sfr中位的定义bit:位变量定义数据类型长度大小bit位0或1sfr1字节0~255sfr162字节0~65535sbit位0或11.字符型char有signedchar和unsignedchar之分,默认为signedchar。它们的长度均为一个字节,用于存放一个单字节的数据。对于signedchar,它用于定义带符号字节数据,其字节的最高位为符号位,“0”表示正数,“1”表示负数,补码表示,所能表示的数值范围是-128~+127;对于unsignedchar,它用于定义无符号字节数据或字符,可以存放一个字节的无符号数,其取值范围为0~255。unsignedchar可以用来存放无符号数,也可以存放西文字符,一个西文字符占一个字节,在计算机内部用ASCII码存放。2.int整型分singedint和unsignedint。默认为signedint。它们的长度均为2个字节,用于存放一个双字节数据。对于signedint,用于存放两字节带符号数,补码表示,数的范畴为-32768~+32767。对于unsignedint,用于存放两字节无符号数,数的范围为0~65535。3.long长整型分singedlong和unsignedlong。默认为signedlong。它们的长度均为四个字节,用于存放一个四字节数据。对于signedlong,用于存放四字节带符号数,补码表示,数的范畴为-2147483648~+2147483647。对于unsignedlong,用于存放四字节无符号数,数的范围为0~4294967295。4.float浮点型float型数据的长度为四个字节,格式符合IEEE-754标准的单精度浮点型数据,包含指数和尾数两部分,最高位为符号位,“1”表示负数,“0”表示正数,其次的8位为阶码,最后的23位为尾数的有效数位,由于尾数的整数部分隐含为“1”,所以尾数的精度为24位。5.*指针型指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占用一定的内存单元,对不同的处理器其长度不一样,在C51中它的长度一般为1~3个字节。6.特殊功能寄存器型这是C51扩充的数据类型,用于访问MCS-51单片机中的特殊功能寄存器数据,它分sfr和sfr16两种类型。其中:sfr为字节型特殊功能寄存器类型,占一个内存单元,利用它可以访问MCS-51内部的所有特殊功能寄存器;sfr16为双字节型特殊功能寄存器类型,占用两个字节单元,利用它可以访问MCS-51内部的所有两个字节的特殊功能寄存器。在C51中对特殊功能寄存器的访问必须先用sfr或sfr16进行声明。7.位类型这也是C51中扩充的数据类型,用于访问MCS-51单片机中的可寻址的位单元。在C51中,支持两种位类型:bit型和sbit型。它们在内存中都只占一个二进制位,其值可以是“1”或“0”。区别:用bit定义的位变量在C51编译器编译时,在不同的时候位地址是可以变化的,而用sbit定义的位变量必须与MCS-51单片机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起,在C51编译器编译时,其对应的位地址是不可变化的。sfrP0=0x80;/*因P0口的寄存器是可位寻址的*/sbitP0_0=P0^0;/*所以P0_0为P0中的P0.0引脚*/除了以上定义方式外,还可以用P0.0的地址去写,如:sbitP0_0=0x80;定义变量例:数据类型变量名unsignedintvar1;bitflags;unsignedcharvector[10];在C51语言程序中,有可能会出现在运算中数据类型不一致的情况。C51允许任何标准数据类型的隐式转换,隐式转换的优先级顺序如下:bitcharintlongfloatsignedunsigned也就是说,当char型与int型进行运算时,先自动对char型扩展为int型,然后与int型进行运算,运算结果为int型。C51除了支持隐式类型转换外,还可以通过强制类型转换符“()”对数据类型进行人为的强制转换。C5l编译器除了能支持以上这些基本数据类型之外,还能支持一些复杂的组合型数据类型,如数组类型、指针类型、结构类型、联合类型等这些复杂的数据类型,在后面将相继介绍。2.2变量的存储种类和存储类型变量是一种在程序执行过程中,其数值不断变化的量。C51规定变量必须先定义后使用。C51对变量定义的格式如下:[存储种类]数据类型[存储器类型]变量名表定义变量例:externunsignedintdatavar1;staticbitdataflags;autounsignedcharcodevector[10];2.2.1变量的存储种类存储种类是指变量在程序执行过程中的作用范围。C51变量的存储种类有四种,分别是自动(auto)、外部(extern)、静态(static)和寄存器(register)。1.auto:作用范围在定义它的函数体或复合语句内部。所有变量默认为自动(auto)变量。在定义它的函数体或复合语句被执行时,C51才为该变量分配内存空间,当函数调用结束返回或复合语句执行结束时,自动变量所占用的内存空间被释放,这些内存空间又可被其他的函数体或复合语句使用。可见使用自动变量能最有效地使用MCS-51单片机内存。2.extern:在一个函数体内,要使用一个已在该函数体外或别的程序中定义过的外部变量时,该变量在该函数体内要用extern说明。文件1为file1.c文件2为file2.cinti,j;//定义全局变量externinti,j;//将icharc;,j从文件1中复制过来voidfunc1(intk);externcharc;//将cmain()复制过来{func2()func1(20);//调用函数{...staticfloatk;}i=j*5/100;func1(intk)//用户定义函数...{}...;}//将i,j和c从文件1带入文件23.static:分为局部静态变量和全局静态变量。在函数体内部定义的静态变量为内部静态变量,它在对应的函数体内有效,一直存在,但在函数体外不可见,当离开函数时值不被改变。外部静态变量作用于仅限于变量被定义的文件中。其它文件中即使用extern声明也没法使用它。4.register:使用register定义的变量称为寄存器变量。它定义的变量存放在CPU内部的寄存器中,处理速度快,但数目少。C51编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户可以无需专门声明。2.2.2变量的存储类型名称存储空间位置长度数据范围data直接寻址片内RAM低128B8位0~255bdata可位寻址片内RAM(20-2FH)1位0/1idata间接寻址片全部内RAM8位0~255pdata片外RAM低256B8位0~255xdata片外RAM全部64K16位0~65535code程序ROM64K16位0~65535说明变量所处单片机的存储区域存储器类型说明data直接寻址的片内数据存储器低128B,访问速度最快bdata可位寻址的片内数据存储器(地址20H~2FH共16B、128位)允许位和字节混合访问idata间接寻址片内数据存储器256B,允许访问片内全部地址pdata分页寻址片外数据存储器256B,使用指令MOVX@Ri访问,需要2个指令周期xdata寻址片外数据存储器64KB,使用指令MOVX@DPTR访问code寻址程序存储器64KB,使用指令MOVCA,@A+DPTR访问下面对MCS-51单片机各存储区类型的特点加以说明。(1)data区data区的寻址是最快的,所以应该把使用频率高的变量放在data区。但由于空间有限,必须注意使用data区,data区除了包含程序变量外,还包含了堆栈和寄存器组data区。unsignedchardatasystem_status=0;unsignedintdataunit_id[2];chardatainp_string[16];floatdataoutp_value;mytypedatanew_var;(2)bdata区当在bdata区的位寻址区定义变量,这个变量就可进行位寻址,并且声明位变量。这对状态寄存器来说十分有用,因为它可以单独使用变量的每一位,而不一定要用位变量名引用位变量。下面是一些在bdata区中声明变量和使用位变量的例子。unsignedcharbdatastatus_byte;unsignedintbdatastatus_word;unsignedl
本文标题:C语言基础与C51程序设计电脑
链接地址:https://www.777doc.com/doc-3379170 .html