08 C51程序设计.ppt

上传人:s****8 文档编号:67211400 上传时间:2022-12-24 格式:PPT 页数:38 大小:2.93MB
返回 下载 相关 举报
08 C51程序设计.ppt_第1页
第1页 / 共38页
08 C51程序设计.ppt_第2页
第2页 / 共38页
点击查看更多>>
资源描述

《08 C51程序设计.ppt》由会员分享,可在线阅读,更多相关《08 C51程序设计.ppt(38页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第8章 单片机C语言程序设计 8.1 C51程序设计语言程序设计语言 8.2 C51的运算符和表达式的运算符和表达式 8.3 C51集成开发环境集成开发环境 8.4 单片机单片机C语言应用程序设计实例语言应用程序设计实例 8.5 单片机单片机C语言应用程序设计实验语言应用程序设计实验 8.1 C51程序设计语言8.1.1 标识符与关键字 8.1.2 数据类型 8.1.3 变量的存储种类和存储器类型 8.1.4 绝对地址的访问 8.1.5 中断服务程序 8.1.6 Cx51的库函数 8.1.1 标识符与关键字 Keil Cx51是一种专为8051单片机设计的高级语言C编译器,支持符合ANSI标准

2、的C语言进行程序设计,同时针对8051单片机自身特点作了一些特殊扩展。C语言的标识符标识符是用来标识源程序中某个对象名字的。一个标识符标识符由字符串、数字和下划线等组成,第一个字符必须是字母或下划线。关键字关键字是一类具有固定名称和特定含义的特殊标识符,有时又称为保留字。标识符的命名不要与关键字相同。表表8-1 ANSI C标准的关键字标准的关键字 Keil Cx51编译器除了支持ANSI C标准的关键字外,还根据8051单片机自身特点扩展了如表8-2所示的关键字。表表8-2 Keil Cx51编译器的扩展关键字编译器的扩展关键字 8.1.2 8.1.2 数据类型数据类型 C语言中的基本数据类

3、型有char,int,short,long,float和double等。Keil Cx51编译器除支持标准C语言的数据类型外,还根据8051单片机的特点扩展了bit、sbit、sfr和sfr16数据类型。1bit:位类型:位类型处于片内处于片内RAM的可位寻址区的可位寻址区可以带上存储器类型可以带上存储器类型(data、idata、bdata)bit flag1=0Bit func();如果声明函数时使用了如果声明函数时使用了using n,则不能返回,则不能返回bit类型的值,会编译错误类型的值,会编译错误2sbit:可寻址位:可寻址位可独立寻址访问的位变量;可用于定义内部可独立寻址访问的位

4、变量;可用于定义内部RAM中的可寻址位或中的可寻址位或SFR中的可寻址中的可寻址位位可带可带bdata存储器类型,对应于定义内部存储器类型,对应于定义内部RAM中的可寻址位;中的可寻址位;要求要求sbit+bdata是全局变量是全局变量Sbit定义可位寻址的变量时,要求对象的存储器类型为定义可位寻址的变量时,要求对象的存储器类型为bdata;Sbit类型要指定一个变量作为基地址,通过下述形式获得实际物理位的地址:类型要指定一个变量作为基地址,通过下述形式获得实际物理位的地址:Char bdata ibase;/定义基址变量定义基址变量ibaseSbit bit0=ibase0;/定义定义bit

5、0为为ibase的第的第0位位Sbit bit1=ibase1;/定义定义bit1为为ibase的第的第1位位后面的数值要求后面的数值要求char型对应型对应07;int型对应型对应015;long型对应型对应031sbit SM0=0X9F;3sfr 定义定义8位特殊功能寄存器位特殊功能寄存器使用这两个关键字,可以直接定义8051单片机的特殊功能寄存器如:sfr P1=0 x90;/定义P1寄存器,地址为0 x90Sfr后面必须跟一个标识符作为特殊功能寄存器的名称,等号后面必须是一个常数,不允许运算式;注意地址范围(0 x800 xff)sfr OV=0XD2sfr CY=0XD7sfr16

6、定义定义16位的位的SFR寄存器寄存器,如如DPTRSfr16 T2=0 xcc;/T2L=0 xCC,T2H=0 xCD结合sbit应用(sbit=特殊功能寄存器变量名位的位置)sfr PSW=0XD0;sbit OV=PSW2;sbit CY=PSW7;结合sbit应用2(sbit=字节地址位的位置)sbit OV=0 xD02sbit CY=0XD078.1.3 变量的存储种类和存储器类型 变量在程序执行过程中其值能不断变化。使用一个变量之前,必须进行定义,用一个标示符作为变量名并指出它的数据类型和模式,以便编译系统为它分配相应的存储单元。在Cx51中对变量进行定义的格式如下:存储种类

7、数据类型 存储器类型 变量名表;其中,“存储种类”和“存储器类型”是可选项。变量的存储种类存储种类有四种:自动(auto)、外部(extern)、静态(static)和寄存器(register)省略则由系统省略则由系统的的3模式决定模式决定auto char data kkk表表8-4 Keil Cx51编译器所能识别的存储器类型编译器所能识别的存储器类型应用实例:应用实例:char bdata flag;char data var1;unsigned int pdata var2;char code text=example;系统提供了编译模式的控制命令系统提供了编译模式的控制命令SMALL

8、(所有变量定义在片内RAM,堆栈必须片内;同data存储器类型)COMPACT所有变量定义于分页寻址的片外RAM,每页内地址长度为256低8位地址由R0、R1决定;高8位地址由P2决定同pdataLARGE使用DPTR同xdataDATADATA存储类型存储类型存储类型存储类型直接访问的内部数据存储器直接访问的内部数据存储器RAM的低的低128字节区字节区可一个周期内直接寻址,可一个周期内直接寻址,00H7FH访问速度快访问速度快使用频率高的变量放在data区比较好包含程序变量和堆栈、寄存器组,因此需要留意空间限制包含程序变量和堆栈、寄存器组,因此需要留意空间限制如:如:unsigned ch

9、ar data sys_status=0;BDATABDATA存储类型存储类型存储类型存储类型可位寻址的内部可位寻址的内部RAM20H2FH该区间可以用字节方式,也可以用位方式访问该区间可以用字节方式,也可以用位方式访问不允许不允许在在BDATA段定义段定义float和和double类型的变量类型的变量如:如:unsigned char bdata status_byte;unsigned int bdata status_word;unsigned long bdata status_dword;IDATAIDATA存储类型存储类型存储类型存储类型间接访问的内部间接访问的内部RAM可访问所有

10、的内部存储器空间,可访问所有的内部存储器空间,256个字节个字节必须是间接寻址必须是间接寻址IDATA段也可存放使用频繁的变量,使用寄存器作为指针段也可存放使用频繁的变量,使用寄存器作为指针进行寻址;在寄存器中设置进行寻址;在寄存器中设置8位地址,进行间接寻址。位地址,进行间接寻址。如:如:unsigned char idata sys_status=0;PDATA PDATA 和和和和 XDATA XDATA 存储类型存储类型存储类型存储类型PDATA分页的外部数据存储器;只需要装入8位地址256个字节;使用指令MOVX Rn访问XDATA外部数据存储器,64K字节范围;需要装入16位地址使

11、用MOVX DPTR访问CODECODE存储类型存储类型存储类型存储类型程序存储区的程序存储区的64K字节范围字节范围通过通过MOVC A+DPTR访问访问一定要初始化,否则会得到无关数值;一定要初始化,否则会得到无关数值;存入数据后就无法再更改(ROM区)8.1.4 绝对地址的访问现实需求现实需求:对指定存储器地址访问实际问题:实际问题:地址编译后是浮动地址;解决方法:解决方法:_at_、指针、预定义宏、连接定位控制指令1.采用扩展关键字采用扩展关键字“_at_”或指针定义变量的绝对地址或指针定义变量的绝对地址 在Cx51源程序中定义变量时,可以利用Cx51编译器提供的扩展关键字“_at_”

12、来指定变量的存储器空间绝对地址,一般格式如下:数据类型 存储器类型 标识符 _at_ 地址常数省略则由系统省略则由系统的的3模式决定模式决定可采用数组、结构体可采用数组、结构体等复杂数据类型等复杂数据类型有效绝对地址有效绝对地址绝对变量名绝对变量名例8.1char xdata text256 _at_ 0 xA000;/数组数组int xdata il _at_ 0 x6000;/int变量变量例8.1char xdata text256 _at_ 0 xA000;/数组数组int xdata il _at_ 0 x6000;/int变量变量这样的变量叫做“绝对变量”不能对绝对变量进行初始化函

13、数、bit类型的变量不能用绝对地址定位法绝对变量必须是全局变量函数内部不能采用_at_关键字指定局部变量的绝对地址xdata空间定义的全局绝对变量,还可以在变量前加关键字volatile,保证对该变量的访问不会被编译器优化掉volatile,数据类型声明,声明该变量在程序执行中可以被隐含地改变基于存储器的指针也可以指定变量的存储器绝对地址先定义一个基于存储器的指针变量,对该变量赋予绝对地址先定义一个基于存储器的指针变量,对该变量赋予绝对地址例8.2 利用基于存储器的指针进行变量的绝对地址定位char xdata temp _at_ 0 x4000;/定义全局变量temp,指定地址void ma

14、in(void)char xdata*xdp;/定义指针,xdata存储类型char data*dp;/定义指向data存储空间的指针xdp=0 x2000;/xdata指针赋值,指向绝对地址temp=*xdp;/把xdata空间地址0 x2000送入0 x4000*xdp=0 xAA;/把数据0 xAA送入0 x4000dp=0 x40;/data指针赋值,指向data存储器地址40H*dp=0 xCC;/将数据0 xCC送入40H 2.采用预定义宏指定变量的绝对地址Cx51编译器的运行库中提供了如下一套预定义宏:CBYTE CWORD FARRAY DBYTE DWORD FCARRAY

15、PBYTE PWORD FCVAR XBYTE XWORD FVAR上述宏定义用来对8051系列单片机的存储空间进行绝对地址访问CBYTE寻址寻址CODE区区DBYTE寻址寻址DATA区区PBYTE寻址分页寻址分页XDATA区区XBYTE寻址寻址XDATA区区这些宏定义包含在文件“ABSACC.H”中#includechar a_var;int b_var;XBYTE0X14 =a_var;写入数据到xdata地址0 x0014b_var=XWORD0 x100;从xdata 地址0 x0200中读取数据3.采用连接定位控制命令指定变量的绝对地址 BL51和Lx51连接定位器提供了多个连接定位

16、控制命令,在对用户程序进行连接的时候,可以通过连接定义控制命令连接定义控制命令指定变量的绝对地址。关于连接定位控制命令请参看keil Cx51编译器帮助手册。8.1.5 中断服务程序为了能在C语言源程序中直接编写中断服务函数,Keil Cx51编译器对函数的定义进行了扩展,增加了一个扩展关键字interrupt,它是函数定义时的一个选项,加上这个选项即可以将一个函数定义成中断服务函数。定义中断服务函数的一般形式为:函数类型函数类型 函数名函数名(形式参数)(形式参数)interrrupt nusing m关键字interrupt后面的n是中断号,n的取值范围为131。对于对于51系列,取值范围

17、为系列,取值范围为04,共5个中断;具体的中断地址计算方法是addr=n*8+3m的值表示工作寄存器区,因此范围是03m和和n都不允许带运算符的表达式都不允许带运算符的表达式要求常数要求常数interrupt关键词关键词不允许用于外部函数进入中断函数时,特殊功能寄存器中的ACC、B、DPH、DPL和PSW将被保存入栈;如果不使用using关键字切换工作寄存器,会将中断函数里所有用到的全部工作寄存器入栈保存;并在退出函数前出栈恢复;using关键字关键字在函数的入口处将当前工作寄存器组保护到堆栈;指定的工作寄存器内容不会改变,推出函数前会把受保护的工作寄存器组出栈恢复8.1.6 Cx51的库函数

18、 Cx51标准库提供的包含文件在INC子目录下,这些文件包含常数、宏定义、类型定义和函数原型。ABSACC.H文件包含允许直接访问8051不同存储区的宏定义。CTYPE.H文件包含对ASCII字符分类和字符转换的程序和原型。MATH.H文件包含所有浮点数运算程序的原型和定义,其他数学函数也在这个文件中。STDIO.H文件包含I/O程序的原型和定义,并定义了EOF常数。STDLIB.H文件包含下面类型转换和存储区分配程序的原型和定义,也定义了NULL常数。8.2 C51的运算符和表达式8.2.1 赋值运算符8.2.2 算术运算符8.2.3 关系运算符8.2.4 逻辑运算符8.2.5 位运算符8.

19、2.6 复合运算符8.2.7 指针和地址运算符8.2.1 赋值运算符在C语言中,符号“=”是赋值运算符。它的作用是将一个数据的值赋给一个变量,利用赋值运算符将一个变量与一个表达式连接起来的式子称为赋值表达式。赋值语句的格式如下:变量=表达式;x=5;/*将常数5赋给变量x*/x=y=6;/*将常数6赋给变量x和y*/注意:在使用赋值运算符“=”时应注意不要与关系运算符“=”相混淆8.2.2 算术运算符 C语言中的算术运算符有:+加或取正值运算符 -减或取负值运算符 *乘运算符 /除运算符%取余运算符 加、减、乘、除为双目运算符,对于加、减和乘法符合一般的算术运算规则。除法运算,如果是两个整数相

20、除,其结果为整数,舍去小数部分。取余运算要求两个运算对象均为整形数据;取正值和取负值为单目运算符。用算术运算符将运算对象连接起来的式子即为算术表达式。算术运算的一般形式为:表达式1 算术运算符 表达式2 C语言中规定了运算符的优先级和结合性。在求一个表达式的值时,要按运算符的优先级别进行。算术运算符中取负值(-)的优先级最高,其次是乘法(*)。除法(/)和取余(%)运算符,加法(+)和减法(-)运算符的优先级最低。如果在一个表达式中各个运算符的优先级别相同,则计算时按“从左至右”规则进行。8.2.3 关系运算符 C语言中有6种关系运算符:大于 =大于等于 y、x+yz、(x=3)(y=4)都是

21、合法的关系表达式。关系运算符通常用来判别某个条件是否满足,关系运算的结果只有0和1两种值。8.2.4 逻辑运算符 C语言中有3种逻辑运算符:|逻辑或&逻辑与!逻辑非 逻辑运算的一般形式为:逻辑与:条件式1&条件式2逻辑或:条件式1|条件式2逻辑非:!条件式 逻辑运算符的优先级为(由高至低):!(非)&(与)|(或),即逻辑非的优先级最高。8.2.5 位运算符能对运算对象按位操作是C语言的一大特点,正是由于这一特点使C语言具有了汇编语言的一些功能,从而使之能对计算机的硬件直接进行操作。C语言中共有6种位运算符:按位取反 右移&按位与|按位或 按位异或位运算的一般形式如下:变量1 位运算符 变量2

22、8.2.6 复合运算符在赋值运算符“=”的前面加上其他运算符,就构成了复合赋值运算符:+=加法赋值-=减法赋值*=乘法赋值/=除法赋值%=取模赋值=右移位赋值&=逻辑与赋值!=逻辑或赋值 =逻辑异或赋值=逻辑非赋值 复合运算的一般形式为:变量 复合赋值运算符 表达式 8.2.7 指针和地址运算符C语言提供了两个专门的运算符:*取内容&取地址取内容和取地址运算的一般形式分别为:变量=*指针变量指针变量=&目标变量 取内容运算的含义是将指针变量所指向的目标变量的值赋给左边的变量;取地址运算的含义是将目标变量地址赋给左边的变量。补:函数的重入补:函数的重入补:函数的重入补:函数的重入51的函数参数和

23、局部变量是存储在固定的地址单元中,因的函数参数和局部变量是存储在固定的地址单元中,因此不能重入,因此不可被递归调用或同时被多个进程调用;此不能重入,因此不可被递归调用或同时被多个进程调用;不能应用导致递归调用的结构不能应用导致递归调用的结构但是,如果声明函数的后面带上关键词但是,如果声明函数的后面带上关键词reentrant,就可以,就可以具备重入功能,可以用于递归具备重入功能,可以用于递归如:如:int calc(char I,int b)reentrantint x;x=tablei;return(x*b);补充例题补充例题补充例题补充例题1 1补充例题补充例题补充例题补充例题2 2补充例题补充例题补充例题补充例题3 3中断方式中断方式补充例题补充例题补充例题补充例题4 4

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com