收藏 分享(赏)

08 C51程序设计.ppt

上传人:11xg27ws 文档编号:5786086 上传时间:2019-03-17 格式:PPT 页数:38 大小:2.93MB
下载 相关 举报
08 C51程序设计.ppt_第1页
第1页 / 共38页
08 C51程序设计.ppt_第2页
第2页 / 共38页
08 C51程序设计.ppt_第3页
第3页 / 共38页
08 C51程序设计.ppt_第4页
第4页 / 共38页
08 C51程序设计.ppt_第5页
第5页 / 共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标准的C语言进行程序设计,同时针对8051单片机自身特点作了一些特殊扩展。C语言的标识符是用来

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

3、bit、sbit、sfr和sfr16数据类型。 1bit:位类型 处于片内RAM的可位寻址区 可以带上存储器类型(data、idata、bdata) bit flag1=0 Bit func(); 如果声明函数时使用了using n,则不能返回bit类型的值,会编译错误 2sbit:可寻址位 可独立寻址访问的位变量;可用于定义内部RAM中的可寻址位或SFR中的可寻址位 可带bdata存储器类型,对应于定义内部RAM中的可寻址位; 要求sbit+bdata是全局变量 Sbit定义可位寻址的变量时,要求对象的存储器类型为bdata; Sbit类型要指定一个变量作为基地址,通过下述形式获得实际物理位

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

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

6、应的存储单元。 在Cx51中对变量进行定义的格式如下:存储种类 数据类型 存储器类型 变量名表;其中,“存储种类”和“存储器类型”是可选项。 变量的存储种类有四种: 自动(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(所

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

8、以用位方式访问 不允许在BDATA段定义float和double类型的变量 如: unsigned char bdata status_byte; unsigned int bdata status_word; unsigned long bdata status_dword;,IDATA存储类型,间接访问的内部RAM 可访问所有的内部存储器空间,256个字节 必须是间接寻址 IDATA段也可存放使用频繁的变量,使用寄存器作为指针进行寻址;在寄存器中设置8位地址,进行间接寻址。 如: unsigned char idata sys_status=0;,PDATA 和 XDATA 存储类型,PD

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

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

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

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

13、定义用来对8051系列单片机的存储空间进行绝对地址访问 CBYTE寻址CODE区 DBYTE寻址DATA区 PBYTE寻址分页XDATA区 XBYTE寻址XDATA区 这些宏定义包含在文件“ABSACC.H”中,#include char a_var; int b_var; XBYTE0X14 =a_var ;写入数据到xdata地址0x0014 b_var=XWORD0x100 ;从xdata 地址0x0200中读取数据 3.采用连接定位控制命令指定变量的绝对地址BL51和Lx51连接定位器提供了多个连接定位控制命令,在对用户程序进行连接的时候,可以通过连接定义控制命令指定变量的绝对地址。关

14、于连接定位控制命令请参看keil Cx51编译器帮助手册。,8.1.5 中断服务程序,为了能在C语言源程序中直接编写中断服务函数,Keil Cx51编译器对函数的定义进行了扩展,增加了一个扩展关键字interrupt,它是函数定义时的一个选项,加上这个选项即可以将一个函数定义成中断服务函数。 定义中断服务函数的一般形式为:函数类型 函数名(形式参数)interrrupt nusing m 关键字interrupt后面的n是中断号,n的取值范围为131。对于51系列,取值范围为04,共5个中断;具体的中断地址计算方法是addr=n*8+3 m的值表示工作寄存器区,因此范围是03 m和n都不允许带

15、运算符的表达式,要求常数,interrupt关键词 不允许用于外部函数 进入中断函数时,特殊功能寄存器中的ACC、B、DPH、DPL和PSW将被保存入栈; 如果不使用using关键字切换工作寄存器,会将中断函数里所有用到的全部工作寄存器入栈保存;并在退出函数前出栈恢复; using关键字 在函数的入口处将当前工作寄存器组保护到堆栈;指定的工作寄存器内容不会改变,推出函数前会把受保护的工作寄存器组出栈恢复,8.1.6 Cx51的库函数,Cx51标准库提供的包含文件在INC子目录下,这些文件包含常数、宏定义、类型定义和函数原型。ABSACC.H文件包含允许直接访问8051不同存储区的宏定义。CTY

16、PE.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.2.6 复合运算符 8.2.7 指针和地址运算符,8.2.1 赋值运算符,在C语言中,符号“=”是赋值运算符。它的作用是将一个数据的值赋给一个变量,

17、利用赋值运算符将一个变量与一个表达式连接起来的式子称为赋值表达式。赋值语句的格式如下:变量=表达式;x=5; /*将常数5赋给变量x*/x=y=6; /*将常数6赋给变量x和y*/注意:在使用赋值运算符“=”时应注意不要与关系运算符“= =”相混淆,8.2.2 算术运算符,C语言中的算术运算符有:+ 加或取正值运算符- 减或取负值运算符* 乘运算符/ 除运算符% 取余运算符加、减、乘、除为双目运算符,对于加、减和乘法 符合一般的算术运算规则。除法运算,如果是两个整数相除,其结果为整数,舍去小数部分。取余运算要求两个运算对象均为整形数据;取正值和取负值为单目运算符。,用算术运算符将运算对象连接起

18、来的式子即为算术表达式。算术运算的一般形式为: 表达式1 算术运算符 表达式2C语言中规定了运算符的优先级和结合性。在求一个表达式的值时,要按运算符的优先级别进行。算术运算符中取负值(-)的优先级最高,其次是乘法(*)。除法(/)和取余(%)运算符,加法(+)和减法(-)运算符的优先级最低。如果在一个表达式中各个运算符的优先级别相同,则计算时按“从左至右”规则进行。,8.2.3 关系运算符,C语言中有6种关系运算符: 大于= 大于等于= 小于等于= = 等于! = 不等于前4种关系运算符具有相同的优先级,后两种关系运算符也具有相同的优先级;但前4种的优先级高于后2种。,关系表达式的一般形式为:

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

20、符: 按位取反 右移& 按位与| 按位或 按位异或 位运算的一般形式如下:变量1 位运算符 变量2,8.2.6 复合运算符,在赋值运算符“=”的前面加上其他运算符,就构成了复合赋值运算符:+= 加法赋值 -= 减法赋值*= 乘法赋值 /= 除法赋值 %= 取模赋值 = 右移位赋值 &= 逻辑与赋值 != 逻辑或赋值 = 逻辑异或赋值= 逻辑非赋值复合运算的一般形式为:变量 复合赋值运算符 表达式,8.2.7 指针和地址运算符,C语言提供了两个专门的运算符:* 取内容& 取地址 取内容和取地址运算的一般形式分别为:变量 = *指针变量指针变量 = &目标变量取内容运算的含义是将指针变量所指向的目标变量的值赋给左边的变量;取地址运算的含义是将目标变量地址赋给左边的变量。,补:函数的重入,51的函数参数和局部变量是存储在固定的地址单元中,因此不能重入,因此不可被递归调用或同时被多个进程调用; 不能应用导致递归调用的结构 但是,如果声明函数的后面带上关键词reentrant,就可以具备重入功能,可以用于递归 如: int calc(char I,int b)reentrant int x; x=tablei; return(x*b); ,补充例题1,补充例题2,补充例题3,中断方式,补充例题4,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报