1.38k likes | 1.58k Views
第 3 章. 单片机指令系统. 本章主要内容. 汇编语言的语句格式. 80C51 的寻址方式. 常用指令使用方法. +5V. P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7. 80C51. 项目引入:彩灯控制器. 2 、项目电路. 1 、项目内容. 将 8 只发光二极管分别接到单片机 P1 口的 8 只引脚上, 实现 8 只 LED 依次闪烁,间隔时间为 50ms , 并一直循环下去。. 点亮第 1 只 LED. 延时 50ms. 依次点亮下一只 LED. 判断 8 只 LED 是否点亮完毕?. +5V.
E N D
第 3 章 单片机指令系统 本章主要内容 汇编语言的语句格式 80C51的寻址方式 常用指令使用方法
+5V P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 80C51 项目引入:彩灯控制器 2、项目电路 1、项目内容 将8只发光二极管分别接到单片机P1口的8只引脚上,实现8只LED依次闪烁,间隔时间为50ms,并一直循环下去。
点亮第1只LED 延时50ms 依次点亮下一只LED 判断8只LED 是否点亮完毕? +5V 3、设计程序流程图 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 程序开始 N Y 80C51
点亮第1只LED 延时50ms 依次点亮下一只LED N Y 4、程序设计 ORG 0030H MOV P1,#0FEH YY: 程序开始 MOV R0,#08H MOV A,P1 QQ: ACALL DELAY RL A MOV P1,A DJNZ R0,QQ AJMP YY 判断8只LED 是否点亮完毕? DELAY:MOV R7,#200 DEL1: MOV R6,#123 NOP DEL2: DJNZ R6,DEL2 DJNZ R7,DEL1 RET END
80C51指令类别 80C51单片机具有111条指令,可分为: ① 数据传送类指令 ;如MOV A,#08H ② 算术运算类指令 ;如ADD A,#08H ③ 逻辑运算类指令 ;如ANL A,#08H ④循环类指令 ;如RL A ⑤ 控制转移类指令 ;如AJMP START ⑥位操作类指令 ;如SETB P1.0
一、 指令格式及常用符号 ▼计算机能直接识别和执行的指令是二进制编码指令, 称为机器指令 ▼采用有一定含义的符号(助记符)来表示机器指令, 称为符号指令 ▼对于8051单片机及其兼容型单片机,目前有四种 语言支持:汇编语言、BASIC语言、PL/M语言 和C语言
汇编语言与C语言特点 ▼汇编语言有执行效率高、速度快、与硬件结合紧密等 特点。尤其在进行I/O端口管理时,使用汇编语言有快 捷、直观的优点。但是使用汇编语言相对于使用高级 语言编程难度要大一些,且程序可读性低、开放性差, 从系统开发时间来看,效率不是很高。
汇编语言与C语言特点 ▼C语言是一种编译型程序设计语言,它兼顾了多种高 级语言的特点,并具备汇编语言的功能。具有较高的 可移植性,提供了种类丰富的运算符据类型,极大地 方便了程序设计,同时,它有功能丰富的库函数,运 算速度快、编译效率高,且可以直接实现对系统硬件 的控制,它是一种结构化程序设计语言,在软件开发 中可以采用模块化程序设计方法。
+5V ORG 0030H MOV P1,#0FEH YY: P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 MOV R0,#08H MOV A,P1 汇 编 程 序 QQ: ACALL DELAY RL A MOV P1,A DJNZ R0,QQ AJMP YY DELAY:MOV R7,#200 DEL1: MOV R6,#123 NOP DEL2: DJNZ R6,DEL2 DJNZ R7,DEL1 RET 80C51 END
+5V P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 #include <AT89X51.H> C语言程序 void delay (void) /*延时子程序 */ { unsigned char i,j,k; for(i=20;i>0;i--) for(j=20;j>0;j--) for(k=248;k>0;k--); } /*主程序在下一页*/ 80C51
/*续上页,以下为主程序*/ void main(void) { while(1) { temp=0xfe; P1=temp; delay(); for(i=1;i<8;i++) { a=temp<<i; // 左移 b=temp>>(8-i); P1=a|b; delay(); } } } C语言程序
1、 汇编语言的语句格式 指令格式: [ ]内容可有可无 [标号] 操作助记符 [操作数或操作数地址] [注释] START: ANL A,#40H ;功能是将立即数“40H”同累加器 ;A中的数进行“与”操作,结果送回累加器。 ▼START 为指令的标号; ▼ANL为“与”操作的助记符; ▼立即数“40H”为源操作数; ▼累加器A为目的操作数。
汇编语言的语句格式说明 ①标号由1~8个ASCII字符组成,第一个字符必须是 字母,标号后边必须跟冒号。 ②不能使用该汇编语言已定义了的符号作为标号, 如指令助记符、寄存器符号名称等。 ③十六进制数以字母A~F开头时应在其前面加上数字“0”。
7 0 操作码 7 7 7 0 0 0 7 7 0 0 操作码 操作码 数据或寻址方式 数据或寻址方式 数据或寻址方式 2、 机器指令的编码格式 指令按字节的长度可分为: INC A MOV A,R0 单字节指令: 双字节指令: MOV A,#50H 三字节指令: MOV 20H,#50H;三字节指令
机器指令的编码 单字节指令 如:INC A ;编码为:0000 0100B; 如:MOV A,R0 ;编码为:1110 1000B,高5位为操作码,低3位为放操作数的寄存器编码 双字节指令 如:MOV A,#50H;编码为0111 0100B,0101 0000B 三字节指令 如:MOV 20H,#50H;编码为 ;0111 0101B,0010 0000B,0101 0000B。
二、 80C51的寻址方式 80C51的寻址方式有七种。 ①寄存器寻址 ②直接寻址 什么是寻址方式? ③寄存器间接寻址 ▼寻址方式即寻找地址的方式; ④立即寻址 ▼寻找操作数或指令的地址的方式; ⑤变址寻址 ▼寻址方式均指源操作数的寻址方式 ⑥相对寻址 ⑦位寻址
①寄存器寻址 源操作数放在寄存器中, 指令中直接给出寄存器的名称。 MOV A,R0 累加器A中 寄存器R0的内容 寄存器可以是: MOV 30H,A R0~R7 A B MOV A,B MOV A,DPH DPTR
②直接寻址 指令操作码之后的字节存放的是操作数的地址, 操作数本身存放在该地址指示的存储单元中。 MOV A,50H 50H单元的内容 累加器A中 若(50H)=3CH,指令MOV A,50H执行后, 则 (A)=3CH
片内RAM 50H SFR MOV A,50H执行示意图 已知(50H)=3CH 采用直接寻址的存储空间为: ▼片内RAM低128字节 (以地址形式表示) 3CH ▼SFR(以地址形式或SFR的 符号形式表示均可) 如 MOV A,P1 MOV A,90H 功能一样 常用 3CH A 不常用
③寄存器间接寻址 寄存器中的内容为地址,从该地址去取操作数。 MOV A ,@R0 以R0的内容为地址, 该地址单元的内容 R0的内容 累加器A中 所以称为寄存器间接寻址 若(R0)=30H,(30H)=5AH 指令MOV A,@R0执行后,则(A)=5AH
片内RAM 30H SFR 已知(R0)=30H, (30H)=5AH MOV A, ,@R0执行示意图 寄存器间接寻址对应的空间为: R0 30H ▼片内RAM MOV A,@R0 MOV A,@R1 5AH ▼片外RAM 5AH MOVX A,@R0 MOVX A,@DPTR A
④立即寻址 指令编码中直接给出操作数的寻址方式 MOV A,#50H 数据50H 累加器A中 立即数可以为一个字节,也可以是两个字节, 并要用符号“#”来标识。 如 MOV DPTR,#13F9H 立即寻址所对应的寻址空间为:ROM
课堂练习 若(A)=C6H,(R0)=30H,(30H)=2AH,(50H)=0FH, 试写出下列各指令独立执行后有关寄存器和 存储单元的内容, 1、MOV A,#50H 答案1、(A)=50H 2、MOV A, 50H 答案2、(A)=0FH 3、MOV A,R0 答案3、(A)=30H 4、MOV A,@R0 答案4 、(A)=2AH
⑤变址寻址 以一个基地址(数据指针DPTR或程序计数器PC)加上一个偏移量地址(累加器A)形成操作数地址的寻址方式。 MOVC A,@A+ DPTR 以和为地址单元,该地址单元的内容 累加器A中的内容与数据指针DPTR求和 累加器A中 若(A)=0FH,(DPH)=24H,(DPL)=00H,即 (DPTR)=2400H,(240FH)=88H。 执行指令 “MOVC A,@A+DPTR”,则(A)=88H
片内RAM ROM SFR 00H DPL 24H DPH 已知(A)=0FH, (DPH)=24H, (DPL)=00H MOVC A,@A+DPTR执行示意图 ▼变址寻址所对应的寻址空间为: ROM 93H 2400H ▼另外两条寻址指令为: MOVC A,@A+PC JMP @A+DPTR 88H 2400H 88H 0FH A
项目:求平方值 项目内容:有一个数在R0中,要求用查表的方法确定 它的平方值(此数的取值范围是0-5) MOV DPTR,#TABLE MOV A,R0 MOVC A,@A+DPTR . . . TABLE: DB 0,1,4,9,16,25
⑥相对寻址 相对寻址是以程序计数器PC的当前值(指读出该2字节或3字节的跳转指令后,PC指向的下条指令的地址)为基准,加上指令中给出的相对偏移量 rel (rel的真值)形成目标地址的寻址方式 。 JZ rel JNZ rel
相对寻址实例 ORG 0030H CLR A JNZ L1;若A的内容不为零,则跳转到L1 INC A JNZ L2 L1: MOV A,#09H L2: MOV A,#0AH END
⑦位寻址 对位地址中的内容进行操作的寻址方式 SETB P1.2 CLR P3.0 习惯上,特殊功能寄存器的寻址位常用符号位地址表示。 如: CLR ACC.0 MOV 30H,C 寻址空间为:片内RAM的20H~2FH单元中的128可寻址位; SFR的可寻址位。
闪烁灯 VCC VCC R2=4.7K 单片机 P1.0 220Ω P3.0/RXD ORG 0030H START: JNB P3.0,LIG GND SETB P1.0 SJMP START LIG: CLR P1.0 SJMP START END
符号 含义 三、常用指令使用方法 1、符号指令及其注释中常用的符号 Rn (n=0~7) 当前选中的工作寄存器组中的寄存器 R0~R7之一 Ri (i=0,1) 当前选中的工作寄存器组中的寄存器 R0或R1 @ 间址寄存器前缀 #data 8位立即数
符号 含义 1、符号指令及其注释中常用的符号 #data16 16位立即数 direct 内部128个RAM单元地址及 SFR地址号名称表示) addr11 11位目的地址 addr16 16位目的地址 rel 补码形式表示的8位地址偏移量, 值在 -128~+127范围内
符号 含义 1、符号指令及其注释中常用的符号 将箭头右边的内容送入箭头左边的单元中 / 位操作数的取反操作前缀 (×) 表示×地址单元或寄存器中的内容 ((×)) 表示以×单元或寄存器内容为地址间接 寻址单元的内容 bit 片内RAM位地址、SFR的位地址 (可用符号名称表示)
2、数据传送类指令(29条) ▼一是采用MOV操作符,称为一般传送指令; 8位传送:MOV A,#40H 16位传送:MOV DPTR,#1234H ▼二是采用非MOV操作符,称为特殊传送指令, 如MOVC、MOVX、PUSH、POP、XCH、XCHD及SWAP
(1) 一般传送指令 ▼ 16位传送:MOV DPTR,#1234H 仅此一条16位传送指令,上面指令执行后 (DPH)=12H,(DPL)=34H。 ▼ 8位传送:属于字节传送,完成的任务是将源字节内容拷贝到目的字节,而源字节的内容不变。 MOV A,R0 ;将寄存器R0的内容传送到累加器A,但R0的内容不变
8位传送 通用的格式为: MOV <目的字节>,<源字节> 源字节可以为: 目的字节可以为: A A Rn Rn direct direct @Ri @Ri #data #data ▼在5种源字节中,只有#data不能用作目的字节。
① 以A为目的 ▼源字节与目的字节不相同(除direct外) Rn direct MOV A, @Ri #data 若(R1)=20H,(20H)=55H,执行指令 ”MOV A,@R1”后,(A)=55H
②以Rn为目的 ▼源字节不能是工作寄存器及其间址方式寻址。 A direct MOV Rn, #data 若(50H)=40H,执行指令 ”MOV R6,50H”后, (R6)=40H
③以direct为目的 A Rn MOV direct, direct @Ri #data × MOV 40H,40H direct地址单元的内容可以送到另一个direct地址单元,但不能送给同一个direct地址单元。 MOV 40H,3FH √
④以@Ri为目的 ▼源字节不能是工作寄存器及其间址方式寻址。 A MOV @Ri, direct #data 若(R1)=30H,(A)=20H 执行指令 ”MOV @R1, A”后 (30H)=20H
(2)特殊传送指令 特殊传送指令为: ① ROM查表:MOVC A,@A+DPTR ;MOVCA,@A+PC ②读写片外RAM:MOVX A,@DPTR ;MOV A,@Ri MOVX @DPTR,A; MOVX @Ri,A ③堆栈操作:PUSH direct ;POP direct ④数据交换:SWAP A;XCH A,Rn等
① ROM查表(2条) ▼ DPTR内容为基址 MOVC A,@A+DPTR ;A ←((A)+(DPTR)) ▼ PC内容为基址 MOVC A,@A+PC ;A ←((A)+(PC)) ;PC先增1,以增1后的当前值去执行16位无 ;符号加法,指令执行后PC内容不变。
ROM查表项目:求平方 项目内容: 有一个数在R0中,要求用查表的方法确定它的平方值(此数的取值范围是0-5) ORG 0030H MOV DPTR,#TABLE MOV A,R0 MOVC A,@A+DPTR . . . TABLE: DB 0,1,4,9,16,25 END 程序设计:
② 读写片外RAM(4条) ▼读片外RAM MOVX A,@DPTR ;在DPH中的高8位地址由P2 ;接口输出,在DPL中的低8位地址由P0接口分时输出。 MOVX A,@Ri ;低8位地址在R0或R1中,由P0接口 ;分时输出。 ▼写片外RAM MOVX @DPTR , A MOVX @Ri , A 读写外部RAM的数据必需要通过累加器A
+5V 74LS373 6264 80C31 OE OE WE RD WR CE EA RAM 扩展 8KB RAM P2.7 P2.0~P2.4 A8~A12 ALE G A7 … A0 D7 … D0 Q7 … Q0 CS P0 D0~D7
D 触发器 D0 三态门 地址锁存器 D G Q0 G Q G Q 74LS373 D7 … D0 Q7 … Q0 . . . . . . D7 D Q7 OE OE G 地址锁存器的结构 地址锁存器一般选用带三态缓冲输出的8D锁存器74LS373。
8D 锁存器 三态门 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 D0 D1 D2 D3 D4 D5 D6 D7 OUT IN G OE 地址锁存器的工作原理 G高电平Q=D D锁存在Q中 G低电平,D变化时Q不再随之变化
8KB RAM SFR A 6264 读写片外RAM项目 试将片外RAM 0000H单元内容传送到片外RAM 0002H单元。 55H 0000H 55H 0001H 55H 0002H MOV DPTR,#0000H MOVX A,@DPTR MOV DPTR,#0002H 01FFH MOVX @DPTR,A