计控第2章单片机C语言编程.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《计控第2章单片机C语言编程.ppt》由会员分享,可在线阅读,更多相关《计控第2章单片机C语言编程.ppt(55页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第二章单片机的C语言编程2.1概述2.2C51程序结构2.3C51的数据类型与运算符2.4C51的函数2.5C51的硬件编程2.1C51概述51系列单片机支持三种高级语言,即PL/M,C和BASIC。C语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,并具有良好的程序结构,适用于各种应用的程序设计,是目前使用较广的单片机编程语言。MCS-51系列单片机采用的C语言,简称C51。C51符合C语言的ANSI标准,并根据单片机的特性进行了扩展。C51所产生的目标代码短、运行速度高、所需存储空间小。注:注:1.1.在实际的系统设计中,当设计对象只是一个小的嵌入式系统时,汇编在实际的系统设
2、计中,当设计对象只是一个小的嵌入式系统时,汇编语言是一个很好的选择,因为代码一般都不超过语言是一个很好的选择,因为代码一般都不超过8K8K,而且都比较简单;,而且都比较简单;2.2.当一个系统对时钟要求很严格时,使用汇编语言成了唯一的方法。当一个系统对时钟要求很严格时,使用汇编语言成了唯一的方法。2.2C51的程序结构同ANSIC一样,C51的程序由一个个函数组成,这里的函数和其他语言的“子程序”或“过程”具有相同的意义。必须有一个主函数main(),程序的执行从main()函数开始,调用其他函数后返回主函数main(),最后在主函数中结束整个程序而不管函数的排列顺序如何。功能函数可以是C51
3、语言提供的库函数,也可以是用户自定义的函数。组成结构:预处理语句预处理语句全局变量说明全局变量说明 /*可被各函数引用*/main()main()/*主函数*/局部变量说明局部变量说明 /*只在本函数引用*/执行语句执行语句(包括函数调用语句包括函数调用语句)fun1(fun1(形式参数表形式参数表)/*函数1*/形式参数说明形式参数说明 局部变量说明局部变量说明 执行语句执行语句(包括调用其他函数语句包括调用其他函数语句)funnfunn(形式参数表形式参数表)/*函数n*/形式参数说明形式参数说明 局部变量说明局部变量说明 执行语句执行语句 C语言的语句规则:1.每个变量必须先说明后引用,
4、变量名英文大小写是有差别的。2.C语言程序一行可以书写多条语句,但每个语句必须以“;”结尾,一个语句也可以多行书写。3.C语言的注释用/*/或/表示。4.“”花括号必须成对,位置随意,可在紧挨函数名后,也可另起一行,多个花括号可以同行书写,也可逐行书写,为层次分明,增加可读性,同一层的“”花括号对齐,采用逐层缩进方式书写。2.3C51的数据类型与运算符2.3.1C512.3.1C51的存储类型的存储类型51系列单片机的内存区域被分为两大类。一类是程序存储区,即ROM;另一类是数据存储区,包括内部数据存储区和外部数据存储区。内部数据存储区中又包含了51单片机的特殊功能寄存器。1数据存储区1)内部
5、数据存储区dataidatabdata2)外部数据存储区xdatapdata2程序存储器code存储类型存储类型存储位置存储位置 位位 数数 范围范围DATADATA直接寻址片内直接寻址片内RAMRAM的的00007FH7FH地址地址8 80 0127127BDATABDATA片内片内RAMRAM的可位寻址的可位寻址20202FH2FH地址地址8 8、1 10 0127127(位)(位)IDATAIDATA间接寻址片内间接寻址片内RAMRAM的的0000FFHFFH地址地址8 80 0255255PDATAPDATA寻址外部寻址外部RAMRAM,使用指令,使用指令MOVX MOVX A,RiA
6、,Ri8 80 0255255XDATAXDATA使用使用DPTR DPTR 寻址外部寻址外部RAMRAM16160 06553565535CODECODE使用使用DPTR DPTR 寻址程序存储器寻址程序存储器16160 065535655355151系列系列单片机的存片机的存储区区类型型 2.3C51的数据类型与运算符2.3.2C512.3.2C51的数据类型的数据类型无论哪种数据都是存放在存贮单元中的,每一个数据究竟要占用几个单元(即数据的长度)都要提供给编译系统,编译系统以此为根据预留存贮单元,这就是定义数据类型的意义。C51支持ANSIC的所有标准数据类型,并在此基础上增设了位型及特
7、殊功能寄存器类型。2.3C51的数据类型与运算符2.3.2C512.3.2C51的数据类型的数据类型1.C51的数据类型2.常量与变量C51支持的数据有常量、变量、指针。存储时先高后低原则;常量位置与定义说明有关,一般放在程序存储区code。1)常量整型常量、实型常量、字符常量、字符串常量、符号常量。符号常量在使用前必须先定义,格式为:#define标识符常量/是C51的预处理指令2)变量定义变量的一般格式:存储模式数据类型存储器类型变量名;变量说明举例char var;/*字符变量var,存储类型由编译模式确定*/char code MSG=PARAMETER:;/*字符数组MSG 定位在程
8、序存贮区*/unsigned long xdata array100;/*无符号长型数组定位在片外RAM区,每元素占4bytes*/float idata x,y,z;/*实型变量x,y,z,定位在片内用间址访问的内部RAM区*/bit lock;/*位变量Lock,由编译器定位*/unsigned int pdata sion;/*无符号整型变量sion定位在外部RAM*/unsigned char xdata vector10 4 4/*无符号字符型三维数组,定位在片外RAM区*/sfr P0=0 x80;/*定义P0口,地址为80H*/char bdata flags;/*字符变量fla
9、gs定位在可位寻址内部RAM区*/sbit flag0=flags0;/*定义flag0为flags.0*/说明:1.字符型(char)、整型(int)和长整型(long)均有符号型(signed)和无符号型(unsigned)两种,如果不是必须,尽可能选择unsigned型,这将会使编译器省却符号位的检测,使生成的程序代码比signed类型短得多。2.程序编译时,C51编译器会自动进行类型转换,当运算符两边为不同类型的数据时,编译器先将低级的数据类型转换为较高级的数据类型,运算后,运算结果为高级数据类型。3.bit和sbit都是C51扩展的变量类型。bit用来定义一个普通位变量(0或1),编
10、译器在编译过程中分配地址,除非指定否则这个地址随机分布在整个可寻址空间中。所有可位寻址的位都可由sbit指定,这包括可位寻址区和SFR中的位。4.如果在变量说明时略去存贮器类型标志符,编译器会自动选择默认的存贮器类型。(1)关于指针型变量在汇编语言程序中,要取存贮单元m的内容可用直接寻址方式,也可用寄存器间接寻址方式。如果用R1寄存器指示m的地址,则用R1取m单元的内容。相对应的在C语言中用变量名表示取变量的值(相当于直接寻址),也可用另一个变量(如P)存放m的地址,P就相当于R1寄存器。用*P取得m单元的内容(相当于汇编的间接寻址方式)这里P即为指针型变量。下面表格表示两种语言将m单元的内容
11、送n单元的对照语句。注:注:上表省略了汇编语言程序中对符号地址上表省略了汇编语言程序中对符号地址n和和m用用EQU伪指令进行具体地址定义的伪指令进行具体地址定义的 语句以及语句以及C语言对变量语言对变量n、m和指针变量和指针变量P进行类型定义的语句,实际程序设计中,此进行类型定义的语句,实际程序设计中,此步是不可步是不可 缺少的。表中缺少的。表中&为取地址运算符,为取地址运算符,*为取内容运算符。为取内容运算符。汇编语言和汇编语言和C语言的对照语言的对照表表直接寻址间接寻址汇编语言C语言汇编语言C语言movn,m传送语句n=m;赋值语句movR1,#m;m的地址送R1movn,R1;m的内容送
12、nP=&m/*m的地址送P*/n=*P/*m的内容送n*/2.3C51的数据类型与运算符2.3.3C512.3.3C51的指针的指针说明:1.在C语言中,为了能够实现直接对内存单元进行操作,引入了指针类型的数据。一个变量的地址就称为该变量的指针。2.如果有一个变量专门用来存放另一个变量的地址,则称之为指针变量。一个指针变量存放的内容是另一个变量在内存中的地址,每一个变量都有它自己的指针(地址)。3.C语言中用“*”表示“指向”。如:整型变量i的地址存放在指针变量ip中,则i=0 x50;*ip=0 x50;都是给同一个变量赋值。4.区分“&”和“*”运算符。(2)指针型数据的类型 由于C51是
13、结合51单片机硬件的,51单片机的不同存贮空间,有不同的地址范围,即使对于同一外部数据存贮器,又有用Ri寻址(Ri为八位)和用DPTR寻址(DPTR为十六位)两种寻址方式,而指针本身也是一个变量,有它存放的存贮区和数据长度。因此,在指针类型的定义中要说明:被指的变量的数据类型和存贮类型;指针变量本身的数据类型(占几个字节)和存贮类型(即指针本身存放在什么存贮区)。指针类型的定义形式如下:数据类型 存储器类型1*存储器类型2 标识符;指针类型指针类型(存存储器类型储器类型1)大小大小通用指针通用指针3 BytesXDATA 指针指针2 BytesCODE 指针指针2 BytesIDATA 指针指
14、针1 ByteDATA 指针指针1 BytePDATA 指针指针1 ByteC51C51各类指针类型和其占用字节大小各类指针类型和其占用字节大小“存储器类型存储器类型2”2”选项用于指定指针本身的存储器空间。选项用于指定指针本身的存储器空间。指向不同存储区变量的通用指针指针能适用于指向任何存贮空间,此时指针长度为3字节,第一字节表示存贮器类型编码,第二、三字节分别表示所指地址的高位和低位。unsigned char *ptr;/通用指针ptr,指针存放在默认存储区unsigned char *idata iptr;/通用指针iptr,指针存放在idata存储区指向固定存储区变量的指针定义为da
15、ta或idata,表示指针指向内部数据存贮器;定义为pdata,表示指针指向外部数据存贮器,用Ri间址。以上均为八位地址;定义为类型code/xdata,表示指针指向外部程序存贮器或外部数据存贮器指针,本身(即被指示地址)应为十六位长度。int code*ptr;/指向code存储区的指针ptr,指针存放在默认存储区 int idata *pdata iptr;/指向idata存储区的指针iptr,指针存放在pdata存储区指针变量说明:longxdata*px;/*指针px指向xdata区的long型(每个数据占四个单元)变量,指针自身在编译模式默认的存贮区,指针长度为2个字节*/charx
16、data*datapd;/*指针pd指向xdata区的字符型变量,自身在data区,指针长度为2个字节*/datacharxdata*pd;/*与上例等效*/dataint*pn;(和int*datapn及int*pn等效)/*定义一个类型为int型的通用型指针,指针自身在data区,长度为3字节*/在上例的指针声明中包含如下几个内容:1)指针变量名(如px)前面冠以“*”,表示px为指针型变量,此处*不带取内容之意。2)指针指向的存贮类型,即指向哪个存贮区,它决定了指针本身的长度(见数据类型表)。存贮类型声明的位置在数据类型和指针名(如*px)之间,如无此项声明,则此指针型变量为通用型。3)
17、指针指向的存贮区的数据类型,即被指向的存贮区以多少个单元作一个数据单位,当程序通过指针对该区操作时,将按此规定的单元个数的内容作为一个数据操作。4)指针变量自身的存贮类型,即指针处于什么区与自身的长度无关,该声明可位于声明语句的开头,也可在“*”和变量名之间。此项由编译模式放在默认区,如无规定编译模式,通常在data区。1.特殊功能寄存器SFR定义C51提供了一种自主形式的定义方式,使用特定关键字sfr如sfrSCON=0 x98;/*串行通信控制寄存器地址98H*/sfrTMOD=0 x89;/*定时器模式控制寄存器地址89H*/sfrACC=0 xe0;/*A累加器地址E0H*/sfrP1
18、=0 x90;/*P1端口地址90H*/定义了以后,程序中就可以直接引用寄存器名。C51也建立了一个头文件reg51.h(增强型为reg52.h),在该文件中对所有的特殊功能寄存器的进行了sfr定义,对特殊功能寄存器的有位名称的可寻址位进行了sbit定义,因此,只要用包含语句#include,就可以直接引用特殊功能寄存器名,或直接引用位名称。要特别注意:在引用时特殊功能寄存器或者位名称必须大写。sfr和sbit只能在函数外使用,一般放在程序的开头。2.3C51的数据类型与运算符2.3.4C512.3.4C51的硬件资源定义的硬件资源定义2.对位变量的定义 C51对位变量的定义有三种方法:将变量
19、用bit类型的定义符定义为bit类型:如 bit mn;mn为位变量,其值只能是“0”或“1”,其位地址由C51任意分配。采用字节寻址变量.位的方法:如 bdata int ibase;/*ibase定义为整型变量*/sbit mybit=ibase15;/*mybit定义为ibase的D15位*/这里位是运算符“”相当于汇编中的“.”,其后的最大取值依赖于该位所在的字节寻址变量的定义类型,如定义为char最大值只能为7。对特殊功能寄存器的位的定义 方法1:使用头文件及sbit定义符;多用于无位名的可寻址位。例如#include sbit P1_1=P11;/*P1_1为P1口的第1位*/sb
20、it ac=ACC7;/*ac定义为累加器A的第7位*/方法2:使用头文件reg51.h,再直接用位名称。例如#include RS1=1;RS0=0;方法3:字节地址位表示 例如 sbit CY=0 xd07;方法4:用位地址表示 例如 sbit CY=0 xd7;方法5:用寄存器名.位定义 例如 sfr PSW=0 xd0;/*定义PSW地址为d0H*/sbit CY=PSW7;/*CY为PSW.7*/3.C51对存贮器和外接I/O口的绝对地址访问和定义对存贮器的绝对地址访问利用绝对地址访问的头文件absacc.h可对不同的存贮区进行访问。该头文件的函数有:CBYTE(访问code区字符型
21、)DBYTE(访问data区字符型)PBYTE(访问pdata或I/O区字符型)XBYTE(访问xdata或I/O区字符型)还有CWORD、DWORD、PWORD和XWORD四个函数,它们的访问区域同上,只是访问的类型为int型。例:#include#definecomXBYTE0 x07ff那么后面程序com变量出现的地方,就是对地址为07ffH的外部RAM或I/O口进行访问。例:XWORD0=0 x9988;即将9988H(int类型)送入外部RAM的0号和1号单元。使用中要注意:absacc.h一定要包含进程序,XWORD必须大写。对外部I/O口的访问由于单片机的I/O口和外部RAM统一
22、编址,因此对I/O口地址的访问可用XBYTE(MOVXDPTR)或PBYTE(MOVXRi)进行。例:#include“absacc.h”#definePAXBYTE0 xffec/将PA定义为外部I/O口,地址0FFECH#defineNAMEDBYTE0 x40/将NAME定义为片内RAM,地址40Hvoidmain(void)PA=0 x3a;NAME=0 x01;对绝对地址的定义定义变量时,使用_at_关键词指定变量的绝对地址,格式为:存储类型数据类型变量名_at_绝对地址;例:dataunsignedcharx1_at_0 x40;/在data区定义字节变量x1,它的地址为40Hxd
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计控第 单片机 语言 编程
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内