51单片机-查表指令
51单片机-查表指令-课件

三、举例 4、流程图
三、举例 5、程序段 查表指令控制流水灯.txt
三、举例
④ 数据表(平方表)在ROM中存放的示意图: (注意:这里,标号 TABLE实际上是数据表 的首地址,它是一个具 体的值。只不过在这里, 用TABLE这个标号来 表示更为方便而已。)
三、举例
⑤程序执行情况分析: MOV R0,#2;待查2的平方,将R0赋值为2 MOV DPTR,#TABLE;将平方表的首地址送入DPTR中,假 设为1000H(标号为TABLE) MOV A,R0;A=R0=2 MOVC A,@A+DPTR;将A与DPTR相加,即1002H(TABLE+2),以该值为 地址,到ROM中相应单元去取数。程序中该单元的数据为4,正是2的平 方。 (显示程序段……) TABLE: DB 0,1,4,9,16,25
MOVC A,@A+PC—程序存储器ROM向累加器A传送数据的指令 A—累加器,用于保存临时数据 PC—程序计数指针,PC的值等于当前要执行的指令的存放地址(举例) DPTR—16位寄存器,在查表程序中,DPTR的值一般等于待查数据表的首 地址。 @—表示间接寻址方式。
此条指令的含义是将累加器A中的值与寄存器DPTR中的值 相加,相加后的结果是程序存储器ROM中的某个存储单元 的地址。将这个地址中的数据传送到A中保存起来。
二、查表程序格式
在使用时,将DPTR赋值为欲查数据表的首地 址,累加器A赋值为要查的数据,即可实现查 表功能,查得的数据保存在A中。通用格式如 下: MOV DPTR,#TABLE MOVC A,@A+DPTR ……(其他程序段) TABLE:DB ……(数据库)
51单片机符号

ls的乱写PC = progammer counter //程序计数器ACC = accumulate //累加器PSW = progammer status word //程序状态字SP = stack point //堆栈指针DPTR = data point register //数据指针寄存器IP = interrupt priority //中断优先级IE = interrupt enable // 中断使能TMOD = timer mode //定时器方式(定时器/计数器控制寄存器)ALE = alter (变更,可能是)PSEN = progammer saving enable //程序存储器使能(选择外部程序存储器的意思) EA = enable all(允许所有中断)完整应该是enable all interruptPROG = progamme (程序)SFR = special funtion register //特殊功能寄存器TCON = timer control //定时器控制PCON = power control //电源控制MSB = most significant bit//最高有效位LSB = last significant bit//最低有效位CY = carry //进位(标志)AC = assistant carry //辅助进位OV = overflow //溢出ORG = originally //起始来源DB = define byte //字节定义EQU = equal //等于DW = define word //字定义E = enable //使能OE = output enable //输出使能RD = read //读WR = write //写中断部分:INT0 = interrupt 0 //中断0INT1 = interrupt 1//中断1T0 = timer 0 //定时器0T1 = timer 1 //定时器1TF1 = timer1 flag //定时器1 标志(其实是定时器1中断标志位)IE1 = interrupt exterior //(外部中断请求,可能是)IT1 = interrupt touch //(外部中断触发方式,可能是)ES = enable serial //串行使能ET = enable timer //定时器使能EX = enable exterior //外部使能(中断)PX = priority exterior //外部中断优先级PT = priority timer //定时器优先级PS = priority serial //串口优先级全局变量与局部变量c51中如何实现对全局变量的声明,注意项目含有多个文件,要声明一个全局变量,使得各模块都能使用该变量。
C51汇编111条指令

54 逻辑与 ANL A, Rn 将累加器A的值和寄存器Rn的值进行与操作,结果保存到累加器A中
55 ANL A, direct 将累加器A的值和direct地址单元内的值进行与操作,结果保存到累加器A中
56 ANL A, @Ri 寄存器Ri内为RAM地址,将累加器A的值和该地址单元内的值进行与操作,结果保存到累加器A中
23 MOVX A , @DPTR 将DPTR寄存器所指外部RAM地址单元内的数据送累加器A
24 MOVX A, @Ri 寄存器Ri内为片外RAM地址,将该地址单元内的数据送累加器A
25 MOVX @Ri, A 寄存器Ri内为片外RAM地址,将该地址单元内的数据送累加器A
26 与ROM传送 MOVC A, @A+DPTR A+DPTR构成ROM地址,将该地址内的数据送累加器A内
85 CJNE A, #data, rel If(累加器A!= 立即数)则PC加2再加上rel作为目标地址
86 CJNE Rn, #data, rel If(寄存器Rn的值!= 立即数)则PC加2再加上rel作为目标地址
87 CJNE @Ri, #data, rel 寄存器Ri内为RAM地址,If(该地址单元的值!= 立即数)则PC加2再加上rel作为目标地址
66 逻辑异或 XRL A, Rn 将累加器A的值和寄存器Rn的值进行异或操作,结果保存到累加器A中
67 XRL A, direct 将累加器A的值和direct地址单元内的值进行异或操作,结果保存到累加器A中
68 XRL A, @Ri 寄存器Ri内为RAM地址,将累加器A的值和该地址单元内的值进行异或操作,结果保存到累加器A中
控制转移指令
51单片机查表指令

51单⽚机查表指令51单⽚机查表指令51单⽚机具有两条查表指令,⽤于从 ROM 中读出预存的数据:MOVC A, @A + PCMOVC A, @A + DPTR问题:在“MOVC A,@A+DPTR”和“MOVC A,@A+PC”中,分别使⽤了DPTR和PC作基址,请问这两个基址代表什么地址?使⽤中有何不同?答案:使⽤@A+DPTR基址变址寻址时,DPTR为常数且是表格的⾸地址,A为从表格⾸址到被访问字节地址的偏移量。
使⽤@A+PC基址变址寻址时,PC仍是下条指令⾸地址,⽽A则是从下条指令⾸地址到常数表格中的被访问字节的偏移量。
PC是程序计数器,DPTR是数据指针。
⽤这个MOVC A,@A+DPTR⽐较⽅便的,DPTR是16位。
范围⼴。
建议使⽤。
这两条都是查表指令,MOVC A,@A+PC,只能给累加器A赋值,所以只能查这条指令所在地址以后256字节范围内的代码或常数。
⽽MOVC A,@A+DPTR,可以给DPTR赋给任何⼀个16位的地址值,所以查表范围可达整个程序存储器64K字节空间的代码或常数。
其中前⼀条指令的⽤法,⽐较难,使⽤的时候,需要计算⼀个“偏移量”。
不了解“指令的字节数”的⼈,都不清楚应该如何计算。
做⽽论道曾在以前的⽂章中,介绍过“偏移量”的⾃动计算⽅法,可见如下链接:--------------------最佳答案:51单⽚机汇编语⾔有⼀条查表指令是:MOVC A, @A + DPTR它不是单独使⽤的,要和 DB 伪指令配套使⽤。
例如:若累加器A中有⼀个0~9的数,请⽤查表法求出该数的平⽅值,设平⽅表表头地址为1000H。
程序如下:;-------------------------------------MOV DPTR, #1000HMOVC A, @A + DPTR……ORG 1000HDB 0, 1, 4, 9, 16, 25......;-------------------------------------DB 伪指令从 ROM 1000H 开始,顺序存放了⼀系列的“平⽅”数据。
MCS-51指令系统

4、控制转移类指令(二)
无条件转移:(LJMP,AJMP,SJMP,JMP—4条) LJMP addr16 长跳转指令
——可在64K范围内跳转 AJMP addr11 绝对跳转指令
——可在指令所在的2K范围内跳转 SJMP rel 相对跳转指令
——可在当前PC-128与+127范围内跳转 JMP @A+DPTR 间接长跳转指令
1
累加器清零/取反操作 (CLR,CPL—2条)
CLR A —对累加器清零
1 Byte 1 Tm
CPL A ——对累加器按位取非 1 Byte 1 Tm 15
3、逻辑运算及移位类指令(三)
逻辑运算指令在程序中的应用(下面的例子认为Acc 的内容为9AH)
逻辑与ANL运算用于对某些位进行清0或者保留: 例: ANL A, #0FH; 则(A) = 0AH
位清零/置位指令(4条): CLR bit(或C) —— (bit或 C)“0” SETB bit(或C) —— (bit或 C)“1”
位逻辑与/或/非指令(6条): ANL C,bit(或/bit) ORL C,bit(或/bit) CPL bit (或 C) 注: “/bit”表示对bit位先取反然后再参加运算
带借位减法(SUBB):(A) ← (A)- (Cy)- (第二操作数)
10
2、算术运算类指令(三)
加1/减1操作: (INC,DEC—9条) INC, DEC与用加/减法指令做加1/减1 操作不 同之处在于INC、DEC不影响标志位。
单字节乘/除运算: (MUL,DIV—2条) 两个单字节数的乘/除法运算只在A与B之间 进行。 MUL AB: (A)与(B)相乘, 积为16位数,
MCS51单片机指令系统

第一条指令为远查表指令,可以在64K的程序存储器空间寻 址。基地址寄存器为DPTR,其意思为,DPTR里面存放的是 程序存储器中数据表格的首地址,A为数据地址的偏移量。
这条指令执行以后,以 (A)+(DPTR)的数值为地址数 据就送进A里面来了,也就是从表格首地址开始以后的第(A) 个数据被送进A了。(举例子说明)
编写好的程序都放在程序存储器中,由于一个存储地址所 指示的存储单元只能存放一字节的数据。所以,在存放指令时, 必须将指令拆分成一个一个字节进行连续存放。
比如: 实现“累加器加10H”这条指令,其机器语言为 0111010000010000, 占用了两个字节,就必须拆成两个字节 进行连续存储。
但是,用二进制来表示比较麻烦,因此,也常用十六进制来 表示如:74H 10H来表示以上这条机器语言。可见,用十六进 制表示指令比较简单,但是,指令系统有上百条指令,不易记 住。所以,一般采用容易记住的一些缩写符号来表示机器语言,
2. 在指令中直接给出操作数的地址, 这种寻址方式就属
于直接寻址方式。在这种方式中, 指令的操作数部分直接 是操作数的地址。
比如:MOV A,30H;将30H里面的数送到A里面 MOV 21H,30H;将30H里面的数存放到21H里面 在MCS -51 单片机指令系统中, 直接寻址方式中可
以访问 3 种存储器空间: (1) 内部数据存储器的低 128 个字节单元(00H~
7. 位寻址 指按照位进行的寻址操作,(前面讲的都是按字节进
行的寻址操作)。该种寻址方式中, 操作数是内部RAM单元 中20H到2FH的128个位地址以及SFR中的11个可进行 位寻址的寄存器中的位地址寻址。
比如:MOV C,20H;就是将RAM中位寻址区中20H位地 址中的内容送给C。区别与MOV A,20H;这个是将内部 RAM中20H单元的内容送给A。
51单片机中查表指令的使用

个偏移量,以补偿数据表首址与MoVc A,@A+PC后面下! 一条指令地址的差值。也就是说,基址加变址A+Pc中, !
PC虽然不能改变,但可将A中的数据进行调整(加上偏 移量),就能实现准确查表。实际应用中,使用MOVC A,@”Pc指令编写程序时,调整偏移量有以下几种处理 方法:
1.子程序法。将查表指令写成子程序,子程序后紧 跟着安排数据表。
I
MOV DPTR, #TABLE
MOV A, @A+DPTR
I
‘ ●
1
.
。
TABLE:DB……·
:
在实际的单片机应用系统中,往往需要扩展外部数!
据存储器或输入输出接口(如键盘和数码显示等)。在!
这种情况下,程序中就要用到数据指针DPTR,要将其指;
向外RAM地址(或键盘与显示器地址),利用Movx;
式。用MOVC A,@A+DPT财旨令查表,因为数据指针DPTR
是16位的,故数据表可安排在64KB的ROM的任意地址范l
围内。使用时只要将数据指针DPTR(基址寄存器)指向I
欲查数据表的首地址,将累加器A(变址参数寄存器)I
赋以要查表的数据,就可实现查表功能,查得的数据存l
在累加器A中。通用的程序如下:
A,@DPTR和MOVx@DPTR,A指令与外RAM进行数据交换。;
若此时还需要查表(如数码显示程序,需查找七段显示;
器的段码),使用MoVc A,@A+DPTR指令就不太方便。;
数据指针DPTR既要指向内部程序存储器RoM的数据表首;
址,又要指向外部RAM或其他接口的地址,这虽然可用;
堆栈等方法来实现,但比较麻烦。在这种情况下最好使!
应用设计
5 1单片机中查表指令的使用
大学课件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位 可以位寻址)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MOVC A,@A+PC MOVC A,@A+DPTR
MOVC—程序存储器ROM向累加器A传送数据的指令 A—累加器,用于保存临时数据 PC—程序计数指针,PC的值等于当前要执行的指令的存放地址(举例) DPTR—16位寄存器,在查表程序中,DPTR的值一般等于待查数据表的首
地址。 @—表示间接寻址方式。
此条指令的含义是将累加器A中的值与寄存器DPTR中的值 相加,相加后的结果是程序存储器ROM中的某个存储单元 的地址。将这个地址中的数据传送到A中保存起来。
3
二、查表程序格式
在使用时,将DPTR赋值为欲查数据表的首地 址,累加器A赋值为要查的数据,即可实现查 表功能,查得的数据保存在A中。通用格式如 下: MOV DPTR,#TABLE MOVC A,@A+DPTR ……(其他程序段) TABLE:DB ……(数据库)
后面的数,即0~5的平方值0,1,4,9,16,25存放 在ROM中。
③待查的数据保存在R0中,可根据需 要进行修改。
6
三、举例
④ 数据表(平方表)在ROM中存放的示意图: 是一个具 体的值。只不过在这里, 用TABLE这个标号来 表示更为方便而已。)
4
三、举例
例1:将累加器A中的数(0~5),用查表的方法求 平方值。 MOV R0,#待查值 MOV DPTR,#TABLE MOV A,R0 MOVC A,@A+DPTR (显示程序段……) TABLE: DB 0,1,4,9,16,25
5
三、举例
讲解:①TABLE是数据表首地址的标号。 ②DB是一条伪指令,它的用途是将其
左移2次,右移2次,闪烁2次(延时的时间 0.2秒)。
10
三、举例
2、电路原理图 控制流水灯实验\流水灯.DSN 3、设计思路
把控制码建成一个表,而利用MOVC A,@ A+DPTR做取码的操作,就可方便地处理一 些复杂的控制动作
11
三、举例 4、流程图
12
三、举例 5、程序段
查表指令控制流水灯.txt
地址,到ROM中相应单元去取数。程序中该单元的数据为4,正是2的平 方。 (显示程序段……) TABLE: DB 0,1,4,9,16,25
8
三、举例 例2:基于单片机的简易计算器设计 基于单片机的简易计算器.doc
9
三、举例
例3:用查表方式控制广告灯显示
1. 实验任务 利用取表的方法,使端口P1做单一灯的变化:
模块七 查表指令
1
在日常生活中,很多场合需要单片机控制电 路做复杂的显示或运算。如大型的LED中文 显示屏,复杂的数据计算等。通常的做法是: 事先做好数据库(比如汉字库),然后让单 片机通过“查表”的方式调用数据库中的内 容进行相应的显示或其他操作。
2
一、指令讲解
51单片机指令系统中,有两个查表指令。
7
三、举例
⑤程序执行情况分析: MOV R0,#2;待查2的平方,将R0赋值为2 MOV DPTR,#TABLE;将平方表的首地址送入DPTR中,假
设为1000H(标号为TABLE) MOV A,R0;A=R0=2 MOVC A,@A+DPTR;将A与DPTR相加,即1002H(TABLE+2),以该值为