51汇编语言程序设计
- 格式:doc
- 大小:2.52 MB
- 文档页数:11
51单片机汇编语言程序设计1.题目:数码管显示1~72.题目分析本实验将要求51单片机采用汇编程序来实现以上程序,我们首先要对51单片机进行硬件电路设计,然后编写相应的汇编程序3.硬件电路4.程序设计;-------------------------------------------------------------------------------;选择P1口作为数码管位选;-------------------------------------------------------------------------------org 0hmov p1,h ;启动P1作为数码管位选again: m ov p2,Fh ;0000 0011 1111 显示数字1sjmp againmov p2,h ;0000 0110 显示数字2sjmp againmov p2,Bh ;0101 1011 显示数字3sjmp againmov p2,Fh ;0100 1111 显示数字4sjmp againmov p2,h ;0110 0110 显示数字5sjmp againmov p2,Dh ;0110 1101 显示数字6sjmp againmov p2,dh ;0111 1101 显示数字7sjmp againend5.程序流程本汇编程序的程序流程如下:1)将P1口设置为数码管的位选;2)通过P2口设置相应的数字,P2口的值将会根据数字的不同而不同,以便实现将不同的数字显示到数码管上;3)循环2步骤,不断刷新P2口的值,从而实现数字的不断变化,从而实现将1-7数字在数码管上循环显示。
第4章 MCS-51汇编语言程序设计一、填空1. 单片机汇编语言程序有三种基本结构,分别是:()、()和()。
二、简答3. 以BUF1为起始地址的外存储区中,存放有16个单字节无符号二进制数,试编一程序,求其平均值并送BUF2单元4. 在DATA1单元中有一个带符号8位二进制数x。
编一程序,按以下关系计算y值,送DATA2单元。
Y=x+5,x>0Y=x,x=0Y=x-5,x<011. 什么是伪指令?常用的伪指令功能如何?12. MCS-51单片机汇编语言有何特点?13. 利用MCS-51单片机汇编语言进行程序设计的步骤如何?14. 常用的程序结构有哪几种?特点如何?15. 子程序调用时,参数的传递方法有哪几种?16. 设被加数存放在内部RAM的20H、21H单元,加数存放在22H、23H单元,若要求和存放在24H、25H中,试编写出16位数相加的程序段。
17. 编写一段程序,把外部RAM中1000H~1030H的内容传送到内部RAM的30H~60H中。
18. 编写程序,实现双字节无符号数加法运算,要求(R1R0)+(R7R6)→(61H60H)。
19. 若MCS-51的晶振频率为6MHz,试计算延时子程序的延时时间。
DELAY:MOV R7,#0F6HLP:MOV R6,#0FAHDJNZ R6,$DJNZ R7,LPRET20. 对访问内部RAM和外部RAM,各应采用哪些寻址方式?22.在程序存储器中,从2000H到2100H单元中存有符号数,要求按下式⎧ 3X X >0Y= ⎨ 255 X=0X +5 X<0根据变量X的大小,求出Y值并放入存储器从2000H开始的相应单元。
画出程序流程图并编写源程序。
23确计算出下列延时程序的时间(fosc=6MHz),需要列出表达式DEL: MOV R7, #200DEL1: MOV R6, #123NOPDEL2: DJNZ R6, DEL2DJNZ R7, DEL1四、选择1.以下运算中对溢出标志OV没有影响或不受OV影响的运算是(A) 逻辑运算 (B) 符号数加减法运算(C) 乘法运算 (D) 除法运算2. 将累加器中的数据送到片外RAM 40H单元,可执行指令( ) 。
MCS51单片机指令系统与汇编语言程序设计MCS-51是一种非常常见的8位单片机系列,该系列包括了多种型号的单片机,如Intel 8051、8031、8052等。
MCS-51单片机指令系统是一组用于驱动该系列单片机的指令集,汇编语言程序设计是利用这些指令来编写程序。
MCS-51单片机指令系统包含了多种指令,可以执行诸如数据传输、算术逻辑运算、控制和数据访问等功能。
这些指令通过各种不同的寻址模式来操作数据,包括立即寻址、寄存器寻址、直接寻址、间接寻址和寄存器间接寻址等。
不同的寻址模式和指令组合可以实现不同的功能。
汇编语言程序设计通过将人类可读的汇编指令翻译成机器可执行的二进制指令来编写程序。
在MCS-51单片机中,汇编指令由操作码和操作数组成。
操作码指定了所执行的操作,如数据传输、算术运算或控制指令。
操作数则指定了指令要操作的数据。
下面以一个简单的例子来说明MCS-51单片机指令系统和汇编语言程序设计的基本原理。
假设我们要编写一个程序,将两个寄存器中的数据相加,并将结果存储到第三个寄存器中。
首先,我们需要将第一个寄存器的值加载到累加器A中,这可以通过MOV指令实现。
MOV指令的操作码为01,操作数为两个寄存器的地址。
例如,MOVA,R0将R0的值加载到A中。
接下来,我们需要将第二个寄存器的值加载到B寄存器中,同样可以使用MOV指令。
MOVB,R1将R1的值加载到B中。
然后,我们可以使用ADD指令将A和B中的值相加,并将结果存储到A中。
ADD指令的操作码为04,操作数为A的地址。
例如,ADDA将累加器中的值与A寄存器中的值相加,并将结果存储到A中。
最后,我们可以使用MOV指令将A中的结果移动到第三个寄存器中,例如,MOVR2,A将A的值移动到R2中。
通过组合使用这些指令,我们可以实现将两个寄存器中的值相加并存储到第三个寄存器中的功能。
总结来说,MCS-51单片机指令系统和汇编语言程序设计是一种用于编程控制该系列单片机的方式。
C51单片机汇编语言程序设计一、二进制数与十六进制数之间的转换1、数的表达方法为了方便编程时书写,规定在数字后面加一个字母来区别,二进制数后加B十六进制数后加H。
2、二进制数与十六进制数对应表二进制十六进二进制制0000000100100011010001010110011101234567100010011010101111001101 11101111十六进制89ABCDEF3、二进制数转换为十六进制数转换方法为:从右向左每4位二进制数转化为1位十六进制数,不足4位部分用0补齐。
例:将(1010000110110001111)2转化为十六进制数解:把1010000110110001111从右向左每4位分为1组,再写出对应的十六进制数即可。
0101000011011000111150D8F答案:(1010000110110001111)2=(50D8F)16例:将1001101B转化为十六进制数解:把10011110B从右向左每4位分为1组,再写出对应的十六进制数即可。
100111109E答案:10011110B=9EH4、十六进制数转换为二进制数转换方法为:将每1位十六进制数转换为4位二进制数。
例:将(8A)16转化为二进制数解:将每位十六进制数写成4位二进制数即可。
8A10001010答案:(8A)16=(10001010)2例:将6BH转化为二进制数解:将每位十六进制数写成4位二进制数即可。
6B01101011答案:6BH=01101011B二、计算机中常用的基本术语1、位(bit)计算机中最小的数据单位。
由于计算机采用二进制数,所以1位二进制数称作1bit,例如110110B为6bit。
2、字节(Byte,简写为B)8位的二进制数称为一个字节,1B=8bit3、字(Word)和字长两个字节构成一个字,2B=1Word。
字长是指单片机一次能处理的二进制数的位数。
如AT89S51是8位机,就是指它的字长是8位,每次参与运算的二进制数的位数为8位。
第四章MCS-51汇编语言程序设计重点及难点:单片机汇编语言程序设计的基本概念、伪指令、单片机汇编语言程序的三种基本结构形式、常用汇编语言程序设计。
教学基本要求:1、掌握汇编语言程序设计的基本概念;2、掌握伪指令的格式、功能和使用方法;3、掌握顺序结构、分支结构和循环结构程序设计的步骤和方法;4、掌握常用汇编语言程序设计步骤和方法。
教学内容§4.1汇编语言程序设计概述一、汇编语言的特点(1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。
(2)使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。
(3)汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。
(4)汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用;但是掌握了一种计算机系统的汇编语言后,学习其他的汇编语言就不太困难了。
二、汇编语言的语句格式[<标号>]:<操作码> [<操作数>];[<注释>]三、汇编语言程序设计的步骤与特点(1)建立数学模型(2)确定算法(3)制定程序流程图(4)确定数据结构(5)写出源程序(6)上机调试程序§4.2伪指令伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令。
MCS- 51常见汇编语言程序中常用的伪指令:第四章MCS-51汇编语言程序设计911.ORG (ORiGin)汇编起始地址命令[<标号:>] ORG <地址>2.END (END of assembly)汇编终止命令[<标号:>] END [<表达式>]3.EQU (EQUate)赋值命令<字符名称> EQU <赋值项>4.DB (Define Byte)定义字节命令[<标号:>] DB <8位数表>5.DW (Define Word)定义数据字命令[<标号:>] DW <16位数表>6.DS (Define Stonage )定义存储区命令[<标号:>] DW <16位数表>7.BIT位定义命令<字符名称> BIT <位地址>8.DA TA数据地址赋值命令<字符名称> DATA <表达式>§4.3单片机汇编语言程序的基本结构形式一、顺序程序[例4-1]三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、5414和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。
MOV R0 ,# 52H ;被加数的低字节地址MOV R1 ,# 55H ;加数的低字节地址MOV A ,@ R0ADD A ,@ R1 ;低字节相加MOV @ R0 , A ;存低字节相加结果DEC R0DEC R1MOV A ,@ R0ADDC A ,@ R1 ;中间字节带进位相加MOV @ R0 , A ;存中间字节相加结果DEC R0DEC R1MOV A ,@ R0ADDC A ,@ R1 ;高字节带进位相加MOV @ R0 , A ;存高字节相加结果CLR AADDC A , # 00H ;存放进位的单元地址 MOV @ R0 , A;进位送00H 位保存二、分支程序1.单分支程序[例4-2] 变量X 存放在V AR 单元内,函数值Y 存放在FUNC 单元中,试按下式的要求给Y 赋值。
⎪⎩⎪⎨⎧<-=>=010001X X X Y 本题的程序流程见图4-1(a )。
参考程序: ORG 1000HV AR DA TA 30H FUNC DA TA 31HMOV A , V AR ;A ← XJZ DONE;若X=0,则转DONE JNB ACC.7 , POSI ;若X>0,则转POSI MOV A , # 0FFH ;若X<0,则Y=-1 SJMP DONEPOSI : MOV A , # 01H ;若X>0,则Y = 1 DONE : MOVE FUNC , A ;存函数值 SJMP $ END图4-1 例4-2的分支流程图第四章MCS-51汇编语言程序设计93这个程序的特征是先比较判断,然后按比较结果赋值,这实际是三分支而归一的流程图,因此,至少要用两个转移指令。
初学者很容易犯的一个错误是:漏掉了其中的SJMP DONE 语句,因为流程图中没有明显的转移痕迹。
这个程序也可以按图4-1(b)的流程图来编写,其特征是先赋值,后比较判断,然后修改赋值并结束。
参考程序:ORG 1000HV AR DA TA 30HFUNC DA TA 31HMOV A ,V AR ;A ←XJZ DONE ;若X=0,则转DONEMOV R0 ,# 0FFH ;先设X<0,R0 = FFHJNB ACC.7 ,NEG ;若X<0,则转NEGMOV R0 ,# 01H ;若X>0,R0 = 1 NEG:MOV A ,# 01H ;若X>0,则Y = 1DONE:MOV FUNC , A ;存函数值SJMP $END2.多分支程序图4-2 多分支程序转移三、循环程序循环程序一般由4部分组成:(1)置循环初值,即确立循环开始时的状态。
(2)循环体(工作部分),要求重复执行的部分。
(3)循环修改,循环程序必须在一定条件下结束,否则就要变成死循环。
(4)循环控制部分,根据循环结束条件,判断是否结束循环。
以上4个部分可以有两种组织方式。
[例4-3]从BLOCK单元开始存放一组无符号数,一般称为一个数据块。
数据块长度放在LEN单元,编写一个求和程序,将和存入SUM单元,假设和不超过8位二进制数。
在置初值时,将数据块长度置入一个工作寄存器,将数据块首地址送入另一个工作寄存器,一般称它为数据块地址指针。
每做一次加法之后,修改地址指针,以便取出下一个数来相加,并且使计数器减1。
到计数器减到0时,求和结束,把和存入SUM即可。
参考程序:各单元的地址是任意的。
LEN DA TA 20HSUM DA TA 21HBLOCK DA TA 22HCLR A ;清累加器MOV R2 ,LEN ;数据块长度送R2MOV R1 ,# BLOCK ;数据块首址送Rl LOOP:ADD A ,@R1 ;循环做加法INC R1 ;修改地址指针DJNZ R2 ,LOOP ;修改计数器并判断MOV SUM , A ;存和以上程序在计数器初值不为零时是没有问题的,但若是数据块的长度有可能为零,则将出现问题。
当R2初值为零,减1之后将为FFH,故要做256次加法之后才会停止,显然和题意不符。
若考虑到这种情况,则可按图4-3(b)的方式来编写程序。
在做加法之前,先判断一次R2的初值是否为零。
整个程序仍基本套用原来的形式:CLR A ;清累加器MOV R2 ,LEN ;数据块长度送R2MOV R1 ,# BLOCK ;数据块首址送RlINC R2SJMP CHECKLOOP:ADD A ,@R1 ;循环做加法INC R1 ;修改地址指针CHECK:DJNZ R2 ,LOOPMOV SUM , A ;存和§4.4MCS-51单片机汇编语言程序设计举例一、算术运算程序[例4-4]假定R2、R3和R4、R5分别存放两个16位的带符号二进制数,其中R2和R4的最高位为两数的符号位。
请编写带符号双字节二进制数的加减法运算程序,以BSUB为减法程序入口,以BADD为加法程序入口,以R6、R7保存运算结果。
参考程序:BSUB:MOV A ,R4 ;取减数高字节CPL ACC.7 ;减数符号取反以进行加法MOV R4 , ABADD:MOV A ,R ;取被加数MOV C ,ACC.7MOV F0 , C ;被加数符号保存在F0中XRL A ,R4 ;两数高字节异或第四章MCS-51汇编语言程序设计95MOV C ,ACC.7 ;两数同号CY=0,两数异号CY=1MOV A ,R2CLR ACC.7 ;高字节符号位清“0”MOV R2 , A ;取其数值部分MOV A ,R4CLR ACC.7 ;低字节符号位清“0”MO V R4 , A ;取其数值部分JC JIAN ;两数异号转JIANJIA:MOV A ,R3 ;两数同号进行加法ADD A ,R5 ;低字节相加MOV R7 , A ;保存和MOV A ,R2ADDC A ,R4 ;高字节相加MOV R6 , A ;保存和JB ACC.7 ,QAZ ;符号位为“1”转溢出处理QWE:MOV C ,F0 ;结果符号处理MOV ACC.7, CMOV R6 , ARETJIAN:MOV A ,R3 ;两数异号进行减法CLR CSUBB A ,R5 ;低字节相减MOV R7 , A ;保存差MOV A ,R2SUBB A ,R4 ;高字节相减MOV R6 , A ;保存差JNB ACC.7 ,QWE ;判断差的符号,为“0”转QWE BMP:MOV A ,R7 ;为“1”进行低字节取补CPL AADD A ,#1MOV R7 , AMOV A ,R6 ;高字节取补CPL AADDC A ,# 0MOV R6 , ACPL F0 ;保存在F0中的符号取反SJMP QWE ;转结果符号处理QAZ:;溢出处理二、数制转换程序[例4-5]在内部RAM的hex单元中存有2位十六进制数,试将其转换为ASCII码,并存放于asc和asc+1两个单元中。
主程序(MAIN):MOV SP ,# 3FHMAIN:PUSH hex ;十六进制数进栈ACALL HASC ;调用转换子程序POP asc ;第一位转换结果送asc单元MOV A ,hex ;再取原十六进制数SW AP A ;高低半字节交换PUSH ACC ;交换后的十六进制数进栈ACALL HASCPOP asc+l ;第二位转换结果送asc+l单元子程序(HASC):HASC:DEC SP ;跨过断点保护内容DEC SPPOP ACC ;弹出转换数据ANL A ,# 0FH ;屏蔽高位ADD A ,# 7 ;修改变址寄存器内容MOVC A ,@A+PC ;查表PUSH ACC ;查表结果进栈INC SP ;修改堆栈指针回到断点保护内容INC SPRET SPASCTAB:DB “0,1,2,3,4,5,6,7”;ASCII码表DB “8,9,A,B,C,D,E,F”三、定时程序有多个定时需要,我们可以先设计一个基本的延时程序,使其延迟时间为各定时时间的最大公约数,然后就以此基本程序作为子程序,通过调用的方法实现所需要的不同定时。