第4章 汇编语言程序设计及仿真调试(2)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
格式: 符号名 XDATA 表达式 XDATA 指令用于将一个外部 RAM 的地址赋给指定的符号名。 数值表达式的值在0000H~0FFFFH之间,对于STC12C5A60S2单片 机,片内集成了1024字节的XRAM,地址范围是0000H~03FFH。表 达式必须是一个简单表达式。如: MYDATA XDATA 0020H
1/39
增强型8051单片机实用开发技术
1、设置起始地址ORG
ORG nn
ORG伪指令总是出现在每段源程序或数据块的开始。它可使程序 员把程序、子程序或数据块存放在存贮器的任何位置。
ORG 0000H
LJMP MAIN ┇ 在实际应用中,一般仅设置中断服务子程序的入口地址和主程序 的起始存放地址,其他的程序或常数依次存放即可,汇编程序会自动 进行存储空间的分配。
使用上述命令后,在用户程序中就可以直接使用STC12C5A60S2 单片机的寄存器名称了。例如, MOV BRT,#0FBH ;设置独立波特率发生器的时间常数
7/39
增强型8051单片机实用开发技术
8、条件汇编控制指令
条件汇编控制指令的作用是使源程序中的一部分程序行根据需 要决定是否进行汇编。条件汇编控制伪指令的一般格式: IF 表达式
6/39
增强型8051单片机实用开发技术
7、文件包含命令INCLUDE
文件包含命令INCLUDE用于将寄存器定义文件(一般的后缀名 为.INC)包含于当前程序中,与C语言中的#include语句类似。使用 格式为:
$INCLUDE (文件名)
例如,为了使用方便,作者把STC12C5A60S2D单片机的寄存器 定义保存在文件STC12C5A.INC中,使用时,可以在程序的开始处使 用下面的命令将其包含到用户程序中: $INCLUDE (STC12C5A.INC) ;包含寄存器定义文件
4、DATA指令
格式: 符号名 DATA 表达式 DATA 指令用于将一个内部 RAM 的地址赋给指定的符号名。 数值表达式的值在00H~0FFH之间,表达式必须是一个简单表达 式。如: BUFFER DATA 40H
4/39
增强型8051单片机实用开发技术
5、XDATA指令(Extenal Data)
1、汇编语言程序设计的一般步骤 (1)分析课题,确定算法或解题思路; (2)根据算法或思路画出流程图; (3)根据算法要求分配资源,包括内部RAM、定时器、中断等资源的分配。 (4)根据流程图编写程序; (5)不断调试并修改源程序,直到满足系统的要求。
9/39
增强型8051单片机实用开发技术
2、STC12C5A60S2单片机 汇编语言程序的设计框架:
13/39
增强型8051单片机实用开发技术
2、查表程序设计 所谓查表法,就是把事先计算或测得的数据按一定顺序编制成表格,查 表程序根据被测参数的值或者中间结果,查出最终所需要的结果。它具有程 序简单,执行速度快等优点。 查表程序在计算机控制系统中应用非常广泛。例如,在键盘处理程序中, 查找按键相应的命令处理子程序的入口地址;在LED显示程序中,获得LED 数码管的显示代码;在一些快速计算的场合,根据自变量的值,从函数表上 查找出相应的函数值以及实现非线性修正、代码转换等等。 常用MOVC A,@A+DPTR查找程序存储器空间的代码或常数,每次传 送一个字节。
2、定义字节DB或DEFB
〈标号:〉 DB 〈项或项表〉 其中项或项表是指一个字节,数或字符串,或以引号括起来的ASCⅡ码字符 串(一个字符用ASCⅡ码表示,相当于一个字节)。该指令的功能是把项或项 表的数值(字符则用它的ASCⅡ码)存入从标号开始的连续单元中。
2/39
增强型8051单片机实用开发技术
DB
DB DB DB DB DB DB DB
080H
090H 088H 083H 0C6H 0A1H 086H 08EH
;8
;9 ;A ;B ;C ;D ;E ;F
访问表格常数时,常用MOVC A, @A+DPTR指令。
3/39
增强型8051单片机实用开发技术
3、为标号赋值EQU
〈标号:〉 EQU 项或汇编符号 其功能是将一个数或特定的汇编符号赋给语句中的字符名称。 注意,字符名称为一自定的符号,而不是标号,字符名称后无 “:”。字符名称可用来作数据地址、立即数或者位地址,其值可 以是一个8位数,也可以是16位数。 使用EQU伪指令可以把抽象的数字或地址表示成有一定意义的 符号,增强程序的可读性。需要注意的是,在同一程序中,用EQU 伪指令对标号赋值后,该标号的值在整个程序中不能再改变。
常用DB命令在程序存储器中存放数据表格,例如存放数码管显示的十六进制数的字 形码(或称为字模)。例如,共阳极LED显示字模表如下: LEDCode: DB DB DB DB 0C0H 0F9H 0A4H 0B0H ;0 ;1 ;2 ;3
DB
DB DB DB
099H
092H 082H 0F8H
;4
;5 ;6 ;7
入口:设延时时间N(以0.1ms为单位)送入R0。 出口:延时到,退出程序,无参数传递。 DELAY: MOV R7,#150 ;当时钟为6MHz时,约延时0.1ms
LOOP:
DJNZ R7,LOOP
DJNZ R0,DELAY RET
16/39
增强型8051单片机实用开发技术
4、定点数运算子程序
(1)多字节十进制BCD码减法 入口:被减数低字节地址存放于R1,减数低字节地址存放于R0,字节数存放于R2。 出口:差(补码)的低字节地址存放于R0,字节数存放于R3。
源自文库
[ 程序块1 ]
[ ELSE ] [ 程序块2 ]
ENDIF
9、源程序结束 END
〈标号:〉 END 〈表达式〉 END语句是一个结束标志,它告诉汇编程序,该程序段已结束。 因此,该语句必须放在整个程序(包括伪指令)之后。
8/39
增强型8051单片机实用开发技术
4.2.2 汇编语言程序设计的一般步骤和基本框架
$INCLUDE (STC12C5A.INC) ;包含STC12C5A60S2单片机寄存器定义头文件 ;这里可以编写程序中用到的一些符号定义(使用EQU、DATA、BIT等伪指令) ORG 0000H LJMP MAIN ;跳转到主程序 ORG 0003H LJMP INT0_ISR ;外部中断0入口 ORG 000BH LJMP T0_ISR ;定时器0中断入口 ORG 0013H LJMP INT1_ISR ;外部中断1入口 ORG 001BH LJMP T1_ISR ;定时器1中断入口 ORG 0023H LJMP UART1_ISR ;串口1中断入口 ORG 002BH LJMP ADC_ISR ;ADC中断服务程序入口 ORG 0033H LJMP LVD_ISR ;低电压检测中断服务程序入口 ORG 003BH LJMP PCA_ISR ;PCA中断服务程序入口 ORG 0043H LJMP UART2_ISR ;串口2中断服务程序入口 ORG 004BH LJMP SPI_ISR ;SPI中断服务程序入口 ORG 0100H MAIN: MOV SP,#70H ;设置堆栈指针(可根据实际情况进行修改) ……;初始化内存区域内容 ……;设置有关特殊功能寄存器(SFR)的控制字 ……;根据需要开放相应的中断控制 MAINLOOP: ;主程序循环 LJMP MAINLOOP 10/39
14/39
增强型8051单片机实用开发技术
3、循环程序设计 当程序处理的对象具有重复性规律时,可以使用循环程序设计。一个循 环表示重复执行一组指令(程序段)。
开始
初始化部分
处理部分
循环控制部分
N 循环次数是否已够? Y 结束
15/39
增强型8051单片机实用开发技术
例1 延时程序(时钟为6MHz )
12/39
增强型8051单片机实用开发技术
4.3
典型汇编语言程序设计举例
1、分支程序设计
【例4-1】编程实现下面的比较函数。设变量x存放在R0,求得的y值存入SIGN单 元。 +1 x>37 y= -1 x<37 0 x=37
解:可以利用CJNE指令和进位位C状态控制转移(JC指令)来实现三分支转移。源程序如下: SIGN EQU 50H ORG 0000H LJMP MAIN ORG 0100H MAIN: CJNE R0,#37,NOTEQ ;R0中数与37数比较,不相等则转NOTEQ MOV SIGN,#00H ;若比较相等,则SIGN←0 LJMP ENDME NOTEQ:JC NEG ;两数不相等,若R0<37则转NEG MOV SIGN,#01H ;R0>37时,SIGN←+1 LJMP ENDME NEG: MOV SIGN,#0FFH ;R0<37时,SIGN←-1(以补码形式给出) ENDME:NOP END
增强型8051单片机实用开发技术
;下面是各个中断服务子程序的入口 INT0_ISR: ;外部中断0服务子程序 …… ;根据需要填入适当的内容 RETI INT1_ISR: ;外部中断1服务子程序 …… ;根据需要填入适当的内容 RETI T0_ISR: ;定时器0中断服务子程序 …… ;根据需要填入适当的内容 RETI T1_ISR: ;定时器1中断服务子程序 …… ;根据需要填入适当的内容 RETI UART1_ISR: ;串口1中断服务子程序 …… ;根据需要填入适当的内容(注意中断请求标志位的清零) RETI UART2_ISR: ;串口2中断服务子程序 …… ;根据需要填入适当的内容(注意中断请求标志位的清零) RETI
增强型8051单片机实用开发技术
4.2
4.2.1 伪指令
汇编语言程序设计
一般来说,在汇编语言源程序中用指令助记符编写 的程序,都可以一一对应的产生目标程序。但还有一些 指令,例如指定目标程序或数据存放的起始地址,给一 些指定的标号赋值,在内存中予留工作单元,表示源程 序结束等等。这些指令并不产生目标程序,不影响程序 的执行,仅仅产生供汇编用的某些指令,以便在汇编时 执行一些特殊操作,称之为伪指令。
INC
INC CPL DJNZ JNC SETB SUBCD2:RET
R1
R3 C R2,SUBCD1 SUBCD2 07H
其他编程实例,请参见教材
17/39
增强型8051单片机实用开发技术
4.4 利用Keil uVision集成开发环境调试程序
4.4.1 Keil uVision集成开发环境简介
5/39
增强型8051单片机实用开发技术
6、定义位命令BIT
格式: 字符名称 BIT 位地址 用于给字符名称定义位地址。如: DOGOUT BIT P3.4 经定义后,允许在指令中用DOGOUT代替P3.4。 DATA、BIT命令可以使用EQU代替,例如,下面的两条命令 是等价的: TCON DATA 88H ;中断优先级高位寄存器 TCON EQU 88H ;中断优先级高位寄存器 下面的两条命令也是等价的: TF1 BIT 8FH ;TF1的位地址位8FH TF1 EQU TCON.7 ;TF1为TCON的第7位
07H为符号位。0表示结果为正,1表示结果为负。
SUBCD: MOV CLR CLR SUBCD1:MOV R3,#00H 07H C A,#9AH ;差字节数置0 ;符号位清0 ;借位位C清0
SUBB
ADD DA MOV INC
A,@R0
A,@R1 A @R0,A R0
;相差
;地址值增1 ;差字节增1 ;进位求反,以形成正确借位 ;未减完继续,减完向下执行 ;无借位去SUBCD2返主,否则继续 ;差为负置“1”符号位 ;返回
11/39
增强型8051单片机实用开发技术
ADC_ISR: ;ADC中断服务子程序 …… ;根据需要填入适当的内容(注意中断请求标志位的清零) RETI SPI_ISR: ;SPI通信中断服务子程序 …… ;根据需要填入适当的内容(注意中断请求标志位的清零) RETI LVD_ISR: ;低电压检测服务子程序 …… ;根据需要填入适当的内容(注意中断请求标志位的清零) RETI PCA_ISR: ;PCA和PWM中断服务子程序 …… ;根据需要填入适当的内容(注意中断请求标志位的清零) RETI ;下面可以编写其他子程序或者定义程序中所用的常数 END
1/39
增强型8051单片机实用开发技术
1、设置起始地址ORG
ORG nn
ORG伪指令总是出现在每段源程序或数据块的开始。它可使程序 员把程序、子程序或数据块存放在存贮器的任何位置。
ORG 0000H
LJMP MAIN ┇ 在实际应用中,一般仅设置中断服务子程序的入口地址和主程序 的起始存放地址,其他的程序或常数依次存放即可,汇编程序会自动 进行存储空间的分配。
使用上述命令后,在用户程序中就可以直接使用STC12C5A60S2 单片机的寄存器名称了。例如, MOV BRT,#0FBH ;设置独立波特率发生器的时间常数
7/39
增强型8051单片机实用开发技术
8、条件汇编控制指令
条件汇编控制指令的作用是使源程序中的一部分程序行根据需 要决定是否进行汇编。条件汇编控制伪指令的一般格式: IF 表达式
6/39
增强型8051单片机实用开发技术
7、文件包含命令INCLUDE
文件包含命令INCLUDE用于将寄存器定义文件(一般的后缀名 为.INC)包含于当前程序中,与C语言中的#include语句类似。使用 格式为:
$INCLUDE (文件名)
例如,为了使用方便,作者把STC12C5A60S2D单片机的寄存器 定义保存在文件STC12C5A.INC中,使用时,可以在程序的开始处使 用下面的命令将其包含到用户程序中: $INCLUDE (STC12C5A.INC) ;包含寄存器定义文件
4、DATA指令
格式: 符号名 DATA 表达式 DATA 指令用于将一个内部 RAM 的地址赋给指定的符号名。 数值表达式的值在00H~0FFH之间,表达式必须是一个简单表达 式。如: BUFFER DATA 40H
4/39
增强型8051单片机实用开发技术
5、XDATA指令(Extenal Data)
1、汇编语言程序设计的一般步骤 (1)分析课题,确定算法或解题思路; (2)根据算法或思路画出流程图; (3)根据算法要求分配资源,包括内部RAM、定时器、中断等资源的分配。 (4)根据流程图编写程序; (5)不断调试并修改源程序,直到满足系统的要求。
9/39
增强型8051单片机实用开发技术
2、STC12C5A60S2单片机 汇编语言程序的设计框架:
13/39
增强型8051单片机实用开发技术
2、查表程序设计 所谓查表法,就是把事先计算或测得的数据按一定顺序编制成表格,查 表程序根据被测参数的值或者中间结果,查出最终所需要的结果。它具有程 序简单,执行速度快等优点。 查表程序在计算机控制系统中应用非常广泛。例如,在键盘处理程序中, 查找按键相应的命令处理子程序的入口地址;在LED显示程序中,获得LED 数码管的显示代码;在一些快速计算的场合,根据自变量的值,从函数表上 查找出相应的函数值以及实现非线性修正、代码转换等等。 常用MOVC A,@A+DPTR查找程序存储器空间的代码或常数,每次传 送一个字节。
2、定义字节DB或DEFB
〈标号:〉 DB 〈项或项表〉 其中项或项表是指一个字节,数或字符串,或以引号括起来的ASCⅡ码字符 串(一个字符用ASCⅡ码表示,相当于一个字节)。该指令的功能是把项或项 表的数值(字符则用它的ASCⅡ码)存入从标号开始的连续单元中。
2/39
增强型8051单片机实用开发技术
DB
DB DB DB DB DB DB DB
080H
090H 088H 083H 0C6H 0A1H 086H 08EH
;8
;9 ;A ;B ;C ;D ;E ;F
访问表格常数时,常用MOVC A, @A+DPTR指令。
3/39
增强型8051单片机实用开发技术
3、为标号赋值EQU
〈标号:〉 EQU 项或汇编符号 其功能是将一个数或特定的汇编符号赋给语句中的字符名称。 注意,字符名称为一自定的符号,而不是标号,字符名称后无 “:”。字符名称可用来作数据地址、立即数或者位地址,其值可 以是一个8位数,也可以是16位数。 使用EQU伪指令可以把抽象的数字或地址表示成有一定意义的 符号,增强程序的可读性。需要注意的是,在同一程序中,用EQU 伪指令对标号赋值后,该标号的值在整个程序中不能再改变。
常用DB命令在程序存储器中存放数据表格,例如存放数码管显示的十六进制数的字 形码(或称为字模)。例如,共阳极LED显示字模表如下: LEDCode: DB DB DB DB 0C0H 0F9H 0A4H 0B0H ;0 ;1 ;2 ;3
DB
DB DB DB
099H
092H 082H 0F8H
;4
;5 ;6 ;7
入口:设延时时间N(以0.1ms为单位)送入R0。 出口:延时到,退出程序,无参数传递。 DELAY: MOV R7,#150 ;当时钟为6MHz时,约延时0.1ms
LOOP:
DJNZ R7,LOOP
DJNZ R0,DELAY RET
16/39
增强型8051单片机实用开发技术
4、定点数运算子程序
(1)多字节十进制BCD码减法 入口:被减数低字节地址存放于R1,减数低字节地址存放于R0,字节数存放于R2。 出口:差(补码)的低字节地址存放于R0,字节数存放于R3。
源自文库
[ 程序块1 ]
[ ELSE ] [ 程序块2 ]
ENDIF
9、源程序结束 END
〈标号:〉 END 〈表达式〉 END语句是一个结束标志,它告诉汇编程序,该程序段已结束。 因此,该语句必须放在整个程序(包括伪指令)之后。
8/39
增强型8051单片机实用开发技术
4.2.2 汇编语言程序设计的一般步骤和基本框架
$INCLUDE (STC12C5A.INC) ;包含STC12C5A60S2单片机寄存器定义头文件 ;这里可以编写程序中用到的一些符号定义(使用EQU、DATA、BIT等伪指令) ORG 0000H LJMP MAIN ;跳转到主程序 ORG 0003H LJMP INT0_ISR ;外部中断0入口 ORG 000BH LJMP T0_ISR ;定时器0中断入口 ORG 0013H LJMP INT1_ISR ;外部中断1入口 ORG 001BH LJMP T1_ISR ;定时器1中断入口 ORG 0023H LJMP UART1_ISR ;串口1中断入口 ORG 002BH LJMP ADC_ISR ;ADC中断服务程序入口 ORG 0033H LJMP LVD_ISR ;低电压检测中断服务程序入口 ORG 003BH LJMP PCA_ISR ;PCA中断服务程序入口 ORG 0043H LJMP UART2_ISR ;串口2中断服务程序入口 ORG 004BH LJMP SPI_ISR ;SPI中断服务程序入口 ORG 0100H MAIN: MOV SP,#70H ;设置堆栈指针(可根据实际情况进行修改) ……;初始化内存区域内容 ……;设置有关特殊功能寄存器(SFR)的控制字 ……;根据需要开放相应的中断控制 MAINLOOP: ;主程序循环 LJMP MAINLOOP 10/39
14/39
增强型8051单片机实用开发技术
3、循环程序设计 当程序处理的对象具有重复性规律时,可以使用循环程序设计。一个循 环表示重复执行一组指令(程序段)。
开始
初始化部分
处理部分
循环控制部分
N 循环次数是否已够? Y 结束
15/39
增强型8051单片机实用开发技术
例1 延时程序(时钟为6MHz )
12/39
增强型8051单片机实用开发技术
4.3
典型汇编语言程序设计举例
1、分支程序设计
【例4-1】编程实现下面的比较函数。设变量x存放在R0,求得的y值存入SIGN单 元。 +1 x>37 y= -1 x<37 0 x=37
解:可以利用CJNE指令和进位位C状态控制转移(JC指令)来实现三分支转移。源程序如下: SIGN EQU 50H ORG 0000H LJMP MAIN ORG 0100H MAIN: CJNE R0,#37,NOTEQ ;R0中数与37数比较,不相等则转NOTEQ MOV SIGN,#00H ;若比较相等,则SIGN←0 LJMP ENDME NOTEQ:JC NEG ;两数不相等,若R0<37则转NEG MOV SIGN,#01H ;R0>37时,SIGN←+1 LJMP ENDME NEG: MOV SIGN,#0FFH ;R0<37时,SIGN←-1(以补码形式给出) ENDME:NOP END
增强型8051单片机实用开发技术
;下面是各个中断服务子程序的入口 INT0_ISR: ;外部中断0服务子程序 …… ;根据需要填入适当的内容 RETI INT1_ISR: ;外部中断1服务子程序 …… ;根据需要填入适当的内容 RETI T0_ISR: ;定时器0中断服务子程序 …… ;根据需要填入适当的内容 RETI T1_ISR: ;定时器1中断服务子程序 …… ;根据需要填入适当的内容 RETI UART1_ISR: ;串口1中断服务子程序 …… ;根据需要填入适当的内容(注意中断请求标志位的清零) RETI UART2_ISR: ;串口2中断服务子程序 …… ;根据需要填入适当的内容(注意中断请求标志位的清零) RETI
增强型8051单片机实用开发技术
4.2
4.2.1 伪指令
汇编语言程序设计
一般来说,在汇编语言源程序中用指令助记符编写 的程序,都可以一一对应的产生目标程序。但还有一些 指令,例如指定目标程序或数据存放的起始地址,给一 些指定的标号赋值,在内存中予留工作单元,表示源程 序结束等等。这些指令并不产生目标程序,不影响程序 的执行,仅仅产生供汇编用的某些指令,以便在汇编时 执行一些特殊操作,称之为伪指令。
INC
INC CPL DJNZ JNC SETB SUBCD2:RET
R1
R3 C R2,SUBCD1 SUBCD2 07H
其他编程实例,请参见教材
17/39
增强型8051单片机实用开发技术
4.4 利用Keil uVision集成开发环境调试程序
4.4.1 Keil uVision集成开发环境简介
5/39
增强型8051单片机实用开发技术
6、定义位命令BIT
格式: 字符名称 BIT 位地址 用于给字符名称定义位地址。如: DOGOUT BIT P3.4 经定义后,允许在指令中用DOGOUT代替P3.4。 DATA、BIT命令可以使用EQU代替,例如,下面的两条命令 是等价的: TCON DATA 88H ;中断优先级高位寄存器 TCON EQU 88H ;中断优先级高位寄存器 下面的两条命令也是等价的: TF1 BIT 8FH ;TF1的位地址位8FH TF1 EQU TCON.7 ;TF1为TCON的第7位
07H为符号位。0表示结果为正,1表示结果为负。
SUBCD: MOV CLR CLR SUBCD1:MOV R3,#00H 07H C A,#9AH ;差字节数置0 ;符号位清0 ;借位位C清0
SUBB
ADD DA MOV INC
A,@R0
A,@R1 A @R0,A R0
;相差
;地址值增1 ;差字节增1 ;进位求反,以形成正确借位 ;未减完继续,减完向下执行 ;无借位去SUBCD2返主,否则继续 ;差为负置“1”符号位 ;返回
11/39
增强型8051单片机实用开发技术
ADC_ISR: ;ADC中断服务子程序 …… ;根据需要填入适当的内容(注意中断请求标志位的清零) RETI SPI_ISR: ;SPI通信中断服务子程序 …… ;根据需要填入适当的内容(注意中断请求标志位的清零) RETI LVD_ISR: ;低电压检测服务子程序 …… ;根据需要填入适当的内容(注意中断请求标志位的清零) RETI PCA_ISR: ;PCA和PWM中断服务子程序 …… ;根据需要填入适当的内容(注意中断请求标志位的清零) RETI ;下面可以编写其他子程序或者定义程序中所用的常数 END