- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
例:一个字符串存放在外部RAM中,起始地址为3000H,求这个字符串的长度,放入R0寄存器中。 解:根据字符串的原理,将字符串的每个字符所对应的ASCII码按顺序存放在存储器中,字符串的结尾是一个ASCII码为0的结尾符。很显然,该程序是一个循环次数不固定的程序,该循环的结束条件是从外部RAM中得到的当前字符的ASCII码是否为0。如果是0,表明该字符串到此结束。 程序流程图如下: 51系列单片机汇编程序设计 51系列单片机汇编程序设计 ORG 0000H MOV R0, #-1 ;在循环中,至少要进行一次加法,所以计数值初始值为-1 MOV DPTR, #3000H L00P: MOVX A, @DPTR ;将当前字符的ASCII码送入A寄存器 INC DPTR INC R0 CJNE A, #0, LOOP ;如果当前字符的ASCII码不为0,循环继续 LEND:SJMP $ END 51系列单片机汇编程序设计 查表程序设计 在程序设计中,查表功能是一项非常重要的功能。查表就是根据自变量x,在表格中寻找y,使y=f(x)。自变量x的范围一般是一个连续变化的整数,比如0~99之间的整数。因此,可以将所对应的y值按自变量x的顺序排列在一起,就得到了一个线性表。根据x的值求取y值,只需要在这个线性表中查询相应的单元即可,称之为查表功能。 指令“MOVC A,@A+DPTR”完成把A中的内容作为一个无符号数与DPTR中的内容相加,所得结果为某一程序存储单元的地址,然后把该地址单元中的内容送到累加器A中。 51系列单片机汇编程序设计 例:在一个以MCS-51为核心的温度控制器中,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由A/D转换为8位二进制数。根据测得的不同温度下的电压值数据构成一个表,表中放温度值y为双字节无符号数,单字节无符号数x为电压值数据。设测得的电压值x放入R2中,编写一程序,根据电压值x,查找对应的温度值y,放入R2R3中。 解:这是一个典型的查表程序。首先使用DW伪指令按电压值的顺序建立一个电压温度表。因为温度值是双字节数,因此这个表的每一项占两个字节,高位字节在前,低位字节在后。表的基地址存放在DPTR寄存器中。查表时,首先将表的索引电压值乘以2,再进行查询。电压值乘以2后,有可能大于255,产生CY进位。如果产生了CY进位,则应通过将DPH加1的方法将进位处理后再查询。 ORG 00H MOV DPTR, #TAB1 ;将表的基地址存放在DPTR寄存器中 MOV A, R2 ;将电压值放入A寄存器中 CLR C ;清除CY标志位 RLC A ;将A乘以2 JNC LNOCY ;如果没有进位则跳过进位处理 INC DPH ;将DPH加1,也就是将DPTR加256, ;处理了进位 LNOCY:MOV R4, A ;保存索引值A到R4寄存器 MOVC A, @A+DPTR ;查表得到温度值的高字节 MOV R2, A ;将温度值的高字节置于R2寄存器 MOV A, R4 ;恢复索引值A INC A ;索引值A加1 MOVC A, @A+DPTR ;查表得到温度值的低字节 MOVC R3, A ;将温度值的高字节置于R3寄存器 LEND:SJMP LEND TAB1:DW…… ;温度值表 使用查表的方式设计多分支程序 原理如下:假设一个程序中有n个分支,每一个分支的入口地址分别是BR0、BR1、......、BRn-1。建立一个分支表,该表的首地址置于DPTR寄存器,共有n项。任意第i(0≤i≤n-1)项的内容只有一条语句,AJMP BRi,占两个字节。将2*i的值置于A寄存器,则执行指令JMP @A+DPTR后,下一条指令将跳转到分支表的第i项。 而分支表第i项所载有的指令是AJMP BRi,所以程序最后将跳转到第i个分支。因此,利用分支程序表,只需要执行一次跳转语句JMP @A+DPTR就可以跳转到任何分支。 例:以下程序利用查表的方式设计4分支程序。A的内容为0~4。 ORG 0000H MOV R0, #8 MOV DPTR, #BRTAB RLA JMP @A+DPTR LEND:SJMP $ BRTAB:AJMP BR0 ;转移表 AJMP BR1 AJMP BR2 AJMP BR3 BR0:
文档评论(0)