您好,欢迎访问三七文档
4单片机C语言及程序设计4.1C51概述4.2C51数据类型及存储4.3C51变量的定义及数据存储区域4.4C51位变量的定义4.5C51特殊功能寄存器的定义4.6C51指令的定义4.7C51的输入/输出4.8C51函数的定义4.9C51与汇编语言混合编程目录第4章单片机C语言及程序设计本章内容的安排,认为读者已经学习过C语言,具有C语言的基本知识,因此,本章内容完全是结合单片机来讲解,也就是补充C语言在单片机方面的概念、数据定义和函数定义等。通过本章学习,使读者能够比较顺利地编写C51程序。4.1C51概述主要内容4.1.1C语言编程的优势4.1.2C51与ANSIC的区别4.1.3C51扩展的关键字4.1C51概述学习单片机C语言的必要性随着单片机性能的不断提高,C语言编译调试工具的不断完善,以及现在对单片机产品辅助功能的要求、对开发周期不断缩短的要求,使得越来越多的单片机编程人员转向使用C语言,因此有必要在单片机课程中讲授“单片机C语言”。“C51”概念:为了与ANSIC区别,把“单片机C语言”称为“C51”,也称为“KeilC”。4.1.1C语言编程的优势在编程方面,使用C51较汇编语言有诸多优势:1)编程容易2)容易实现复杂的数值计算3)容易阅读与交流4)容易调试与维护程序5)容易实现模块化开发6)程序可移植性好4.1.2C语言与ANSI的区别用汇编语言编写单片机程序时,必须要考虑其存储器的结构,尤其要考虑其片内数据存储器、特殊功能寄存器是否正确合理的使用,以及按照实际地址端口数据的处理。用C51编写程序,虽然不像汇编语言那样需要具体地组织、分配存储器资源,但是C51对数据类型和变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。4.1.2C语言与ANSI的区别用C51编写单片机程序,与用ANSIC编写程序的不同之处是,需要根据单片机存储器结构及内部资源,定义相应的数据类型和变量。其它的语法规定、程序结构及程序设计方法,都与ANSIC相同。所以本章主要介绍C51各种变量的定义、指针定义、函数定义和混合编程。4.1.3C51扩展的关键字由于单片机在结构及编程上的特殊要求,C51有自己的特殊关键字,称之为C51扩展的关键字,下面给出常用的C51扩展的关键字。_at_bdatabitcodedataidatainterruptpdatareentrantsbitsfrsfr16usingvolatilexdata这些关键字在后面会陆续接触到,此处先不给出它们的含义。4.2C51数据类型及存储主要内容4.2.1C51的数据类型4.2.2C51数据的存储4.2.1C51的数据类型表4-1C51数据类型、长度和数值范围数据类型表示方法长度数值范围无符号字符型unsignedchar1字节0~255有符号字符型signedchar1字节-128~127无符号整型unsignedint2字节0~65535有符号整型signedint2字节-32768~32767无符号长整型unsignedlong4字节0~4294967295有符号长整型signedlong4字节-2147483648~2147483647浮点型float4字节±1.1755E-38~±3.40E+38特殊功能寄存器型sfrsfr161字节2字节0~2550~65535位类型bit、sbit1位0或14.2.1C51的数据类型数据类型转换1)自动转换转换规则是向高精度数据类型转换、向有符号数据类型转换。如字符型变量与整型变量相加时,则位变量先转换字符型或整型数据,然后相加。2)强制转换像ANSIC一样,通过强制类型转换的方式进行转换。如:unsignedintb;floatc;b=(int)c;4.2.2C51数据的存储MCS-51单片机只有bit和unsignedchar两种数据类型支持机器指令,而其它类型的数据都需要转换成bit或unsignedchar型进行存储。为了减少单片机的存储空间和提高运行速度,要尽可能地使用unsignedchar型数据。一、位变量的存储bit和sbit型位变量,直接存于RAM的位寻址空间,包括低128位和特殊功能寄存器位。4.2.2C51数据的存储二、字符变量的存储字符变量(char):无论是unsignedchar数据还是signedchar数据,均为1个字节,能够被直接存储在RAM中,可以存储在0~0x7f区域,也可以存储在0x80~0xff区域,与变量的定义有关。unsignedchar数:可直接被MSC-51接受signedchar数据:用补码表示。需要额外的操作来测试、处理符号位,使用的是两种库函数,代码量大,运算速度降低。4.2.2C51数据的存储三、整型变量的存储整型变量(int):不管是unsignedint数据还是signedint数据,均为2个字节,其存储方法是高位字节保存在低地址(在前面),低位字节保存在高地址(在后面)。例如,整型变量的值为0x1234,在内存中的存放如右图所示。signedint数据用补码表示。地址低高::1234::4.2.2C51数据的存储四、长整型变量的存储长整型变量(long)为4个字节,其存储方法与整型数据一样,是最高位字节保存的地址最低(在最前面),最低位字节保存的地址最高(在最后面)。如长整型变量的值为0x12345678,在内存中的存放方法如右图所示。不管是unsignedlong数据还是signedlong数据。地址低高::12345678::4.2.2C51数据的存储五、浮点型变量的存储浮点型变量(fload)占4个字节,用指数方式表示,其具体格式与编译器有关。对于KeilC,采用的是IEEE-754标准,具有24位精度,尾数的最高位始终为1,因而不保存。具体分布为:1位符号位,8位阶码位,23位尾数,如下图所示。字节地址0123浮点数内容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM符号和阶码尾数高位尾数低位4.2.2C51数据的存储符号位S:1表示负数,0表示正数。阶码:用移码表示。如,实际阶码-126用1表示,实际阶码0用127表示,即实际阶码数加上127得到阶码的表达数。阶码数值范围:-126~+128。4.2.2C51数据的存储例如浮点数-12.5符号位为1,12.5的二进制数为1100.1=1.1001E+0011,阶码数值为3+127=130=10000010B,尾数为1001。因此,其十六进制数为0xC1480000,则存储结构如右图所示。地址低高::C1480000::说明:教材中存储结构是错的。4.3C51变量的定义及数据存储区域主要内容4.3.1C51变量的定义4.3.2C51变量的存储类型4.3.3C51变量的存储区域4.3.4C51变量定义举例4.3.5C51变量的存储模式4.3.6C51变量的绝对定位4.3.1C51变量的定义C51变量定义的一般格式为:[存储类型]数据类型[存储区]变量名1[=初值][,变量名2[=初值]][,…]或[存储类型][存储区]数据类型变量名1[=初值][,变量名2[=初值]][,…]可见变量(非位变量)的定义由4部分组成,即在变量定义时,指定变量4种属性。数据类型:在前面的4.2中已经叙述过,对于变量名也无须多说,下面主要解释“存储类型”和“存储区”等概念。4.3.2C51变量的存储类型存储类型这个属性我们仍沿用ANSIC的说法,尽量不改变原来的含义。按照ANSIC,C语言的变量有4种存储类型:动态存储(auto)静态存储(static)全局存储(extern)寄存器存储(register)4.3.2C51变量的存储类型一、动态存储动态(存储)变量:用auto定义的为动态变量,也叫自动变量。作用范围:在定义它的函数内或复合语句内部。当定义它的函数或复合语句执行时,C51才为变量分配存储空间,结束时所占用的存储空间释放。定义变量时,auto可以省略,或者说如果省略了存储类型项,则认为是动态变量。动态变量一般分配使用寄存器或堆栈。4.3.2C51变量的存储类型二、静态存储静态(存储)变量:用static定义的为静态变量。分为内部静态和外部静态变量。内部静态变量:在函数体内定义的为内部静态变量。在函数内可以任意使用和修改,函数运行结束后会一直存在,但在函数外不可见,即在函数体外得到保护。外部静态变量:在函数体外部定义的为外部静态变量。在定义的文件内可以任意使用和修改,外部静态变量会一直存在,但在文件外不可见,即在文件外得到保护。4.3.2C51变量的存储类型三、外部存储外部(存储)变量:用extern声明的变量为外部变量,是在其它文件定义过的全局变量。用extern声明后,便可以在所声明的文件中使用。需要注意的是:在定义变量时,即便是全局变量,也不能使用extern定义。4.3.2C51变量的存储类型四、寄存器存储寄存器(存储)变量:用register定义的变量为寄存器变量。寄存器变量存放在CPU的寄存器中,这种变量处理速度快,但数目少。C51中的寄存器变量:C51的编译器在编译时,能够自动识别程序中使用频率高的变量,并将其安排为寄存器变量,用户不用专门声明。4.3.3C51变量的存储区域变量的存储区属性是单片机扩展的概念,非常重要,它涉及到7个新的关键字。MCS-51单片机有四个存储空间,分成三类,它们是片内数据存储空间、片外数据存储空间和程序存储空间。MCS-51单片机有更多的存储区域:由于片内数据存储器和片外数据存储器又分成不同的区域,所以单片机的变量有更多的存储区域。在定义变量时,必须明确指出是存放在哪个区域。4.3.3C51变量的存储区域表4-2C51存储区与存储空间的对应关系关键字对应的存储空间及范围codeROM空间,64KB全空间data片内RAM,直接寻址,低128字节bdata片内RAM,位寻址区0x20~0x2f,可字节访问idata片内RAM,间接寻址,256字节,与@Ri对应pdata片外RAM,分页寻址的256字节(P2不变),P2改变可寻址64KB全空间,与MOVX@Ri对应xdata片外RAM,64KB全空间bit片内RAM位寻找区,位地址0x00~0x7f,128位4.3.4C51变量定义举例1)定义存储在data区域的动态unsignedchar变量:unsignedchardatasec=0,min=0,hou=0;2)定义存储在data区域的静态unsignedchar变量:staticunsignedchardatascan_code=0xfe;3)定义存储在data区域的静态unsignedint变量:staticunsignedintdatadd;4.3.4C51变量定义举例4)定义存储在bdata区域的动态unsignedchar变量:unsignedcharbdataoperate,operate1;//定义指示操作的可位寻址的变量5)定义存储在idata区域的动态unsignedchar数组:unsignedcharidatatemp[20];6)定义在pdata区域的动态有符号int数组:intpdatasend_data[30];//定义存放发送数据的数组4.3.4C51变量定义举例7)定义存储在xdata区域的动态unsignedint数组:unsignedintxdatareceiv_buf[50];//定义存放接受数据的数组8)定义存储在code区域的unsignedchar数组:unsignedcharcodedis_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定义共阴极数码管段码数组4.3.5C51变量的存储模式存储模式:如果在定义变量时缺省了存储区属性,则编译器会自动选择默认的存储区域,也就是存储模式。变量的存储模式也就是程序(或函数)的编译模式。编译模式分为三种:小模式(small)、紧凑模式(compact)和大
本文标题:72C51编程基础
链接地址:https://www.777doc.com/doc-3894006 .html