MCS-51单片机程序设计.ppt_第1页
MCS-51单片机程序设计.ppt_第2页
MCS-51单片机程序设计.ppt_第3页
MCS-51单片机程序设计.ppt_第4页
MCS-51单片机程序设计.ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机原理、接口及应用,第3章程序设计林海波,内容提要,概述汇编语言程序设计C语言程序设计,3.1概述,MCS-51单片机的编程语言可以是汇编语言也可以是高级语言(如C语言),高级语言编程快捷,但程序长,占用存储空间大,执行慢;汇编语言产生的目标程序简短,占用存储空间小,执行快,能充分发挥计算机的硬件功能。无论是高级语言还是汇编语言,源程序都要转换成目标程序(机器语言)单片机才能执行。,连接/定位器L51,汇编语言源程序,汇编器A51,符号转换程序OHS51,绝对地址目标程序.BIN,C语言程序,浮动地址目标程序,编译器C51,HEX,图3-1两种语言源程序转换成目标程序,目前很多公司将编辑器、汇编器、编译器、连接/定位器、符号转换程序做成集成软件包,用户进入该集成环境,编辑好程序后,只需点击相应菜单就可以完成上述的各步,如WAVE、KEIL、IAR等。,汇编:将汇编语言源程序转换成机器语言目标程序的过程称为汇编。汇编程序:能将汇编语言源程序转换成机器语言目标程序的系统软件称为汇编程序。,汇编的方法:汇编的方法有两种1.手工汇编:人工查指令表,查出程序中每条指令对应的机器代码。早期的计算机使用。2.机器汇编:用计算机中的汇编程序对用户源程序进行汇编。用机器汇编要提供给汇编一些信息,遵循汇编程序的一些约定。这些由伪指令指定。,1)确定程序中每条汇编语言指令的指令机器码2)确定每条指令在存储器中的存放地址3)提供错误信息4)提供目标执行文件(*.OBJ/*.HEX)和列表文件(*.LST),地址机器码源程序ORG2000H2000H7830MAIN:MOVR0,#30H2002HE6MOVA,R0,1.机器指令:指令系统中的全部指令。每条机器指令都有对应的机器代码,可以被CPU执行。2.伪指令:汇编控制指令,没有指令代码,只用于汇编过程,为汇编程序提供汇编信息。,一、汇编语言指令类型,宏汇编功能:将需要反复多次执行的程序段定义成一个宏指令名(宏定义)。编程时,可在程序中使用宏指令名来替代被定义的程序段(宏调用)。,3.2伪指令,宏定义过程:,宏调用过程:宏指令名实际参数宏指令名实际参数,宏指令名MACRO形式参数;被定义的程序段ENDM,二伪指令常用伪指令及功能:,1.起始指令ORGnn功能:定义程序或数据块的起始地址。指示此语句后面的程序或数据块以nn为起始地址,连续存放在程序存储器中。指令地址机器码源程序ORG2000H2000H7830MAIN:MOVR0,#30H2002HE6MOVA,R0,ORG3000H3000H23TAB:DB23H,100,A3001H643002H41,2.字节定义标号:DB(字节常数,或字符或表达式)功能:指示在程序存储器中以标号为起始地址的单元里存放的数为字节数据(八位二进制数)。例如LN:DB32,C,25H,-1;LNLN+2地址单元依次存放20H,43H,25H,FFH,3.字定义标号:DW(字常数或表达式)作用:指示在程序存储器中以标号为起始地址的单元里存放的数为字数据(即16位的二进制数),例如:GH:DW1234H,5678H,08,5.等值指令标号EQU(数值表达式)表示EQU两边的量等值,用于为标号或标识符赋值。例如:X1EQU2000HX2EQU0FHMAIN:MOVDPTR,#X1;DPTR=2000HADDA,#X2;A=A+0FH,4保留字节标号:DS(数值表达式)作用:指示在程序存储器中保留以标号为起始地址的若干字节单元,其单元个数由数值表达式指定。例如L1:DS32;从L1地址开始保留32个存储单元。,6.位定义标号BIT位地址作用:同EQU指令,不过定义的是位操作地址。例如AICBITP1.1。,7.汇编结束END作用:指示源程序段结束。END指令放在程序的最后。A51汇编程序还有一些其它的伪指令,列在教材表3-1中。,汇编语言程序设计步骤,一.确定方案和计算方法二.了解应用系统的硬件配置、性能指标三.建立系统数学模型,确定控制算法和操作步骤四.合理分配存储器单元和了解I/O接口地址,五.编制源程序1.按功能设计程序,明确各程序之间的相互关系2.用流程图表示程序结构和功能,3.程序中用注释说明指令在程序中的作用,方便阅读、调试和修改,单片机原理、接口及应用,第10章C语言编程林海波,内容提要,C51程序结构C51的数据类型数据的存贮类型和存贮模式SFR、可寻址位、存储器和I/O口的定义C51的运算符函数变量使用,51系列单片机支持三种高级语言,即PL/M,C和BASIC。8052单片机内固化有解释BASIC语言,BASIC语言适用于简单编程而对编程效率运行速度要求不高的场合;PL/M是一种结构化的语言,很象PASCAL,PL/M编译器好象汇编器一样产生紧凑的机器代码,可以说是高级汇编语言,但它不支持复杂的算术运算,无丰富库函数支持,学习PL/M无异于学习一种新的语言。C语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,并具有良好的程序结构,适用于各种应用的程序设计,是目前使用较广的单片机编程语言。,单片机的C语言采用C51编译器(简称C51)。由C51产生的目标代码短、运行速度高、所需存储空间小、符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言或PL/M51语言目标代码混和使用。,应用C51编程具有以下优点:(1)C51管理内部寄存器和存贮器的分配,编程时,无需考虑不同存储器的寻址和数据类型等细节问题;()程序由若干函数组成,具有良好的模块化结构;()有丰富的子程序库可直接引用,从而大大减少用户编程的工作量。()C语言和汇编语言可以交叉使用.汇编语言程序代码短、运行速度快、但复杂运算编程耗时。如果用汇编语言编写与硬件有关的部分程序,用C语言编写与硬件无关的运算部分程序,充分发挥两种语言的长处,可以提高开发效率。,10.1C51程序结构,同标准C一样,C51的程序由一个个函数组成,这里的函数和其他语言的“子程序”或“过程”具有相同的意义。其中必须有一个主函数main(),程序的执行从main()函数开始,调用其他函数后返回主函数main(),最后在主函数中结束整个程序而不管函数的排列顺序如何。,C语言程序的组成结构如下所示:,全局变量说明/*可被各函数引用*/main()/*主函数*/局部变量说明/*只在本函数引用*/执行语句(包括函数调用语句)fun1(形式参数表)/*函数1*/形式参数说明,局部变量说明执行语句(包括调用其他函数语句)funn(形式参数表)/*函数n*/形式参数说明局部变量说明执行语句,C语言的语句规则:1.每个变量必须先说明后引用,变量名英文大小写是有差别的。2.C语言程序一行可以书写多条语句,但每个语句必须以“;”结尾,一个语句也可以多行书写为好。3.C语言的注释用/*/表示。4.“”花括号必须成对,位置随意,可在紧挨函数名后,也可另起一行,多个花括号可以同行书写,也可逐行书写,为层次分明,增加可读性,同一层的“”花括号对齐,采用逐层缩进方式书写。,10.2C51的数据类型,C51的数据有常量和变量之分。常量在程序运行中其值不变的量,可以为字符,十进制数或十六进制数(用0 x表示)。常量分为数值型常量和符号型常量,如果是符号型常量,需用宏定义指令(#define)对其进行定义(相当于汇编的“EQU”伪指令)如:#definePI3.1415那么程序中只要出现PI的地方,编译程序都译为3.1415。变量在程序运行中其值可以改变的量。一个变量由变量名和变量值构成,变量名即是存贮单元地址的符号表示,而变量的值就是该单元存放的内容。定义一个变量,编译系统就会自动为它安排一个存贮单元,具体的地址值用户不必在意。,10.2.1C51变量的数据类型,无论哪种数据都是存放在存贮单元中的,每一个数据究竟要占用几个单元(即数据的长度)都要提供给编译系统,正如汇编语言中存放数据的单元要用DB或DW伪指令进行定义一样,编译系统以此为根据预留存贮单元,这就是定义数据类型的意义.C51编译器支持数据类型见表10.1。,表10-1C51的数据类型,对表10.1作如下说明:1.字符型(char)、整型(int)和长整型(long)均有符号型(signed)和无符号型(unsigned)两种,如果不是必须,尽可能选择unsigned型,这将会使编译器省却符号位的检测,使生成的程序代码比signed类型短得多。2.程序编译时,C51编译器会自动进行类型转换,例如将一个位变量赋值给一个整型变量时,位型值自动转换为整型值;当运算符两边为不同类型的数据时,编译器先将低级的数据类型转换为较高级的数据类型,运算后,运算结果为高级数据类型。3.51单片机内部数据存贮器的可寻址位(20H2FH)定义为bit型,而特殊功能寄存器的可寻址位(即地址为X0H和X8H的SFR的各位)只能定义为sbit类型。,10.2.2关于指针型数据,(1)关于指针型变量在汇编语言程序中,要取存贮单元m的内容可用直接寻址方式,也可用寄存器间接寻址方式,如果用R1寄存器指示m的地址,用R1取m单元的内容。相对应的在C语言中用变量名表示取变量的值(相当于直接寻址),也可用另一个变量(如P)存放m的地址,P就相当于R1寄存器。用*P取得m单元的内容(相当于汇编的间接寻址方式)这里P即为指针型变量。下面表格表示两种语言将m单元的内容送n单元的对照语句。,注:上表省略了汇编语言程序中对符号地址n和m用EQU伪指令进行具体地址定义的语句以及C语言对变量n、m和指针变量P进行类型定义的语句,实际程序设计中,此步是不可缺少的。表中=(相等);!=(不相等)优先级:前四个高,后二个“=”和“!=”级别低。,4C51的逻辑运算符有三种:逻辑表达式和关系表达式的值相同,以0代表假,以1代表真。以上三种运算的优先级见图10.1。5C51的按位操作的运算符有六种:intc;c=a+b;return(c);main()intd,0u=3,v=2;d=2*fun(u,v);上例被调函数在主调函数前,不用说明。,intfun1(a,b);main()intd,u=3,v=2;d=2*fun1(u,v);intfun1(a,b);inta,b;intc;c=a+b;return(c);上例中被调函数在主调函数后,在前面对被调函数进行说明。,10.7变量使用,1.定位变量经常访问的数据对象放入在片内数据RAM中,这可在任一种模式(COMPACT/LARGE)下用输入存贮器类型的方法实现。访问片内RAM要比访问片外RAM快得多。在片内RAM由寄存器组、位数据区、栈和其它由用户用“data”类型定义的变量共享。由于片内RAM容量的限制(128256字节,由使用的处理器决定),必须权衡利弊以解决访问效率和这些对象的数量之间的矛盾。2.只要有可能,使用局部函数变量编译器总是尝试在寄存器里保持局部变量。这样,将索引变量(如FOR和WHILE循环中计数变量)声明为局部变量是最好的,这个优化步骤只为局部变量执行。使用“unsignedchar/int”的对象通常能获得最好的结果。,3.尽可能使用最小数据类型MCS-51系列单片机是8位机,因此对具有“char”类型的对象的操作比“int”或“long”类型的对象方便得多。建议编程者只要能满足要求,应尽量使用最小数据类型。C51编译器直接支持所有的字节操作,因而如果不是运算符要求,就不作“int”类型的转换,这可用一个乘积运算来说明,两“char”类型对象的乘积与8XX51操作码“MULAB”刚好相符。如果用整型完成同样的运算,则需调用库函数。4.只要有可能,使用“unsigned”数据类型8XX51单片机的CPU不直接支持有符号数的运算。因而C51编译必须产生与之相关的更多的代码以解决这个问题。如果使用无符号类型,产生的代码要少得多。,二、程序设计阶段,1方案制订阶段制订技术开发要求制订实现方案,进行技术准备评估整个项目开发需要的各方面资源评估并确定开发周期,2程序设计阶段,程序框架的划分各个模块功能的细分系统资源的分配算法的设计程序流程图的绘制,3代码编写阶段,避免笔误,遵守规范向前兼容原则相互兼容原则,4程序调试阶段,验证前面的工作,把程序调通(保证程序在各种可能的状态下都能按预期的要求工作)。测试解决BUG,5程序维护阶段,程序交付后,根据要求进行升级或BUG消除的阶段养成良好的编程习惯自觉加强版本管理,三、编程思路,1程序基本结构初始化程序主程序循环体,2模块化程序结构,3模块的事件驱动,由于程序是按顺序执行各个模块,而有些模块可能在本次循环中不具备执行的条件。可用事件驱动的机制,加快主程序的循环速度,提升整个系统的性能给每个模块设置“使能标志”,通过该标志来触发模块,4调度机制,顺序调度机制:缺点某些重要模块无法得到及时响应优先调度机制:可让优先级高的模块获得更多更及时的执行机会,缺点是排在末位的模块可能被阻塞,5中断与前后台,轮询调度机制可以应对一般的任务,但遇到紧急事件还是无法保证及时响应,因此引入中断。把实时性高的时间放在中断中响应,实时性低的任务交给主程序(后台)调度。极端情况:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论