本文目录一览

1,请问用51单片机如何查表

ADD A, #1 ; 入口地址在 A 中MOVC A, @A+PC ; 本条指令后有几个字节 A+几RET ; 如 RET 一字节 A+1TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6

请问用51单片机如何查表

2,51单片机数据表shujubiaodb 后面的数据最多能访问多少字节

因为使用movc a,@a+dptr时,ACC的表示的范围是8位的(00~255),所以在DPTR不变时只能访问256字节的空间。 你可以这样:定义数据块,每块都是256字节,这样在访问不同的区块时就让DPTR装载不同的基地址,这样就扩大了访问的范围。还有一个最简单的办法,每次查表时把ACC的值固定为0,而是让DPTR移动变化,这样DPTR就能访问64K的空间了,就像下面一样:MOV A,#00HMOVC A,@A+DPTRINC DPTR

51单片机数据表shujubiaodb 后面的数据最多能访问多少字节

3,51单片机汇编语言如何通过查表的方法找出下面表中任意一位数

找哪一个数?假设找38HMOV DPTR , #TABLELOOP:MOV A,#0MOVC A,@A+DPTR ;查表CJNE A,#38H,LOOP ;不是需要的,返回,继续SJMP $ ;是它,踏步
code是一个定义的前缀,也就是告诉你现在定义的数据是放在程序存储区。ckcon我在c8051f系列单片机里面见过,是定时器的时钟源的配置寄存器至于你的第三个问题,我还是菜鸟,没有做过

51单片机汇编语言如何通过查表的方法找出下面表中任意一位数

4,MSC51单片机指令中的查表问题

我的分析不一定对,仅供参考。 基本思路是从R2R3处取偏移量,乘以2(每个数据为2个字节)通过A加给DPTR,R2加给DPL,r3加给DPH,再从DPTR处取数,交给A,再给R2R3. MOV DPTR,#TAB 表的首地址给DPTR MOV A,R3 r3的值给A CLR C C置零 RLC A A乘2(左移一位后补零) XCH A,R2 A和r2交换数值 RLC A A左移一位,即乘2 XCH A,R2 A和r2交换。至此,相当于R3乘2后给了R2,r2里存的是r3.乘2后的数,A里是r2乘2后的数。 ADD A,DPL DPL的值加给A MOV DPL,A;调整DPL,DPH 相当于把原r2里的数乘2当做偏移地址加给DPL MOV A,DPH ADDC A,R2 MOV DPH,A 相当于把原r3里的数乘2当做偏移地址加给DPH CLR A MOVC A,@A+DPTR;查表 MOV R2,A;第一字节 CLR A INC DPTR MOVC A,@A+DPTR;查第二字节 MOV R3,A RET TAB: DW XXXXH;共1024个数据项 DW XXXXH ...... DW XXXXH 因为查表的数字是双字节,所以低位给r2,高位给r3.

5,MCS51单片机查表程序

ADD A,#16和ADD A,#7都属于查表“修正”指令。这是 MOVC A,@A+PC 这条查表指令必须要用到的修正方式,所以这种修正指令的识别特征就是:它的下条要运行的指令一定是 MOVC A,@A+PC 这样作的目的就是为了当A中的数值与PC中的当前内容相加后,形成的查表地址能跟表格TABLE的首地址相对应,否则相加后形成的查表地址就会出错。具体的修正数值不是固定的(不同的人编写的指令数量不同,所以修正数值也不同,大致上可以按照每条指令占用2个字节、个别指令需要3字节,如MOVC A,@A+PC就需要3个字节这样来计算,总之这条指令使用起来很麻烦,需要提前人工计算出它的修正值。 而 MOVC A,@A+DPTR同样也是查表指令,但它就不需要人工进行计算修正,这是因为在进行编译时,汇编软件会自动计算出查表指令距离表首地址的长度,从而自行修正,不需要人工干涉。 “问题补充”的内容: MOV A,@R0 ;以寄存器R0中的内容为单元地址,并将这个单元地址中的数据传送至累加器A ANL A,#0FH ;将累加器A中的内容和十六进制立即数0F进行逻辑“与”运算,结果再传送给A(这实际是要将累加器A中的高4位进行清0处理,而低4位保持不变) ADD A,#16 ;累加器A中的内容和十进制立即数16进行相加,相加后的结果再传送给A(修正指令) MOVC A,@A+PC ;典型的查表指令之一。含义:将累加器A中的内容和程序指针PC中的当前内容相加,相加后的结果作为要读取的程序存储器ROM的单元地址,并将这个单元地址中的内容传送给累加器A 唉……好久没来“知道”转转了,没想到刚一上来就敲了这么多字,也不知道楼主能看懂了没有?

6,MSC51单片机指令中的查表问题

查表程序是要从一个专门的数据区内找到你所需要的那个数。这个数在表中的位置,由表首地址、数在表内相对表首地址的偏移量、一个数据的字节数等因素来确定。具体方法是:将表首地址放入DPTR中,偏移量放入A中,用查表指令MOVC A,@A+DPTR;来完成从数据区取数。有如下几种情况:1、如果数据区的长度不超过256个字节(累加器A的容量之内),且数据是单字节的,则不需要另外处理;2、因为如果数据区的长度不超过256个字节,但数据是双字节的,需要将偏移量乘2,第一次读出一个字节保存,将地址加1后再读第二字节(类推:一个数据是n字节,则偏移量乘n,每次读出一个字节保存,将地址加1后再读下一字节,直到一个数全部读出)。3、如果数据区的长度超过了256个字节,因为A已经存放不了256以上的偏移量,此时需要事先将偏移量加入到DPTR中去(即数据的真实地址全部放到DPTR中了),再将A清零后使用查表指令。同样也要如上区分单字节数和多字节数。你所给例就是数据区的长度超过了256个字节,且数据为双字节的情况。程序解释如下,供参考。MOV DPTR,#TAB ;表首地址入DPTRMOV A,R3 CLR C RLC A ;偏移量的低8位乘2在A中,移出的最高位在C中XCH A,R2 ;乘2后的偏移量的低8入R2中,偏移量的高8位入A中RLC A;偏移量的高8位乘2在A中XCH A,R2 ;偏移量的高低字节归位,至此完成了偏移量乘2ADD A,DPL MOV DPL,A;MOV A,DPH ADDC A,R2 MOV DPH,A;将偏移量加到DPTR中,至此DPTR中就是数据第一个字节的实际地址 CLR A ;A清零,因为偏移量已经加入,DPTR内容不需要再修正。MOVC A,@A+DPTR;读数据第一个字节 MOV R2,A;读数据第一个字节存入R2中 CLR A ;A清零INC DPTR ;地址加“1”,准备读下一个字节MOVC A,@A+DPTR MOV R3,A 读数据第一个字节存入R3中RET TAB: DW XXXXH;TAB为表首地址,共1024个双字节数据项,共2048个字节 DW XXXXH ...... DW XXXXH

7,51单片机查表程序

查表啊 事先定义好的数据 0x3f 0x06....
adda,#16和adda,#7都属于查表“修正”指令。这是movca,@a+pc这条查表指令必须要用到的修正方式,所以这种修正指令的识别特征就是:它的下条要运行的指令一定是movca,@a+pc这样作的目的就是为了当a中的数值与pc中的当前内容相加后,形成的查表地址能跟表格table的首地址相对应,否则相加后形成的查表地址就会出错。具体的修正数值不是固定的(不同的人编写的指令数量不同,所以修正数值也不同,大致上可以按照每条指令占用2个字节、个别指令需要3字节,如movca,@a+pc就需要3个字节这样来计算,总之这条指令使用起来很麻烦,需要提前人工计算出它的修正值。而movca,@a+dptr同样也是查表指令,但它就不需要人工进行计算修正,这是因为在进行编译时,汇编软件会自动计算出查表指令距离表首地址的长度,从而自行修正,不需要人工干涉。“问题补充”的内容:mova,@r0;以寄存器r0中的内容为单元地址,并将这个单元地址中的数据传送至累加器aanla,#0fh;将累加器a中的内容和十六进制立即数0f进行逻辑“与”运算,结果再传送给a(这实际是要将累加器a中的高4位进行清0处理,而低4位保持不变)adda,#16;累加器a中的内容和十进制立即数16进行相加,相加后的结果再传送给a(修正指令)movca,@a+pc;典型的查表指令之一。含义:将累加器a中的内容和程序指针pc中的当前内容相加,相加后的结果作为要读取的程序存储器rom的单元地址,并将这个单元地址中的内容传送给累加器a唉……好久没来“知道”转转了,没想到刚一上来就敲了这么多字,也不知道楼主能看懂了没有?

8,51单片机查表问题

不能用A当做变量,改用R2。;MOV A,#00H mov r2, #0MAIN: mov a, r2 MOVC A,@A+DPTR MOV P2,A ACALL DEL;INC A inc r2 cjne r2, #8, main mov r2, #0 AJMP MAIN有字数限制,不能写了
程序有多处错误请改为第二行的AJMP MAIN删除它标号MAIN:移上一行指令INC A改为INC DPTR循环里应加上判定DPTR的值,让它读取一定的数值后退出循环(就是换花样)
程序有几处错误,1、第二句的跳转应改到第四句2、不能用A计数,执行MOVC后A被清除,换成R2,相应的该为INC R2,再加一句R2计数8次的判断。3、TAB行中0E0H和0C0H误将0写为英文字符O了
mov dptr,#tab把tab表的首地(存0c0h的单元地址,下一个地址就存0f9h)址放进指针dptrmovc a,@a+dptr累加器a的值加dptr作为一个数并看成地址将这个地址中的数赋值给累加器a如果执行这句前累加器内容为0那么运行后a中就会存这个表格的第一个值;为2同样会变成第三个值@间接寻址的说明,后面的a+dptr的结果作为地址进行查找就能找到你的表格
TABLE: DW 0FA15H,0FA67H,0FB04H,0FB90H(16进制)……DW伪指令,把一个字:FA 15,分别存放在两个字节单元中,其它的字,也都是分别存放的。……MOV DPTR,#TABLE1MOVC A,@A+DPTR -- 从一个字中,读出一个字节……INC TEMP --加一MOV A,TEMPMOVC A,@A+DPTR -- 从同一个字中,读出另一个字节…… ------------------------------------------------DW伪指令,是存放两个字节的。从TABLE:开始,第0、1字节,存放了15 FA;第2、3字节,存放了67 FA;第4、5字节,存放了04 FB;第6、7字节,存放了90 FB;……。从中找第N个字,就要从N*2的地址去找,所以前面有个(要×2呢?)。MOV A,BUFF,假设BUFF=1×2后,存放到TEMP,再用MOVC A,@A+DPTR,即可从一个字中,读出一个字节,即67H;INC TEMP --加一后,再用MOVC A,@A+DPTR,即可从一个字中,读出另一个字节,即FAH。另外,站长团上有产品团购,便宜有保证

9,MCS51单片机查表程序的问题

MOV DPTR,#TAB把TAB表的首地(存0c0h的单元地址,下一个地址就存0f9h)址放进指针DPTRMOVC A,@A+DPTR累加器A的值加DPTR作为一个数并看成地址将这个地址中的数赋值给累加器A如果执行这句前累加器内容为0那么运行后A中就会存这个表格的第一个值;为2同样会变成第三个值@间接寻址的说明,后面的A+DPTR的结果作为地址进行查找就能找到你的表格
adda,#16和adda,#7都属于查表“修正”指令。这是movca,@a+pc这条查表指令必须要用到的修正方式,所以这种修正指令的识别特征就是:它的下条要运行的指令一定是movca,@a+pc这样作的目的就是为了当a中的数值与pc中的当前内容相加后,形成的查表地址能跟表格table的首地址相对应,否则相加后形成的查表地址就会出错。具体的修正数值不是固定的(不同的人编写的指令数量不同,所以修正数值也不同,大致上可以按照每条指令占用2个字节、个别指令需要3字节,如movca,@a+pc就需要3个字节这样来计算,总之这条指令使用起来很麻烦,需要提前人工计算出它的修正值。而movca,@a+dptr同样也是查表指令,但它就不需要人工进行计算修正,这是因为在进行编译时,汇编软件会自动计算出查表指令距离表首地址的长度,从而自行修正,不需要人工干涉。“问题补充”的内容:mova,@r0;以寄存器r0中的内容为单元地址,并将这个单元地址中的数据传送至累加器aanla,#0fh;将累加器a中的内容和十六进制立即数0f进行逻辑“与”运算,结果再传送给a(这实际是要将累加器a中的高4位进行清0处理,而低4位保持不变)adda,#16;累加器a中的内容和十进制立即数16进行相加,相加后的结果再传送给a(修正指令)movca,@a+pc;典型的查表指令之一。含义:将累加器a中的内容和程序指针pc中的当前内容相加,相加后的结果作为要读取的程序存储器rom的单元地址,并将这个单元地址中的内容传送给累加器a唉……好久没来“知道”转转了,没想到刚一上来就敲了这么多字,也不知道楼主能看懂了没有?
MOV DPTR,#TAB MOVC A,@A+DPTR CPL A ;理解这句 MOV P0,AMOV DPTR,#TAB 这句是将TAB处的内容的地址移入DPTR寄存器(51单片机中唯一的一个16位的)MOVC A,@A+DPTR 这句将(A寄存器中的内容+DPTR)中的地址处的数据移入A比如此时 A=0,DPTR=300,这时就将300+0寄存器里的数据移到A如果A=2,DPTR=300,这时就将(300+2)寄存器里的数据移到A CPL A ; A求反, MOV P0,A 将A的值移入P0口,用数码管等显示出来结果

10,MSC51单片机指令中的查表问题

我的分析不一定对,仅供参考。 基本思路是从R2R3处取偏移量,乘以2(每个数据为2个字节)通过A加给DPTR,R2加给DPL,r3加给DPH,再从DPTR处取数,交给A,再给R2R3.MOV DPTR,#TAB 表的首地址给DPTRMOV A,R3 r3的值给A CLR C C置零RLC A A乘2(左移一位后补零)XCH A,R2 A和r2交换数值RLC A A左移一位,即乘2XCH A,R2 A和r2交换。至此,相当于R3乘2后给了R2,r2里存的是r3.乘2后的数,A里是r2乘2后的数。ADD A,DPL DPL的值加给AMOV DPL,A;调整DPL,DPH 相当于把原r2里的数乘2当做偏移地址加给DPLMOV A,DPH ADDC A,R2 MOV DPH,A 相当于把原r3里的数乘2当做偏移地址加给DPHCLR AMOVC A,@A+DPTR;查表MOV R2,A;第一字节CLR AINC DPTRMOVC A,@A+DPTR;查第二字节MOV R3,ARETTAB: DW XXXXH;共1024个数据项DW XXXXH......DW XXXXH 因为查表的数字是双字节,所以低位给r2,高位给r3.
流水灯(利用取表方式) 1. 实验任务 利用取表的方法,使端口p1做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0.2秒)。 2. 电路原理图 图4.5.1 3. 系统板上硬件连线   把“单片机系统”区域中的p1.0-p1.7用8芯排线连接到“八路发光二极管指示模块”区域中的l1-l8端口上,要求:p1.0对应着l1,p1.1对应着l2,……,p1.7对应着l8。 4. 程序设计内容 在用表格进行程序设计的时候,要用以下的指令来完成 (1). 利用mov dptr,#data16的指令来使数据指针寄存器指到表的开头。 (2). 利用movc a,@a+dptr的指令,根据累加器的值再加上dptr的值,就可以使程序计数器pc指到表格内所要取出的数据。 因此,只要把控制码建成一个表,而利用movc a,@a+dptr做取码的操作,就可方便地处理一些复杂的控制动作,取表过程如下图所示: 5. 程序框图 图4.5.2 6. 汇编源程序org 0start: mov dptr,#tableloop: clr amovc a,@a+dptrcjne a,#01h,loop1jmp startloop1: mov p1,amov r3,#20lcall delayinc dptrjmp loopdelay: mov r4,#20d1: mov r5,#248djnz r5,$djnz r4,d1djnz r3,delayrettable: db 0feh,0fdh,0fbh,0f7hdb 0efh,0dfh,0bfh,07fhdb 0feh,0fdh,0fbh,0f7hdb 0efh,0dfh,0bfh,07fhdb 07fh,0bfh,0dfh,0efhdb 0f7h,0fbh,0fdh,0fehdb 07fh,0bfh,0dfh,0efhdb 0f7h,0fbh,0fdh,0fehdb 00h, 0ffh,00h, 0ffhdb 01hend7. c语言源程序#include <at89x51.h>unsigned char code table[]=0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00,0xff,0x00,0xff,0x01};unsigned char i;void delay(void)unsigned char m,n,s;for(m=20;m>0;m--)for(n=20;n>0;n--)for(s=248;s>0;s--);}void main(void)while(1)if(table[i]!=0x01)p1=table[i];i++;delay();}elsei=0;}}}

文章TAG:51单片机查表数据多少单片机  查表  数据  
下一篇