欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    单片机C语言及程序设计.docx

    • 资源ID:15737831       资源大小:35.57KB        全文页数:38页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    单片机C语言及程序设计.docx

    1、单片机C语言及程序设计单片机C语言及程序设计4.1 C51概述“C51”概念:为了与ANSI C区别,把“单片机C语言”称为“C51”,也称为“Keil C”。 用汇编语言编写单片机程序时,必须要考虑其存储器的结构,尤其要考虑其片内数据存储器、特殊功能寄存器是否正确合理的使用,以及按照实际地址端口数据的处理。 4.1.2 C语言与ANSI 的区别用C51编写程序,虽然不像汇编语言那样需要具体地组织、分配存储器资源,但是C51对数据类型和变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。 用C51编写单片机程序,与用ANSI C编写程序的不同之处是,需要根据单片机存储器结

    2、构及内部资源,定义相应的数据类型和变量。 其它的语法规定、程序结构及程序设计方法,都与ANSI C相同。所以本章主要介绍C51各种变量的定义、指针定义、函数定义和混合编程。 4.1.3 C51扩展的关键字由于单片机在结构及编程上的特殊要求,C51有自己的特殊关键字,称之为C51扩展的关键字,下面给出常用的C51扩展的关键字。 _at_ bdata bit code data idata interrupt pdata reentrant sbit sfr sfr16 using volatile xdata 4.2 C51数据类型及存储表4-1 C51数据类型、长度和数值范围数据类型表示方法长

    3、 度数 值 范 围无符号字符型unsigned char1字节0255有符号字符型signed char1字节-128127无符号整型unsigned int2字节065535有符号整型signed int2字节-3276832767无符号长整型unsigned long4字节0有符号长整型signed long4字节-浮点型float4字节1.1755E-383.40E+38特殊功能寄存器型Sfrsfr161字节2字节0255065535位类型bit、sbit1位0或1数据类型转换 1)自动转换 转换规则是向高精度数据类型转换、向有符号数据类型转换。如字符型变量与整型变量相加时,则位变量先转

    4、换字符型或整型数据,然后相加。 2)强制转换 像ANSI C一样,通过强制类型转换的方式进行转换。如: unsigned int b; float c; b=(int)c; 4.2.2 C51数据的存储MCS-51单片机只有bit和unsigned char两种数据类型支持机器指令,而其它类型的数据都需要转换成bit或unsigned char型进行存储。 为了减少单片机的存储空间和提高运行速度,要尽可能地使用unsigned char型数据。 一、位变量的存储 bit和sbit型位变量,直接存于RAM的位寻址空间,包括低128位和特殊功能寄存器位。 二、字符变量的存储 字符变量(char):

    5、无论是unsigned char数据还是signed char数据,均为1个字节,能够被直接存储在RAM中,可以存储在00x7f区域,也可以存储在0x800xff区域,与变量的定义有关。 unsigned char数:可直接被MSC-51接受地址低高:3412: signed char数据:用补码表示。需要额外的操作来测试、处理符号位,使用的是两种库函数,代码量大,运算速度降低。 三、整型变量的存储 整型变量(int):不管是unsigned int数据还是signed int数据,均为2个字节,其存储方法是高位字节保存在低地址(在前面),低位字节保存在高地址(在后面) 。例如,整型变量的值为

    6、0x1234,在内存中的存放如右图所示。 signed int数据用补码表示。四、长整型变量的存储 长整型变量(long)为4个字节,其存储方法与整型数据一样,是最高位字节保存的地址最低(在最前面),最低位字节保存的地址最高(在最后面)。如长整型变量的值为0x,在内存中的存放方法如右图所示。地址低高:78563412:不管是unsigned long数据还是signed long数据。五、浮点型变量的存储 浮点型变量(fload)占4个字节,用指数方式表示,其具体格式与编译器有关。 对于Keil C,采用的是IEEE-754标准,具有24位精度,尾数的最高位始终为1,因而不保存。具体分布为:1

    7、位符号位,8位阶码位,23位尾数,如下图所示。 字节地址0123浮点数内容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM符号和阶码尾数高位尾数低位符号位S:1表示负数,0表示正数。地址低高:000048C1: 阶码:用移码表示。如,实际阶码-126用1表示,实际阶码0用127表示,即实际阶码数加上127得到阶码的表达数。阶码数值范围:-126+128。例如浮点数-12.5 符号位为1,12.5的二进制数为1100.1=1.1001E+0011,阶码数值为3+127=130=B,尾数为1001。 因此,其十六进制数为0xC,则存储结构如右图所示。 4.3 C51变量的定义及数据

    8、存储区域4.3.1 C51变量的定义C51变量定义的一般格式为: 存储类型 数据类型 存储区变量名1=初值 ,变量名2=初值 ,或 存储类型 存储区 数据类型 变量名1=初值 ,变量名2=初值 , 可见变量(非位变量)的定义由4部分组成,即在变量定义时,指定变量4种属性。 数据类型:在前面的4.2中已经叙述过,对于变量名也无须多说,下面主要解释“存储类型”和“存储区”等概念。 4.3.2 C51变量的存储类型存储类型这个属性我们仍沿用ANSI C的说法,尽量不改变原来的含义。 按照ANSI C,C语言的变量有4种存储类型: 动态存储(auto) 静态存储(static) 全局存储(extern

    9、) 寄存器存储(register) 一、动态存储 动态(存储)变量:用auto定义的为动态变量,也叫自动变量。 作用范围:在定义它的函数内或复合语句内部。 当定义它的函数或复合语句执行时,C51才为变量分配存储空间,结束时所占用的存储空间释放。 定义变量时,auto可以省略,或者说如果省略了存储类型项,则认为是动态变量。动态变量一般分配使用寄存器或堆栈。 二、静态存储 静态(存储)变量:用static定义的为静态变量。分为内部静态和外部静态变量。 内部静态变量:在函数体内定义的为内部静态变量。 在函数内可以任意使用和修改,函数运行结束后会一直存在,但在函数外不可见,即在函数体外得到保护。 外部

    10、静态变量:在函数体外部定义的为外部静态变量。在定义的文件内可以任意使用和修改,外部静态变量会一直存在,但在文件外不可见,即在文件外得到保护。 三、外部存储 外部(存储)变量:用extern声明的变量为外部变量,是在其它文件定义过的全局变量。 用extern声明后,便可以在所声明的文件中使用。 需要注意的是:在定义变量时,即便是全局变量,也不能使用extern定义。 四、寄存器存储 寄存器(存储)变量:用register定义的变量为寄存器变量。 寄存器变量存放在CPU的寄存器中,这种变量处理速度快,但数目少。 C51中的寄存器变量: C51的编译器在编译时,能够自动识别程序中使用频率高的变量,并

    11、将其安排为寄存器变量,用户不用专门声明。 4.3.3 C51变量的存储区域变量的存储区属性是单片机扩展的概念,非常重要,它涉及到7个新的关键字。 MCS-51单片机有四个存储空间,分成三类,它们是片内数据存储空间、片外数据存储空间和程序存储空间。 MCS-51单片机有更多的存储区域:由于片内数据存储器和片外数据存储器又分成不同的区域,所以单片机的变量有更多的存储区域。 在定义变量时,必须明确指出是存放在哪个区域。表4-2 C51存储区与存储空间的对应关系关键字对应的存储空间及范围codeROM空间,64KB全空间data片内RAM,直接寻址,低128字节bdata片内RAM,位寻址区0x200

    12、x2f,可字节访问idata 片内RAM,间接寻址,256字节,与 Ri 对应pdata片外RAM,分页寻址的256字节(P2不变), P2改变可寻址64KB全空间,与MOVX Ri 对应xdata片外RAM,64KB全空间bit片内RAM位寻找区,位地址0x000x7f,128位4.3.4 C51变量定义举例1)定义存储在data区域的动态unsigned char变量: unsigned char data sec=0, min=0, hou=0; 2)定义存储在data区域的静态unsigned char变量: static unsigned char data scan_code=0x

    13、fe; 3)定义存储在data区域的静态unsigned int变量: static unsigned int data dd; 4)定义存储在bdata区域的动态unsigned char变量: unsigned char bdata operate, operate1; /定义指示操作的可位寻址的变量 5)定义存储在idata区域的动态unsigned char数组: unsigned char idata temp20; 6)定义在pdata区域的动态有符号int数组: int pdata send_data30; /定义存放发送数据的数组 7)定义存储在xdata区域的动态unsign

    14、ed int数组: unsigned int xdata receiv_buf50; /定义存放接受数据的数组 8)定义存储在code区域的unsigned char数组: unsigned char code dis_code10= 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,0x7d,0x07,0x7f,0x6f; /定义共阴极数码管段码数组4.3.5 C51变量的存储模式存储模式:如果在定义变量时缺省了存储区属性,则编译器会自动选择默认的存储区域,也就是存储模式。 变量的存储模式也就是程序(或函数)的编译模式。 编译模式分为三种:小模式(small)、紧凑模式(

    15、compact)和大模式(large)。编译模式由编译控制命令决定。存储模式(编译模式)决定了变量的默认存储区域和参数的传递方法。 一、small模式 在small模式下,变量的默认存储区域是“data”、“idata”,即未指出存储区域的变量保存到片内数据存储器中,并且堆栈也安排在该区域中。 small模式的特点:存储容量小,但速度快。 在small模式下参数的传递:通过寄存器、堆栈或片内数据存储区完成的。 二、compact模式 在compact模式下,变量的默认存储区域是“pdata”,即未指出存储区域的变量保存到片外数据存储器的一页中,最大变量数为256字节,并且堆栈也安排在该区域中。

    16、 compact模式的其特点:是存储容量较small模式大,速度较small模式稍慢,但比large模式要快。 在compact模式下参数的传递:通过片外数据区的一个固定页完成的。 三、large模式 在large模式下,变量的默认存储区域是“xdata”,即未指出存储区域的变量保存到片外数据存储器,最大变量数可达64KB,并且堆栈也安排在该区域中。 large模式的特点:存储容量大,速度慢 large模式下参数的传递方式:参数的传递也是通过片外数据存储器完成的。 C51支持混合模式:即可以对函数设置编译模式,所以在large模式下,可以对某些函数设置为compact模式或small模式,从而

    17、提高运行速度。 默认编译模式:如果文件或函数未指明编译模式,则编译器按small模式处理。 编译模式控制命令: “#pragma small(或compact、large)”应放在文件的开始。 4.3.6 C51变量的绝对定位C51有三种方式可以对变量(I/O端口)绝对定位:绝对定位关键字_at_ 、指针、库函数的绝对定位宏。 对于后两种方式,在后面指针一节介绍。 C51扩展的关键字_at_专门用于对变量作绝对定位,_at_使用在变量的定义中,其格式为: 存储类型 数据类型 存储区 变量名1 _at_ 地址常数,变量名2 举例说明_at_的使用方法 1)对data区域中的 unsigned c

    18、har变量aa作绝对定位: unsigned char data aa _at_ 0x30; 2)对pdata区域中的 unsigned int数组cc作绝对定位: unsigned int pdata cc10 _at_ 0x34; 3)对xdata区域中的 unsigned char变量printer_port作绝对定位: unsigned char xdata printer_port _at_ 0x7fff; 对变量绝对定位的几点说明: 1)绝对地址变量在定义时不能初始化,因此不能对code型变量绝对定位; 2)绝对地址变量只能够是全局变量,不能在函数中对变量绝对定位; 3)绝对地址变

    19、量多用于I/O端口,一般情况下不对变量作绝对定位; 3)位变量不能使用_at_绝对定位。4.4 C51位变量的定义4.4.1 bit型位变量的定义常说的位变量指的就是bit型位变量。C51的bit型位变量定义的一般格式为: 存储类型 bit 位变量名1=初值 ,位变量名2=初值 , bit位变量被保存在RAM中的位寻址区域(字节地址为0x200x2f,16字节)。 例如: bit flag_run,receiv_bit=0; static bit send_bit; 两点说明: 1)bit型位变量与其它变量一样,可以作为函数的形参,也可以作为函数的返回值,即函数的类型可以是位型的; 2)位变量

    20、不能定义指针,不能定义数组。 4.4.2 sbit型位变量的定义对于能够按位寻址的特殊功能寄存器、定义在位寻址区域的变量(字节型、整型、长整型),可以对其各位用sbit定义位变量。 为了方便起见,分开讨论按位寻址的特殊功能寄存器中位变量的定义、按位寻址的变量中位变量的定义。一、特殊功能寄存器中位变量定义 能够按位寻址的特殊功能寄存器中位变量定义的一般格式为: sbit 位变量名 位地址表达式 这里的位地址表达式有三种形式: 直接位地址 特殊功能寄存器名带位号 字节地址带位号1、用直接位地址定义位变量 这种情况下位变量的定义格式为: sbit 位变量名 位地址常数 这里的位地址常数范围为0x80

    21、0xff,实际是定义特殊功能寄存器的位。例如: sbit P0_0=0x80; sbit P1_1=0x91; sbit RS0=0xd3; /定义PSW的第3位 sbit ET0=0xa9; /定义IE的第1位 2、特殊功能寄存器名带位号定义 这时位变量的定义格式为: sbit 位变量名 特殊功能寄存器名号常数 这里的位号常数为07。例如: sbit P0_3=P03; sbit P1_4=P14; sbit OV=PSW2; /定义PSW的第2位 sbit ES=IE4; /定义IE的第4位 3、寄存器地址带位号定义位变量 在这种情况下位变量的定义格式为: sbit 位变量名 特殊功能寄存

    22、器地址位号常数 这里的位号常数同上,为07。例如: sbit P0_6=0x806; sbit P1_7=0x907; sbit AC=0xd06; /定义PSW的第6位 sbit EA=0xa87; /定义IE的第7位 4、几点说明 1)用sbit定义的位变量,必须能够按位操作,而不能够对无位操作功能的位定义位变量。 2)用sbit定义位变量,必须放在函数外面作为全局位变量,而不能在函数内部定义。 3)用sbit每次只能定义一个位变量。 4)对其它模块定义的位变量(bit型或 sbit型)的引用声明,都使用bit。 5)用sbit定义的是一种绝对定位的位变量(因为名字是与确定位地址对应的),

    23、具有特定的意义,在应用时不能像bit型位变量那样随便使用。二、位寻址区变量的位定义 对bdata型变量(字节型、整型、长整型) ,被保存在RAM中的位寻址区,因此可以对bdata型变量各位作位变量定义。 这样,既可以对bdata型变量作字节(或整型、长整型)操作,也可以作位操作。 bdata型变量的位定义格式: sbit 位变量名 bdata型变量名位号常数 bdata型变量为在此之前应该是定义过的,位号常数可以是07(8位字节变量),或015(16位整型变量),或031(32位字长整型变量)。例如: unsigned char bdata operate; 对operate的低4位作位变量定

    24、义: sbit flag_key=operate0; /键盘标志位 sbit flag_dis=operate1; /显示标志位 sbit flag_mus=operate2; /音乐标志位 sbit flag_run=operate3; /运行标志位 4.5 C51特殊功能寄存器的定义4.5.1 8位特殊功能寄存器的定义定义的一般格式为: sfr 特殊功能寄存器名 地址常数 地址常数范围:0x800xff。 特殊功能寄存器定义例子(见reg51.h、reg52.h等文件): sfr P0=0x80; /定义P0寄存器 sfr P1=0x90; /定义P1口寄存器 sfr PSW=0xd0;

    25、/定义PSW sfr IE=0xa8; /定义IE 4.5.2 16位特殊功能寄存器的定义定义的一般格式为: sfr16 特殊功能寄存器名 地址常数 地址常数范围:0x800xff。 例如(见reg51.h、reg52.h等文件): sfr16 DPTR=0x82; sfr16 T2=0xcc; /含TL2和TH2 sfr16 RCAP2=0xca; /含RCAP2L /和RCAP2H, 0xca为RCAP2L的地址几点说明: 1)定义特殊功能寄存器中的地址必须在0x800xff范围内。 2)定义特殊功能寄存器,必须放在函数外面作为全局变量。 3)用sfr或sfr16每次只能定义一个特殊功能寄

    26、存器。 4)像sbit一样,用sfr或sfr16定义的是绝对定位的变量(因为名字是与确定地址对应的),具有特定的意义,在应用时不能像一般变量那样随便使用。 4.6 C51指针的定义4.6 C51指针的定义由于MCS-51单片机有三种不同类型的存储空间,并且还有不同的存储区域,因此C51指针的内容更丰富。 指针除了具有像变量的四种属性(存储类型、数据类型、存储区、变量名)外,按存储区,将指针分为通用指针和不同存储区域的专用指针。 4.6.1 通用指针所谓通用指针,就是通过该类指针可以访问所有的存储空间。 在C51库函数中通常使用这种指针来访问。 通用指针用3个字节来表示: 第一个字节:表示指针所

    27、指向的存储空间 第二个字节:为指针地址的高字节 第三个字节:为指针地址的低字节通用指针的定义与一般C语言指针的定义相同,其格式为: 存储类型 数据类型 *指针名1,*指针名2 ,通用指针的特点: 定义简单 访问所有空间 访问速度慢 例如: unsigned char *cpt; int *dpt; long *lpt; static char *ccpt; 4.6.2 存储器专用指针所谓存储器专用指针,就是通过该类指针,只能够访问规定的存储空间区域。 指针本身占用1个字节(data *,idata *,bdata *,pdata *)或2个字节(xdata *,code *)。 存储器专用指针

    28、的一般定义格式为: 存储类型 数据类型 指向存储区 *指针存储区 指针名1 ,*指针存储区 指针名2, 指向存储区: 是指针变量所指向的数据存储空间区域。不能够缺省。 指针存储区: 是指针变量本身所存储的空间区域。 缺省时认为指针存储区在默认的存储区域,其默认存储区域决定于所设定的编译模式。 指向和指针存储区,两者可以是同一个区域,但多数情况下不会是同一个区域。 存储器专用指针例子: unsigned char data *cpt1, *cpt2; signed int idata *dpt1, *dpt2; unsigned char pdata *ppt; signed long xdat

    29、a *lpt1, *lpt2; unsigned char code *ccpt; 上面所定义的指针虽然所指向的空间不同,但指针变量本身都存储在默认的存储区域。 又如: 1)unsigned char data *idata cpt1,*idata cpt2; 2)signed int idata *data dpt1, *data dpt2; 3)unsigned char pdata *xdata ppt; 4)signed long xdata *lpt1, *xdata lpt2; 5)unsigned char code *data ccpt; 前关键字为指针所指向的存储区 后关键字为指针本身所存储的区域注意:(1)要区分指针变量指向的空间区域和指针变量本身所存储的区域;(2)定义时,前者不能缺省,而后者可以缺省;(3)指针变量的长度:指向不同的区域,占用的字节数不同。 说明:指针


    注意事项

    本文(单片机C语言及程序设计.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开