查表程序是单片机应用系统中常用的一种程序。利用它能避免进行复杂的运算或转换过程,可完成数据的补偿、修正及转换等功能,具有程序简单、执行速度快等优点。
查表就是根据自变量x,在表格中寻找y,使y=f(x)。数据表格一般存储于程序存储器内。在8051的指令系统中,提供了两条极为有用的查表指令:
两条指令的功能相同,但在具体使用上有一些差别。
指令MOVC A,@A+DPTR是把A中的内容作为一个无符号数与DPTR中的内容相加,所得结果为某一程序存储单元的地址,然后把该地址单元中的内容送到累加器A中。DPTR作为一个基址寄存器,执行完这条指令后,DPTR的内容不变。
指令MOVC A,@A+PC以PC作为基址寄存器,PC的内容和A的内容作为无符号数,相加后得到程序存储器单元的地址,并从该地址单元取出数据送入累加器A,这条指令执行后,PC的内容仍指向查表指令的下一条指令。该指令的优点在于预处理较少,且不影响其他特殊功能寄存器的值。缺点是该表格只能存储在这条指令地址以下的00H~FFH中,这使得表格所在的程序空间受到了限制。
【例5-22】 根据累加器A中的数x(0~9之间)查x的函数y值,其中y=2x2+6。
先计算x对应的y值形成表格数据,再根据x的值查表找出对应的y值,程序如下:
累加器A中的数反映的仅是从表头开始向后查找多少个单元,基址寄存器PC的内容并非表头,执行查表指令时,PC中的内容为1003H,即指向RET指令,而距离表头还差1个字节,所以必须加上PC基址到表头的距离,形成偏移量。(www.xing528.com)
上面的例子中,在进入程序前,将A的内容预置0~9之间的数。如果A中的内容为02H,则运行查表程序后,应该得到对应的y值为14;依次类推,可以根据A的内容查出对应的y值。
MOVC A,@A+DPTR这条指令的应用范围较为广泛,一般情况下都使用该指令进行查表。该指令的优点是表格可以设在64KB程序存储器空间内的任何地方,而不必像MOVC A,@A+PC那样只能设在PC下面的256个单元以内。使用该指令不用计算偏移量。该指令的缺点在于如果DPTR已被使用,则在进入查表前必须保护DPTR,查表结束后再恢复DPTR。上例的查表子程序修改如下:
【例5-23】 设有一个巡回检查报警装置,需要对16路输入进行检测,每路有一个最大允许值,为双字节数。装置运行时,需根据测量的路数,找出每路的最大允许值。如果输入大于允许值就报警。下面根据上述要求编制查表程序。
取路数为x(0~15),设进入查表前,已经把x值放入R7中,y为最大允许值,已放在表格中。
查表程序如下:
上述查表程序是有限制的,表格长度不能超过256B,且表格只能存储于MOVC A,@A+PC指令以下的256个单元中,如果表格的长度超过256B,且需要把表格放在64KB程序存储器空间的任何地方,则应使用指令MOVC A,@A+DPTR,且对DPH、DPL进行运算,求出表目的地址。
【例5-24】 在一个以8051为核心的温度控制器中,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由A-D转换为10位二进制数。根据测得的不同温度下的电压值数据构成一个表,表中存储温度值y,数据x为电压值。设测得的电压值x已放入R3和R4中,要求根据电压值x查找对应的温度值y,结果仍放入R3和R4中。程序如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。