第7讲51单片机汇编语言程序设计.
- 格式:doc
- 大小:89.50 KB
- 文档页数:9
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数字在数码管上循环显示。
51 单片机编程语言
51单片机是一种非常流行的单片机,它广泛应用于各种嵌入式
系统中。
它的编程语言主要是汇编语言和C语言。
汇编语言是一种
底层的语言,它直接操作单片机的寄存器和内存,可以实现高效的
控制和优化。
而C语言则是一种高级语言,它更易于理解和编写,
适合开发复杂的嵌入式系统。
使用51单片机编程语言可以实现各种功能,例如控制各种外围
设备、处理各种传感器数据、实现通信功能等。
由于其灵活性和高
性能,51单片机编程语言被广泛应用于各种领域,如工业控制、汽
车电子、家用电器等。
对于初学者来说,学习51单片机编程语言可能会有一定的难度,特别是对于汇编语言的学习。
但是一旦掌握了这些编程语言,就能
够实现更加复杂和功能丰富的嵌入式系统。
因此,学习51单片机编
程语言是非常有价值的。
总的来说,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位。
第7讲51单片机汇编语言程序设计.标题:第四部分汇编语言程序设计教学目标与要求:1、理解源程序、目标代码、编辑、汇编等含义2、了解汇编过程3、掌握伪指令的使用4、掌握顺序结构、分支结构及循环结构程序的编写方法授课时数:8学时教学重点:伪指令的使用教学内容及过程:一、程序设计概念1、汇编程序设计步骤:分析题意;资源分配;程序流程图编写程序调试程序2、程序编写规则:结构清晰,易读、易于移植占用存储空间少;运行时间短;程序的编制、调试及排错所需时间短;3、汇编程序功能汇编指令与机器码指令有一一对应的关系。
汇编程序是一种翻译程序,将源程序翻译成目标程序。
4、汇编程序的汇编过程汇编有两种方法:手工汇编、机器汇编。
1、手工汇编:第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出;第二次汇编:标号代真,将字符标号用所计算出的具体地址值或偏移量代换。
源程序地址目标程序第一次汇编第二次汇编ORG 1000HSTART: MOV R0,BUFFER-1 1000 A82F A82F MOV R2,#00H 1002 7A00 7A00MOV A,@R0 1004 E6 E6MOV R3,A 1005 FB FBINC R3 1006 0B 0BSJMP NEXT 1007 80NEXT 8005 LOOP; INC R0 1009 08 08 CJNE @R0,#44H,NEXT 100A B644NEXT B64401INC R2 100D 0A 0A NEXT: DJNZ R3,LOOP 100E DBLOOP DBF9 MOV RESULT,R2 1010 8A2A 8A2ASJMP $ 1012 80FE 80FE BUFFER DATA 30HRESULT DATA 2AHEND2、机器汇编两次扫描过程。
第一次扫描:检查语法错误,确定符号名字;建立使用的全部符号名字表;每一符号名字后跟一对应值(地址或数)。
51单片机汇编程序1. 简介51单片机是一种常用的8位单片机芯片,具有广泛的应用领域。
51单片机的编程语言主要有汇编语言、C语言和底层汇编语言。
本文主要介绍51单片机的汇编程序。
2. 汇编程序基础2.1 寄存器51单片机的CPU有4个8位寄存器(A、B、DPTR、PSW)和一个16位寄存器(PC)。
在汇编程序中,我们可以使用这些寄存器来进行各种操作。
•A寄存器(累加器):用于存储数据和进行算术运算。
•B寄存器:辅助寄存器,可用于存储数据和进行算术运算。
•DPTR寄存器:数据指针寄存器,用于存储数据存取的地址。
•PSW寄存器:程序状态字寄存器,用于存储程序运行状态信息。
•PC寄存器:程序计数器,用于存储当前执行指令的地址。
2.2 指令集51单片机的指令集包含了多种汇编指令,可以用来进行数据操作、算术运算、逻辑运算、控制流程等。
常用的汇编指令有:•MOV:数据传送指令。
•ADD、SUB:加法和减法运算指令。
•ANL、ORL、XRL:逻辑运算指令。
•MOVX:外部RAM的读写指令。
•CJNE、DJNZ:条件分支指令。
•LCALL、RET:函数调用和返回指令。
2.3 编写一个简单的汇编程序下面是一个简单的汇编程序示例,用于将A寄存器中的数据加1,并将结果存储到B寄存器中。
ORG 0x0000 ; 程序的起始地址MOV A, #0x01 ; 将A寄存器赋值为1ADD A, #0x01 ; 将A寄存器加1MOV B, A ; 将A寄存器的值传送到B寄存器END ; 程序结束在上面的示例中,ORG指令用于指定程序的起始地址,MOV 指令用于将A寄存器赋值为1,ADD指令用于将A寄存器加1,MOV指令用于将A寄存器的值传送到B寄存器,END指令用于标记程序结束。
3. 汇编语言的应用51单片机的汇编语言广泛应用于各种嵌入式系统中,包括智能家居、工业自动化、仪器仪表等领域。
汇编程序具有以下特点:•程序执行效率高:由于汇编语言直接操作硬件,可以精确控制程序的执行流程,提高程序的执行效率。
标题:第四部分汇编语言程序设计教学目标与要求:1、理解源程序、目标代码、编辑、汇编等含义2、了解汇编过程3、掌握伪指令的使用4、掌握顺序结构、分支结构及循环结构程序的编写方法授课时数: 8学时教学重点:伪指令的使用教学内容及过程:一、程序设计概念1、汇编程序设计步骤:分析题意;资源分配;程序流程图编写程序调试程序2、程序编写规则:结构清晰,易读、易于移植占用存储空间少;运行时间短;程序的编制、调试及排错所需时间短;3、汇编程序功能汇编指令与机器码指令有一一对应的关系。
汇编程序是一种翻译程序,将源程序翻译成目标程序。
4、汇编程序的汇编过程汇编有两种方法:手工汇编、机器汇编。
1、手工汇编:第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出;第二次汇编:标号代真,将字符标号用所计算出的具体地址值或偏移量代换。
源程序地址目标程序第一次汇编第二次汇编ORG 1000HSTART: MOV R0,BUFFER-1 1000 A82F A82F MOV R2,#00H 1002 7A00 7A00MOV A,@R0 1004 E6 E6MOV R3,A 1005 FB FBINC R3 1006 0B 0BSJMP NEXT 1007 80NEXT 8005 LOOP; INC R0 1009 08 08 CJNE @R0,#44H,NEXT 100A B644NEXT B64401INC R2 100D 0A 0A NEXT: DJNZ R3,LOOP 100E DBLOOP DBF9 MOV RESULT,R2 1010 8A2A 8A2ASJMP $ 1012 80FE 80FE BUFFER DATA 30HRESULT DATA 2AHEND2、机器汇编两次扫描过程。
第一次扫描:检查语法错误,确定符号名字;建立使用的全部符号名字表;每一符号名字后跟一对应值(地址或数)。
第二次扫描:是在第一次扫描基础上,将符号地址转换成真地址(代真);利用操作码表将助记符转换成相应的目标码。
二、伪指令伪指令是告诉汇编程序,如何汇编源程序的指令。
伪指令既不控制机器的操作,也不能被汇编成机器代码,故称为伪指令。
1、起始地址伪指令ORGORG addr16用于规定目标程序段或数据块的起始地址,设置在程序开始处。
2、汇编结束伪指令END告诉汇编程序,对源程序的汇编到此结束。
一个程序中只出现一次,在末尾。
3、赋值伪指令EQU告诉汇编程序,将汇编语句操作数的值赋予本语句的标号。
格式:标号名称EQU 数值或汇编符号“标号名称”在源程序中可以作数值使用,也可以作数据地址、位地址使用。
先定义后使用,放在程序开头。
4、定义字节伪指令DB告诉汇编程序从指定的地址单元开始,定义若干字节存储单元并赋初值。
格式:[标号:] DB 字节数据或字节数据表5、定义字伪指令DW从指定地址开始,定义若干个16个位数据,高八位存入低地址;低八位存入高地址。
例、ORG 1000HPIOI:DW 7654H,40H、12、‘AB’6、数据地址赋值伪指令DATA将表达式指定的数据地址赋予规定的字符名称格式:字符名称DATA 表达式注:该指令与EQU 指令相似,只是,可先使用后定义,放于程序开头、结尾均可。
7、定义空间伪指令DS从指定地址开始,保留由表达式指定的若干字节空间作为备用空间。
格式:[标号:] DS 表达式例2、ORG 1000HDS 0AHDB 71H,11H,11H ;从100BH开始存放71H、11H、11H。
注:DB、DW、DS 只能用于程序存储器;而不能用于数据存储器。
8、位地址赋值伪指令BIT将位地址赋予规定的字符名称。
格式:字符名称BIT 位地址例3、X1 BIT P12相当于X1 EQU 92H三、汇编程序的基本结构1、顺序程序举例例1、设在外RAM的60H单元存有1个字节代码,要求将其分解成两个4位字段,高4位存入原单元的低4位,其低4位存入61H单元的低4位,且要求这两个单元的高4位均为0,试编制完整程序。
解:字节分解:核心指令MODE: ANLORL 1000HMODE:MOV R0,#60H MOVX A,@R0MOV B,AANL A,#0F0HSWAP AMOVX @R0,AANL B,#0FHMOV A,BINC R0MOVX @R0,AEND2、分支结构与分支程序设计结构:根据不同的条件,进行相应的处理。
通常用条件转移指令形成简单分支结构。
如:判(A)= Z 或NZ ,转移判(CY)= 1 或0 ,转移判(bit)=1 或0 ,转移CJNE 比较不相等转移例3、设a存放在累加器A中,b存放在寄存器B中,要求按下式计算Y值,并将结果Y 存于累加器A 中,试编写程序。
解:本题关键是判a是正数,还是负数;由ACC7便知。
BR:MINUS: DONE: ORG 1000HJB ACC7,MINUS CLR CSUBB A,B SJMP DONE ADD A,BSJMP $END例4、设有两个16位无符号数NA,NB分别存放在8031单片机内部RAM的40H、41H 及50H、51H单元中,当NA > NB时,将内部RAM的42H单元清0;否则,将该单元置成全1,试编程。
解法I:因为无16位数的比较指令,所以,只能用8位数的比较指令。
(画出流程框图)CMP: CMP1:HIGHE: DONE: ORG 2000HMOV A,50HCJNE A,40H,CMP1MOV A,51HCJNE A,41H,CMP1 SJMP NHIGHEJC HIGHENHIGHE:MOV 42H,#0FFH SJMP DONEMOV 42H,#00HSJMP $END上述程序中多次用到SJMP语句,该语句为无条件转移语句。
无条件语句应尽量少用,这样可使程序结构紧凑而易读,易理解。
解法II:先假设NA > NB,再来判断是否NA ≤ NBCMP2: ORG 3000HMOV R0,#00HMOV A,50HCJNE A,40H,CMP3CMP3: NHIGHE: HIGHE: MOV A,51HCJNE A,41H,CMP3SJMP NHIGHEJC HIGHEMOV R0,#0FFH ;不大于标志MOV 42H,R0SJMP $END3、循环程序1)、循环次数是已知的程序例1、已知片外RAM的10H单元存放8位二进制数,要求将其转移成相应的ASCII码,并以高位在前,低位在后的顺序,依次存放到片外RAM以11H为首地址的连续单元中,试编程。
解:先将中间单元置成30H,然后判欲转换位是否为1,若是,则将中间单元内容加1;否则,中间单元内容保持不变。
通过左移指令实现由高到低的顺序进行转换。
ORG 1000HSTART: M OV R2,#08H ;循环计数初值(循环次数已知)MOV R0,#10H ;地址指针初值MOVX A,@R0 ;取数MOV B,A ;暂存B中LOOP: M OV A,#30H ;将中间单元(A)置成30HJNB B.7,NA ;判断转换的二进制位为0否?;若是转NAINC A ;1的ASCII码“31H”NA: I NC R0 ;修改地址指针MOVX @R0,A ;存放转换的结果MOV A,BRL A,B ;作好准备,判断下一位MOV B,A ;暂存DJNZ R2,LOOP ;判断转换结束否?未完继续SJMP $END2)循环次数未知的程序例2、设用户用键盘输入长度不超过100字节的字符串放在8031单片机外部RAM以20H 为首地址的连续单元,该字符串用回车符CR(‘CR’= 0DH)作为结束标志,要求统计此字符串的长度并存入内部RAM的1FH单元中。
解:从首单元开始取数,每取一数判断其是否为‘CR’,是则结束。
STADA SLANGCMCR2:CRLOP: ORG 1000HDATA 20HDATA 1FHMOV R0,#STADA-1 MOV B,#0FFHINC R0INC BMOVX A,@R0CJNE A,#0DH,CRLOP MOV SLANG,BSJMP $END3)、多重循环设计循环体中还包含着一个或多个循环结构,即双重或多重循环。
例3、设8031使用12MHz晶振,试设计延迟100ms的延时程序。
解:延时程序的延迟时间就是该程序的执行时间,通常采用MOV和DJNZ二指令。
T = 12 / fosc = 12 / (12×106)= 1us内循环延时:(1 + 2 × CTR)T = 500us(假设)则CTR = 250实际延时:[1 + 2 × 250] × 1us = 501us外循环延时:T +(501 + 2T)× CTS = 100ms = 100 000us所以,CTS = 198.8 取199实际延时:[1 + (501 + 2)×199] = 1000.98ms例4、设在8031内部RAM中存一无符号数的数组,其长度为100,起始地址是30H,要求将它们从大到小排序,排序后仍存放在原区域中,试编者按程。
这就是所畏的“冒泡法”。
实际上大多情况,用不到99次循环,排序就结束。
为了提高排序速度,程序中可设一交换标志位,如10H位,每次循环中:若有交换则SETB 10H若无交换则CLR 10H每次循环结束时,测10H位,判断排序是否结束。
BUBBLE:LOOP:BUEU: ORG 1000HMOV R0,#30HMOV B,#64HCLR 10HDEC BMOV A,@R0MOV 20H,AINC R0MOV 21H,@R0CJNE A,21H,BUEU;长度计数;暂存,为交换作准备;若(20H)≠(21H)转移;(20H)≥(21H)转移BUNEXT: JNC BUNEXTMOV A,@R0MOV @R0,20HDEC R0MOV @R0,AINC R0SETB 10HDJNZ B,LOOPJB 10H,BUBBLEEND;若(20H)< (21H)则交换;使R0退格指向小地址;恢复R0指向大地址;置交换标志;判断标志位为1否?若为1,则继续小结:1、汇编程序有哪三种基本结构?2、构成循环程序、分支程序,常用到哪些判断语句?3、迟时较短的时间一般采取哪种方法?这种方法有什么缺陷?思考题(作业):课后小记::。