第4章单片机的C语言编程

上传人:无*** 文档编号:232342974 上传时间:2023-09-18 格式:PPT 页数:33 大小:540KB
收藏 版权申诉 举报 下载
第4章单片机的C语言编程_第1页
第1页 / 共33页
第4章单片机的C语言编程_第2页
第2页 / 共33页
第4章单片机的C语言编程_第3页
第3页 / 共33页
资源描述:

《第4章单片机的C语言编程》由会员分享,可在线阅读,更多相关《第4章单片机的C语言编程(33页珍藏版)》请在装配图网上搜索。

1、内内容容提提要要C51程序结构程序结构C51的数据类型的数据类型及及运算符运算符C51的函的函数数 C51程序设计程序设计小结小结第4章 单片机的C语言编程 应用应用C51C51编程具有以下优点:编程具有以下优点:(1 1)C51C51管管理理内内部部寄寄存存器器和和存存贮贮器器的的分分配配,编编程程时时,无无需需考虑不同存储器的寻址和数据类型等细节问题;考虑不同存储器的寻址和数据类型等细节问题;()程序由若干函数组成,具有良好的模块化结构;()程序由若干函数组成,具有良好的模块化结构;()有有丰丰富富的的子子程程序序库库可可直直接接引引用用,从从而而大大大大减减少少用用户户编程的工作量。编程

2、的工作量。()()C51C51和汇编语言可以交叉使用和汇编语言可以交叉使用.汇编语言程序代码短、汇编语言程序代码短、运行速度快、但复杂运算编程耗时。如果用汇编语言编写与运行速度快、但复杂运算编程耗时。如果用汇编语言编写与硬件有关的部分程序,用硬件有关的部分程序,用C51C51编写与硬件无关的运算部分程序,编写与硬件无关的运算部分程序,充分发挥两种语言的长处,可以提高开发效率。充分发挥两种语言的长处,可以提高开发效率。4.1 C514.1 C51程序结构程序结构 同标准同标准C C一样,一样,C51C51的程序由一个个函数组成,的程序由一个个函数组成,这里的函数和其他语言的这里的函数和其他语言的

3、“子程序子程序”或或“过程过程”具具有相同的意义。其中必须有一个主函数有相同的意义。其中必须有一个主函数main()main(),程程序的执行从序的执行从main()main()函数开始,调用其函数开始,调用其 他函数后返回他函数后返回主函数主函数main()main(),最后在主函数中结束整个程序而不最后在主函数中结束整个程序而不管函数的排列顺序如何。管函数的排列顺序如何。全局变量说明全局变量说明 /*/*可被各函数引用可被各函数引用*/main()/*main()/*主函数主函数*/局部变量说明局部变量说明 /*/*只在本函数引用只在本函数引用*/执行语句执行语句(包括函数调用语句包括函数

4、调用语句)fun1(fun1(形式参数表形式参数表)/*)/*函数函数1*/1*/形式参数说明形式参数说明局部变量说明局部变量说明执执行行语语句句(包包括括调调用用其其他他函函数语句数语句)funn(形形式式参参数数表表)/*函函数数n*/形式参数说明形式参数说明局部变量说明局部变量说明执行语句执行语句C语言程序的组成结构如下所示:语言程序的组成结构如下所示:C语言的语句规则:语言的语句规则:1.每每个个变变量量必必须须先先说说明明后后引引用用,变变量量名名英英文文大大小小写写是有差别的。是有差别的。2.C语语言言程程序序一一行行可可以以书书写写多多条条语语句句,但但每每个个语语句必须以句必须

5、以“;”结尾,一个语句也可以多行书写为好。结尾,一个语句也可以多行书写为好。3.C语言的注释用语言的注释用/*/表示。表示。4.“”花括号必须成对,位置随意,可在紧挨函数花括号必须成对,位置随意,可在紧挨函数名后,也可另起一行,多个花括号可以同行书写,也名后,也可另起一行,多个花括号可以同行书写,也可逐行书写,为层次分明,增加可读性,同一层的可逐行书写,为层次分明,增加可读性,同一层的“”花括号对齐,采用逐层缩进方式书写。花括号对齐,采用逐层缩进方式书写。4.2 4.2 C51C51的数据类型的数据类型及及运算符运算符4.2.1 C514.2.1 C51的存贮类型的存贮类型 访问内部数据存贮器

6、访问内部数据存贮器(idata)比访问外部数据存贮器比访问外部数据存贮器(xdata)相对要相对要快一些,因此,可将经常使用的变量置于内部数据存贮器中,而将较大快一些,因此,可将经常使用的变量置于内部数据存贮器中,而将较大及很少使用的数据变量置于外部数据存贮器中。例如定义变量及很少使用的数据变量置于外部数据存贮器中。例如定义变量x语句:语句:datacharx(等价于等价于chardatax)。如果用户不对变量的存贮类型定义,如果用户不对变量的存贮类型定义,则编译器承认默认存贮类型,默认的存贮类型由编译控制命令的存贮的则编译器承认默认存贮类型,默认的存贮类型由编译控制命令的存贮的模式部分决定。

7、模式部分决定。存储器类型存储器类型描描 述述datadata直接寻址内部数据存储区,访问变量速度最快(直接寻址内部数据存储区,访问变量速度最快(128bytes128bytes)bdatabdata可位寻址内部数据存储区,允许位与字节混合访问(可位寻址内部数据存储区,允许位与字节混合访问(16bytes16bytes)idataidata间接寻址内部数据存储区,访问全部内部地址空间(间接寻址内部数据存储区,访问全部内部地址空间(256bytes256bytes)pdatapdata分页(分页(256bytes256bytes)外部数据存储区,由操作码)外部数据存储区,由操作码MOVXRiMOV

8、XRi访问访问xdataxdata外部数据存储区(外部数据存储区(64K64K),由操作码),由操作码MOVXDPTRMOVXDPTR访问访问codecode代码存储区,由操作码代码存储区,由操作码MOVCA+DPTRMOVCA+DPTR访问访问4.2.2 C514.2.2 C51的存贮器模式的存贮器模式 存贮器模式决定了变量的默认存贮器类型、参数传递区和无明确存贮器模式决定了变量的默认存贮器类型、参数传递区和无明确存贮区类型的说明。存贮区类型的说明。C51C51的存贮器模式有的存贮器模式有SMALLSMALL、LARGELARGE和和COMPACTCOMPACT。在固定的存贮器地址进行变量参

9、数传递是在固定的存贮器地址进行变量参数传递是C51C51的一个标准特征,在的一个标准特征,在SMALLSMALL模式下参数传递是在内部数据存贮区中完成的。模式下参数传递是在内部数据存贮区中完成的。LARGELARGE和和COMPACTCOMPACT模模式允许参数在外部存贮器中传递。式允许参数在外部存贮器中传递。C51C51同时也支持混合模式,例如在同时也支持混合模式,例如在LARGELARGE模式下生成的程序可将一些函数分页放入模式下生成的程序可将一些函数分页放入SMALLSMALL模式中从而加快执模式中从而加快执行速度。行速度。例如设例如设C C语言源程序为语言源程序为PROR.CPROR.

10、C,若使程序中的变量类型和参数传递区限定若使程序中的变量类型和参数传递区限定 在外部数据存贮区在外部数据存贮区 ,有两种方法:,有两种方法:方法方法1 1:用:用C51C51对对PROR.CPROR.C进行编译时,使用命令进行编译时,使用命令C51 PROR.C COMPACTC51 PROR.C COMPACT。方法方法2 2:在程序的第一句加预处理命令:在程序的第一句加预处理命令#pragmapragma compact compact 存贮器模式表存贮器模式表 存储器模式存储器模式描描 述述SMALLSMALL参数及局部变量放入可直接寻址的内部存储器(最大参数及局部变量放入可直接寻址的内

11、部存储器(最大128bytes128bytes,默认存储器类型,默认存储器类型DATADATA)COMPACTCOMPACT参数及局部变量放入分页外部存储区(最大参数及局部变量放入分页外部存储区(最大256bytes256bytes,默认存储器类型,默认存储器类型PDATAPDATA)LARGELARGE参数及局部变量直接放入外部数据存储器(最大参数及局部变量直接放入外部数据存储器(最大64K64K,默认存储器类型,默认存储器类型XDATAXDATA)4.2.3 C514.2.3 C51的数据类型的数据类型 无论哪种数据都是存放在存贮单元中的,每无论哪种数据都是存放在存贮单元中的,每一个数据究

12、竟要占用几个单元一个数据究竟要占用几个单元(即数据的长度即数据的长度)都要都要提供给编译系统,正如汇编语言中存放数据的单元提供给编译系统,正如汇编语言中存放数据的单元要用要用DBDB或或DWDW伪指令进行定义一样,编译系统以此为伪指令进行定义一样,编译系统以此为根据预留存贮单元,这就是定义数据类型的意义。根据预留存贮单元,这就是定义数据类型的意义。C51C51编译器支持数据类型见下表。编译器支持数据类型见下表。数据数据类类型型长长度度取取值值范范围围位型位型bit1Bit1Bit0 0或或1 1字符型字符型signedchar1Byte1Byte-128+127unsignedchar1Byt

13、e1Byte0255整型整型signedint或或signedshort2Bytes2Bytes-32768+32767unsignedint或或unsignedshort2Bytes2Bytes065535signedlong4Bytes4Bytes-2147483648+2147483647unsignedlong4Bytes4Bytes04294967295实型实型float4Bytes4Bytes1.175494E-383.402823E+38指针型指针型data/idata/pdata1Byte1Byte1 1字节地址字节地址code/xdata2Bytes2Bytes2 2字节地址

14、字节地址通用指针通用指针3Bytes3Bytes1字节为存储器类型编码,字节为存储器类型编码,2、3字节字节为地址偏移量为地址偏移量访问访问SFR的的数据类型数据类型sbit1Bit1Bit0 0或或1 1sfr1Byte1Byte0255sfr162Bytes2Bytes065535 C51C51的数据类型的数据类型 对上表作如下说明:对上表作如下说明:1.1.字字 符符 型型(char)(char)、整整 型型(intint)和和 长长 整整 型型(long)(long)均均 有有 符符 号号 型型(signed)(signed)和和无无符符号号型型(unsigned)(unsigned)

15、两两种种,如如果果不不是是必必须须,尽尽可可能能选选择择unsignedunsigned型型,这这将将会会使使编编译译器器省省却却符符号号位位的的检检测测,使使生生成成的的程程序序代代码码比比signedsigned类型短得多。类型短得多。2.2.程程序序编编译译时时,C51C51编编译译器器会会自自动动进进行行类类型型转转换换,例例如如将将一一个个位位变变量量赋赋值值给给一一个个整整型型变变量量时时,位位型型值值自自动动转转换换为为整整型型值值;当当运运算算符符两两边边为为不不同同类类型型的的数数据据时时,编编译译器器先先将将低低级级的的数数据据类类型型转转换换为为较较高高级级的的数据类型,

16、运算后,运算结果为高级数据类型。数据类型,运算后,运算结果为高级数据类型。3.513.51单片机内部数据存贮器的可寻址位单片机内部数据存贮器的可寻址位(20H(20H2FH)2FH)定义为定义为bitbit型,型,而特殊功能寄存器的可寻址位而特殊功能寄存器的可寻址位(即地址为即地址为X0HX0H和和X8HX8H的的SFRSFR的各位的各位)只能定只能定义为义为sbitsbit类型。类型。4.2.4 C514.2.4 C51的指针的指针(1)关于指针型变量关于指针型变量 在汇编语言程序中,要取存贮单元在汇编语言程序中,要取存贮单元m m的内容可用直接寻址方式,也可的内容可用直接寻址方式,也可用寄

17、存器间接寻址方式用寄存器间接寻址方式 ,如果用,如果用R1R1寄存器指示寄存器指示m m的地址,用的地址,用R1R1取取m m单元单元的内容。相对应的在的内容。相对应的在C C语言中用变量名表示取变量的值语言中用变量名表示取变量的值(相当于直接寻址相当于直接寻址),也可用另一个变量,也可用另一个变量(如如P)P)存放存放m m的地址,的地址,P P就相当于就相当于R1R1寄存器寄存器 。用。用*P P取取得得m m单元的内容单元的内容(相当于汇编的间接寻址方式相当于汇编的间接寻址方式)这里这里P P即为指针型变量。下即为指针型变量。下面表格表示两种语言将面表格表示两种语言将m m单元的内容送单

18、元的内容送n n单元的对照语句。单元的对照语句。注:上表省略了汇编语言程序中对符号地址n和m用EQU伪指令进行具体地址定义的 语句以及C语言对变量n、m和指针变量P进行类型定义的语句,实际程序设计中,此步是不可 缺少的。表中&为取地址运算符,*为取内容运算符。汇编语言和汇编语言和C语言的对照语言的对照 表表直接寻址直接寻址间接寻址间接寻址汇编语言汇编语言C语言语言汇编语言汇编语言C语言语言movn,m传送语句传送语句n=m;赋值语句赋值语句movR1,#m;m的地址送的地址送R1movn,R1;m的内容送的内容送nP=&m/*m的地址送的地址送P*/n=*P/*m的内容送的内容送n*/(2)(

19、2)指针型数据的类型指针型数据的类型 由由于于C51是是结结合合5151单单片片机机硬硬件件的的,5151单单片片机机的的不不同同存存贮贮空空间间,有有不不同同的的地地址址范范围围,即即使使对对于于同同一一外外部部数数据据存存贮贮器器,又又有有用用Ri分分页页寻寻址址(Ri为为八八位位)和和用用DPTR寻寻址址(DPTR为为十十六六位位)两两种种寻寻址址方方式式,而而指指针针本本身身也也是是一一个个变变量量,有有它它存存放放的的存存贮贮区区和和数数据据长长度度。因因此此,在在指指针针类类型型的的定定义义中中要要说说明明:被被指指的的变变量量的的数数据据类类型型和和存存贮贮类类型型;指指针针变变

20、量量本本身身的的数数据据类类型型(占占几几个个字字节节)和和存存贮贮类类型型(即即指指针针本本身身存存放放在在什么存贮区什么存贮区)。例如类型定义为例如类型定义为data或或idata,表示指针指示内部数据存贮器;而表示指针指示内部数据存贮器;而pdata表示表示指针指向外部数据存贮器,用指针指向外部数据存贮器,用Ri间址。以上均为八位地址;而类型间址。以上均为八位地址;而类型code/xdata表示指针指向外部程序存贮器或外部数据存贮器指针,本身表示指针指向外部程序存贮器或外部数据存贮器指针,本身(即被指示地址即被指示地址)应为应为十六位长度。如果想使指针能适用于指向任何存贮空间,则可以定义

21、指针为通用十六位长度。如果想使指针能适用于指向任何存贮空间,则可以定义指针为通用型,此时指针长度为型,此时指针长度为3 3字节,第一字节表示存贮器类型编码,第二、三字节分别字节,第一字节表示存贮器类型编码,第二、三字节分别表示所指表示所指 地址的高位和低位。第一字节表示的存贮器类型编码见下表地址的高位和低位。第一字节表示的存贮器类型编码见下表:通用型指针的存贮类型编码表通用型指针的存贮类型编码表 存储器类型存储器类型idataidataxdataxdatapdatapdatadatadatacodecode编编 码码1 12 23 34 45 5变量说明举例变量说明举例 非指针型变量说明非指针

22、型变量说明data char data char varvar;/*/*字符变量字符变量varvar定位在片内数据存贮区定位在片内数据存贮区*/char char code code MSGMSG =PARAMETER:=PARAMETER:;/*/*字字 符符 数数 组组 MSG MSG 定定 位位 在在 程程 序序 存贮区存贮区*/unsigned unsigned long long xdataxdata arrayarray100100;/*/*无无符符号号长长型型数数组组定定位位在在片片外外 RAMRAM区,每元素占区,每元素占4bytes*/4bytes*/float float

23、idataidata x,y,zx,y,z;/*/*实实型型变变量量x,y,zx,y,z,定定位位在在片片内内用用间间址址访访问问 的内部的内部RAMRAM区区*/bit lockbit lock;/*/*位变量位变量LockLock定位在片内定位在片内RAMRAM可位寻址区可位寻址区*/unsigned unsigned intint pdatapdata sionsion;/*/*无无符符号号整整型型变变量量sionsion定定位位在在分分页页的的外外部部RAM*/RAM*/unsigned unsigned char char xdataxdata vector10 vector10 4

24、 4 4 4/*/*无无符符号号字字符符型型三三维维数数 组,组,定位在片外定位在片外RAMRAM区区*/sfrsfr P0=0 x80 P0=0 x80;/*/*定义定义P0P0口,地址为口,地址为80H*/80H*/char char bdatabdata flags flags;/*/*字符变量字符变量flagsflags定位在可位寻址内部定位在可位寻址内部RAMRAM区区*/sbitsbit flag0=flags0 flag0=flags0;/*/*定义定义flag0flag0为为flags.0*/flags.0*/如果在变量说明时略去存贮器类型标志符,编译器会自动选择默认如果在变量

25、说明时略去存贮器类型标志符,编译器会自动选择默认的存贮器类型。默认的存贮器类型由控制指令的存贮器类型。默认的存贮器类型由控制指令SMALLSMALL、COMPACTCOMPACT和和LARGELARGE限限制。例如如果声明制。例如如果声明char char varvar,则默认的存贮器模式为则默认的存贮器模式为SMALLSMALL,varvar放在放在datadata存贮区;如果使用存贮区;如果使用COMPACTCOMPACT模式,模式,varvar放入放入idataidata存贮区存贮区 ;在使用;在使用LARGELARGE模式的情况下,模式的情况下,varvar被放入外部数据存贮区被放入外

26、部数据存贮区(xdataxdata存贮区存贮区)。指针变量说明指针变量说明longxdata*px;/*指针指针px指向指向long型型xdata区区(每个数据占四个每个数据占四个单单元,指针自身在默认存贮器元,指针自身在默认存贮器(如不指定编译模式如不指定编译模式在在data区区),指针长度为,指针长度为2个字节个字节*/charxdata*datapd;/*指指针针pd指指向向字字符符型型xdata区区,自自身身在在data区区,长度长度2字字节节*/datacharxdata*pd;/*与上例等效与上例等效*/dataint*pn;(和和int*datapn及及intr*pn等等效效)/

27、*定定义义一一个个类类型型为为int型的通用型指针,型的通用型指针,指针自身在指针自身在data区长度为区长度为3字节字节*/在上例的指针声明中包含如下几个内容:在上例的指针声明中包含如下几个内容:1)1)指针变量名指针变量名(如如pxpx)前面冠以前面冠以“*”,表示表示pxpx为指针型变量,此处为指针型变量,此处*不不带取内容之意。带取内容之意。2)2)指针指向的存贮类型,即指向哪个存贮区,它决定了指针本身的长指针指向的存贮类型,即指向哪个存贮区,它决定了指针本身的长度度(见数据类型表见数据类型表)。存贮类型声明的位置在数据类型和指针名。存贮类型声明的位置在数据类型和指针名(如如*pxpx

28、)之间,之间,如无次项声明,则此指针型变量为通用型。如无次项声明,则此指针型变量为通用型。3)3)指针指向的存贮区的数据类型,即被指向的存贮区以多少个单元作指针指向的存贮区的数据类型,即被指向的存贮区以多少个单元作一个数据单位,当程序通过指针对该区操作时,将按此规定的单元个数的一个数据单位,当程序通过指针对该区操作时,将按此规定的单元个数的内容作为一个数据操作。内容作为一个数据操作。4)4)指针变量自身的存贮类型,即指针处于什么区与自身的长度无关,指针变量自身的存贮类型,即指针处于什么区与自身的长度无关,该声明可位于声明语句的开头,也可在该声明可位于声明语句的开头,也可在“*”和变量名之间。此

29、项由编译模和变量名之间。此项由编译模式放在默认区,如无规定编译模式,通常在式放在默认区,如无规定编译模式,通常在datadata区。区。4.2.5C51对对SFR、可寻址位、存储器和可寻址位、存储器和I/O口的定义口的定义 1.1.特殊功能寄存器特殊功能寄存器SFRSFR定义定义 C51C51提供了一种自主形式的定义方式,使用特定关键字提供了一种自主形式的定义方式,使用特定关键字sfrsfr 如如 sfrsfr SCON=0 x98 SCON=0 x98;/*/*串行通信控制寄存器地址串行通信控制寄存器地址98H*/98H*/sfrsfr TMOD=0 x89 TMOD=0 x89;/*/*定

30、时器模式控制寄存器地址定时器模式控制寄存器地址89H*/89H*/sfrsfr ACC=0 xe0 ACC=0 xe0;/*A/*A累加器地址累加器地址E0H*/E0H*/sfrsfr P1=0 x90 P1=0 x90;/*P1/*P1端口地址端口地址90H*/90H*/定义了以后,程序中就可以直接引用寄存器名。定义了以后,程序中就可以直接引用寄存器名。C51C51也建立了一个头文件也建立了一个头文件reg51.h(reg51.h(增强型为增强型为reg52.h)reg52.h),在该文件在该文件中对所有的特殊功能寄存器的进行了中对所有的特殊功能寄存器的进行了sfrsfr定义,定义,对特殊功

31、能寄存器的有对特殊功能寄存器的有位名称的可寻址位进行了位名称的可寻址位进行了sbitsbit定义,因此,只要用包含语句定义,因此,只要用包含语句#include#include,就可以直接引用特殊功能寄存器名,或直接引用就可以直接引用特殊功能寄存器名,或直接引用位名称。位名称。要特别注意要特别注意:在引用时特殊功能寄存器或者位名称必须大写。在引用时特殊功能寄存器或者位名称必须大写。2.2.对位变量的定义对位变量的定义 C51C51对位变量的定义有三种方法:对位变量的定义有三种方法:将变量用将变量用bitbit类型的定义符定义为类型的定义符定义为bitbit类型类型:如如 bit bit mnm

32、n;mnmn为为位位变变量量,其其值值只只能能是是“0 0”或或“1 1”,其其位位地地址址C51C51自行安排在可位寻址区的自行安排在可位寻址区的bdatabdata区。区。采用字节寻址变量采用字节寻址变量.位的方法位的方法:如如 bdatabdata intint ibaseibase;/*/*ibaseibase定义为整型变量定义为整型变量*/sbitsbit mybitmybit=ibase15=ibase15;/*/*mybitmybit定义为定义为ibaseibase的的D15D15位位*/这里位是运算符这里位是运算符“”相当于汇编中的相当于汇编中的“”,其后的,其后的最大取值依赖

33、于该位所在的字节寻址变量的定义类型,如定最大取值依赖于该位所在的字节寻址变量的定义类型,如定义为义为charchar最大值只能为最大值只能为7 7。对特殊功能寄存器的位的定义对特殊功能寄存器的位的定义 方法方法1 1:使用头文件及:使用头文件及sbitsbit定义符;多用于无位名的可寻址位。定义符;多用于无位名的可寻址位。例如例如#include#include sbitsbit P1-1=P11 P1-1=P11;/*P1-1/*P1-1为为P1P1口的第口的第1 1位位*/sbitsbit ac=ACC7 ac=ACC7;/*ac/*ac定义为累加器定义为累加器A A的第的第7 7位位*/

34、方法方法2 2:使用头文件:使用头文件reg51.hreg51.h,再直接用位名称。再直接用位名称。例如例如#include#include RS1=1 RS1=1;RS0=0RS0=0;方法方法3 3:用字节地址位表示:用字节地址位表示 例如例如 sbitsbit OV=0 xD02 OV=0 xD02;方法方法4 4:用寄存器名:用寄存器名.位定义位定义 例如例如 sfrsfr PSW=0 xd0 PSW=0 xd0;/*/*定义定义PSWPSW地址为地址为d0H*/d0H*/sbitsbit CY=PSW7 CY=PSW7;/*CY/*CY为为PSWPSW7*/7*/3.C513.C51

35、对存贮器和外接对存贮器和外接I/OI/O口的绝对地址访问口的绝对地址访问对存贮器的绝对地址访问对存贮器的绝对地址访问 利用绝对地址访问的头文件利用绝对地址访问的头文件absacc.habsacc.h可对不同的存贮区进行访问。可对不同的存贮区进行访问。该头文件的函数有:该头文件的函数有:CBYTE (CBYTE (访问访问codecode区字符型区字符型)DBYTE (DBYTE (访问访问datadata区字符型区字符型)PBYTE (PBYTE (访问访问pdatapdata或或I/OI/O区字符型区字符型)XBYTE (XBYTE (访问访问xdataxdata或或I/OI/O区字符型区字

36、符型)还有还有CWORDCWORD、DWORDDWORD、PWORDPWORD和和XWORDXWORD四个函数,它们的访问区域同上,四个函数,它们的访问区域同上,只是访问的类型为只是访问的类型为intint 型。型。例例:#include#include#define com XBYTE#define com XBYTE0 x07ff0 x07ff 那那么么后后面面程程序序comcom变变量量出出现现的的地地方方,就就是是对对地地址址为为07ffH07ffH的的外外部部RAMRAM或或I/OI/O口进行访问。口进行访问。例例:XWORDXWORD0 0=0 x9988=0 x9988;即将即将

37、9988H(int9988H(int类型类型)送入外部送入外部RAMRAM的的0 0号和号和1 1号单元。号单元。使使用用中中要要注注意意:absacc.habsacc.h一一定定要要包包含含进进程程序序,XWORDXWORD必必须须大写。大写。对外部对外部I/OI/O口的访问口的访问 由于单片机的由于单片机的I/OI/O口和外部口和外部RAMRAM统一编址,因此对统一编址,因此对I/OI/O口口地址的访问可用地址的访问可用XBYTE(MOVX DPTR)XBYTE(MOVX DPTR)或或PBYTE(MOVX PBYTE(MOVX RiRi)进行。进行。例例:XBYTEXBYTE0Xefff

38、0Xefff=0 x10=0 x10;将将10H10H输出到地址为输出到地址为EFFFHEFFFH端口端口 4.2.6 C514.2.6 C51的运算符的运算符 1 1赋值运算符:赋值运算符:将将“”的右边的值赋值给左边的变量的右边的值赋值给左边的变量.2.C512.C51的算术运算符的算术运算符:(加或正号加或正号);(减或负号减或负号);*(乘号乘号);/(/(除号除号);%(%(求余求余)优先级为:先乘除,后加减,先括号内,再括号外优先级为:先乘除,后加减,先括号内,再括号外3.C513.C51的关系运算符有六种:的关系运算符有六种:(小于小于);(大于大于);=(=(小于等于小于等于)

39、;=(=(大于等于大于等于);=();=(相等相等);!=(!=(不相等不相等)优先级:前四个高,后二个优先级:前四个高,后二个“=”和和“!=!=”级别低。级别低。4C51的逻辑运算符有三种:的逻辑运算符有三种:&(逻辑与逻辑与);|(逻辑或逻辑或);!(逻辑非逻辑非);逻逻辑辑表表达达式式和和关关系系表表达达式式的的值值相相同同,以以0代代表表假假,以以1代表真。代表真。以上三种运算的优先级见右图所示。以上三种运算的优先级见右图所示。5C51的按位操作的运算符有六种:的按位操作的运算符有六种:&(按位与按位与);(按位或按位或);(按位异或按位异或);(位取反位取反);(位右移位右移)(注

40、:补零移位注:补零移位)例例1.a=0 xf0H;表达式表达式a=a值为值为0FH例例2.a=0 xea;表达式表达式a2值为值为A8H,即,即a值左移值左移两位,移位后空白位补两位,移位后空白位补0。6.自增、自减运算符自增、自减运算符:+i,-i(在使用在使用i之前,先使之前,先使i值加值加1,减减1)i+,i-(在使用在使用i之后,再使之后,再使i值加值加1.,减减1)例设例设i原值为原值为5j=+i则则j值为值为6,i值也为值也为6j=i+则则j值为值为5,i值为值为6|非算术运算关系运算&和|=赋值运算 运算符的优先级运算符的优先级 7 7复合赋值运算符复合赋值运算符:+=+=;=;

41、*=;/=/=;%=%=;=;&=&=;=;|=|=。例:例:a+=b a+=b 相当于相当于 a=a=a+ba+b ;a=7 a=7 相当于相当于 a=a 7 a=a 7。8.8.?运算符?运算符:?1?表达式表达式2:2:表达式表达式3 3 例:例:result=var1 var2?var1:var2;resultresult=var1 var2?var1:var2;result等于变量等于变量var1var1和和var2var2的小者的小者 9.9.对指针操作的运算符对指针操作的运算符:&取地址运算取地址运算 *间址运算符间址运算符 例例 a=&ba=&b;取;取b b变量的地址送变量变

42、量的地址送变量a a c=*b c=*b;将以将以b b的内容为地址的单元的内容送的内容为地址的单元的内容送c c这里要注意:这里要注意:“&”与与按按位位与与运运算算符符的的差差别别,如如果果“&”为为“与与”,&的的两两边边必必须须为为变量或常量;变量或常量;“*”与与指指针针定定义义时时指指针针前前的的“*”的的差差别别。如如char char*pt*pt,这这里里的的“*”只表示只表示ptpt为指针变量,不代表间址取内容的运算。为指针变量,不代表间址取内容的运算。4.3 C514.3 C51的函数的函数 从用户使用角度划分,函数分为从用户使用角度划分,函数分为库函数库函数和和用户自定义

43、函数用户自定义函数。库函数库函数是编译系统为用户设计的一系列标准函数,用户是编译系统为用户设计的一系列标准函数,用户只需调用,而无需自己去编写这些复杂的函数,如前面所用只需调用,而无需自己去编写这些复杂的函数,如前面所用到的头文件到的头文件reg51.hreg51.h、absacc.habsacc.h等,有的头文件中包括一系列等,有的头文件中包括一系列函数,要使用其中的函数必须先使用函数,要使用其中的函数必须先使用#include#include包含语句,然包含语句,然后才能调用。后才能调用。用户自定义函数用户自定义函数是用户根据任务编写的函数是用户根据任务编写的函数从参数形式上函数分为从参数

44、形式上函数分为无参函数无参函数和和有参函数有参函数。有参函数有参函数即是在在调用时,调用函数用实际参数代替形即是在在调用时,调用函数用实际参数代替形式参数,调用完返回结果给调用函数式参数,调用完返回结果给调用函数。4.3.1 C514.3.1 C51函数的定义函数的定义C51C51中函数的定义格式与中函数的定义格式与ANSI CANSI C类似,增加了以下内容:类似,增加了以下内容:将函数定义为中断服务子程序;将函数定义为中断服务子程序;选择函数所使用的寄存器体;选择函数所使用的寄存器体;选择存储模式选择存储模式(memory model);(memory model);说明函数是一个可重入函

45、数。说明函数是一个可重入函数。函数定义格式为:函数定义格式为:返回值类型返回值类型 函数名函数名(参数参数)存储模式存储模式 reentrant interrupt n using n reentrant interrupt n using n1.1.格式中格式中 中的内容为可省略的选项。如果函数没有返回值,返回值类中的内容为可省略的选项。如果函数没有返回值,返回值类型应该声明为型应该声明为voidvoid,省略时默认返回值类型为,省略时默认返回值类型为intint。2.2.存储模式:说明函数的存储模式,可以为存储模式:说明函数的存储模式,可以为smallsmall、compactcompac

46、t或或 lagrelagre,省,省略时使用程序设定的存储模式。略时使用程序设定的存储模式。3.3.reentrantreentrant:说明函数为可重入函数。:说明函数为可重入函数。4.4.interrupt ninterrupt n:说明函数是中断类型号:说明函数是中断类型号n n的中断服务子程序。的中断服务子程序。5.5.using nusing n:指定函数使用第:指定函数使用第n n个寄存器组,个寄存器组,n n可以为可以为0 0、1 1、2 2或或3 3。函数声。函数声明中不能包括明中不能包括using nusing n选项。选项。4.3.2 C514.3.2 C51函数参数传递及

47、返回值传递函数参数传递及返回值传递1 1函数参数传递函数参数传递 为了避免函数调用占用过多的堆栈空间,为了避免函数调用占用过多的堆栈空间,C51C51编译器在调用函数时,只编译器在调用函数时,只将函数的返回地址压入堆栈,而通过寄存器或固定地址的存储单元来传递将函数的返回地址压入堆栈,而通过寄存器或固定地址的存储单元来传递参数。默认情况下,编译器最多可以通过寄存器传递参数。默认情况下,编译器最多可以通过寄存器传递3 3个参数,寄存器传递个参数,寄存器传递参数的具体情况如下表所示。参数的具体情况如下表所示。寄存器传递参数表寄存器传递参数表类类型序号型序号char/1char/1字字节节指指针针in

48、t/2int/2字字节节指指针针Long floatLong float通用指通用指针针1 1R7R7R6R6和和R7R7R4 R7R4 R7R1 R3R1 R32 2R5R5R4R4和和R5R5R4 R7R4 R7R1 R3R1 R33 3R3R3R2R2和和R3R3R1 R3R1 R3 可以用指令可以用指令REGPARMS和和NOREGPARMS说明是否要通过寄存器传说明是否要通过寄存器传递参数。不用寄存器传递参数或传递递参数。不用寄存器传递参数或传递3个以上参数时,个以上参数时,C51编译器会通过固编译器会通过固定地址的存储单元进行参数传递。此外,由于定地址的存储单元进行参数传递。此外,

49、由于bit类型的参数不能用寄存器类型的参数不能用寄存器传递,函数中传递,函数中bit型参数之后的参数都不会用寄存器传递,因此型参数之后的参数都不会用寄存器传递,因此bit型参数应型参数应该在参数列表的最后声明。该在参数列表的最后声明。2 2函数返回值的传递函数返回值的传递 C51C51编译器始终通过寄存器传递函数的返回值,传递返回值的寄编译器始终通过寄存器传递函数的返回值,传递返回值的寄存器如下表所示。存器如下表所示。传递函数返回值所用的寄存器传递函数返回值所用的寄存器返回返回值类值类型型bitbitchar/1char/1字字节节指指针针int/2int/2字字节节指指针针Long floa

50、tLong float通用指通用指针针寄存器寄存器CFCF标标志志R7R7R6R6和和R7R7R4 R7R4 R7R1 R3R1 R3例例1 1:定义函数:定义函数sumsum,实现两个参数求和功能。,实现两个参数求和功能。unsigned unsigned intint sum(unsignedsum(unsigned intint var1,var2);var1,var2);void main()void main()unsigned unsigned intint rltrlt;bgnbgn:rltrlt=sum(100,200);=sum(100,200);gotogoto bgnbg

51、n;unsigned unsigned intint sum(unsignedsum(unsigned intint var1,var2)var1,var2)return(var1+var2);return(var1+var2);在程序开始处添加代码在程序开始处添加代码#pragmapragma REGPARMS REGPARMS,通过寄存器传递参,通过寄存器传递参数,则指令编译后的汇编程序如下:数,则指令编译后的汇编程序如下:代码地址代码地址 机器码机器码 汇编指令汇编指令C:0 x0003 7DC8 MOV R5,#0 xC8C:0 x0003 7DC8 MOV R5,#0 xC8C:0

52、x0005 7C00 MOV R4,#0 x00C:0 x0005 7C00 MOV R4,#0 x00C:0 x0007 7F64 MOV R7,#0 x64C:0 x0007 7F64 MOV R7,#0 x64C:0 x0009 7E00 MOV R6,#0 x00C:0 x0009 7E00 MOV R6,#0 x00C:0 x000B 120020 LCALL sum(C:0020)C:0 x000B 120020 LCALL sum(C:0020)C:0 x000E 8E0A MOV 0 x0A,R6C:0 x000E 8E0A MOV 0 x0A,R6C:0 x0010 8F0B

53、 MOV 0 x0B,R7C:0 x0010 8F0B MOV 0 x0B,R7在程序开始处添加代码在程序开始处添加代码#pragmapragma NOREGPARMS NOREGPARMS,通过存储单元传递,通过存储单元传递参数,则指令编译后的汇编程序如下:参数,则指令编译后的汇编程序如下:代码地址代码地址 机器码机器码 汇编指令汇编指令C:0 x0003 750A00 MOV 0 x0A,#0 x00C:0 x0003 750A00 MOV 0 x0A,#0 x00C:0 x0006 750B64 MOV 0 x0B,#0 x64C:0 x0006 750B64 MOV 0 x0B,#0

54、x64C:0 x0009 750C00 MOV 0 x0C,#0 x00C:0 x0009 750C00 MOV 0 x0C,#0 x00C:0 x000C 750DC8 MOV 0 x0D,#0 xC8C:0 x000C 750DC8 MOV 0 x0D,#0 xC8C:0 x000F 120024 LCALL sum(C:0024)C:0 x000F 120024 LCALL sum(C:0024)C:0 x0012 8E08 MOV 0 x08,R6C:0 x0012 8E08 MOV 0 x08,R6C:0 x0014 8F09 MOV 0 x09,R7C:0 x0014 8F09 M

55、OV 0 x09,R7参数传递情况分析参数传递情况分析例例2:定义中断函数。:定义中断函数。unsignedintintercnt;unsignedcharsecond;voidtimer0(void)interrupt1using3if(+intercnt=4000)second+;intercnt=0;程序编译链接后,汇编程序如下:程序编译链接后,汇编程序如下:代码地址代码地址机器码机器码汇编指令汇编指令C:0 x000B02000ELJMPtimer0(C:000E)/中断向量中断向量/中断程序中断程序timer0,压栈保护函数中使用了的压栈保护函数中使用了的ACC、PSW寄存器寄存器C

56、:0 x000EC0E0PUSHACC(0 xE0)C:0 x0010C0D0PUSHPSW(0 xD0)C:0 x001275D018MOVPSW(0 xD0),#0 x18/修改修改PSW,使用寄使用寄存器组存器组3/省略实现函数功能的代码省略实现函数功能的代码C:0 x002ED0D0POPPSW(0 xD0)C:0 x0030D0E0POPACC(0 xE0)C:0 x003232RETI 4.3.3 C514.3.3 C51函数的调用函数的调用对被调函数的说明对被调函数的说明 :返回值类型返回值类型 被调函数名被调函数名(形参表列形参表列);如如果果被被调调函函数数出出现现在在主主调

57、调函函数数之之后后,在在主主调调函函数数前前应应对对被被调调函函数数作作以以说说明明。如如果果被被调调函函数数出出现现在在主主调调函函数数之之前前,可可以以不不对对被被调调函函数数说说明明。函数调用的形式为:函数调用的形式为:函数名函数名(实际参数表列实际参数表列);实实参参和和形形参参的的数数目目相相等等类类型型一一致致,对对于于无无参参函函数数当当然然不不存存在在实实际际参参数表列。数表列。函数的调用方式有三种函数的调用方式有三种:函函数数调调用用语语句句:即即把把被被调调函函数数名名作作为为调调用用函函数数的的一一个个语语句句;如如fun1fun1()()。被调函数作为表达式的运算对象被

58、调函数作为表达式的运算对象,如如 result=2*get(a,b)result=2*get(a,b)此时此时getget函数中的函数中的a,ba,b应为实参,其以返回值参予式中的运算。应为实参,其以返回值参予式中的运算。被调函数作为另一个数的实际参数被调函数作为另一个数的实际参数 如如 m=max(a,get(a,b)m=max(a,get(a,b);函数函数get(a,b)get(a,b)作为函数作为函数max()max()的一个实际参数。的一个实际参数。4.4 C51 4.4 C51 程序设计程序设计 进行程序设计时,为使程序简明清晰,易于阅读、测试、交流、移进行程序设计时,为使程序简明

59、清晰,易于阅读、测试、交流、移植以及与其他程序连接和共享,通常需采用模块化程序设计方法。植以及与其他程序连接和共享,通常需采用模块化程序设计方法。设计一个实际的应用系统时,通常会创建一个项目,将整个应用程设计一个实际的应用系统时,通常会创建一个项目,将整个应用程序划分为多个功能模块,每个模块完成一个方面的功能,如输入模块、序划分为多个功能模块,每个模块完成一个方面的功能,如输入模块、输出模块、通讯模块等。每个功能模块细分为多个具体的子功能,例如输出模块、通讯模块等。每个功能模块细分为多个具体的子功能,例如串行通讯模块可以细分为初始化、接收一个字节、发送一个字节、接收串行通讯模块可以细分为初始化

60、、接收一个字节、发送一个字节、接收多个字节和发送多个字节等多个具体的子功能模块,每个具体的子功能多个字节和发送多个字节等多个具体的子功能模块,每个具体的子功能定义一个函数实现。定义一个函数实现。利用模块化设计方法简化了编程和调试的难度,提高了程序的复用利用模块化设计方法简化了编程和调试的难度,提高了程序的复用性和灵活性。常用的功能模块可以在其他应用程序中直接使用,避免重性和灵活性。常用的功能模块可以在其他应用程序中直接使用,避免重复开发。复开发。小结小结 本章介绍了本章介绍了C51C51的基本数据类型、存贮类型及对的基本数据类型、存贮类型及对C51C51对单片机内部部件对单片机内部部件的定义等

61、,这些都是利用的定义等,这些都是利用C51C51编单片机程序的基础,都应该掌握并灵活应用,编单片机程序的基础,都应该掌握并灵活应用,只有多编程,多上机才能不断提高编程的能力。如何编写高效的只有多编程,多上机才能不断提高编程的能力。如何编写高效的C51C51程序,程序,通常应注意以下问题:通常应注意以下问题:1.1.定位变量定位变量 经常访问的数据对象放入在片内数据经常访问的数据对象放入在片内数据RAMRAM中,这可在任一种模式中,这可在任一种模式(COMPACT/LARGE)(COMPACT/LARGE)下用输入存贮器类型的方法实现。访问片内下用输入存贮器类型的方法实现。访问片内RAMRAM要

62、比访问要比访问片外片外RAMRAM快得多。在片内快得多。在片内RAMRAM由寄存器组、位由寄存器组、位 数据区、栈和其它由用户用数据区、栈和其它由用户用“datadata”类型定义的变量共享。由于片内类型定义的变量共享。由于片内RAMRAM容量的限制容量的限制(128(128 256256字节,字节,由使用的处理器决定由使用的处理器决定),必须权衡利弊以解决访问效率和这些对象的数量之,必须权衡利弊以解决访问效率和这些对象的数量之间的矛盾。间的矛盾。2.2.尽可能使用最小数据类型尽可能使用最小数据类型 MCS-51MCS-51系列单片机是系列单片机是8 8位机,因此对具有位机,因此对具有“cha

63、rchar”类型的对象的操作类型的对象的操作比比“intint”或或“longlong”类型的对象方便得多。建议尽量使用最小数据类型。类型的对象方便得多。建议尽量使用最小数据类型。C51C51编译器直接支持所有的字节操作,因而如果不是运算符要求,就编译器直接支持所有的字节操作,因而如果不是运算符要求,就不作不作“intint”类型的转换,这可用一个乘积运算来说明,两类型的转换,这可用一个乘积运算来说明,两“charchar”类型类型对象的乘积与对象的乘积与8XX518XX51操作码操作码“MUL ABMUL AB”刚好相符。如果用整型完成同样的刚好相符。如果用整型完成同样的运算,则需调用库函数

64、。运算,则需调用库函数。3.3.只要有可能,使用只要有可能,使用“unsignedunsigned”数据类型数据类型 8XX518XX51单片机的单片机的CPUCPU不直接支持有符号数的运算。因而不直接支持有符号数的运算。因而C51C51编译必须产生编译必须产生与之相关的更多的代码以解决这个问题。如果使用无符号类型,产生的代与之相关的更多的代码以解决这个问题。如果使用无符号类型,产生的代码要少得多。码要少得多。4.4.只要有可能,使用局部函数变量只要有可能,使用局部函数变量 编译器总是尝试在寄存器里保持局部变量。这样,将索引变量编译器总是尝试在寄存器里保持局部变量。这样,将索引变量(如如FORFOR和和WHILEWHILE循环中计数变量循环中计数变量)声明为局部变量是最好的,这个优化步骤只为局声明为局部变量是最好的,这个优化步骤只为局部变量执行。使用部变量执行。使用“unsigned char/unsigned char/intint ”的对象通常能获得最好的结果。的对象通常能获得最好的结果。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!