51单片机实用汇编程序库(word)
第三章MCS51单片机的指令系统和汇编语言程序示例(第5.
第三章MCS51单片机的指令系统和汇编语言程序示例(第5、6、7节)
1.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?
(1)MOV A,#19H
ADD A,#66H
(2)MOV A,#5AH
ADD A,#6BH
2.已知:A=85H,R0=30H,(30H)=11H, (31H)=0FFH,C=1,试计算单片机执行下列指令后累加器A和C中的值各是多少?
(1)ADDC A,R0, (2)ADDC A,31H
(3) ADDC A,@R0, (4) ADDC A,#85H
3.已知M1和M2中分别存放两个16位无符号数的低8位,M1+1和M2+1中分别存放两个16位无符号数的高8位,计算两数之和(低8位存放在M1,高8位存放在M1+1,设两数之和不超过16位)。
4.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?
CLR C
MOV A,#52H
SUBB A,#0B4H
5.已知:A=0DFH,R1=40H,R7=19H,(30H)=00H,(40H)=0FFH,试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?
(1) DEC A (2) DEC R7 (3) DEC 30H (4) DEC @R1
6.试写出能完成85+59的BCD加法程序,并对工作过程进行分析。
7.已知:两个8位无符号乘数分别放在30H和31H单元中,编程实现他们乘积的低8位存放在32H,高8位存放在33H。
8.已知:R0=30H,(30H)=0AAH,试分析执行下列指令后累加器A和30H单元的内容是什么?
51单片机汇编语言程序设计
51单片机汇编语言程序设计
1.题目:数码管显示1~7
2.题目分析
本实验将要求51单片机采用汇编程序来实现以上程序,我们首先要对51单片机进行硬件电路设计,然后编写相应的汇编程序
3.硬件电路
4.程序设计
;-------------------------------------------------------------------------------
;选择P1口作为数码管位选
;-------------------------------------------------------------------------------
org 0h
mov p1,h ;启动P1作为数码管位选
again: m ov p2,Fh ;0000 0011 1111 显示数字1
sjmp again
mov p2,h ;0000 0110 显示数字2
sjmp again
mov p2,Bh ;0101 1011 显示数字3
sjmp again
mov p2,Fh ;0100 1111 显示数字4
sjmp again
mov p2,h ;0110 0110 显示数字5
sjmp again
mov p2,Dh ;0110 1101 显示数字6
sjmp again
mov p2,dh ;0111 1101 显示数字7
sjmp again
end
5.程序流程
本汇编程序的程序流程如下:
1)将P1口设置为数码管的位选;
2)通过P2口设置相应的数字,P2口的值将会根据数字的不同而不同,以便实现将不同的数字显示到数码管上;
完整word版,单片机汇编语言经典一百例
51单片机实用程序库
4.1 流水灯
程序介绍:利用P1 口通过一定延时轮流产生低电平
输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。
程序实例(LAMP.ASM)
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
9
MOV A,#00H
MOV P1,A ;灭所有的灯
MOV A,#11111110B
MAIN1:
MOV P1,A ;开最左边的灯
ACALL DELAY ;延时
RL A ;将开的灯向右边移
AJMP MAIN ;循环
DELAY:
MOV 30H,#0FFH
D1: MOV 31H,#0FFH
D2: DJNZ 31H,D2
DJNZ 30H,D1
RET
END
4.2 方波输出
程序介绍:P1.0 口输出高电平,延时后再输出低电
平,循环输出产生方波。实际应用中例如:波形发生器。
程序实例(FAN.ASM):
ORG 0000H
MAIN:
;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAY
SETB P1.0
ACALL DELAY
10
CLR P1.0
AJMP MAIN
;////////////////////////////////////////////////// DELAY:
MOV R1,#0FFH
DJNZ R1,$
RET
END
五、定时器功能实例
5.1 定时1秒报警
程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM):
ORG 0000H
51单片机汇编语言教程
51单片机汇编语言教程:10课:单片机数据传送类指令 单片机的累加器A与片外RAM之间的数据传递类指令MOVX A,@RiMOVX @Ri,AMOVX A,@DPTRMOVX @DPTR,A说明:1)在51系列单片机中,与外部存储器RAM打交道的只能是A累加器。所有需要传送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。在此我们能看出内外部RAM的区别了,内部RAM间能直接进行数据的传递,而外部则不行,比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再传送到0200H单元中去。要读或写外部的RAM,当然也必须要知道RAM的地址,在后两条单片机指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是一个8位的寄存器,所以只供给低8位地址。因为有时扩展的外部RAM的数量比较少,少于或等于256个,就只需要供给8位地址就够了。使用时应当首先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。例:将单片机外部RAM中100H单元中的内容送入外部RAM中200H单元中。MOV DPTR,#0100HMOVX A,@DPTRMOV DPTR,#0200HMOVX @DPTR,A程序存储器向累加器A传送指令MOVC A,@A+DPTR 本指令是将ROM中的数送入A中。本指令也被称为单片机查表指令,常用此指令来查一个已做好在ROM中的表格 说明:此条指令引出一个新的寻址办法:变址寻址。本指令是要在ROM的一个地址单元中找出数据,显然必须知道这个单元的地址,这个单元的地址是这样确定的:在执行本指令立脚点DPTR中有一个数,A中有一个数,执行指令时,将A和DPTR中的数加起为,就成为要查找的单元的地址。查找到的结果被放在A中,因此,本条指令执行前后,A中的值不一定相同。例:有一个数在R0中,要求用查表的办法确定它的平方值(此数的取值范围是0-5)MOV DPTR,#TABLEMOV A,R0MOVC A,@A+DPTRTABLE: DB 0,1,4,9,16,25设R0中的值为2,送入A中,而DPTR中的值则为TABLE,则最终确定的ROM单元的地址就是TABLE+2,也就是到这个单元中去取数,取到的是4,显然它正是2的平方。其它数据也能类推。标号的真实含义:从这个地方也能看到另一个问题,我们使用了标号来替代具体的单元地址。事实上,标号的真实含义就是地址数值。在这里它代表了,0,1,4,9,16,25这几个数据在ROM中存放的起点位置。而在以前我们学过的如LCALL DELAY单片机指令中,DELAY 则代表了以DELAY为标号的那段程序在ROM中存放的起始地址。事实上,CPU正是通过这个地址才找到这段程序的。能通过以下的例程再
51单片机汇编程序集
1、片内RAM初始化子程序
2、片外RAM初始化子程序
3、片外RAM初始化子程序(双字节个单元)
4、内部RAM数据复制程序
5、外部RAM数据复制程序
6、外部RAM数据复制程序
7、外部RAM数据复制到内部RAM程序
8、限幅滤波程序
9、中位值滤波程序
10、N点算术平均滤波
;片内RAM初始化子程序
IBCLR :MOV A,R0
MOV R1,A
CLR A
IBC1 :MOV @R1,A
INC R1
DJNZ R7,IBC1
RET
;片外RAM初始化子程序
EBCLR1 :MOV A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
CLR C
EBC11 :MOVX @DPTR,A
INC DPTR
DJNZ R7,EBC11
RET
;片外RAM初始化子程序(双字节个单元) EBCLR2 :MOV A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
MOV A,R7
JZ EBC21
INC R6
EBC21 :CLR A
MOVX @DPTR,A
INC DPTR
DJNZ R7,EBC21
DJNZ R6,EBC21
RET
;内部RAM数据复制程序
;入口:R0,R7
;堆栈需求:2字节
;出口:R1
IBMOV :MOV A,R0
ADD A,R7
MOV R0,A
MOV A,R1
ADD A,R7
MOV R1,A
IBM1 :DEC R0
DEC R1
MOV A,@R0
MOV @R1,A
DJNZ R7,IBM1
RET
;外部RAM数据复制程序
;入口:ADDPH,ADDPL,R7
;占用资源:ACC
;堆栈需求:2字节
第三章MCS51单片机的指令系统和汇编语言程序示例(第5范文
第三章MCS51单片机的指令系统和汇编语言程序示例(第5、6、7节)
1.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?
(1)MOV A,#19H
ADD A,#66H
(2)MOV A,#5AH
ADD A,#6BH
2.已知:A=85H,R0=30H,(30H)=11H, (31H)=0FFH,C=1,试计算单片机执行下列指令后累加器A和C中的值各是多少?
(1)ADDC A,R0, (2)ADDC A,31H
(3) ADDC A,@R0, (4) ADDC A,#85H
3.已知M1和M2中分别存放两个16位无符号数的低8位,M1+1和M2+1中分别存放两个16位无符号数的高8位,计算两数之和(低8位存放在M1,高8位存放在M1+1,设两数之和不超过16位)。
4.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?
CLR C
MOV A,#52H
SUBB A,#0B4H
5.已知:A=0DFH,R1=40H,R7=19H,(30H)=00H,(40H)=0FFH,试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?
(1) DEC A (2) DEC R7 (3) DEC 30H (4) DEC @R1
6.试写出能完成85+59的BCD加法程序,并对工作过程进行分析。
7.已知:两个8位无符号乘数分别放在30H和31H单元中,编程实现他们乘积的低8位存放在32H,高8位存放在33H。
8.已知:R0=30H,(30H)=0AAH,试分析执行下列指令后累加器A和30H单元的内容是什么?
MCS-51单片机实用子程序库
MCS-51单片机实用子程序库(一)
目前已有若干版本的子程序库公开发表,它们各有特色。本程序库中的开平方算法为快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:
(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。
在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。程序清单中开列了四个栏目:标号、指令、操作数、注释。为方便读者理解,注释尽力详细。
子程序库的使用方法如下:
1.将子程序库全部内容链接在应用程序之后,统一编译即可。优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。
2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。优点是程序紧凑,缺点是需要对子程序库进行仔细删节。
(一)MCS-51定点运算子程序库及其使用说明
定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:
1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,(31H)=34H,(32H)=56H。
第三章MCS51系列单片机指令系统及汇编语言程序设计
寄存器间接寻址的存储器空间包括:内部数据RAM和外部数据RAM。 内部数据RAM共用128字节,用一个字节的R0或R1可寻址整个空间。 外部数据RAM最大可达64K字节,仅用R0或R1无法寻址整个空间。在 MCS-51系列单片机指令中,对外部数据RAM作间接寻址有两种方法:第一种 由P2口提供高8位外部数据RAM地址,由R0或R1提供低8位地址,由此共同 寻址64K空间;第二种是用16位的DPTR作寄存器间接寻址。
3.1 MCS-51单片机的寻址方式
MCS-51单片机共有7种寻址方式:
➢ 立即寻址 ➢ 直接寻址 ➢ 寄存器寻址 ➢ 寄存器间接寻址 ➢ 变址寻址 ➢ 相对寻址 ➢ 位寻址
1. 立即寻址
立即寻址就是把操作数直接在指令中给出,即操作 数包含在指令中。立即操作数有8位和16位两种形式, 前面加“#”来表示。
CLR A ;0→A,累加器A中的内容清零 循环移位指令(4条)
RL A ;累加器A中的内容左移一位 RR A ;累加器A中的内容右移一位 RLC A ;累加器A中的内容连同进位位C左移一位 RRC A ;累加器A中的内容连同进位位C右移一位 例:A=16H,指令RR A执行后,A=0BH。
4.控制转移类指令 (共17条)
大学课件MCS51单片机指令系统与汇编语言程序设计
2.2.1 立即寻址
定义:将立即参与操作的数据直接写在指令中,这种寻址方 式称为立即寻址。 特点:指令中直接含有所需的操作数。该操作数可以是8位的, 也可以是16位的,常常处在指令的第二字节和第三字节的位 置上。立即数通常使用#data或#data16表示,在立即数 前面加“#”标志,用以和直接寻址中的直接地址(direc或 bit)相区别。 P41例
表该位地址。位地址n可以是绝对地址,也可以是符号地址。
(8)数据地址赋值伪指令DATA
格式:字符名称x DATA 表达式n
功能:把表达式n的值赋值给左边的字符名称x。n可以是数据或地址,
也可以是包含所定义的“字符名称x”在内的表达式,但不能是汇编符号。 DATA与EQU的主要区别是:EQU定义的“字符名称”必须先定义
后使用,而DATA定义的“字符名称”没有这种限制。所以,DATA伪指令 通常用在源程序的开头或末尾。
2.1.2 指令的分类
MCS-51指令系统有111条指令,可按下列几种方式分类: n 按指令字节数分类
单字节指令(49条)、双字节指令(46条)和三字 节指令(16条)。 2. 按指令执行时间分类
单机器周期指令(65条)、双机器周期指令(44条) 和四机器周期指令(2条)。 3. 按功能分类
2.2 MCS-51单片机的寻址方式
寻址方式:在计算机中,说明操作数所在地址的方法称为指令 的寻址方式。
51单片机汇编指令大全
51汇编指令大全
Rn: 表示当前寄存器区的8个工作寄存器R0~R7
Ri: 表示当前寄存器区的R0或R1,可作地址指针即间址寄存器(i=0或1)
@: 为间接寄存器或基址寄存器的前缀.
Direct: 表示8位内部数据存储单元的地址.它可以是内部RAM的单元地址0~127.特殊功能
寄存器SFR的地址(128~255)或名称,
A: 累加器ACC.
B: .特殊功能寄存器B,用于MUL和DIV指令中.
C: 进位位Cy.
#data: 表示包含在指令中的单字节(8位)立即数.如果用16位进制表示,后缀字母为”H”,数据范围00~0FFH,不得一字母开头;如果用16进制表示无须任何后缀,但必须在0~255之间.
#data16: 表示包含在指令中的双字节(16位)立即数.
Adda16: 表示16位的目的地址.用于LCALL和LJMP指令中,目的地址范围是从0000H~FFFFH的整个64KB存储地址空间.
Adda11: 表示11位的目的地址.用于ACALL和AJMP的指令中,目的地址必须和下一条指令第一个字节同处一页.
Rel: 表示8位带符号的相对偏移量.用语SJMP和所有的条件转移指令中.偏移量相对于下一条指令的第一个字节计算,在-128~+127范围内取值.
DPTR: 为数据指针,可用作16位的地址寄存器.
/: 加在位操作的前面,表示对该位进行非运算.
bit: 表示内部可寻址位或特殊功能寄存器中的直接寻址位.
“(x): 寄存器或地址单元中的内容.
((x)): 有x见解寻址的单元中的内容.
<-: 表示将箭头右边的内容传送至箭头的左边.
51单片机汇编程序范例
16位二进制数转换成BCD码的的快速算法一51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。
程序可见:
http:
32.html中的HEX2BCD子程序。
•说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。
但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。
上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331 个机器周期。•单片机系统多半是用于各种类型的控制场合,很多时候都是需要〃争分夺秒〃的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。
为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的!•近来,在网上发现了一个链接:
,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。这篇文章提到的程序,一直也没有找到,也难辩真假。
这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:
〃使用51条指令代码,但执行这段程序却要耗费312个指令周期〃,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,
51单片机汇编指令总结
51单片机汇编指令总结
数据传输指令
一.片内ram数据传输指令
1.以累加器a为目的操作数的指令:mova,rnmova,directmova,@rimova,#data
2.以寄存器rn为目的操作数的指令:movrn,amovrn,directmovrn,data
3.以轻易地址为目的操作数的指令:movdirect,amovdirect,rnmovdirect1,derect2movdirect,@rimovdirect,#data
4.间接地址为目的操作数的指令:mov@ri,amov@ri,directmov@ri,#data
5.十六位数据传送指令:movdptr,#data16
二.累加器a与片外ram数据传输指令:movxa,@rimovxa,@dptrmovx@ri,
amovx@dptr,a三.换算串行:movca,@a+dptr(先pc←(pc)+1,后a←((a)+(dptr)))+movca,@a+pc(先pc←(pc)+1,后a←((a)+(pc)))四.互换指令:
1.字节交换指令:
xcha,rnxcha,directxcha,@ri
2.半字节交换指令:xchda,@ri
3.累加器半字节交换指令:swapa五.栈操作指令:1.push(入栈指令)pushdirect
2.pop(出栈指令)popdirect
算术运算指令:
一.乘法加法指令:
1.加法指令:
adda,rnadda,directadda,@riadda,#data2.拎位次乘法指令:
addca,rna←(a)+(rn)+cyaddca,directa←(a)+(direct)+cyaddca,@ria←(a)+((ri))+cyaddca,#dataa←(a)+(data)+cy3.带借位减法指令:
C51单片机汇编语言程序设计
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)
单片机汇编程序51电子时钟.doc
单片机汇编程序 51电子时钟
电子钟设计实验报告
一)实验目的:
1、进一步掌握定时器的使用和编程方法。
2、进一步掌握中断处理程序的编程方法。
3、进一步掌握数码显示电路的驱动方法。
4、进一步掌握键盘电路的驱动方法。
5、进一步掌握软件数据处理的方法。
二)内容要求:
1、利用CPU的定时器和数码显示电路,设计一个电子时钟。格式如下:XX XX XX 由左向右分别为:时、分、秒。
2、电子时钟有秒表功能。
3、并能用键盘调整时钟时间。
4、电子时钟能整点报时、整点对时功能。
5、能设定电子时钟的闹铃。
三)主要元件:
电阻4.7K 10个 2K 1个四位共阳数码管1个二位共阳数码管1个按钮开关4个万用板(中板)1个 9012PNP 7个排线排阵若干电线一捆蜂鸣器1个最小系统一个
四)系统说明:
按P1.0键,如果按下的时间小于1秒进入省电模式(数码管不显示,开T0计时器),如果按下的时间大于1秒则进入时间调整.。在时间调整状态:再按P1.0,如果按下时间大于0.5秒转调小时状态,按下时间小于0.5秒加1分钟操作。在小
时调整状态再按P1.0键,如果按下时间大于0.5秒退出时间调整,如果按下时间小于0.5秒加1小时操作。
按P1.1键,进入闹铃调分状态,按P1.2分加1,按P1.0分减1。若再按
P1.3,则进入调整状态,按P1.2时加1,按P1.0分时。按P1.1键,闹铃有效,显示式样变为00:00:—0;再按P1.1键,闹铃无效,显示式样变为00:00:—。按P1.3键,调整闹钟时间结束。
按P1.2键,进入秒表计时功能,按P1.2键暂停或清零,按P1.1键退出秒表回到时钟状态。
51单片机汇编语言指令教程汇集
51单片机汇编语言指令教程汇集
1.MOV指令:MOV指令用于将一个值从一个寄存器或内存位置复制到
另一个寄存器或内存位置。例如,MOVA,将常数10复制到累加器A中。
2.ADD指令:ADD指令用于将两个操作数相加,并将结果保存在目标
操作数中。例如,ADDA,B将寄存器B的值与累加器A的值相加,并将结
果保存在累加器A中。
3.SUB指令:SUB指令用于将源操作数减去目标操作数,并将结果保
存在目标操作数中。例如,SUBA,B将寄存器B的值减去累加器A的值,
并将结果保存在累加器A中。
4.INC指令:INC指令用于将指定的操作数加1、例如,INCA将累加
器A的值加1
5.DEC指令:DEC指令用于将指定的操作数减1、例如,DECA将累加
器A的值减1
6.JMP指令:JMP指令用于无条件地跳转到指定的地址。例如,
JMP1000h将跳转到地址1000h处执行指令。
9. ACALL指令:ACALL指令用于调用一个子程序,其地址由指令给出,子程序结束后返回到调用指令的下一条指令。例如,ACALL Subroutine
将调用一个名为Subroutine的子程序。
10.RET指令:RET指令用于从子程序返回到调用指令的下一条指令。
例如,RET将从子程序返回。
11.NOP指令:NOP指令用于空操作,即不执行任何操作。它通常用于
延时或填充空白。
以上是一些常用的51单片机汇编语言指令,这些指令可以用于控制I/O口、进行算术运算、执行跳转和调用子程序等。学习并熟练掌握这些指令,对于编写高效的51单片机汇编程序非常重要。
51单片机汇编程序
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寄存器赋值为1
ADD A, #0x01 ; 将A寄存器加1
MOV B, A ; 将A寄存器的值传送到B寄存器END ; 程序结束
在上面的示例中,ORG指令用于指定程序的起始地址,MOV 指令用于将A寄存器赋值为1,ADD指令用于将A寄存器加1,MOV指令用于将A寄存器的值传送到B寄存器,END指令用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51 单片机实用程序库
4.1 流水灯
程序介绍:利用P1 口通过一定延时轮流产生低电平
输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。
程序实例(LAMP.ASM)
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
9
MOV A,#00H
MOV P1,A ;灭所有的灯
MOV A,#11111110B
MAIN1:
MOV P1,A ;开最左边的灯
ACALL DELAY ;延时
RL A ;将开的灯向右边移
AJMP MAIN ;循环
DELAY:
MOV 30H,#0FFH
D1: MOV 31H,#0FFH
D2: DJNZ 31H,D2
DJNZ 30H,D1
RET
END
4.2 方波输出
程序介绍:P1.0 口输出高电平,延时后再输出低电
平,循环输出产生方波。实际应用中例如:波形发生器。
程序实例(FAN.ASM):
ORG 0000H
MAIN:
;直接利用P1.0 口产生高低电平地形成方波////////////// ACALL DELAY
SETB P1.0
ACALL DELAY
10
CLR P1.0
AJMP MAIN
;////////////////////////////////////////////////// DELAY:
MOV R1,#0FFH
DJNZ R1,$
RET
五、定时器功能实例
5.1 定时1 秒报警
程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM):
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP DIN0 ;定时器0 入口
MAIN:
TFLA G EQU 34H ;时间秒标志,判是否到50 个
0.2 秒,即50*0.2=1 秒
MOV TMOD,#00000001B;定时器0 工作于方式
1
MOV TL0,#0AFH
MOV TH0,#3CH ;设定时时间为0.05 秒,定时
20 次则一秒
11
SETB EA ;开总中断
SETB ET0 ;开定时器0 中断允许
SETB TR0 ;开定时0 运行
SETB P1.0
LOOP: AJMP LOOP
DIN0:
;是否到一秒//////////////////////////////////////// INCC: INC TFLAG
MOV A,TFLAG
CJNE A,#20,RE
MOV TFLAG,#00H
CPL P1.0
;////////////////////////////////////////////////// RE:
MOV TL0,#0AFH
MOV TH0,#3CH ;设定时时间为0.05 秒,定时
20 次则一秒
RETI
END
5.2 频率输出公式
介绍:f=1/t
s51 使用12M 晶振,一个周期是1 微秒使用定时器1
工作于方式0,最大值为65535,以产生200HZ 的频率为例:
200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电
平或低电平的时间为2500 微秒。这样,定时值应设为65535-2500=63035,将它转换为十六进制则为:F63B。
具体程序请看f200.asm
频率递增:
200HZ:63035:F63B
250HZ:63535:F82F
300HZ:63868:F97C
5.3 200HZ 频率输出
程序介绍:利用定时器定时,在P1.0 口产生200HZ
的频率输出。实际应用例如:传感器前级推动。
程序实例(F200.ASM):
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP DIN0
MAIN:
CLR P1.0 ;产生一个低电平,实际上
是从p1.0 口产生频率
MOV TMOD,#00010000B ;定时器1 工作于方式0
MOV TH1,#0F6H
MOV TL1,#3BH ;频率产生的时间,详细请
见频率公式
SETB EA ;开总中断
13
SETB TR1 ;开定时器1 运行
SETB ET1 ;开定时器1 允许
LOOP: AJMP LOOP ;无限循环
DIN0: CPL P1.0 ;产生一个高电平,
下次来就是低电平(因为取反),一个高电平和一个低电平形成一个周期
MOV TH1,#0F6H
MOV TL1,#3BH ;重置频率产生时间
RETI ;返回
END
5.4 200——250HZ 变化频率输出
程序介绍:利用定时器定时时间的变化,由P1.0 口
产生200——250HZ 变化的频率。实际应用例如:传感器
前级推动、频率发生器。
程序实例(F250.ASM):
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP DIN1