具体方法是:将表首地址放入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 ;表首地址入DPTR
MOV 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 ;偏移量的高低字节归位,至此完成了偏移量乘2
ADD 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单相的从正弦涵数中从0度到90度范围中均匀取出n个数再用256的模转换成表格数。三相的只需从0度到30度取,可这会n要是三的公倍数。后在运行中按你的频率的不同从该表格中抽取就行了。这就是单牌机由PWM产生的正弦波中的那时间段的数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)