版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于汇编与C语言的单片机原理及应用,第4章 Keil C51程序设计,基于汇编与C语言的单片机原理及应用,2,主要内容:,4.1 Keil C51编程语言,Keil C51(由美国Keil Software 公司推出)是目前最流行的51系列单片机C语言软件开发平台,具有程序的编辑、编译、连接、目标文件格式转换、调试和模拟仿真等功能。C51是其中的一个编译器,它具有ANSIC标准C所有的功能,并针对51系列单片机的硬件特点做了扩展。本章首先介绍了Keil Vision4的使用方法,随后对标准C的基本语法做了概括性的介绍,重点阐述了C51的扩展功能,使具有C语言基础的读者能尽快掌握C51程序的编写
2、方法。,基于汇编与C语言的单片机原理及应用,3,4.1.1 Keil C51的简介,Keil C51语言是在ANSI C的基础上针对51单片机的硬件特点进行的扩展,并向51单片机上移植,经过多年努力,C51语言已经成为公认的高效、简洁而又贴近5 1单片机硬件的实用高级编程语言。 目前大多数的51单片机用户都在使用C51语言来进行程序设计。用C51进行单片机软件开发,有如下优点:,基于汇编与C语言的单片机原理及应用,4,4.1.1 Keil C51的简介,(1)可读性好。 (2)模块化开发与资源共享。 (3)可移植性好。 (4)代码效率高。,基于汇编与C语言的单片机原理及应用,5,4.1.2 K
3、eil C51的开发环境,Keil公司目前已推出V7.0以上版本的C51编译器,为5 1单片机软件开发提供了全新的C语言环境,同时保留了汇编代码高效、快速的特点。现在,Keil C51已被完全集成到一个功能强大的全新集成开发环境(IDE) Vision4中,该环境下集成了文件编辑处理、编译链接、项目管理、窗口、工具引用和仿真软件模拟器以及Monitor51硬件目标调试器等多种功能,这些功能均可在Keil Vision4环境中极为简便地进行操作。 本章用到Keil C51和Keil Vision4两个术语。分别是51单片机编程所用的C语言和51单片机的C51程序编写、调试的集成开发环境。,基于汇
4、编与C语言的单片机原理及应用,6,4.1.3 Keil Vision4 初步应用方法,使用汇编语言或C语言要用到编译器,以便把写好的程序编译为机器码,随后才能把HEX可执行文件写入单片机内。Keil uVision4是众多单片机应用开发软件中最新、最优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,甚至ARM系统,它集编辑,编译,仿真等多种功能于一体,它的界面和常用的微软VC+的操作界面相似,人机交互友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。,基于汇编与C语言的单片机原理及应用,7,建立第一个Keil Vision4 C语言项目运行Keil Vision4 的首个画面:
5、,基于汇编与C语言的单片机原理及应用,8,(1)在Project菜单,选择弹出的下拉式菜单中的New Project,创建新的Vision项目。注意,这里的项目文件扩展名是uvproj。 (2)选择所要的单片机,这里我们选择常用的MCU单片机芯片是Ateml公司的AT89C51。 (3)创建新的程序文件如例4-1的串口输出字符串“Hello World!”程序。,基于汇编与C语言的单片机原理及应用,9,基于汇编与C语言的单片机原理及应用,10,【例4-1】串口输出字符串“Hello World!”,#include #include void main(void) SCON = 0 x50;
6、/串口方式1,允许接收 TMOD = 0 x20; /定时器1定时方式2 TCON = 0 x40; /设定时器1开始计数 TH1 = 0 xE8; /11.0592MHz 1200波特率 TL1 = 0 xE8; TI = 1; TR1 = 1; /启动定时器 while(1) printf (Hello World!n); /显示Hello World! ,基于汇编与C语言的单片机原理及应用,11,(4)保存新建的C语言程序,可以用File菜单的Save或快捷键Ctrl+S进行保存。如图4-3所示,我们把第一个程序命名为example801.c,保存在项目所在的目录中。如图4-3鼠标在屏幕
7、左边project项目区域中的Target 1 ,点击其左侧的+号;然后,在Source Group1文件夹图标上右击弹出菜单,在这里可以实现在项目中增加减少文件等操作。我们点击Add File to Group Source Group 1弹出文件窗口,选择刚刚保存的example801.c文件,按ADD按钮,实现添加example801.c文件到项目工程,如图4-4所示;然后,点击CLOSE按钮,实现关闭文件窗口并退出。这时在Target 1项目文件夹下的Source Group1文件夹图标左边出现了一个小+号说明,文件组中有了文件,点击它可以展开查看。,基于汇编与C语言的单片机原理及应用
8、,12,基于汇编与C语言的单片机原理及应用,13,(5)设置Options for Target Target1,在Project下拉菜单中或者在Target 1图标上点击右键,打开Options for Target Target1,弹出项目选项设置窗口。如图4-5所示,Output选项页中1是选择编译输出的路径,2是设置编译输出生成的文件名,3则是决定是否要创建HEX文件,选中它就可以输出HEX文件到指定的路径中。Debug选项页如图4-6所示,由于本章内容不涉及到Proteus仿真和单片机开发板烧录,Debug选项页中均保持如图显示的默认值即可。,基于汇编与C语言的单片机原理及应用,14
9、,基于汇编与C语言的单片机原理及应用,15,(6)项目的编译运行 (7) 进入调试模式,在下拉菜单Debug中StartStop Debug Session,或者,快捷键为Ctrl+F5。点击下拉菜单Debug中的Run,或者,快捷键F5,程序连续运行。显示内容见图4-8,在此画面中同时打开了了Serial Windows,以观察字符串的输出情况。图中1为运行按钮,当程序处于停止状态时才有效,图中2为停止按钮,程序处于运行状态时才有效。图中3是复位按钮,模拟芯片的复位,程序回到最开头处执行。按图中的Peripherals下拉菜单中我们可以打开串行调试窗口,如图4所示。这个窗口我们可以看到从51
10、芯片的串行口输入输出的字符,“Hello World!”。最后我们要停止程序运行回到文件编辑模式中,就要先按停止按钮再按StartStop Debug Session开启关闭调试模式按钮。,基于汇编与C语言的单片机原理及应用,16,基于汇编与C语言的单片机原理及应用,17,4.2 MCS-51单片机C51语言程序设计基础,在单片机应用系统开发过程中,应用程序设计是整个应用系统开发的重要组成部分,它直接决定着应用系统开发周期的长短、性能。尽管采用汇编语言编写的应用程序可直接操纵系统的硬件资源,能编写出较高运行效率的程序代码,程序运行速度快。但因汇编语言学习困难、可读性差、修改调试困难,且编写比较
11、复杂的数值计算程序非常复杂。因此,为了提高编制单片机系统和其应用程序的效率,改善程序的可读性和可移植性,最好采用高级语言编程,及类似于C语言的单片机开发语言。,基于汇编与C语言的单片机原理及应用,18,4.2.1 C51与MCS-51汇编语言的比较,C51语言能直接对计算机的硬件进行操作,与汇编语言相比它具有如下优点: (1) C51要比MCS - 51汇编语言的可读性好。 (2)程序由若干函数组成,为模块化结构。 (3)使用C51编写的程序可移植性好。 (4)编程及程序调试的时间短。 (5) C51中的库函数包含了许多标准的子程序 (6)对单片机中的寄存器分配、不同存储器的寻址以及数据类型等
12、细节可由编译器来管理。 汇编语言的特点如下: (1)代码执行效率高。 (2)占用存储空间少。 (3)可读性和可移植性差。,基于汇编与C语言的单片机原理及应用,19,4.2.2 C51与标准C的主要区别,(1)头文件的差异。Keil C51系列的头文件集中体现了各系列芯片的不同资源及功能。 (2)数据类型的不同。51系列单片机包含位操作空间和丰富的位操作指令。 (3)数据存储类型的不同。51系列单片机有片内、外程序存储器,还有片内、外数据存储器。 (4)标准C语言没有处理单片机中断的定义。 (5) Keil C51与标准C的库函数有较大的不同。 (6)程序结构的差异。,基于汇编与C语言的单片机原
13、理及应用,20,因此,C51语言。它与传统的、通用的像K break; *CMD N为命令号* case F: CMD_N=l; break; case G: CMD_N=2; break; case W: CMD_N=3; break; case Z: CMD_N=4; break ; default: CMD_N=0 xff; ,基于汇编与C语言的单片机原理及应用,51,(1)while语句 while语句的一般形式为: while(表达式)语句;,基于汇编与C语言的单片机原理及应用,52,4循环语句和循环结构程序,【例4-3】求S=1+2+3+100和的程序,请用while循环来实现:
14、#include void main() unsigned int s=0; *定义变量并初始化* unsigned char i=l; while (i =100) s+=i; *循环体为复合语句* i+; *修改循环变量x printf(s=%dn,s); ,基于汇编与C语言的单片机原理及应用,53,Do 语句; *循环体,可以是简单语句或复合语句* while(表达式); *其后分号不可少,表达式为关系表达式或逻辑表达式* 【例4-4】求S=1+2+3+100和的程序,请用do-while循环来实现: #include void main() int i,s; i=1;s=0; do s
15、=s+i; i=i+1; while(i=100); printf(s=%dn,s);,基于汇编与C语言的单片机原理及应用,54,(2)do-while语句,【例4-5】P1.1输出16次跳变,产生8个脉冲,P1.1初态为0,则程序如下: unsigned char i=0; *定义循环控制变量i* do P1= P10 x02;*P1.1求反,Pl口其他位不变* i+; * 修改循环控制变量 * while (116); * ;号不可省 *,基于汇编与C语言的单片机原理及应用,55,for语句的一般形式为: for(表达式1;表达式2;表达式3) 语句; for(循环变量赋初值;循环条件;循
16、环控制变量修改) 语句 *循环体,可以是简单语句、复合语句或空语句*,基于汇编与C语言的单片机原理及应用,56,(3)for语句,【例4-6】用for语句实现S=1+2+3+100的程序。 unsigned int s; *标准形式* unsigned char i; for(i=1,s=0;i=100;i+)s+=i; unsigned int s=0; *省表达式l* unsigned char i=l; for(;i =100;i+)s+=i; unsigned int s;*缺省表达式3* unsigned char i; for(i=l,s=0; i=100;) s+=i; i+;
17、*循环体中修改变量i* ,基于汇编与C语言的单片机原理及应用,57, goto话句为无条件跳转语句,一般形式为: goto 语句标号; *goto语句尽量少用* break语句用来从循环体中跳出循环体,终止整个循环。一般形式为: Break; continue语句用于循环体中,其功能为跳过本次循环中尚未执行的语句,继续下次循环,而不终止整个循环,一般形式为: Continue;,基于汇编与C语言的单片机原理及应用,58,(4)goto语句、break语句和continue语句,C51编译器支持的基本数据类型有:位型(bit)、无符号字符(unsigned char)、有符号字符(signed
18、char)、无符号整型(unsigned int)、有符号整型(signed int)、无符号长整型(unsigned long)、有符号长整型(signed long)、浮点(float)、双精度浮点(double),另外C51还提供了一些扩展的数据类型,它们是由C51支持的基本数据类型按一定的规则组合成的数据类型,称之为构造数据类型。C51支持的构造数据类型有:数组、结构、指针、共同体(或者,也称为联合)、枚举等。其实C51支持的构造数据类型与标准C语言是一样的,对构造数据类型的定义、引用以及运算的规则也与标准的C语言相同。,基于汇编与C语言的单片机原理及应用,59,4.2.7 C51构造
19、数据类型,1. 数组 2. 结构体 3. 联合(共用)体 4. 指针,基于汇编与C语言的单片机原理及应用,60,数组是相关的同类对象的集合,是一种构造类型的变量。数组中各元素的数据类型必须相同,元素的个数必须固定,数组中的元素按顺序存放,每个元素对应于一个序号(称为下标),各元素按下标存取。数组元素下标的个数由数组的维数确定,一维数组有一个下标,二维数组有两个下标。 (1)一维数组的定义 (2) 一维数组的引用 (3) 一维数组的初始化,基于汇编与C语言的单片机原理及应用,61,1. 数组,【例4-7】统计某班学生成绩中80分以上,60分80分,60分以下人数的程序。 unsigned cha
20、r i=0, score_A=0, score_B=0, scroe _F=0; for( ;i80) score_A+; *score_A 统计80分以上学生人数* else if( student_scorei=60) score_B+; * score_B 统计6080分之间学生人数* else score_F+; * score_F统计60分以下学生人数* ,基于汇编与C语言的单片机原理及应用,62,结构是另一种构造类型数据。通过使用结构可以把一些数据类型可能不同的相关变量结合在一起,给它们一个共同的名称,以方便编程。 (1)定义结构类型 定义结构类型的一般形式为: struct结构类
21、型名*struct为结构类型关键字* 成员表列 *对各个成员数据类型声明* ; *分号不能省略* 例如:定义包含年、月、日的结构类型: struct date unsigned int year; *3个成员的数据类型声明* unsigned char month; unsigned char day; *;号不可省略*,基于汇编与C语言的单片机原理及应用,63,2. 结构体的定义与引用,(2)定义结构类型变量 定义结构类型以后,再定义这种结构类型的变量。一般形式为: 结构类型名存贮器类型说明 结构变量名表; 在定义结构类型时同时定义结构变量,一般形式为: struct结构类型名 成员表列 变
22、量名表列; 直接定义结构类型变量,基于汇编与C语言的单片机原理及应用,64,(3)结构变量的引用 对结构变量的成员只能一个一个引用。引用结构变量成员的方法有两种: 用结构变量名引用结构成员,其形式为: 结构变量名.成员名 例如:birth_day.year=1960; 用指向结构的指针引用成员,其形式为: 指针变量名-成员名 例如:birth_day-year=1960;,基于汇编与C语言的单片机原理及应用,65,联合也称为共用体,联合中的成员是几种不同类型变量,它们共用一个存贮区域,任意瞬间只能存取其中的一个变量,即一个变量被修改了,其他变量原来的值也就消失了。 (1)定义联合类型和联合类型
23、变量,定义形式为: union联合类型名 成员表列 变量名表; (2)联合类型变量成员引用 联合类型变量成员的引用方法类似于结构类型变量成员的引用:变量名.成员名,基于汇编与C语言的单片机原理及应用,66,3. 联合的定义与引用,在C语言中,把存放数据的地址称为指针,把存放数据地址的变量称为指针变量。一般的数据变量表示存贮单元内容,而指针变量表示存贮单元的地址。利用指针变量访问数据对象类似于用DPTR间接寻址一样地方便。 (1)定义指针变量 指针变量也必须先定义后使用,C51指针变量定义的一般形式为: 基类型 存贮器类型 *指针变量名表;,基于汇编与C语言的单片机原理及应用,67,4. 指针,
24、C51支持“基于存贮器”的指针和“通用指针”两种指针类型。 基于存贮器的指针 基于存贮器的指针以存贮类型为参量,在编译时确定。用这种指针可以高效地访问指针指向单元的内容。这类指针的长度为1个字节(idata *,data *,pdata *)或2个字节(code *,xdata *)。 通用指针 凡是在指针定义时未对指针指向的对象存贮空间进行修饰说明的,编译器都使用3个字节的通用指针。一个通用指针可以访问任何变量而不管它在MCS51哪个存贮空间的什么位置。通用指针只在编译和连接/定位时才把存贮空间代码和地址填入预留的3个字节中。,基于汇编与C语言的单片机原理及应用,68,通用指针包括3个字节,
25、其中1个字节为存贮类型,另2个字节为偏移地址。存贮类型决定了对象所占用的MCS51存贮空间,偏移地址指向实际地址。有关通用指针的字节分配、存贮类型编码以及通用指针到具体存贮空间的定位如“字节分配表”和“存储器类型编码表”所示。,基于汇编与C语言的单片机原理及应用,69,(2)指针变量的引用 取变量的地址赋给指针变量 C51中的单目运算符 *关定时器T0* TH0=RELOADH; *恢复T0初值* TL0=RELOADL; TR0 =1 *重新允许T0计数* Tick_count+ *修改变量Tick_count* ,基于汇编与C语言的单片机原理及应用,80, 局部变量 在一个函数(即使是主函
26、数)内部定义的变量在本函数内有效,在函数外无效。在复合语句内定义的变量也只能在本复合语句内有效,复合语句外无效。这类变量称为局部变量。因此,不同函数内使用的变量可以使用相同的名称。局部变量名是用小写字母表示的标识符。 全局变量 一个源文件包含若干个函数,在函数外部定义的变量可以为多个函数所共用,有效范围从定义变量处到文件结束,一般在文件开头定义,使之对整个文件有效。这类变量称之为全局变量。全局变量名称一般以大写字母开头。,基于汇编与C语言的单片机原理及应用,81,5局部变量和全局变量,变量定义中的存贮种类指出变量的存贮方式和作用域。 auto动态变量 在函数或复合语句内部定义的变量,在定义中若
27、缺省存贮种类则默认为动态变量,动态变量只在函数被调用时,系统才给动态变量分配存贮单元,函数执行结束时释放存贮空间。动态变量只能在函数或复合语句的内部使用。 static静态变量 在函数内或复合语句内的变量定义中,用static指定存贮种类,这种变量称为静态局部变量,静态局部变量在程序运行时始终存在(占用存贮单元),但只能在函数内部使用,其作用是本次调用函数时能使用上次调用后的变量值。例如中断函数中定义的一些特殊变量可以用静态变量。,基于汇编与C语言的单片机原理及应用,82,6变量的存储种类,全局变量也是静态变量,始终占有存贮单元,但可以为多个函数共用。 用extern声明外部变量 在函数外部定
28、义的变量称为外部变量(即全局变量),如果在变量定义处之前使用该变量,必须用extern声明,从声明处开始可使用该变量,如果一个文件中使用另一个文件中的全局变量,在使用之前也应用extern声明。 用extern声明外部函数 一个文件使用另一个文件中的函数,也用extern声明是外部函数。,基于汇编与C语言的单片机原理及应用,83,1预处理命令 预处理命令是在编译前预先处理的命令,编译器不能直接对它们处理,是在编译前预先处理的命令;下面简单介绍常用的预处理命令。 (1)宏定义#define 不带参数的宏定义 用指定的标识符来代表一个字符序列。一般定义形式为: #define 标识符 字符序列 *
29、命令后不加分号*,基于汇编与C语言的单片机原理及应用,84,4.2.9 C51预处理命令和库函数, 带参数的宏定义 预处理时不但进行字符替换,而且替换字符序列中的形参。一般定义形式如下: #define 标识符(形参)字符序列 *字符串中含有形参*,基于汇编与C语言的单片机原理及应用,85,(2)类型定义typedef 使用基本类型定义或声明变量时,用数据类型关键字指明变量的数据类型,而用结构、联合等类型定义变量时,先定义结构、联合的类型,再用关键字,类型名定义变量。如果用typedef定义新的类型名后,只要用类型名就可定义新的变量。例如: typedef struct int num; ch
30、ar * name; char sex; int arg; int score; STD_TYPE; *定义结构类烈STD_TYPE* 接着便可以在程序中用STD_TYPE,就可以定义属于这种类型的结构变量。例如: STD_TYPE std1,std2; *定义STD_TYPE类型结构变量std1,std2*,基于汇编与C语言的单片机原理及应用,86,(3)文件包含#include 文件包含命令是将另外的文件插入到本文伴中,作为一个整体文件编译。C51提供了丰富的库函数,并有相应的头文件,只有用# include命令包含了相应头文件,才可以调用库中的函数。包含命令一般形式为: #include
31、 “文件名”或者 #include #include“stdio.h” *包含标准I/O头文件,后面无;号* #include“math.h” *包含数学计算函数库头文件*,基于汇编与C语言的单片机原理及应用,87,在Keil uVision 的安装目录C51/LIB中有几个重要的源文件,对它们稍作修改就可以用在专用的系统中。 (1)init_mem.C 功能是初始化动态内存区,指定动态内存区的大小。 (2)init.a51 功能是对watchdog操作。 (3)C51启动配置文件startup.a51 启动配置文件startup.a51中包含了目标系统启动代码,可以在每个工程项目中加入这个文
32、件,复位以后先执行该程序,然后转主函数main( )。,基于汇编与C语言的单片机原理及应用,88,2C51的通用文件,(1)本征函数文件 本征函数也称为内联函数,这种函数不采用调用形式,编译时直接将代码插入当前行。 左环移本征函数 _crol_,_ irol_,_lrol_分别将字符型变量a、整型变量a、长整型变量a循环左移n位。 右环移本征函数 _cror_,_iror_,_lror_分别将字符型变量a、整型变量a、长整型变量a循环右移n位。 其他本征函数 _nop_,_testbit_( ),基于汇编与C语言的单片机原理及应用,89,3C51的库函数,(2)库函数 C51针对51单片机硬件
33、特点设置了SMALL、COMPACT、LARGE的有和没有浮点运算的函数库。 C51S . LIB 无浮点运算的小系统函数库 C51FPS . LIB 有浮点运算的小系统函数库 C51C.LIB 无浮点运算的紧凑系统函数库 C51FPC.LIB 有浮点运算的紧凑系统函数库 C51L.LIB 无浮点运算的大系统函数库 C51FPL.LIB 有浮点运算的大系统函数库,基于汇编与C语言的单片机原理及应用,90,(3)头文件 每个函数库都有相应头文件,用户如果需要用库函数,必须将用#include命令包含相应头文件。下面列出相应头文件(位于KeilC51INC目录下): ctype.h 字符函数; s
34、tdio.h 一般I/O函数 string.h 字符串函数; stdlib.h 标准函数 math.h 数学函数; absacc.h 绝对地址访问宏定义 intrins.h 本征函数; stdarg.h 变量参数表 setjmp.h 全程跳转; regxxx.h SFR定义文件,基于汇编与C语言的单片机原理及应用,91,C51与汇编语言混合编程的方法为:在把汇编语言程序加入到C语言程序前,须使汇编语言和C51程序一样具有明确的边界、参数、返回值和局部变量;必须为汇编语言编写程序段指定段名并进行定义;如果要在它们之间传递参数,则必须保证汇编程序用来传递数的存储区和C51函数使用的存储区是一样的。
35、C51中使用汇编语言有以下3种方法: 1C51代码中直接嵌入汇编代码 2控制命令SRC控制 3模块间接口,基于汇编与C语言的单片机原理及应用,92,4.2.10 MCS51汇编语言与C51的混合编程,1C51代码中直接嵌入汇编代码,第1种方法使用asm功能。 第2种方法使用# pragma asm功能。 【例4-10】编写程序从P10接口输出方波。要求Keil C环境下C51程序中嵌入汇编程序段。 # include sbit P1_ 0=P10; 定义位变量P1_0 void main(void) w hile (1)(P1_0=!P1_0;P1_0接口输出取反 # pragma asm 汇
36、编程序段开始 MOV R3,#18 DJNZ R3, $ 延时等待 # pragma endasm 汇编程序段结束 程序结束,基于汇编与C语言的单片机原理及应用,93,Keil Vision4直接嵌入汇编代码的方法: (1)在C文件中要嵌入汇编代码片的方式为: # pragma ASM # pragma ENDASM (2)在Project窗口中包含汇编代码的C文件上右键,选择“Options for”,点击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态; (3)根据选择的编译模式,把相应的库文件(如
37、Small模式时,是KeilC51LibC51S. Lib)加人工程中,该文件必须作为工程的最后文件; (4)编译,即可生成目标代码。,基于汇编与C语言的单片机原理及应用,94,2控制命令SRC控制,(1)按写普通C51程序方法,建立工程,在里面导入main.c文件和CFUNC.c文件。 (2)在 “Options for”,点击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态; (3)根椐选择的编译模式,把相应的库文件(如Small模式时,是KeilC51LibC51S. Lib)加人工程中,该文件必
38、须作为工程的最后文件; (4) build这个工程后将会产生一个CFUNC. SRC的文件,将这个文件改名为CFUNC. A51然后在工程里去掉库文件(如C51S. Lib)和CFUNC.c,而将CFUNC. A51添加到工程里。 (5)检查maIn.c的“Generate Assembler SRC File”和“Assemble SRC File”是否有效。,基于汇编与C语言的单片机原理及应用,95,3模块间接口,当采用C51与汇编语言混合编程时,在技术上有两个问题:一个是在C51中如何调用汇编语言程序;另一个是C51程序如何与汇编语言程序之间实现数据的交换。当采用混合编程时,必须约定这两
39、方面的规则,即命名规则和参数传递规则。 (1)命名规则。在C51中被调用函数要在主函数中说明,在汇编语言程序中,要使用伪指令使CODE选项有效并申明为可再定位段类型,并且根据不同情况对函数名作转换。 (2)参数传递规则。C51编译器可使用寄存器传递参数,也可以使用固定存储器或使用堆栈,由于MCS-51系列单片机的堆栈深度有限,因此多用寄存器或存储器来传递。利用寄存器最多只能传递3个参数,选择固定的寄存器。,基于汇编与C语言的单片机原理及应用,96,4.3 8051单片机C51语言程序设计方法,存贮种类和存贮模式的选择应和硬件存贮器物理地址范围对应,还应注意存贮器是否溢出。 外部I/O口绝对地址
40、的定义和I/O口物理地址对应,还须考虑P2口是否作为地址总线口使用来选择XBYTE或PBYTE来定义,选用PBYTE时注意和P2口操作一致。 寄存器定义文件的选择和单片机型号一致。 动态参数选择应考虑时钟频率的因素。 算法选择应考虑硬件和C51的特点。 设法提高内部RAM使用效率(尽可能缩短变量字节数,如循环变量i一般用unsigned char类型;使用存贮器类型指针等)。,基于汇编与C语言的单片机原理及应用,97,4.3.1系统软件设计,基于汇编与C语言的单片机原理及应用,98,2程序设计方法 (1)自顶向下模块化设计方法 (2)逐步求精设计方法 (3)结构化程序设计方法 3算法和数据结构
41、 4程序设计语言选择和编写程序,基于汇编与C语言的单片机原理及应用,99,4.3.2 C51语言程序设计举例,【例4-11】片内RAM的20H单元存放一个有符号数x,函数求解X和Y的对应关系。 main( ) char x, *p, *y; p= 0 x20 ; y= 0 x21; for(;) x=*p; If(x0) *y=x; If(x0) *y=x+5; if(x=0) *y=0 x20;,基于汇编与C语言的单片机原理及应用,100,【例4-12】有两个数a和b,根据R3的内容转向不同的处理子程序,#include #define r3 DBYTE0 x03 int c,c1,a,b; pr0() c=a+b; pr1() c=a-b; pr2() c=a*b; pr3() c=a/b; main( ) a=90; h=30;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (新教材)2026人教版三年级下册数学 3.1 多边形 教学课件
- 2026年劳务合同和聘用合同(1篇)
- 2025 网络基础中教育网络的网络教育公平性网络保障案例课件
- 刑法案例分析中犯罪构成要件分析
- 2025 高中信息技术数据与计算之算法的关键路径算法课件
- 高危药品管理策略
- 人力资源开发与管理真题试卷及答案
- 2025 高中信息技术数据与计算之数据在电商用户复购率提升策略中的应用课件
- 2025 高中信息技术数据与计算之数据可视化的流图设计课件
- 2026年北斗三号基准站网观测环境评估与选址规范
- 2026年食品安全与环境管理的关系
- 煤气管道动火作业施工方案
- 2026湖南省卫生健康委直属事业单位招聘185人考试备考题库及答案解析
- 《慢性支气管炎诊断与治疗指南(2025年版)》
- 应急响应团队能力提升路径-洞察与解读
- 0-6岁儿童行为预警及早期干预手册
- 水运工程结构防腐蚀施工规范 JTS-T 209-2020
- PFNA手术体位摆放的配合
- 医院宣传工作培训课件
- 2025广东省低空经济产业发展有限公司招聘19人笔试历年参考题库附带答案详解
- 2025贵州高速公路集团有限公司第二批次招聘6人 (第二轮)考试笔试参考题库附答案解析
评论
0/150
提交评论