版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 单片机的C语言编程 4.1 C51的程序结构 4.2 C51的数据类型及运算符 4.3 C51的函数 4.4 C51程序设计,4.1 C51的程序结构,C51程序结构同ANSI C一样,必须有一个主函数main( ),从主函数main( )开始执行程序,默认情况下主函数是一个“死循环”结构,不停地循环执行。 例:C51程序基本结构 在此处定义全局变量;/所有函数都可以使用 void main( )/* 定义主函数*/ 在此处定义局部变量; /只能在本函数范围内使用 bgn: goto bgn; ,单片机上电复位时需对它的硬件环境进行初始化,这部分代码通常是用汇编语言编写,称为启动代码(
2、startup code)。启动代码主要完成以下操作: 将内部和外部数据存储区(即RAM区域)清零; 针对小模式(Small Model)、大模式(Large Model)和紧凑模式(Compact Model)3种不同的存储模式,对可重入(reentrant)堆栈和可重入堆栈指针进行初始化; 初始化单片机的硬件堆栈指针; 初始化全局变量; 跳转到C语言程序的主函数main( )。 汇编语言程序文件后缀为.A51或.asm,其他常用文件后缀与ANSI C规范相同,C语言文件后缀为.c,头文件后缀为.h,库文件后缀为.lib。,4.2 C51的数据类型及运算符 4.2.1 C51的存储类型 4.
3、2.2 C51的存储模式 4.2.3 C51的数据类型 4.2.4 C51的指针 4.2.5 C51对扩展外设的访问 4.2.6 C51的运算符,4.2.1 C51的存储类型 在定义变量时,需要说明变量的存储类型,将变量存放到指定的存储区中。默认存储类型的确定与4.2.2中所述的存储模式有关。 程序存储区 程序存储区中可以存放程序中用到的一些常量。定义时用存储类型标识符code,程序运行过程中不可改变用code定义的变量的值。,数据存储区 根据数据所在存储空间的不同,其定义的类型也不一样。 (1) 内部数据存储区 内部数据存储区分为3种存储类型, data型:变量只能存放在片内数据存储区的低1
4、28字节中可直接访问,存取速度最快。 idata型:变量可存放在整个256字节的片内数据存储区,只能间接访问,存取速度比data型慢。 bdata型:变量存放在可位寻址的内部数据存储区中,可以单独访问字节中的每一位,bdata类型的变量必须定义为全局变量。,(2) 外部数据存储区 外部数据存储区只能间接访问,存取速度比内部数据存储区慢。外部数据存储区有两种不同的存储类型。 xdata型:变量可存放在整个64KB的外部数据存储区中,存取速度最慢。 pdata型:变量只能存放在外部数据存储区的当前页中(一页为256字节),存取速度比xdata型快。间接访问时只需说明变量地址的低8位。,二、存储类型
5、,表 C51存储类型,表 C51存储类型及其大小,4.2.2 C51的存储模式 存储模式用于确定没有明确指定存储类型的变量的默认存储区。C51有3种存储模式 小模式(Small Model):默认的存储区类型为data; 紧凑模式(Compact Model):默认的存储区类型为pdata; 大模式(Large Model):默认的存储区类型为xdata。,4.2.3 C51的数据类型 C51编译器兼容ANSI C,支持ANSI C的基本数据类型,并针对MCS-51系列单片机的特点,对数据类型进行了扩展。 C51支持的ANSI C的数据类型如下表所示。可以定义这些类型的变量、常量和指针。,C5
6、1扩展的数据类型如下表所示,只能定义扩展数据类型的变量和常量。,C-51数据的存储类型 例: 数据类型 存储类型 变量 Char data var1; bit data flags; unsigned char xdata vextor10;,选择变量类型时应尽量选用无符号型,可以减少测试符号的额外操作,可以提高代码效率。 为使编程时书写简化,数据类型允许用缩写,例:#define uchar unsigned char #define ulong unsigned long,4.2.4 C51的指针 C51中定义变量时,需定义数据类型,并说明存储类型。通过指针访问不同存储类型的变量时,所需的
7、地址位数也不完全相同,因此C51具有两种类型的指针:即可指向不同存储区变量的通用指针和指向固定存储区变量的指针。 (1)通用指针 通用指针可以指向任何存储类型的变量。指针占用3个字节,第一个字节说明指针所指变量的存储类型;第二个字节为变量地址的高8位;第三个字节为变量地址的低8位。 (2)指向固定存储区变量的指针 只能指向固定存储区的变量,指针所占的字节数同所指变量的存储区类型有关。指向data、idata、bdata或pdata存储区变量的指针只占一个字节,而指向code或xdata存储区变量的指针需要两个字节。,一、指针与指针变量 变量名对应于内存单元的地址,变量值则是放在内存单元中的数据
8、。同时把存放变量x的地址称为指针,使用指针前也必须定义。 指针的定义: char xdata*dataxp 也可以写成 data char xdata*xp,指针与指针变量的使用 1.指针变量名前面冠以“*”号,如上例*xp,表示xp为指针。 2.定义时,应包括被指变量的数据类型、存储类型以及指针变量本身的存储类型。指针变量本身的存储类型,写在语句的开头,或者在*号与变量名之间。 3.如果只标明被指变量的数据类型和存储类型,而没有指明指针变量本身的存储类型,则指针变量本身被默认为通用型。,指针与指针变量的使用举例 例:定义一字符变量x,并赋值为6 char data x x=6 例:定义一指针
9、xp,指向x所在的内存单元 char data*dataxp xp= unsigned char data var_data=0 x12; unsigned char *ptr; /通用指针ptr存放在默认存储区中 unsigned char * idata iptr; /通用指针iptr存放在idata存储区中 char idata myvar=0 x0a; ptr= ,例:定义指向固定存储区变量的指针。 void main( ) int code HZ=0 x0101; int idata var_data=0 x12; int code *ptr; /指向code存储区的指针ptr, 指
10、针存放在默认存储区 signed int idata * pdata iptr;/指向idata存储区的指针iptr, 指针存放在pdata存储区 int idata myvar=0 xff; ptr= ,4.2.5 C51对扩展外设的访问 MCS-51系列单片机中,外部扩展I/O口与外部数据存储区采用统一编址方式,定义变量访问外部扩展I/O口地址时,需要将变量的存储类型说明为xdata或pdata,并且需要指定变量在存储区中的绝对地址。 定义变量时可以用_at_关键词指定变量的绝对地址,其格式为: 数据类型 存储类型 变量名 _at_ 绝对地址; 其中,存储类型可省略,省略时使用默认的存储类
11、型。定义绝对地址的变量时,该变量必须为全局变量。 例:定义访问外部扩展I/O口的变量。 /定义变量IOPort8,地址0 xe000 volatile unsigned char xdata IOPort8 _at_ 0 xe000; /定义变量IOPort16,地址0 xe004 volatile unsigned int xdata IOPort16 _at_ 0 xe004;,4.2.6 C51的运算符 C51的运算符按功能划分,可分为赋值运算符、算术运算符、关系运算符、逻辑运算符、位操作运算符以及特殊运算符。 (1) 赋值运算符 赋值运算符“=”,用于给变量赋值。 (2)算术运算符 算
12、术运算符有加(+)、减(-)、乘(*)、除(/)、取余(%)以及自加(+)和自减运算符(-),运算规则与ANSI C一致。 (3)关系运算符 关系运算符有等于(=)、不等于(!=)、大于()、大于等于(=)、小于()和小于等于(=)。若满足关系运算条件,则运算结果为逻辑真(即1);否则运算结果为逻辑假(即0)。,(4)逻辑运算符 逻辑运算符有逻辑与( bgn: var1+; /执行后 var1= 28 var2-; /执行后 var2= 30 rlt0=var1+var2; /执行后 rlt0= 58 rlt0=var2-var1; /执行后 rlt0= 2 rlt1=var1*var2; /
13、执行后 rlt1= 840 rlt1=var1/var2; /执行后 rlt1= 0 rlt1=var1%10; /执行后 rlt1= 8 goto bgn; ,例:位运算符的使用。 void main( ) unsigned int var1,var2,result; bgn:var1=0 x5555; var2=0 xaaaa; result=var1 ,4.3 C51的函数 4.3.1 C51函数的定义 4.3.2 C51函数参数传递及返回值传递 4.3.3 C51函数的调用 4.3.4 C51的库函数和宏定义,4.3.1 C51函数的定义 C51中函数的定义格式与ANSI C类似,增加
14、了以下内容: 将函数定义为中断服务子程序; 选择函数所使用的寄存器体; 选择存储模式(memory model); 说明函数是一个可重入函数。 函数定义格式为: 返回值类型 函数名(参数) 存储模式 reentrant interrupt n using n 中的内容为可省略的选项。 返回值类型:没有返回值应声明为void,省略时默认为int。 存储模式:可以为small、compact或 lagre,省略时使用程序设定的存储模式。 reentrant关键字:说明函数为可重入函数。 interrupt n:说明函数是中断类型号n的中断服务子程序。,C51编译器支持32个中断函数,中断类型号为0
15、 31,对应的中断服务程序入口地址如下表所示。,1无参数函数的定义形式 类型标识符 函数名() 函数体语句 类型标识符用来指定函数返回值的类型。无参数函数一般不带返回值,可以不写类型标识符。,例:dis() printf(“okn”); ,2有参数函数的定义形式 类型标识符 函数名(参数列表及说明) 函数体语句,例: intmax(int x,int y) int z; / *函数体语句* if(xy) z=x; elsez=y; return(z);,返回本章首页,4.3.2 C51函数参数传递及返回值传递 (1)函数参数传递 C51编译器在调用函数时,只将函数的返回地址压入堆栈,而通过寄存
16、器或固定地址的存储单元来传递参数。默认情况下,编译器最多可以通过寄存器传递3个参数,寄存器传递参数的具体情况如下表所示。,(2)函数返回值的传递 C51编译器始终通过寄存器传递函数的返回值,传递返回值的寄存器如下表所示。,例:定义函数sum,实现两个参数求和功能。 unsigned int sum (unsigned int var1, var2); void main( ) unsigned int rlt; bgn: rlt=sum(100,200); goto bgn; unsigned int sum(unsigned int var1, var2) return(var1+var2)
17、; ,4.3.3 C51函数的调用 C51中函数调用的语法规则同ANSI C一样,可以通过函数名直接调用函数,也可以通过函数指针间接调用函数。调用函数之前必须先定义或声明函数。 C51中也可以通过指向code存储区的指针实现函数指针的功能。通过函数指针调用函数时,其指令格式为: (返回值类型 (code *) (形参说明) 函数指针) (实参说明),例4.24:通过函数指针调用函数。 int fun_add(int var1, int var2); /声明函数fun_add void main( ) char code *pfun; /定义指向code存储区的指针 int rtn=0; beg
18、in: pfun= (void *)fun_add; /指针pfun指向函数fun_add /通过指针pfun调用函数 rtn=(int (code *)(int,int) pfun) (200,100); goto begin; int fun_add(int var1,int var2) /函数定义 return(var1+var2); ,4.3.4 C51的库函数和宏定义 库函数可以分为本征库函数(intrinsic library functions)和非本征库函数两类。非本征库函数以函数调用的形式执行,而调用本征库函数时,会在函数调用处生成内嵌代码直接执行,内嵌代码比函数调用的执行效
19、率高。 常用库函数有 (1)本征库函数 本征库函数的头文件为intrins.h,包含有循环左移、循环右移、压栈、弹栈、测试位状态等功能的函数。 (2)直接访问存储区的宏定义 C51标准库头文件absacc.h中给出了直接访问指定地址存储单元的宏定义。,(3)字符串操作 头文件string.h中声明了字符串操作函数,包括字符串比较、连接、复制、统计字符串长度、查找指定字符等功能的函数,字符串都有结束符NULL。 (4)字符转换和字符分类 字符转换和字符分类函数的头文件是ctype.h,包括有判断字符是否是数字、小写字母或大写字符的函数,以及将字符串转换为大写字符或小写字符的函数。 (5)数学函数 头文件math.h中包含有常用的一些算术运算函数,如sin、cos函数和求绝对值的abs函数等。,库函数是编译系统提供的标准函数,只需要在程序开始位置用#include语句包含对应的头文件,就可以直接调用库函数。 例:字符串操作函数示例。 #include string.h void main( ) char
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗数据安全人才培养联盟体系
- 胃肠道用药课件
- 医疗数据安全与信息化融合策略
- 胃炎课件文档
- 医疗数据分级分类管理下的权利实现策略
- 肾脏组胚教学课件
- 肾脏原理课件
- 医疗数据共享安全:区块链共识机制
- 2026届吉林省百校联盟高一生物第一学期期末质量跟踪监视模拟试题含解析
- 江苏省射阳县2026届高二生物第一学期期末学业水平测试模拟试题含解析
- 保洁员节前安全培训课件
- 物业防火防盗安全培训课件
- 食用菌种植教学课件
- 年度工伤事故工作总结
- 医药产品知识产权考试题及答案
- 棉花合伙种植合同协议书
- 通信基站施工进度施工工期保证措施
- GB/T 23987.3-2025色漆和清漆实验室光源曝露方法第3部分:荧光紫外灯
- 钻孔桩安全技术
- 2025年中国储备粮管理集团有限公司招聘笔试考点考试题库及答案
- 2025年《社区警务工作规范(试行)》复习测试卷附答案
评论
0/150
提交评论