单片机原理及应用实验指导书-20130403

更新时间:2023-03-18 11:21:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片机原理及应用

验 指 导 单片机接口技术实验室

山东大学

二〇一三年三月

实 书

目 录

前言

Ax51汇编语言简单介绍 Cx51语言简单介绍

Keil C51 uVision软件简单介绍 Proteus ISIS软件简单介绍 实验一 Keil C51集成开发环境实验 实验二 Proteus电子设计软件仿真实验

实验三 测量与确定延时子程序时间常数实验 实验四 开关与发光二极管控制实验 实验五 矩阵键盘电路设计实验 实验六 定时计数器程序设计实验 实验七 外部中断程序设计实验 实验八 串行通讯接口实验 A51宏汇编器汇编错误信息 参考文献

前 言

MCS-51单片机实验是MCS-51单片机应用课程教学的一个重要环节。实验指导书包括MCS-51单片机软件开发必备的基本知识和Ax51宏汇编语言,Cx51语言的基本介绍。Keil C51 uVision软件(评估版)和Proteus电子设计软件(授权版)的基本使用方法。实验指导书给出了多个实验项目,通过这些实验项目可以掌握8051单片机各种外设接口和使用开发工具进行软硬件开发调试的方法。

《单片机原理及应用实验指导书》 是单片机接口技术原理实验室的教师根据教学实验要求和教学实验仪器的原理编辑整理编写。在编写过程中的参考文献见“参考文献”,在此向参考文献中的作者表示感谢。

根据学校的有关要求,要求学生在实验室做实验的时候要遵守学校的实验室管理规章制度。这些规章制度是:《山东大学实验室器材损坏赔偿方法》 , 《山东大学仪器设备管理制度》 , 《山东大学学生实验管理制度》 ,《山东大学仪器设备操作规程》 , 《山东大学实验室安全管理制度》 , 《山东大学实验室卫生管理制度》 。

根据实验室的要求,在实验室做实验的时候要准时到实验室并按要求签名,结束实验的时候需要经过实验指导教师的同意才可离开实验室。在实验中间如果实验仪器设备发生问题要及时通知实验指导教师处理仪器设备发生的问题。

提 示

由于每次实验时间有限,因此实验之前,一定要提前预习有关实验项目的实验内容,并按实验要求提前编写实验程序。这样才能在有限的实验时间内完成实验内容。

Ax51汇编语言简单介绍

Ax51汇编语言由汇编器规则和汇编伪指令组成。汇编伪指令是一种特殊的汇编控制符号。在汇编过程中可以按给定的规则改变汇编器的状态,将一些必要的信息加入到目标文件里。A51汇编器允许使用汇编伪指令进行符号定义,保留和初始化存储器空间,控制程序连接,控制汇编状态和进行段选择。下面是汇编语言的简单介绍:

一 符号与表达式

8051汇编语言程序(源程序)是由8051指令的汇编语言符号组成。汇编语言对汇编源程序的指令行的书写格式作了规定,它的格式如下:

[标号:] 8051指令助记符 [操作符1][,操作符2][,操作符3] [;注释]

标号是可选项,一般它表示程序指令的转移地址。操作符又叫操作数,它个数随指令的不同而不同,在汇编指令里可能没有操作符,也可能有1个或多个操作符。操作符可以是立即数、地址或者是符号表示的立即数、存储器地址、转移地址等标识符。

汇编指令里的数字可以使用2进制数、8进制数、10进制数、16进制数。不同进制数用数字后面的不同的后缀来区分:

数 制 2进制 8进制 10进制 16进制 0,1 0 ~ 7 0 ~ 9 0 ~ 9,A ~ F 数值范围 B O D H 后 缀 0xhhhh 其它表示方式 省略后缀默认为10进制数。立即数的前面必须加上符号“#”。 Ax51宏汇编器可以使用符号表示数值、地址和寄存器名等。符号名最长为31个字符,第一个字符必须是英文字母“A”~“Z”或“a”~“z”、“_”、“?”后续的字符可以是上述的字母符号或数字“0”~“9”。Ax51宏汇编器把一些字符预定义为A51的保留字,不能对它们进行重定义。这些保留的符号及意义如下:

保 留 字 C A AB AR0 ~ AR7 DPTR R0 ~ R7 PC 指令助记符 $ 说 明 进位标志 累加器 寄存器对 当前工作寄存器的绝对地址 数据指针 工作寄存器 程序计数器 A51指令的汇编语言符号 当前段的地址计数器 符号“ $ ”是一个特殊的汇编符号,表示当前段的地址计数器。不同的段有不同的地址计数器。如果改变了当前段,地址计数器也自动切换到新段的地址计数器。

Ax51宏汇编器中有三类运算符:算术运算符、逻辑运算符、关系运算符。运算符的运算发生在汇编器的汇编过程中,其结果体现在指令中只是一个操作数(地址、数据、立即数等)。

(1)算术运算符 运算符 + 、 - + 、 - * / MOD ( )

(2)逻辑运算符

运算符 NOT HIGH LOW SHL 、SHR AND OR XOR

(3)关系运算符

运算符 >= <= <> = < > 说明 大与等于 小与等于 不等于 等于 小于 大于 说明 取反运算 选择操作符的高位字节 选择操作符的低位字节 左、右移运算 逻辑与运算 逻辑或运算 逻辑异或运算 说 明 正负号 加减运算 乘法运算 除法运算 取模运算 括号运算 (4)运算优先级

Ax51宏汇编器中的运算符的运算次序具有优先级。优先级1为最高。在同一级别的优先级里按左向右的次序排列,左边的优先级高。

优先级 1 2 3 4 5 6 7 8 运算符 ( ) NOT 、HIGH 、LOW + 、- * 、/ 、MOD + 、- SHL 、SHR AND 、OR 、XOR >= 、<= 、= 、< 、> 说明 正、负号 加、减运算

表达式里有多个运算符时按运算符的优先级进行运算,如果运算符的优先级相同,按自左向右的次序进行运算。

二 符号定义伪指令

符号定义伪指令用来定义和声明段(绝对段、再定位段)和段的类型,定义各种符号(标号、变量的名称,存储器地址和类型等)。

1 数据段和代码段定义伪指令 (1) SEGMENT伪指令

segment 用来声明一个再定位段和一个可选的再定位类型,伪指令的格式如下: 再定位段名 SEGMENT 段类型[再定位类型]

再定位段名用来指明所声明的段,再定位段名是一个标识符(字母数字串)。段类型指明了段所处的存储器地址空间,段类型有:CODE、XDATA、DATA、IDATA、BIT。再定位类型是可选项,用于定义由L51连接器决定的段位置。再定位类型有:

PAGE INPAGE INBLOCK BITADDRSSABLE UNIT OVERLAYABLE 用于CODE、XDATA段,必须是256的整数倍的段。 用于CODE、XDATA段,必须是包含在256个字节块中的段。 用于CODE 段,必须是包含在1024个字节块中的段。 用于DATA 段,位于 BIT区域(20H ~ 2FH),用于最大长度限制为16个字节的数据段。 指定一个可开始于任何一个单元的段。一个单元对BIT段类型是一个位,而对于其它段类型是一个字节。 指定一个可覆盖的段。段和段之间可以交迭。

段名用段符号表示,表达式里段符号表示段的基地址。堆栈定义在数据段(DATA,IDATA)里,不存在堆栈段的段定义。

(2) EQU伪指令

EQU伪指令用于将寄存器名或数值赋给指定的标识符。指令格式如下: 符号名 EQU 表达式 符号名 EQU 寄存器名

表达式是简单再定位表达式。寄存器名是A、R0 ~ R7。EQU指令赋值的标识符可在程序的任何地方使用,但是不能重复定义。

(3) SET伪指令 同EQU伪指令类似,不相同的是用SET指令赋值的标识符在程序里可以重复定义。指令格式如下:

符号名 SET 表达式 符号名 SET 寄存器名 (4) BIT伪指令

BIT伪指令用于将位地址赋给指定的符号名。用BIT伪指令定义的标识符不能被重复定义。指令格式如下:

符号名 BIT 位地址 (5) DATA伪指令

DATA伪指令用于将内部RAM的地址赋给指定的符号名。指令格式如下:

符号名 DATA 表达式 表达式的值在0 ~ 255之间,是简单再定位表达式。用DATA伪指令定义的标识符不能被重复定义。

(6) XDATA伪指令

XDATA伪指令用于将外部RAM的地址赋给指定的符号名。指令格式如下: 符号名 XDATA 表达式

表达式的值是绝对的或简单再定位表达式。用XDATA伪指令定义的标识符不能被重复定义。

(7) IDATA伪指令

IDATA伪指令用于将间接寻址的内部RAM地址赋给指定的符号名。指令格式如下: 符号名 IDATA 表达式

表达式的值是绝对的或简单再定位表达式。用IDATA伪指令定义的标识符不能被重复定义。

(8) CODE伪指令

CODE伪指令用于将程序存储器ROM地址赋给指定的符号名。指令格式如下: 符号名 CODE 表达式

表达式的值是绝对的或简单再定位表达式。用CODE伪指令定义的标识符不能被重复定义。

2 保留和初始化存储器空间伪指令

在当前段(数据段或代码段)的存储器空间里保留和初始化位、字节和字单元。 (1) DS伪指令

DS伪指令以字节为单位在内部数据区保留存储器空间。指令格式如下: [标号:] DS 数值表达式

数值表达式是以字节为单位的数值。DS伪指令使当前数据段的地址计数器指针的值加上表达式计算后的结果值。地址计数器当前值与表达式结果值之和不能超过当前地址空间的限制。标号是可选项,标号值是保留数据的存储器空间的第一个字节的地址。

(2) DBIT伪指令

DBIT伪指令在内部数据区的BIT段内以位为单位保留存储器空间。指令格式如下: [标号:] DBIT 数值表达式

数值表达式是以位为单位的数据。DBIT伪指令使BIT数据段的地址计数器指针值加上表达式计算后的结果值。地址计数器当前值与表达式结果值之和不能超过当前地址空间的限制。标号是可选项,标号值是保留位数据的存储器空间的第一个位的位地址。

(3) DB伪指令

DB伪指令用给定的表达式的值,以字节值初始化代码段空间。指令格式如下: [标号:] DB 表达式表

表达式表是以字节为单位的数据。DB伪指令位于CODE段内,表达式表里可包含符号,字符串,表达式等数据项。数据项之间用“,”分隔,字符串用“”括起来。标号是可选项,标号值是表达式表里的第一个字节数据的地址。

(4) DW伪指令

DW伪指令用给定的表达式的值,以字(双字节)初始化代码段空间。指令格式如下: [标号:] DW 表达式表

DW指令位于CODE段内,表达式表以符号,字符串,表达式等数据项组成。字符串用引号括起来,数据项之间用“,”分隔。一个字符串内最多包含两个字符。标号是可选项,标号值是表达式表里的第一个数据的地址。

3 汇编连接控制伪指令

连接控制伪指令用于标明当前程序模块名、当前程序模块里使用的外部符号名(由其他模块定义的符号名,在当前模块里使用)和可以被其他模块使用的公共符号名(在当前模块里定义的符号名,被其他模块使用)。这些模块名、外部符号名、公共符号名可以允许连接定位器L51将几个不同的程序模块连接成一个绝对程序模块。

(1) PUBLIC伪指令

PUBLIC伪指令用于声明可被其他程序模块使用的公共符号名。指令的格式如下: PUBLIC 符号名表

PUBLIC伪指令中的符号名表由多个符号名组成,每个符号名之间用“,”分隔。符号名是已经在当前程序模块里定义过的符号名。段符号名和寄存器名不能被指定为PUBLIC。

(2) EXTRN伪指令

EXTRN伪指令用于声明当前程序模块里使用的外部符号名,与PUBLIC伪指令配套使用。如果要在当前程序模块里使用其他模块里定义的公共符号,必须用外部符号定义伪指令EXTRN将这些公共符号在当前程序模块里列出来。指令的格式如下:

EXTRN 段类型(符号表)

EXTRN伪指令可在程序模块的任意位置使用,每个外部符号必须有一个段类型,这些段类型是:

CODE 、 DATA 、 IDATA 、 XDATA 、 BIT 、 NUMBER

段的类型限制了外部符号的使用范围。外部CODE段里的符号可以用作JMP转移指令、CALL子程序调用指令的目标地址,不能用作MOV传送指令的目标。在L51连接时将检查EXTRN伪指令声明的符号同PUBLIC伪指令声明的符号是否匹配。

(3) NAME伪指令

NAME伪指令定义一个目标模块名。目标模块名最多可包含40个字符,其中第一个字符不能是数字。目标模块名不是文件名,如果没有定义目标模块名,就会以源程序的文件名(不带扩展名)作为目标模块名。指令的格式如下:

NAME 字符串表达式

4 汇编状态控制伪指令

汇编状态控制伪指令用来控制汇编结束、设定程序的起始地址和使汇编器设定使用CPU工作寄存器组。

(1)END伪指令

END伪指令用来控制汇编结束。在一个汇编程序中只能有一个END伪指令,并且END伪指令必须 位于程序的最后一行。如果在一个汇编程序里有多个END伪指令,A51只汇编第一个END伪指令之前的程序行,以后的程序行将被忽略。指令的格式如下:

END

(2)ORG伪指令

ORG伪指令用来改变汇编器的地址计数器的值,设定一个新的程序的起始地址。指令的格式如下:

ORG 表达式

表达式是一个绝对的或简单再定位的表达式。表达式里只能使用绝对的或当前段里的符号。如果当前段是绝对段,则表达式的结果值作为新的地址计数器的绝对值。如果当前段是再定位段,表达式的结果值作为地址计数器的偏移值,而地址计数器的绝对值在目标程序连接时确定。ORG指令可以改变当前地址计数器的值,但不会产生一个新的段。

(3)USING伪指令

USING伪指令通知汇编器使用CPU的哪一个寄存器组。指令格式如下:

USING 表达式

表达式的值在0 ~ 3之间,默认值是0, 表达式的值指向汇编器指定的寄存器组。USING伪指令不切换寄存器组,只是指定当前AR0 ~ AR7的地址是哪一组寄存器的地址。ARn( n = 0 ~ 7)是在A51里预定义的。

5 再定位段选择伪指令和绝对段选择伪指令

段选择伪指令用来选择当前段是绝对段还是再定位段,不同的段选择指令使程序定位在不同的地址空间。

(1)RSEG伪指令

RSEG伪指令是再定位段选择伪指令。指令的格式如下: RSEG 段名

段名是在前面用SEGMENT伪指令已经定义的再定位段的段名。并用这个段作为当前段。

(2)CSEG、DSEG、XSEG、ISEG、BSEG伪指令

CSEG、DSEG、XSEG、ISEG、BSEG伪指令是绝对段选择伪指令,分别是:

CSEG 绝对代码段 DSEG 内部绝对数据段 XSEG 外部绝对数据段

ISEG 内部间接寻址绝对数据段 BSEG 绝对位寻址数据段

它们的指令格式:

CSEG [AT 绝对地址表达式] DSEG [AT 绝对地址表达式] XSEG [AT 绝对地址表达式] ISEG [AT 绝对地址表达式] BSEG [AT 绝对地址表达式]

括号内是可选项,用来指定当前绝对段的基地址。如果用AT指定了一个基地址,A51汇编器结束当前段并产生一个起始于指定地址的新段。如果AT没有指定基地址,则有当前段时,汇编器忽略该指令。没有当前段时,汇编器将生成一个绝对地址为0H的新段。绝对CODE段的默认地址是0H。如果选择了一个新段,则最后选择的段的段地址计数器保持活动状态。

三 汇编控制伪指令

A51汇编器有两类汇编控制指令,首要控制指令和次要控制指令。首要控制指令在程序里只能定义一次,不能被其它控制指令改变。次要控制指令只能在源程序的开始处引用,并且可以引用多次。在汇编控制伪指令介绍里的“μVision2 控制”项同Keil C51 μVision2集成开发环境里的属性对话框(图1)里的设置相对应。

下面是在MD-DOS的命令行方式下引用汇编控制指令的方法:

A51 SAMPLE.A51 XREF DEBUG NOMOD51 DATE(31,12,96) ERRORPRINT

下面是在源程序里引用汇编控制指令方法,在源程序里使用汇编控制指令需要用符号“$”开头:

$ XREF $ DEBUG $ NOMOD51

$ DATE(31,12,96) $ ERRORPRINT

也可以将它们放在一行

$ XREF DEBUG NOMOD51 DATE(31,12,96) ERRORPRINT

图1 Keil C51 μVision2集成开发环境里的属性对话框

下面给出首要控制指令(方括号内[]是可选项),对应Options For Target ‘ ?的各个选项卡中的设置。

名称:DATE 缩写:DA

参数:不超过9个个数的字符,缺省值为操作系统的系统日期。 μVision2 控制: Options-Ax51-Misc controls: 输入DATE.

功能:字符串显示在列表文件的每页的开头,超过9个字符串将产生错误。 例子:$ DATE(SAMPLE.A51) $ DA

名称:DEBUG / NODEBUG 缩写:DB / NODB 默认:NODEBUG

μVision2控制: Options-Output-Debug Information 功能:确定是否将供仿真器使用的调试信息加入目标文件。 例: A51 SAMPLE.A51 DEBUG

$ DEBUG

名称:ERRORPRINT / NO ERRORPRINT 缩写:ER /

参数:指定的文件名,如没有指定文件名,则信息输出到控制台。

μVision2 控制: 被用来从μVision2获得错误输出。在使用μVision2 IDE 时不用指定这

个控制。

功能:将源程序里的错误行及错误信息输出到指定的文件或控制台。 例: AX51 SAMPLE.A51 ERRORPRINT(SAMPLE.ERR)

AX51SAMPLE2.A51 ERRORPRINT $ ERRORPRINT(SAMPLE1.ERR) $ EP

名称:OBJECT / NOOBJECT 缩写:OJ / NOOJ

参数:指定的文件名,如没有指定文件名则以源文件名加上扩展名“.OBJ”作为目标代码文件名。

μVision2 控制: Options-Output-Select Folder for Objects 默认:OBJECT(源程序文件名.OBJ) 功能:产生目标代码文件。

例: A51 SAMPLE.A51 OBJECT(OBJDIRSAMPLE.OBJ)

OJ(OBJ\\SAMPLE.OBJ) $NOOBJECT

$ OBJECT(D:\\单片机\\SAMPLE.OBJ )

名称:PAGELENGTH 缩写:PL

参数:10~65535之间的数 默认:PAGELENGTH(132)

μVision2 控制: Options-Listing-Page Length

功能:指定列表文件中每页最大的行数,行数最小为10行。 例: $ PAGELENGTH(130)

$PL(66)

名称:PAGEWIDTH 缩写:PW

参数:78~132之间的数 默认:PAGEWIDTH(120)

μVision2 控制: Options-Listing-Page Width 功能:指定列表文件每行中最大的字符数 例: $ PW(80)

名称:PRINT / NOPRINT 缩写:PR / NOPR

参数:指定的扩展名为“LST”的列表文件名,如果没有指定列表文件名,则以源程序文件名加上扩展

名 “.LST”作为列表文件名。 默认:PRINT(源文件名.LST)

μVision2 控制: Options-Listing-Select Folder for List Files 功能:汇编后产生列表文件,在列表文件里有汇编产生的信息。 例: $ PRINT(ASMPLE1.LST)

$ NOPR

A51 TESTPRG.A51PR(TESTPRG1.LST)

名称:SYMBOLS / NOSYMBOLS 缩写:SB / NOSB 参数:无

默认:SYMBOLS

μVision2 控制: Options-Listing-Assembler Listing-Symbols

功能:在列表文件里列出符号表。NOPRINT指令抑制SYMBOLS,XREF指令激活SYMBOLS。 例: $ SYMBOLS

$ NOSB

名称:XREF / NOXREF 缩写:XR / NOXR 参数:无

μVision2 控制: Options-Listing-Assembler Listing-Cross Reference

功能:在列表文件里产生一个交叉参考表。交叉参考表里有参照符号行的行号,每行的#号后面的数字

给出了该符号的程序行。NOPRINT指令抑制XREF 例: $ XREF

名称:TITLE 缩写:TT

参数:不超过60个字符的字符串。

默认:1 省略TITLE指令时使用NAME定义的标题。

2 省略参数则使用不带扩展名的源程序文件名。

μVision2 控制: Options-Ax51-Misc controls: 输入TITLE. 功能:在列表文件的每页的开头包含程序标题。 例: $TITLE(Oven Controller Version 3.12)

$TT(Race Car Controller)

名称:MOD51 / NOMOD51 缩写:MO / NOMO 参数:无

默认:MOD51

μVision2 控制: Options-Target (取决于选择的元件模型). 功能:MOD51默认值定义8051的BIT和DATA符号。NOMOD51指令使的8051的所有符号对于汇编器都是

未知的,从而允许用户自己定义其它型号的单片机的符号。用户定义的符号文件可用INCLUDE指

令包含到源程序文件里,实用自定义符号文件时必须用NOMOD51指令,否则会发生多重定义错误。 例: $ NOMOD51

名称:COND / NOCOND 缩写:无 参数:无 默认:COND

μVision2 控制: Options-Listing-Assembler Listing-Conditional.

功能:将条件汇编块“IF-ELSEIF-ENDIF”结构中未汇编的部分在列表文件里列出来。 例: $COND

名称:MACRO / NOMACRO 缩写:无 参数:无 默认:MACRO

μVision2 控制: Options-Ax51-Macro processor-Standard.

功能:打开宏处理器。宏定义和宏调用将被识别和处理(默认方式)。NOMACRO关闭宏处理器。

例: $ MACRO

名称:REGISTERBANK / NOREGISTERBANK 缩写:RB / NORB

参数:0 ~ 3之间的数,该数值表示寄存器组。 默认:REGISTERMANK(0)

μVision2 控制: Options-Ax51-Misc controls: 输入REGISTERBANK 或NOREGISTERBANK. 功能:为本模块所使用的一组或多组寄存器保留存储器空间。默认值0表示为寄存器组0保留存储器空

间。USING指令自动为所选的寄存器组保留存储器空间。 例: $ REGISTERMANK(0,2,3) $ RB(2)

下面给出次要控制命令 名称:EJECK 缩写:EJ 参数:无

μVision2 控制: 这个控制不能在命令行里使用,只能在源程序里指定。 默认:达到PAGELENTH指令规定的值时换页

功能:将换页命令插入到列表文件里,并在下一页的开始处产生一个题头。NOPRINT和NOLIST指令抑制

EJECT指令

名称:INCLUDE 缩写:IC 默认:无

参数:所要包含的文件的文件名。

μVision2 控制: 这个控制不能在命令行里使用,只能在源程序里指定。

功能:将指定的文件内容立即插入到源程序中,通常用来将用户字定义的8051符号文件包含到程序中。

INCLUDE指令可以嵌套,最大嵌套深度为9层。

名称:LIST / NOLIST 缩写:LI / NOLI 参数:无 默认:LIST

μVision2 控制: Options-Ax51-Misc controls: 输入这个命令。

功能:表明后续的源程序文件是否在列表文件中显示出来。即使使用了NOLIST指令,出错行仍将显示

出来。NOPRINT指令抑制LIST和NOLIST指令。 例: $ NOLIST

名称:GEN / NOGEN 缩写:无 参数:无 默认:GEN

μVision2 控制: Options-Listing-Assembler Listing-Macros.

功能:GEN指令表明在列表文件中每个宏扩展都将被列出。NOGEN指令表明只列出源文件的内容,而不

列出宏扩展。 例: $ GEN

名称:SAVE / RESTORE 缩写:SA / RS 参数:无 默认:无

μVision2 Control: 这个命令不能在命令行指定。 功能:SAVE指令在内部汇编栈中保存当前LIST和GEN的设置。该栈KE 保留至多9个SAVE级。RESTOR

指令恢复最近被保留的GEN和LIST的设置。 例: $ SAVE NOLIST

$ INCLUDE(FILE.A51) $ RESTORE

四 条件汇编伪指令

条件汇编伪指令是A51汇编器的控制指令,其中SET和RESET指令可在源程序里使用,也可在命令行上使用,其它指令只能在源程序行中使用。条件汇编伪指令的作用是控制源程序中的一部分程序行是否根据需要进行汇编。条件汇编伪指令既可作为 $ 控制行的汇编控制,也可作为不带 $ 符的汇编控制。前者只能访问由SET和RESET指令定义的符号,而后者可访问源程序中除SET和RESET符号之外的所有符号,而且可用于宏中。

由条件汇编伪指令IF形成的IF条件块可嵌套使用,最大嵌套深度为10级。如果IF、ELSEIF、ELSE块不汇编,则由它们引起的嵌套条件块也不汇编。

下面介绍条件汇编伪指令和有关的其它伪指令。 (1)设置条件汇编参数值伪指令 名称: SET (参数)/ RESET (参数) 缩写: 无

参数: 参数有三种格式:

1) (变量[,变量,[,?] ] ) 2) ( 变量=数值[,? ] )

3) ( 变量,变量=数值,数值[,? ] )

默认值:无

μVision2 控制: Options-Ax51-Set.

功能: SET和RESET伪指令将数值赋给一个指定的变量。然后这些变量可以包含在IF和ELSETIF的伪指令的表达式里用作条件汇编的控制值。变量是汇编语言级的变量,要遵循汇编语言的规则而且只能在源程序汇编时由汇编语言处理。变量的值将决定源程序的哪些指令模块将包含在目标程序里。变量和变量的值本身不会被包含在目标程序里。变量的数值是一个单独的数字或表达式,表达式是无类型的。 例1:$ SET(VAR,VAR1,VAR2=32,VAR3) 例2:$ RESET(VAR4,VAR5,VAR6)

例1里的变量VAR2被赋值为32,VAR,VAR1,VAR3具有隐含值0FFFFH(“TRUE”)。例2里所有变量都被赋值为0000H(“FALSE”)。

(2) 条件汇编控制伪指令 名称: IF ( 参数 ) 缩写: 无

参数: 数值表达数 默认: 无

μVision2 控制: 这个命令不能在命令行指定。

功能: 如果数值表达式的计算结果值为真,则汇编IF块的语句,否则忽略IF块的语句。一个IF必须

与一个ENDIF匹配。否则会产生错误。

例:$ IF(VAR=3)

mov dptr,#table_a

mov a,@a+dptr

$ ENDIF

(3) 带参数分支条件汇编控制伪指令 名称: ELSFIF ( 参数 ) 缩写: 无

参数: 数值表达式 默认: 无

μVision2 控制: 这个命令不能在命令行指定。

功能: ELSFIF伪指令是IF伪指令模块里的一个分支判断语句。如果ELSFIF参数的数值表达式的计算

结果为真,则汇编该分支块。

例:$ IF(SWITCH=1)

< 语句块1 > $ ELSEIF(SWITCH=2)

< 语句块2 > $ ELSEIF(SWITCH=3)

< 语句块3 > $ ENDIF

(3) 无参数分支条件汇编控制伪指令 名称: ELSE 缩写: 无 参数: 无 默认: 无

μVision2 控制: 这个命令不能在命令行指定。

功能: ELSF伪指令是IF条件汇编语句模块里最后一个分支判断语句。如果汇编时IF或ELSEIF条件的

表达式计算结果为假,则汇编ELSF分支的语句块。一个IF伪指令模块可包含多个

ELSEIF块,

但只能包含一个ELSE块。ELSF伪指令的位置在IF条件汇编语句模块的所有ELSEIF

块的后面。

在IF条件汇编语句模块里可以有,也可以没有ELSF伪指令。

例:$ IF(VAR=1)

< 语句块1 >

$ ELSEIF(VAR=2)

< 语句块2 > $ ELSE

< 语句块3 > $ ENDIF

(4)结束条件汇编控制伪指令 名称:ENDIF 缩写:无 参数:无 默认:无

μVision2 控制: 这个命令不能在命令行指定。 功能:ENDIF伪指令结束IF条件汇编语句模块。ENDIF伪指令的位置在条件汇编语句模块的最后。如果

ENDIF与IF的个数不相等,就会产生汇编错误。 例:$ IF(VAR=1) <语句块>

$ ENDIF

五 宏处理伪指令

宏处理伪指令分为宏定义和宏调用两部分。宏定义是将一组经常使用的汇编指令定义为一个宏并用一个宏名表示它,而宏调用是在程序里用宏名调用一个已定义的宏并将它扩展为一组汇编指令。宏调用同子程序的调用不同。宏调用是在汇编器对源程序进行汇编处理时执行。汇编器在汇编源程序的时候将宏展开成一组指令,并将这组指令加入到程序代码里。而子程序的调用发生在程序(机器代码程序)在CPU里执行的时候,CPU使用CALL指令调用子程序,子程序用RET指令返回到调用它的程序。

宏调用在程序汇编时将宏扩展成一组指令,这会使程序的代码加长但是会加快程序的执行速度。子程序不会增加程序代码的长度,但会降低程序的执行速度。使用子程序可以缩短程序的代码长度。由于宏调用只能减少程序员的编程工作量,同时又增加了程序的复杂性使程序难以理解,所以现在很多程序员已经不使用宏调用了。下面介绍宏的定义和调用。

1 宏定义

(1) MACRO / ENDM

宏定义以MACRO指令开始,以ENDM指令结束。在MACRO和ENDM之间的8051指令称为宏体。指令的格式如下:

宏名 MACRO [形式参数表] 宏名和形式参数名是标识符,不能使用A51的保留字并且要遵循A51关于符号的规定。每个形式参数名必须是唯一的。形式参数表最多可包含16个形式参数,各个参数之间用“,”分隔。宏定义可以嵌套。MACRO指令和ENDM指令是配对使用的。

(2) LOCAL

LOCAL指令用来在宏体里定义局部标号。因为在一个宏里可能使用标号,而宏可能在程序里多次调用,多次扩展代码,这样在程序里就可能出现多个重复的标号,从而出现汇编错误。用LOCAL指令在宏体里说明标号(将标号定义为宏的局部标号)就可避免这种错误。指令的格式如下:

LOCAL 局部标号名[,?]

LOCAL指令只能用在宏体内,并且只能在宏体的其它所有指令的前面,在LOCAL指令的前面不允许有任何标号。在LOCAL指令的局部标号表里最多定义16个局部标号,标号之间用“,”分隔。局部标号不能使用A51的保留字和形式参数名并且要遵循A51关于符号的规定。

(3) RETP

RETP指令同MACRO指令类似,可以用来定义宏。指令的格式: [标号:] RETP 表达式

RETP伪指令允许位于RETP伪指令和ENDM伪指令之间的宏体在汇编进行宏扩展时被重复执行。RETP伪指令的表达式的结果值用来规定重复执行的次数。表达式的结果值是绝对的和无类型的值。LOCAL伪指令在RETP伪指令块里是有效的。

(4) IRP

同RETP伪指令相似,但IRP伪指令的重复次数取决于参数表里的参数个数。伪指令格式如下:

[标号:] IRP 形式参数,<参数表>

IRP伪指令只能包含一个形式参数和一个用〈〉扩起来的参数表。在重复时用参数表里的参数依次代替形式参数。参数表里的参数个数决定了IRP伪指令重复的次数。

(5) IRPC

同RETP伪指令相似,但IRPC伪指令的重复次数取决于实参里的字符个数。伪指令格式

如下:

[标号:] IRPC 形式参数,实参字符串

IRPC伪指令每次重复时用实参字符串里的一个字符代替形式参数。如果字符序列用<>括号扩起来,则全部字符序列作为一个实参。

(6) EXITM

EXITM伪指令用来在结束宏扩展并跳转到ENDM。在REPT、IRP、IRPC循环伪指令里用来结束循环并跳转到ENDM。在宏扩展里遇到EXITM伪指令就直接跳到ENDM伪指令并忽略EXITM后面的所有宏体。EXITM伪指令可以加入宏体里但不能取代ENDM伪指令。位于宏嵌套里的EXITM伪指令使宏扩展退到上一级宏,位于REPT、IRP、IRPC宏体里的EXITM伪指令结束当前和后继的循环。

2 嵌套宏定义

嵌套宏定义是指一个宏定义包含在另一个宏定义里。Ax51宏汇编器允许嵌套9层宏定义。在宏扩展时,先将高一级的宏定义完全扩展,在高级的宏定义展开的代码里包含有低一级的宏定义,然后再扩展低一级的宏定义。依次将所嵌套的所有宏定义都扩展出来。如果直接扩展低一级的宏定义就会产生错误。

3 宏调用

宏一经定义即可在程序里多次调用。宏定义调用的格式如下: [标号:] 宏名[实际参数值] 在宏调用时,按实际参数的排列顺序用实际参数依次替换宏定义里的形式参数。如果实际参数比形式参数多,则多出来的实际参数将被忽略,如果实际参数比形式参数少,则多出来的形式参数用空字符替换。

4 递归宏调用

宏可以用间接的或直接的方法调用自己,称为递归宏调用。但所有的递归过程(打开的文件和宏)不能超过9层。如果嵌套层数超过9,将会发生错误。在递归宏调用的时候适当使用EXITM伪指令会有效的避免产生错误。

5 特殊宏运算符

Ax51宏汇编器包括以下的特殊宏运算符 & 用来连接文本和形式参数

NUL NUL运算符检查参数变量是否是“NULL”,相应的宏处理器扩展的参数必须是“NULL”。

< > 尖括号内通常是定界符(逗号、空格等)。用于将尖括号内的特殊文本传递给嵌套的宏。

! 用在一个字符(通常是定界符)之前,使定界符和符号(“<”、“>”、 “!”、“,”“、”

作为实际文本传递。 ;; 表明该符号以后直到行的结束的正文文本都不被处理。

Keil Cx51语言简单介绍

Keil Cx51是MCS-51系列的单片机的C编译器。Cx51语言在ANSI C的标准上根据8051系列单片机作了一些扩展。下面对这些扩展作一些简单介绍。

存储器类型标识符

由于8051系列单片机有多个存储器空间,相应Cx51对这些存储器空间也扩展了存储器类型标识符并有相应的存储器操作指令。

存储器 程序存储器 直接寻址片内数据存储器 间接寻址片内数据存储器 位寻址片内数据存储器 片外数据存储器 页寻址片外数据存储器

Cx51语言程序里定义变量的时候,如果没有具体指出存储器的类型,编译器会使用默认的编译模式确定变量的存储器类型,这些存储器类型是SMALL,COMPAC,LARGE。

存储器类型 SMALL COMPAC LARGE

说明 堆栈及所有变量定义在片内数据存储器data,idata里。 所有变量定义在页寻址片外数据存储器xdata里,每个页寻址xdata的字长是256字节。 所有变量定义在片外数据存储器xdata里。 类型标识符 code data idata bdata xdata pdata 说明 64K字节,使用MOVC指令访问 128字节,使用MOV指令访问 256字节,使用MOV指令访问 16字节,使用MOV指令访问 64K字节,使用MOVX指令访问 256字节,使用MOVX指令访问 Cx51语言扩展的bit,sbit, sfr,sfr16数据类型

Cx51语言根据8051单片机的特点扩展了几个数据类型,这就是bit,sbit, sfr,sfr16数据类型。

用bit声明的位类型变量被定位在bdata的位寻址区。位寻址区有16个字节,共有128个位地址,可声明128个位类型变量。

Sbit用来声明可位寻址变量。声明sbit类型变量的时候需要先指定一个定义在bdata存储区的变量或者是一个可以位寻址的特殊功能寄存器,再通过这个变量的位(d0 — d7或d0 — d15)得到sbit的变量地址。

例如,ver0是一个定义在bdata存储区的字节变量,可以这样定义一个位变量Ver1: char bdata ver0 ; 声明一个字节变量。

sbit ver1 = ver0^0 ; 通过字节变量声明一个位变量。 sbit ver2 = P0^3; 声明端口P0的d3位为一个位变量。

ver1就是字节变量ver0的d0位,ver2是P0口的d3位。

为了直接访问单片机内部特殊功能寄存器,Sfr和sfr16类型变量可以直接定义特殊功能寄存器。定义的格式是:

sfr 表示8位字长的变量标识符 = 8位字长的特殊功能寄存器的地址常数 sfr16 表示16 位字长的变量标识符 = 16位字长的特殊功能寄存器的地址常数

例如,对于定时器TIMER2,T2L=0xCCH,T2H=0xCDH。 Sfr16 T2 = 0xCCH

T2是一个16位的寄存器,低8位的地址是0xCCH,高8位的地址是0xCDH。

Cx51语言的一般指针和基于存储器指针

声明一般指针的方法同普通的C语言一样。一般指针可以存取任何变量而不用考虑变量在8051单片机存储器里的位置。例如:

int *ver0 char *ver1

声明基于存储器指针需要指明存储器类型(data,idata,pdata,code,xdata ),方法是在*号的前面加一个存储器类型选项。例如:

int data *ver0 char code *ver1 int xdata *ver2

在编译的时候,编译程序对一般指针和基于存储器的指针可能会根据需要转换。

Cx51语言对C语言函数定义的扩展

由于8051单片机的特点,Cx51语言对C语言函数的定义作了扩展。如可以选择函数的编译模式,选择函数的工作寄存器,定义中断服务函数等。

Cx51语言的函数定义一般格式:

函数类型 函数名(形式参数表)[编译模式][reentrant][interrupt n][using n] { 局部变量定义 函数体语句 }

编译模式:指定函数的局部变量和参数存放的存储器空间。有三个可选模式,分别是SMALL,COMPACT,LARGE。

reentrant:用于定义再入函数。

interrupt n:用于定义中断函数。n是中断号,取值0 – 31。中断号决定中断服务程序的入口地址。

using n:用于确定中断服务函数使用的工作寄存器,n是寄存器组号,取值0 – 3。

更详细的Cx51语言和Cx51编译器的内容可以参考相关文献。

Keil C51 IDE简单介绍

Keil C51μVision2集成开发环境(Keil C51 IDE)是基于80C51内核的微处理器软件开发平台。开发平台内包含有完整的符合工业标准的开发工具。用这些开发工具可以完成工程建立、工程管理,软件编译、连接和目标代码的生成以及软件仿真、硬件仿真等完整的开发过程。

μVision2集成开发环境的主要功能如下:

TM

μVision2 for Windows:是一个集成开发环境,将项目管理、源代码调试、程序调试(软件仿真或硬件仿真)等功能组合在一个开发环境里。这些开发工具是:

C51交叉编译器。 A51宏汇编器。 BL51连接/定位器。 LIB51库管理器。

OH51目标文件到HEX文件格式的转换器。 RTX-51实时操作系统。

Keil C51 Software 提供了数个80C51系列的开发工具套件。它们是: PK51专业开发套件 DK51开发套件 CA51编译器套件 A51编译器套件

RTX51实时操作系统(FR51)

下表是每个套件的功能列表:

开 发 工 具 μVision2项目管理器和编辑器 C51交叉编译器 A51宏汇编器 BL51连接/定位器 LIB51库管理器 OH51格式转换器 RTX-51 Full RTX-51 Tiny PK51 √ √ √ √ √ √ √ DK51 √ √ √ √ √ √ CA51 √ √ √ √ √ A51 √ √ √ √ FR51 √ DP-51S单片机仿真实验仪和keil C51开发调试软件集成在一起,形成一个完整的实验系统。实验使用Keil C51 V7.0版的评估版软件。评估版软件里包含了一些示范程序和一些受限制的工具(功能、应用程序代码长度等方面受限),但是我们还是可以通过它很好的学习和了解单片机的整个开发过程。如果是为了商业应用,需要购买正版软件以获得完整的功能。

Keil C51的安装:

安装Keil C51软件,必须满足最小的硬件和软件的要求:

Pentium、PentiumII及以上版本的处理器和兼容处理器的PC计算机; Windows98、WindowsXP、Windows NT4.0、Windows2000等操作系统; 至少16MB RAM;

至少20MB 的硬盘空间; 软件安装过程(略)。软件安装完成以后,在D:\\Keil\\目录下生成两个子目录:C51子目录和UV2子目录。其中C51子目录下是Keil C51的各种开发工具,UV2子目录下是μVision2 IDE集成开发环境。μVision2 IDE支持所有的Keil C51工具软件,这些工具软件介绍如下:

(1)C51交叉编译器

从8051的C源代码产生可重定位的目标模块(object文件)。C51交叉编译器遵照ANSI C语言标准并支持它的所有标准特性以及支持80C51的结构特性。

(2)A51宏汇编器

从8051的汇编源代码产生可重定位的目标模块(object文件)。A51宏汇编器支持80C51及其派生系列的所有指令集。

(3)BL51连接/定位器

连接和定位由C51和A51产生的可重定位的目标模块,生成绝对目标模块。 (4)LIB51库管理器

从目标模块生成连接器可以使用的库文件。这些绝对地址目标文件(模块)包括不可重定位的代码和数据,所有的代码和数据都定位在具体的存储器单元里。

(5)OH51目标文件到HEX文件格式的转换器 用来从绝对目标模块生成Intel HEX文件。 (6)LIB51库管理器

使用目标文件建立库文件。这些库文件是按规定的格式建立的目标模块,可以被连接器直接使用。在连接时,用户的应用程序只连接使用库程序里的由应用程序涉及到的资源。

(7)RTX-51实时操作系统

针对80C51系列的微控制器的一个操作系统多任务实时内核。它简化了是实时系统对事件反应的软件系统设计、编程和调试工作。这个多任务实时内核集成在C51编译器里。有关操作系统的描述和操作由BL51连接/定位器自动完成。RTX-51 Full提供了RTX-51的所有功能,RTX-51 Tiny提供了RTX-51的基本功能。

(8)μVision2软件调试器

可以快速、可靠的调试应用程序,调试器里包括一个高速模拟器,用来模拟80C51的系统。包括片上的外围器件和外部硬件。在器件库里选择器件时,器件的属性会被自动的配置。

(9)μVision2硬件调试器

硬件调试器提供了数种在实际目标硬件上测试程序的方法。它可以在安装有MON51目标监视器的目标系统里,通过Monitor-51接口下载用户程序到目标硬件系统。也可以使用GDI接口,将μVision2调试器同硬件系统相连接,通过μVision2的人机交互环境调试程序完成系统设计。我们使用的DP-51S实验仪就是这样工作的。

在启动μVision2集成开发环境后,在计算机的屏幕上出现μVision2操作界面。在操作界面上有命令菜单栏、工具栏(提供快捷图标)。在工作区有工程项目窗口、文本编辑窗口 、输出信息窗口、存储区观察窗口、变量观察窗口等,这些窗口的显示由View菜单里的命令控制(在图1显示的界面里只打开了三个窗口)。

μVision2集成开发环境菜单栏命令。 (1)文件菜单和文件命令(File)

New ... Open ... Close Save Save As ... Save All Device Database Print Setup ... Print Print Preview 1 ASAMPLE1

创建一个新的源文件或文本文件 打开已有的文件 关闭当前文件 保存当前文件

重命名并保存当前文件

保存所有打开的源文件或文本文件 打开μVision2的器件数据库 设置打印机 打印当前文件 打印预览

快速打开最近使用的源文件或文本文件

图1 μVision2操作界面

2 ASAMPLE2 快速打开最近使用的源文件或文本文件 Exit 退出μVision2并提示保存文件

(2)编辑菜单和编辑命令(Edit)

Undo 撤消上一次操作 Redo 撤消撤消上一次操作

Cut 将选中的文字剪切并放到剪贴板 Copy 将选中的文字复制到剪贴板 Paste 粘帖剪贴板的文字

Indent Selectde Text 将选中的文字向右缩进一个制表符位

Unindent Selected Text 将选中的文字向左缩进一个制表符位 Toggle Bookmark 在当前行放置书签 Goto Next Bookmark 将光标移到下一个书签 Goto Previous Bookmark 将光标移到上一个书签 Clear All Bookmark 清除当前文件中的所有书签 Find 在当前文件中查找文字 Replace 替换指定的文字

find in Files... 在几个文件中查找文字

(3)视图菜单(View)

Status Bar 显示隐藏状态栏 File Toolber 显示隐藏文件工具栏 Build Toolbar 显示隐藏编译工具栏 Debug Toolbar 显示隐藏调试工具栏 Project Window 显示隐藏工程窗口 Output Window 显示隐藏输出窗口 Source Browser 打开源文件浏览器窗口 Disassembly Window 显示隐藏反汇编窗口 Watch & Call Stack Window 显示隐藏观察和堆栈窗口 Memory Window 显示隐藏存储器窗口 Code Coverage Window 显示隐藏代码覆盖窗口 Performance Analyzer Window 显示隐藏性能分析窗口 Symbol Window 显示隐藏符号变量窗口 Serial Window # 1 显示隐藏串行窗口 1 Serial Window # 2 显示隐藏串行窗口 2 Toolbox 显示隐藏工具箱

Periodic Window Update 在运行程序时,周期刷新调试窗口 Workbook Mode 显示隐藏工作簿窗口的标签

Options ... 设置颜色,字体,快捷键和编辑器选项

(4)工程菜单和工程命令 (project )

New Project ... 建立新的工程

Import μVision1 Project ... 输入μVision1 工程文件 Open Project ... 打开已存在的工程 Close Project ... 关闭当前的工程

Target Environment 定义工具系列,包含文件,库文件的路径 Targets , Groups , Files 维护工程的对象,文件组和文件 Select Device for Target 从器件数据库选择一个CPU Remove ... 从工程中删去一个组或文件 Options ... 设置对象,组或文件的工具选项

File Extensions 选择文件的扩展名以区别不同的文件类型 Build Target 转换修改过的文件并编译成应用文件 Rebuid Target 重新转换修改过的文件并编译成应用文件 Translate ... 转换当前的文件 Stop Build 停止当前的编译进程 C:\\C51\\....\\hello.Uv2 打开最近使用的工程文件

(5)调试菜单和调试命令 (Debug)

Start / Stop Debugging 启动和停止μVision2调试模式

Go 运行程序到结束或运行到下一个有效断点 Step 跟踪运行程序 Step Over 单步运行程序

Step out of current function 执行到当前函数的程序 Stop Runnion 停止程序运行 Breakpoints ... 打开断点对话框

Insert / Remove Breakpoint 在当前行设置 / 清除断点 Enable / Disable Breakpoiont 使能 / 禁止当前行的断点 Disable All Breakpoiont 禁止程序中的的所有断点 Kill All Breakpoints 清除程序中的所有断点

Show Next Statement 显示下一条执行的语句 / 指令

Enable / Disable Trace Recording 使能 / 禁止跟踪记录,可以显示程序运行轨迹 View Trace Records 显示以前执行的指令

Memory Map ... 打开存储器空间配置对话框 Performance Analyzer ... 打开性能分析器设置对话框

Inline Assembly ... 对某一行重新汇编,可以修改汇编代码 Function Editor 编辑调试函数和调试配置文件

(6)外围器件菜单 (peripherals ) 以下内容由选择的CPU决定。菜单里出现的各个选项将打开相应的外围器件对话框,对话框的内容由器件数据库中选择的CPU决定。不同的CPU,下拉菜单和对话框里的内容不同。 Reset CPU 复位 CPU Interrupt , I / O - Ports , Serial , Timer ,

(7)工具菜单 (Tools )

Setup PC-Lint 配置Gimpel Sofware 公司的PC-Lint Lint 在当前的编辑文件中运行PC-Lint

Lint all C Source Files 在工程的C源代码文件中运行PC-Lint Setup Easy-Case ... 配置Siemens Easy-Case

Start / Stop Easy-Case 启动或停止Siemens Easy-Case

Show File ( Line ) Customize Tools Menu ... 将用户程序加入工具菜单

(8)软件版本控制系统菜单 (SVCS )

Configure Version Control ... 配置您的软件版本控制系统命令

(9)视窗菜单 (Window )

Cascade 层叠所所有窗口

Tile Horizontally 横向排列窗口(不层叠) Tile Vertically 纵向排列窗口(不层叠) Arrange Icons 在窗口的下方排列图标

Split 将打开的窗口拆分成几个窗格 C:\\C51\\...\\HELLO.C 打开选中的窗口对象 C:\\A51\\...\\ASAMPLE2.A51 打开选中的窗口对象

本文来源:https://www.bwwdw.com/article/x01h.html

Top