收藏 分享(赏)

单片机应用技术第4章.ppt

上传人:dwy79026 文档编号:8054726 上传时间:2019-06-06 格式:PPT 页数:35 大小:113KB
下载 相关 举报
单片机应用技术第4章.ppt_第1页
第1页 / 共35页
单片机应用技术第4章.ppt_第2页
第2页 / 共35页
单片机应用技术第4章.ppt_第3页
第3页 / 共35页
单片机应用技术第4章.ppt_第4页
第4页 / 共35页
单片机应用技术第4章.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、第4章 汇编语言程序设计 本章要点,80C51汇编语言语句结构的基本格式 伪指令的功能和应用 汇编的概念 程序设计的步骤和基本方法 顺序程序 分支程序 循环程序 查表程序 散转程序,4.1汇编语言程序设计基本概念,4.1.1汇编语言及其语句结构 标号:操作码 目的操作数,源操作数;注释,4.1.2 伪指令,用汇编语言编写的程序称为汇编语言源程序。而计算机是不能直接识别源程序的,必须把它翻译成目标程序(机器语言程序),这个翻译过程叫“汇编”。 在汇编时起控制作用,自身并不产生机器码,而仅是为汇编服务的一些指令,称为伪指令。伪指令不属于80C51指令系统。,起始伪指令 ORG(Origin) 格式

2、:ORG 16位地址 功能:规定ORG下面目标程序的起始地址。ORG 0100H START; MOV A,#05H ;标号START代表的地址为0100H,结束伪指令 END 格式:END 功能:汇编语言源程序的结束标志。在END后面的指令,汇编程序不再处理。一个源程序只能有一个END指令,放在所有指令的最后。,等值伪指令 EQU(Equate) 格式:字符名称 EQU 数据或汇编符号 功能:将一个数据或特定的汇编符号赋予规定的字符名称。ABC EQU 30H ;ABC=30H,#ABC=#30H,数据地址赋值伪指令 DATA 格式:字符名称 DATA 表达式 功能:将数据地址或代码地址赋予

3、规定的字符名称。DATA与EQU的区别:EQU定义的符号必须先定义后使用,DATA可以先使用后定义。,定义字节伪指令DB(Define Byte) 格式:DB 8位二进制数表 功能:从指定的地址单元开始,定义若干个8位内存单元的数据。数据与数据之间用“,”分割。ORG 4000H TAB:DB 73H,45,”A”,”2” ;(4000H)=73H,(4001H)=2DH,定义字伪指令DW(Define Word) 格式:DW 16位二进制数表 功能:从指定的地址单元开始,定义若干个16位数据。占用两个字节,高8位先存入,低8位后存入。不足16位者,用0填充。ORG 1000H HTAB:DW

4、 7856H,89H,30 ;(1000H)=78H,(1001H)=56H,定义位地址伪指令BIT 格式:字符名称 BIT 位地址 功能:将位地址赋予所规定的字符名称。DEF BIT 30H ;把位地址赋给字符DEF,DEF可作为位地址30H使用。,4.1.3 汇编,将汇编语言源程序转换为计算机所能识别的机器语言代码程序的过程称为汇编。汇编可分为: 手工汇编 计算机汇编,4.1.4 程序设计的基本方法,编写程序要求: 不仅要完成规定的功能任务,而且还要求:执行速度快、占用内存少、条理清晰、阅读方便、便于移植、巧妙而实用。一般应按以下几个步骤进行: 1.分析问题,确定算法或解题思路 2.画流程

5、图 3.编写源程序 4.汇编和调试,4.2 程序设计举例,4.2.1 顺序程序顺序程序是指按顺序依次执行的程序,也称为简单程序或直线程序。顺序程序结构虽然比较简单,但也能完成一定的功能任务,是构成复杂程序的基础。,例4-2,已知16位二进制负数存放在R1R0中,试求其补码,并将结果存在R3R2中。 解:二进制负数的求补方法可归结为“求反加1”,符号位不变。利用CPL指令实现求反;加1时,则应低8位先加1,高8位再加上低位的进位。注意这里不能用INC指令,因为INC指令不影响标志位。 CONT: MOV A,R0 ;读低8位CPL A ;取反ADD A,#1 ;加1MOV R2,A ;存低8位M

6、OV A,R1 ;读高8位CPL A ;取反ADDC A,#80H;加进位及符号位MOV R3,A ;存高8位RET,4.2.1 分支程序,根据不同条件转向不同的处理程序,这种结构的程序称为分支程序。80C51指令系统中的条件转移指令、比较转移指令和位转移指令,可以实现分支程序。,例4-8,已知电路如图4-5所示,要求实现: S0单独按下,红灯亮,其余灯灭; S1单独按下,绿灯亮,其余灯灭; 其余情况,黄灯亮。,解:程序如下 SGNL:ANL P1,#11100011B ;红绿黄灯灭ORL P1,#00000011B ;置P1.0、P1.1输入态, P1.5P1.7状态不变 SL0: JNB

7、P1.0,SL1 ;P1.0=0,S0未按下,转判S1JNB P1.1,RED ;P1.0=1,S0按下;且P1.1=0,S1未按下,转红灯亮 YELW:SETB P1.4 ;黄灯亮CLR P1.2 ;红灯灭CLR P1.3 ;绿灯灭SJMP SL0 ;转循环 SL1: JNB P1.1,YELW ;P1.0=0,S0未按下;P1.1=0,S1未按下,转黄灯亮 GREN:SETB P1.3 ;绿灯亮CLR P1.2 ;红灯灭CLR P1.4 ;黄灯灭SJMP SL0 ;转循环 RED: SETB P1.2 ;红灯亮CLR P1.3 ;绿灯灭CLR P1.4 ;黄灯灭SJMP SL0 ;转循环,

8、4.2.3 循环程序,循环程序一般包括以下几个部分: 循环初值; 循环体; 循环修改; 循环控制;以上四部分可以有两种组织形式,其结构如图4-6所示。,例4-10,设Xi均为单字节数,并按顺序存放在以50H为首地址的内RAM存储单元中,数据长度(个数)N存在R2中,试编程求和S=X1+X2+XN,并将S(双字节)存放在R3R4中,(设S65536)。 解:程序如下: SXN: MOV R2,#N ;置数据长度(循环次数)MOV R3,#00H ;和单元(高8位)清0MOV R4,#00H ;和单元(低8位)清0MOV R0,#50H ;求和数据区首址 LOOP:MOV A,R4 ;读前次低8位

9、和ADD A,R0 ;低8位累加MOV R4,A ;存低8位和CLR A ;ADDC A,R3 ;高8位加进位MOV R3,A ;存高8位和INC R0 ;指向下一数据 循环修改DJNZ R2,LOOP ;判N个数据累加完否? 循环控制 RET ;退出循环 退出循环,例4-13,编写延时10ms子程序,fosc=12MHz。 解:fosc=12MHz,一个机器周期为1s。 DY10ms:MOV R6,#20 ; 置外循环次数 DLP1: MOV R7,#250 ; 置内循环次数 DLP2: DJNZ R7,DLP2 ; 2机周250 =500机周DJNZ R6,DLP1 ; 500机周20=

10、10000机周RET ; 说明:MOV Rn指令为1个机器周期;DJNZ指令为2个机器周期; RET指令为2个机器周期;(2机周250)+1+220+1+21s/机周=10063s10ms,例4-15,编制一个循环闪烁灯的程序。设80C51单片机的P1口作为输出口,经驱动电路74LS240(8反相三态缓冲/驱动器)接8只发光二极管,如图4-8所示。当输出位为“1”时,发光二极管点亮,输出位为“0”时为暗。试编程实现:每个灯闪烁点亮10次,再转移到下一个灯闪烁点亮10次,循环不止。,解:程序如下: FLASH:MOV A,#01H ;置灯亮初值 FSH0: MOV R2,#0AH ;置闪烁次数

11、FLOP: MOV P1,A ;点亮LCALL DY1s ;延时1sMOV P1,#00H ;熄灭LCALL DY1s ;延时1sDJNZ R2,FLOP ;闪烁10次RL A ;左移一位SJMP FSH0 ;循环RET,例4-16,已知P1口数据每隔10ms刷新一次,试求其1s内的平均值, 平均值存30H。 解:本题需求100个数据的平均值,一般有两种方法:一种是全部累加后再平均;另一种是边平均边累加,现给出两种方法的程序。,(1)全部累加后再平均,AVRG1: MOV R2,#0 ;低8位累加寄存器清0MOV R3,#0 ;高8位累加寄存器清0MOV R4,#100 ;置平均次数 ALOP

12、: MOV A,P1 ;读P1口数据ADD A,R2 ;低8位累加MOV R2,A ;回存CLR A ;高8位与进位累加ADDC A,R3 ;MOV R3,A ;回存LCALL DY10ms ;延时10msDJNZ R4,ALOP ;判100次累加完否?未完继续MOV A,R3 ;100次累加完,求平均值,被除数A、BMOV B,R2 ;MOV R0,30H ;置商间址MOV R6,#0 ;置除数100,除数R6R5MOV R5,#100 ;LCALL SUM ;(A、B)(R6、R5)= 商 R0, 余数A CJNE A,#50,NEXT ;四舍五入 NEXT: JC GRET ;C=1,5

13、0, 舍INC 30H ;C=0,50, 入 GRET: RET,(2)边平均边累加,AVRG2: MOV 30H,#0 ;商累加寄存器清0MOV 31H,#0 ;余数累加寄存器清0MOV R4,#100 ;置平均次数 ALOP: MOV A,P1 ;读P1口数据MOV B,#100 ;置除数(平均次数)DIV AB ;P1口数据除以100ADD A,30H ;商累加MOV 30H,A ;回存MOV A,B ;ADD A,31H ;余数累加MOV 31H,A ;回存CLR C ;SUBB A,#100 ;JC GON ;余数累加100,余数累加寄存器不变INC 30H ;余数累加100, 商累

14、加寄存器+1MOV 31H,A ;减去100后差余数累加寄存器 GON: LCALL DY10ms ;延时10msDJNZ R4,ALOP ;判100次累加完否?未完继续MOV A,31H ;100次累加完毕,余数累加四舍五入CJNE A,#50,NEXT ; NEXT: JC GRET ;C=1,50, 舍INC 30H ;C=0,50, 入 GRET: RET,4.2.4 查表程序,在80C51中,数据表格是存放在程序存储器ROM中,而不是在RAM中。编程时,可以通过DB伪指令将表格的内容存入ROM中。用于查表的指令有两条: MOVC A,A+DPTR MOVC A,A+PC当用DPTR作

15、基址寄存器时,查表的步骤分三步: 基址值(表格首地址)DPTR; 变址值(表中要查的项与表格首地址之间的间隔字节数)A; 执行MOVC A,A+DPTR。,当用PC作基址寄存器时,由于PC本身是一个程序计数器,与指令的存放地址有关,所以查表时其操作有所不同。也可分为三步: 变址值(表中要查的项与表格首地址之间的间隔字节数)A; 偏移量(查表指令下一条指令的首地址到表格首地址之间的间隔字节数)+AA; 执行MOVC A,A+PC指令。 说明:表格首地址与PC值间距不能超过256字节,且编程要事先计算好偏移量,比较麻烦。,例4-17,在单片机应用系统中,常用LED数码管显示数码,但显示数字(9)与

16、显示数字编码并不相同,需要将显示数字转换为显示字段码,通常是用查表的方法。现要求将30H中的显示数字转换为显示字段码并存入30H。已知共阴字段码表首址为TABD。 解:编程如下: CHAG: MOV DPTR,#TABD;置共阴字段码表首址MOV A,30H ;读显示数字MOVC A,A+DPTR ;查表,转换为显示字段码MOV 30H,A ;存显示字段码RET ; TABD:DB 3FH,06H,5BH,4FH,66H;04共阴字段码表DB 6DH,7DH,07H,7FH,6FH;59共阴字段码表,例4-19,用查表程序求040之间整数的立方。已知该整数存在内RAM 30H中,查得立方数存内

17、RAM 30H(高8位)31H。,解:编程如下: CUBE: MOV DPTR,#TAB ;置立方表首址MOV A,30H ;读数据ADD A,30H ;数据2AMOV 30H,A ;暂存立方表数据序号 MOVC A, A+DPTR ;读立方数据高8位XCH A,30H ;存立方数据高8位,立方表数据序号AINC A ;指向立方数据低8位MOVC A,A+DPTR ;读立方数据低8位 MOV 31H,A ;存立方数据低8位RET ; TAB: DB 0,0,0,1,0,8,0,27,0,64 ;040立方表DB 0,125,0,216,0FAH,00H;,4.2.5 散转程序,散转程序是一种并

18、行多分支程序。它根据系统的某种输入或运算结果,分别转向各个处理程序。与分支程序不同的是,散转程序一般采用JMP A+DPTR指令,根据输入或运算结果,确定A或DPTR的内容,直接跳转到相应的分支程序中去。,例4-20,单片机四则运算系统。在单片机系统中设置+、四个运算命令键,它们的键号分别为0、1、2、3。当其中一个键按下时,进行相应的运算。操作数由P1口和P3口输入,运算结果仍由P1口和P3口输出。具体如下:P1口输入被加数、被减数、被乘数和被除数,输出运算结果的低8位或商;P3口输入加数、减数、乘数和除数,输出进位(借位)、运算结果的高8位或余数。键盘号已存放在30H中。,解:程序如下:

19、PRGM: MOV P1,#0FFH ;P1口置输入态MOV P3,#0FFH ;P3口置输入态MOV DPTR,#TBJ ;置“”表首地址MOV A,30H ;读键号RL A ;键号2AADD A,30H ;键号3AJMP A+DPTR ;散转 TBJ: LJMP PRGM0 ;转PRGM0(加法)LJMP PRGM1 ;转PRGM1(减法)LJMP PRGM3 ;转PRGM3(除法)LJMP PRGM2 ;转PRGM2(乘法) PRGM0: MOV A,P1 ;读加数ADD A,P3 ;P1+P3MOV P1,A ;和P1CLR A ;ADDC A,#00H ;进位AMOV P3,A ;进

20、位P3RET ;,PRGM1: MOV A,P1 ;读被减数CLR C ;SUBB A,P3 ;P1-P3MOV P1,A ;差P1CLR A ;RLC A ;借位AMOV P3,A ;借位P3RET ; PRGM2: MOV A,P1 ;读被乘数MOV B,P3 ;置乘数MUL AB ;P1P3MOV P1,A ;积低8位P1MOV P3,B ;积高8位P3RET ; PRGM3: MOV A,P1 ;读被除数MOV B,P3 ;置除数DIV AB ;P1P3MOV P1,A ;商P1MOV P3,B ;余数P3RET ; 说明:由于LJMP为3字节指令,因此键号需先乘3,以便转到正确的位置。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报