三个51单片机通信汇编程序

合集下载

51单片机汇编语言程序设计

51单片机汇编语言程序设计

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单片机汇编语言入门教程

51单片机汇编语言入门教程什么是51单片机
51单片机指的是英特尔公司推出的一种单片机芯片种类,其名字为“AT89S52”。

后来,这种芯片因其使用广泛,被人们简称为“51单片机”。

为什么要研究汇编语言
研究汇编语言能够让我们更好地理解机器是如何执行指令的,
从而更好地优化程序,提高程序运行效率。

汇编语言基础知识
数据类型
- 字节:一个字节是8位二进制数,可以表示0~255之间的数。

- 字:一个字是16位二进制数,可以表示0~之间的数。

- 双字:一个双字是32位二进制数,可以表示0~之间的数。

指令集
51单片机有大约100条汇编指令,这些指令可以完成各种操作,如运算、数据传输、中断处理等。

寄存器
51单片机有4个8位的通用寄存器(寄存器0~3)和2个16
位的通用寄存器(DPTR和PC)。

程序结构
51单片机只有一种程序结构——线性结构。

程序从0地址开始执行,一条一条地执行,直到程序结束。

编写第一个汇编程序
以下是一个简单的汇编程序示例:
ORG 0H ;设置程序起始地址为0H
MOV P1, #55H ;将55H赋值给P1口
END ;程序结束指令
这个程序的作用是将55H赋值给P1口。

总结
通过学习本教程,我们了解了基本的汇编语言知识,包括数据
类型、指令集、寄存器、程序结构以及编写程序的基本步骤。

希望
这份教程可以帮助初学者顺利掌握51单片机汇编语言编程的基础。

第三章MCS51单片机的指令系统和汇编语言程序示例(第5范文

第三章MCS51单片机的指令系统和汇编语言程序示例(第5范文

第三章MCS51单片机的指令系统和汇编语言程序示例(第5、6、7节)1.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?(1)MOV A,#19HADD A,#66H(2)MOV A,#5AHADD A,#6BH2.已知: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,#85H3.已知M1和M2中分别存放两个16位无符号数的低8位,M1+1和M2+1中分别存放两个16位无符号数的高8位,计算两数之和(低8位存放在M1,高8位存放在M1+1,设两数之和不超过16位)。

4.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?CLR CMOV A,#52HSUBB A,#0B4H5.已知:A=0DFH,R1=40H,R7=19H,(30H)=00H,(40H)=0FFH,试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?(1) DEC A (2) DEC R7 (3) DEC 30H (4) DEC @R16.试写出能完成85+59的BCD加法程序,并对工作过程进行分析。

7.已知:两个8位无符号乘数分别放在30H和31H单元中,编程实现他们乘积的低8位存放在32H,高8位存放在33H。

8.已知:R0=30H,(30H)=0AAH,试分析执行下列指令后累加器A和30H单元的内容是什么?(1)MOV A, #0FFH ANL A, R0(2)MOV A, #0FH ANL A, 30H(3)MOV A, #0F0H ANL A, @R0(4)MOV A, #80H ANL 30H, A9.设:A=0AAH和P1=0FFH,试编程把累加器A的低四位送入P1口的低四位,P1口的高四位保持不变。

单片机c51汇编语言51单片机汇编语言

单片机c51汇编语言51单片机汇编语言

单片机c51汇编语言51单片机汇编语言单片机C51汇编语言单片机(C51)是指一种集成电路上只包含一个集中式控制器的微处理器,具有完整的CPU指令集、RAM、ROM、I/O接口等功能。

汇编语言是一种低级语言,是用于编写单片机指令的一种语言。

汇编语言能够直接操作单片机的寄存器和输入/输出端口,因此在嵌入式系统的开发中非常重要。

本文将介绍单片机C51的汇编语言编程。

一、了解单片机C51单片机C51是目前应用最广泛的一种单片机系列,广泛用于各种电子设备和嵌入式系统的开发。

C51指的是Intel公司推出的一种基于MCS-51架构的单片机。

该系列单片机具有较高的性能和低功耗的特点,可用于各种控制和通信应用。

二、汇编语言的基本概念汇编语言是一种低级语言,与机器语言紧密相关。

它使用助记符来代替机器指令的二进制表示,使程序的编写更加易读。

在单片机C51汇编语言中,每一条汇编指令都对应着特定的机器指令,可以直接在单片机上执行。

三、汇编语言的基本指令在单片机C51汇编语言中,有一些基本的指令用于控制程序的执行和操作寄存器。

以下是一些常用的指令:1. MOV指令:用于将数据从一个寄存器或内存单元复制到另一个寄存器或内存单元。

2. ADD指令:用于将两个操作数相加,并将结果存储到目的寄存器中。

3. SUB指令:用于将第一个操作数减去第二个操作数,并将结果存储到目的寄存器中。

4. JMP指令:用于无条件跳转到指定的地址。

5. JZ指令:用于在条件为零时跳转到指定的地址。

6. DJNZ指令:用于将指定寄存器的值减一,并根据结果进行跳转。

四、编写单片机C51汇编程序的步骤编写单片机C51汇编程序需要按照以下步骤进行:1. 确定程序的功能和目标。

2. 分析程序的控制流程和数据流程。

3. 设计算法和数据结构。

4. 编写汇编指令,实现程序的功能。

5. 调试程序,并进行测试。

六、实例演示以下是一个简单的单片机C51汇编程序的示例,用于实现两个数的相加,并将结果输出到LED灯上:org 0H ; 程序的起始地址为0mov a, 05H ; 将05H赋值给累加器mov b, 07H ; 将07H赋值给B寄存器add a, b ; 将A寄存器和B寄存器的值相加mov P1, a ; 将相加结果输出到P1口end ; 程序结束在这个例子中,首先将05H赋值给累加器A,然后将07H赋值给B寄存器,接着使用ADD指令将A和B的值相加,将结果存储到累加器A中,最后将累加器A的值输出到P1口。

第三章MCS51系列单片机指令系统及汇编语言程序设计

第三章MCS51系列单片机指令系统及汇编语言程序设计
AJMP addr11 绝对转移指令为2K地址范围内的转移指令,对转移目的地址的要求与 ACALL指令中对子程序入口地址的要求相同。 【3】短转移指令
SJMP rel ;PC+ 2 + rel→PC 短转移指令为一页地址范围内的相对转移指令。因为rel为1字节补码 偏移量,且SJMP rel指令为2字节指令,所以转移范围为-126D~+ 129D 【4】间接转移指令
表3.4 程序存储器空间中的32个基本2K地址范围
0000H~07FFH 0800H~0FFFH 1000H~17FFH 1800H~1FFFH 2000H~27FFH 2800H~2FFFH 3000H~37FFH 3800H~3FFFH 4000H~47FFH 4800H~4FFFH 5000H~57FFH
3. 寄存器寻址
以通用寄存器的内容为操作数的寻址方式。通用寄存 器包括:A,B,DPTR,R0~R7。其中,R0~R7必须在 工作寄存器组之中。
例如:INC R0 ;(R0)+1→R0
需要注意的是,A和B既是通用寄存器,又是具有直 接地址的特殊功能寄存器。
4. 寄存器间接寻址
以寄存器中的内容为地址,该地址中的内容为操作数的寻址方式。能够 用于寄存器间接寻址的寄存器有:R0,R1,DPTR,SP。其中,R0,R1必 须在工作寄存器组之中,SP仅用于堆栈操作。
MCS-51单片机共有111条指令,按功能分类, MCS-51指令系统可分为5大类:
➢ 数据传送类指令(共29条) ➢ 算术操作类指令(共24条) ➢ 逻辑操作类指令(共24条) ➢ 控制转移类指令(共17条) ➢ 布尔变量操作类指令(共17条)
1.数据传送类指令(共29条)
以累加器A为目的操作数类指令(4条)

大学课件MCS51单片机指令系统与汇编语言程序设计

大学课件MCS51单片机指令系统与汇编语言程序设计

ANL C, P ; (C)← (C)∧(P)
其中:P是PSW的第0位,C是PSW的第7位。
(4)字节符号地址(字节名称)加位序号的形式。对于部分特 殊功能寄存器(如状态标志寄存器PSW),还可以用其字节名 称加位序号形式来访问某一位。AC 如:
定义:操作数存放在MCS-51内部的某个工作寄存器Rn (R0~R7)或部分专用寄存器中,这种寻址方式称为 寄存器寻址。
特点:由指令指出某一个寄存器的内容作为操作数。 存放操作数的寄存器在指令代码中不占据单独的一个 字节,而是嵌入(隐含)到操作码字节中。
寻址范围:四组通用寄存器Rn(R0~R7)、部分专用 寄存器( A, B, DPTR, Cy )。
伪指令只出现在汇编前的源程序中,仅提供汇编用的某些控制 信息,不产生可执行的目标代码,是CPU不能执行的指令。
(1)定位伪指令ORG
格式:ORG n
其中:n通常为绝对地址,可以是十六进制数、标号或表达式。
功能:规定编译后的机器代码存放的起始位置。在一个汇编 语言源程序中允许存在多条定位伪指令,但每一个n值都应和前
2.2.2 直接寻址
定义:将操作数的地址直接存放在指令中,这种寻址方式称为 直接寻址。 特点:指令中含有操作数的地址。该地址指出了参与操作的数 据所在的字节单元地址或位地址。计算机执行它们时便可根据 直接地址找到所需要的操作数。
寻址范围:ROM、片内RAM区、SFR和位地址空间。P42
2.2.3 寄存器寻址
定义:指令中给出的操作数是一个可单独寻址的位地址,这种寻址 方式称为位寻址方式。
特点:位寻址是直接寻址方式的一种,其特点是对8位二进制数中 的某一位的地址进行操作。
寻址范围:片内RAM低128B中位寻址区、部分SFR(其中有83位 可以位寻址)。

第4章 MCS-51单片机汇编语言程序设计

第4章 MCS-51单片机汇编语言程序设计
开始
程序清单:
送转移地址序号
A,R3 ;取序号 A ;序号乘2 DPTR, #JTAB ;32个子程序 首地址送DPTR JMP @A+DPTR ;根据序号转移 JTAB: AJMP ROUT00 ;32个子程序首地址 AJMP ROUT01 … MP: MOV RL MOV AJMP ROUT31
第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计
【例4-1】
双字节二进制数求补。
程序说明:对R3(高8位)、R2(低8位)中的二进制定 点数取反加1即可得到其补码。
开始
程序清单:
BINPL:MOV A,R2 CPL A ADD A,#01H MOV R2,A MOV A,R3 CPL A ADDC A,#00H MOV R3,A RET ;低位字节取反 ;加1 ;低位字节补码送R2 ;高位字节取反 ;加进位 ;高位字节补码送R3
散转生成正确偏移号
置换指令地址表首址
转入R3指示的程序
AJMP
……
AJMP
第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计
3.循环程序
包括:循环初始化、循环处理、循环控制
开始 置初值 循环体 循环结束? Y 循环修改 N 循环体 循环结束? N Y 结束 循环修改 结束 开始 置初值
;调用查表子程序 ; 暂存R1中 ;调查表子程序 ;平方和存A中 ;等待
取第一个数→A 调查表子程序 结果存入R1 取下一个数→A 调查表子程序 两数平方相加 存结果
子程序清单:
SQR: INC A ;加RET占的一个字节 MOVC A,@A+PC ;查平方表 RET TAB: DB 0,1,4,9,16 DB 25,36,49,64,81 END

51单片机汇编语言教程

51单片机汇编语言教程

51单片机汇编语言教程:1课:单片机简叙1、什么是单片机一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。

在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。

而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。

单片机是一种控制芯片,一个微型的计算机,而加上晶振,存储器,地址锁存器,逻辑门,七段译码器(显示器),按钮(类似键盘),扩展芯片,接口等那是单片机系统。

天!PC中的CPU一块就要卖几千块钱,这么多东西做在一起,还不得买个天价!再说这块芯片也得非常大了。

不,价格并不高,从几元人民币到几十元人民币,体积也不大,一般用40脚封装,当然功能多一些单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只8只引脚。

为什么会这样呢?功能有强弱,打个比方,市场上面有的组合音响一套才卖几百块钱,可是有的一台功放机就要卖好几千。

另外这种芯片的生产量很大,技术也很成熟,51系列的单片机已经做了十几年,所以价格就低了。

既然如此,单片机的功能肯定不强,干吗要学它呢?话不能这样说,实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用PIII?应用的关键是看是否够用,是否有很好的性能价格比。

所以8051出来十多年,依然没有被淘汰,还在不断的发展中。

2、MCS51单片机和8051、8031、89C51等的关系更多单片机学习资料请来我们平常老是讲8051,又有什么8031,现在又有89C51,89s51它们之间究竟是什么关系?MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031的名称。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(1)主机程序 AT89C51-A
ORG 00H
JMP START
START: MOV SP,#60H ;设置堆栈
MOV TMOD,#00100000B ;TIMER1工作在MODE2
ANL PCON,#01111111B ;SMOD=0
MOV TH1,#0F3H ;波特率为2400
MOV TL1,#0F3H
SETB TR1 ;启动TIMER1
MOV SCON,#11010000B ;UART工作在MODE3
MOV IE,#10010000B ;UART中断使能
SETB SM2 ;设SM2=1
MOV P2,#0FFH ;给P2口赋初值
MOV 32H,0FFH ;两个副CPU地址暂存器
SCAN0: MOV R3,#F7H ;键盘扫描初始值
SCAN: JB RI,UARTI ;是否有接收中断
MOV R1,#00H ;TABLE取码指针
SCAN1: MOV A,R3 ;输出行扫描
MOV P1,A
MOV A,P1
MOV R4,A
SETB C
MOV R5,#03H ;扫描4列
L1: RLC A
JNC KEYIN ;C=0表示有键按下
INC R1 ;C不等于0,未按则取码指针加1
DJNZ R5,L1 ;扫描下一列
MOV A,R3 ;扫描下一行
SETB C
RRC A
MOV R3,A
JC SCAN1 ;4行扫描完
JMP SCAN0
KEYIN: MOV R7,#0D0H ;消除抖动
D2: MOV R6,#19H
DJNZ R6,$
DJNZ R7,D2
D3: MOV A,P1 ;按键放开否?
XRL A,R4
JZ D3
MOV A,R1 ;至TABLE取键盘码
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV 30H,A
XRL A,#83H ;“#1”是否按下?
JZ UART1
MOV A,30H
XRL A,#C6H ;“#2”是否按下?
JZ UART2
MOV A,30H
MOV SBUF,A ;载入SBUF发送出去WAIT: JBC TI,SCAN ;发送完毕否?
JMP WAIT
UART1: SETB TB8 ;设TB8=1
MOV SBUF,#01H ;发送AT89C51-B的地址01H WAIT1: JBC TI,L2 ;发送完毕否?
JMP WAIT1
L2: CLR TB8 ;清除TB8=0
JMP SCAN0
UART2: SETB TB8 ;设TB8=1
MOV SBUF,#02H ;发送AT89C51-C的地址02H WAIT2: JBC TI,L3 ;发送完毕否?
JMP WAIT2
L3: CLR TB8 ;清除TB8=0
JMP SCAN0
UARTI: PUSH ACC ;压入堆栈
PUSH PSW
JBC RI,L5 ;是否为接收中断?RI=1?
JMP RETURN
L5: JB SM2,L6 ;SM2=1接收地址,SM2=0接收数据MOV A,SBUF ;接收数据载入累加器
MOV 33H,A ;暂存入(33H)RAM
MOV A,32H ;判断接收到89C51-B或89C51-C的数据?
CJNE A,#01H,L8 ;接收到AT89C51-B的数据?
MOV A,33H ;是则输出至P2显示(低4位)
MOV P2,A
SETB SM2 ;设SM2=1,准备接收下一个地址
MOV 32H,#0FFH ;清除地址(32H)RAM
JMP RETURN
L8: CJNE A,#02H,RETURN ;接收到AT89C51-C的数据?
MOV A,33H ;是则输出至P2显示(高4位)
MOV P2,A
SETB SM2 ;设SM2=1,准备接收下一个地址
MOV 32H,#0FFH
JMP RETURN
L6: MOV A,SBUF ;载入接收到的地址
CJNE A,#01H,L7 ;是AT89C51-B的地址?
MOV 32H,A ;是则将此89C51-B的地址存入(32H)RAM
CLR SM2 ;设SM2=0,准备接收数据
JMP RETURN
L7: CJNE A,#02H,RETURN ;是89C51-C的地址?
MOV 32H,A ;是则将此89C51-C的地址存入(32H)RAM
CLR SM2 ;设SM2=0,准备接收数据RETURN: POP PSW ;取回PSW
POP ACC
RETI
TABLE: DB F9H,A4H,B0H
DB 99H,92H,82H
DB F8H,80H,90H,
DB 83H,C6H,FFH
END
(2)从机程序 AT89C51-B
ORG 00H
JMP START
ORG 23H ;UART中断起始地址
JMP UARTI
START: MOV TMOD,#00100000B ;TIMER1工作在MODE2
ANL PCON,#01111111B ;SMOD=0
MOV TH1,#0F3H ;波特率为2400
MOV TL1,#0F3H
SETB TR1 ;启动TIMER1
MOV SCON,#11010000B ;UART工作在MODE3
MOV IE,#10010000B ;UART中断使能
SETB SM2 ;设SM2=1
MOV 30H,#0FFH ;P1指拨开关的初值
MOV P2,#0FFH ;给P2口赋初值
LOOP: MOV A,P1 ;读入P1指拨开关
CJNE A,30H,UART1 ;判断有否有变化?
JMP LOOP
UART1: ORL A,#0F0H ;有变化则取低4位
MOV 30H,A ;存入P1指拨开关的新值
SETB TB8 ;设TB8=1
MOV SBUF,#01 ;发送本身地址(01H)给89C51-A WAIT1: JBC TI,L1 ;发送完毕否?
JMP WAIT1
L1: CLR TB8 ;是则清除TB8=0
MOV SBUF,30H ;将指拨开关的值发送给89C51-A WAIT2: JBC TI,LOOP ;发送完毕否?
JMP WAIT2
UARTI: PUSH ACC ;压入堆栈
PUSH PSW
JBC RI,L5 ;是否为接收中断?
JMP RETURN
L5: JB SM2,L6 ;SM2=1接收地址,SM2=0接收数据MOV A,SBUF ;SM2=0,则接收数据并输出至P2
MOV P2,A
SETB SM2 ;设SM2=1,准备接收下一个地址
JMP RETURN
L6: MOV A,SBUF ;SM2=1,载入地址
CJNE A,#01H,RETURN ;是否(01H)地址?
CLR SM2 ;是则清除SM2=0,准备接收数据RETURN: POP PSW
POP ACC
RETI
END
(3)从机程序 AT89C51-C
ORG 00H
JMP START
ORG 23H ;UART中断起始地址
JMP UARTI
START: MOV TMOD,#00100000B ;TIMER1工作在MODE2
ANL PCON,#01111111B ;SMOD=0
MOV TH1,#0F3H ;波特率为2400
MOV TL1,#0F3H
SETB TR1 ;启动TIMER1
MOV SCON,#11010000B ;UART工作在MODE3
MOV IE,#10010000B ;UART中断使能
SETB SM2 ;设SM2=1
MOV 30H,#0FFH ;P1指拨开关的初值
MOV P2,#0FFH ;给P2口赋初值
LOOP: MOV A,P1 ;读入P1指拨开关
CJNE A,30H,UART1 ;判断有否有变化?
JMP LOOP
UART1: ORL A,#0F0H ;有变化则取低4位
SWAP A ;高低4位互换
MOV 30H,A ;存入P2指拨开关的新值
SETB TB8 ;设TB8=1
MOV SBUF,#02 ;发送本身地址(02H)给89C51-A WAIT1: JBC TI,L1 ;发送完毕否?
JMP WAIT1
L1: CLR TB8 ;是则清除TB8=0
MOV SBUF,30H ;将指拨开关的值发送给89C51-A WAIT2: JBC TI,LOOP ;发送完毕否?
JMP WAIT2
UARTI: PUSH ACC ;压入堆栈
PUSH PSW
JBC RI,L5 ;是否为接收中断?
JMP RETURN
L5: JB SM2,L6 ;SM2=1接收地址,SM2=0接收数据MOV A,SBUF ;SM2=0,则接收数据并输出至P2
MOV P2,A
SETB SM2 ;设SM2=1,准备接收下一个地址
JMP RETURN
L6: MOV A,SBUF ;SM2=1,载入地址
CJNE A,#02H,RETURN ;是否(02H)地址?
CLR SM2 ;是则清除SM2=0,准备接收数据RETURN: POP PSW
POP ACC
RETI
END。

相关文档
最新文档