第二章--第四节--汇编语言程序设计方法(二)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

单片机常见汇编语言程序设计举例:数制转换程序算术和逻辑运算类程序设计查表程序设计子程序设计定时程序2-4汇编语言程序设计方法(二)1、数制转换例1:将20H单元的两个压缩BCD码拆开变成ASCII码,存入21H、22H单元。(假设20H中的BCD码为00110100)什么是BCD码?什么是ASII码?·········20H21H22HAB0011压缩BCD码001100110100低四位ASII码高四位ASII码方法1:将BCD码除以10H,恰好是将BCD码分别移到了A、B的低4位。然后再各自与30H相或,即成为ASCII码。方法2:利用半字节交换指令来实现。ORG0000HMOVA,20HMOVB,#10HDIVABORLB,#30HMOV22H,BORLA,#30HMOV21H,ASJMP$END开始(20H)A10HBA/B(A中为高4位BCD码,B中为低4位BCD码)B+30HBB(22H)A+30HAA(21H)结束数制转换程序1---方法1源程序如下:·········20H21H22HAB00110100PCPC0011010000010000PC0011000000000100PC00110100PCPCPC0011PCORG0000HMOVR0,#20HMOVA,#30HXCHDA,@R0MOV21H,AMOVA,@R0SWAPAANLA,#0FHORLA,#30HMOV22H,ASJMP$END简单程序例1---方法2开始#20HR0#30HAA的低4位(20H)的低4位A(21H)(20H)AA的低4位A的高4位A(22H)结束A+30HAPCPCPCPCPCPCPCPC源程序如下:·········20H21H22HAR000110010000000110100000001000011010000110000001100000011PC0011PCBCD码十进制转换成二进制例:假如在内部RAM40H单元中存储有一个压缩BCD编码的两位十进制数,设计一段程序把这个数转换成二进制数并存入41H单元中。16(40H)余数商为二进制的高四位余为二进制的低四位解题思路:将高四位乘以0AH,再加上低四位即可。程序清单ORG0000HMOVA,40HMOVB,#16DIVABMOV20H,BMOVB,#0AHMULABADDA,20HMOV41H,ASJMP$END取出30H数据除以16,商A,余B将十位数的二进制数加上个位数,结果41H将十位数乘以0AH,其结果不会超过一个字节,在A中2.算术和逻辑运算类程序设计多字节BCD码十进制数相加例:假如在MCS-51单片机内部RAM中30H~37H单元、38H~3FH单元分别存放有两个8字节BCD码十进制数,设计一段程序将这两个数相加,并把结果存于2FH~37H单元中,小地址存数据的高字节。解题思路:先清Cy位,把(37H)和(3FH)进行带Cy相加,在进行十进制调整,结果存于37H单元中;把(36H)和(3EH)进行带Cy相加,在进行十进制调整……循环至结束,结果把最高字节的Cy存入2FH单元。流程与程序清单ORG0000HMOVR2,#08HMOVR0,#37HMOVR1,#3FHCLRCLOP:MOVA,@R0ADDCA,@R1DAAMOV@R0,ADECR0DECR1DJNZR2,LOPCLRARLCAMOV2FH,ASJMP$END设定循环次数,R0和R1分别指向加数和被加数的首地址相加,并回存结果开始R037H(被加数首地址)R13FH(加数首地址)R208H(循环次数)清Cy位加数和被加数相加,十进制调整,并回存Cy存入2FH单元结束调整数据指针R0(R0)-1R1(R1)-1(R2)-1=0?NYR0和R1分别指向加数和被加数的下一地址,判断循环次数存进位标志极值查找程序例:在MCS-51单片机内部RAM的40H-47H单元中存有8个无符号数,设计一段程序找出其中的最大值,并存放到48H单元中。这是一个求最大值的问题。解题思路:先把(A)(40H),然后将(41H)和(A)进行比较,如果(41H)(A),则(A)(41H),然后和下一个字节进行比较,依次类推,最后(A)必定是最大值。40H41H42H43H44H45H46H47H48H开始R040H(数据区首地址)R207H(循环次数)A((R0))(取第一个数)R0(R0)+1(指向下一个数)B((R0))结束A≥B?NYA(B)(R2)-1=0?48H(A)NYORG0000HMOVR2,#07HMOVR0,#40HMOVA,@R0LOOP:INCR0MOVB,@R0CJNEA,B,NEXNEX:JNCNETMOVA,BNET:DJNZR2,LOOPMOV48H,ASJMP$END设定循环次数R1,R0作为数据指针,指向数据区第一个字节取出下一个字节,存入B如果(A)(B),则(A)(B)次数到否,到则取出(A)48H排序程序程序名:BUBBLE功能:将片内RAM数据块由大到小排序入口参数:R0指向数据块首地址,R2存放数据块长度出口参数:仍存放原来位置占用资源:R0,R1,R2,R3,R5,A,PSW;00H位BUBBLLE:MOVA,R0MOVR1,AMOVA,R2MOVR5,ABUBB1:CLR00HDECR5MOVA,@R1BUB1:INCR1MOVB,@R1CJNEA,B,BUB0BUB0:JNCBUB2SETB00HXCHA,@R1BUB2:DECR1MOV@R1,AINCR1MOVA,@R1DJNZR5,BUB1MOVA,R0MOVR1,AMOVA,R2MOVR5,AJB00H,BUBB1RET键控移位例:有一电路如图所示,设计一个程序实现以下功能:SW按下第1次,VD1发光;SW按下第2次,VD1、VD2发光;SW按下第3次,VD1、VD2、VD3发光……SW按下第7次,VD1—VD7发光;SW按下第8次,VD1发光;SW按下第9次,VD1、VD2发光……依次轮回。解题思路:本例涉及到查询按键按下的过程,SW没有按下时P2.0为高电平,按下为低电平。实际应该查询的是P2.0的下降沿,P2.0有一个下降沿,表明有一个按键按下,LED的状态应该改变一次。EA/VP31X119X218RESET9INT012INT113T014T115P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P0.039P0.138P0.237P0.336P0.435P0.534P0.633P0.732P2.021P2.122P2.223P2.324P2.425P2.526P2.627P2.728RD17WR16PSEN29ALE/P30TXD11RXD10AT89C51C230pFC330pFY16.000MHZGNDSWVD1VD2VD3VD4VD5VD6VD7R2330R3330R4330R5330R6330R7330R8330R94.7KGNDVCCR110K+C147uFGNDVCCVCC程序清单SWBITP2.0ORG0000HLOOP0:SETBSWMOVA,#01HMOVR7,#07HLOOP1:MOVC,SWMOVR6,#255DELAY:NOPNOPDJNZR6,DELAYANLC,/SWJNCLOOP1RLCAORLA,#01HMOVP2,ADJNZR7,LOOP1SJMPLOOP0END置P2.0为输入方式,确定循环次数为7延时消抖判断是否有下降沿,有则移位,否则继续查询显示输出,如果循环次数到则重新开始初态次态数据排序程序例:将片内RAM中20H-27H中的数据按照从小到大的顺序重新排列。解题思路:见下图RAM地址20H21H22H23H24H25H26H27H原始数据66H11H10H34H67H01H89HA0H101H11H10H34H67H66H89HA0H201H10H11H34H67H66H89HA0H301H10H11H34H67H66H89HA0H401H10H11H34H66H67H89HA0H501H10H11H34H66H67H89HA0H601H10H11H34H66H67H89HA0H701H10H11H34H66H67H89HA0HR1←20H,R0←(R1)+1R3←08HB←((R1)),R2←(R3)-1查找最小值并和(R1)单元互换R3-1=0?ENDR1←(R1)+1NY程序流程:程序清单:ORG0000HMOVR1,#20HMOVR3,#08HLOOP1:MOVA,R1;R0←(R1)+1INCAMOVR0,AMOVA,R3;R2←(R3)-1DECAMOVR2,AMOVB,@R1LOOP:MOVA,@R0CJNEA,B,MMMM:JNCSS;如果A≥B跳转MOVB,AMOV28H,R0;28h纪录最小值所在单元的编号SS:INCR0DJNZR2,LOOPMOVR0,28H;最小值单元和20H单元内容互换MOVA,@R1;数据MOV@R0,AMOV@R1,BINCR1DJNZR3,LOOP1END3.查表程序设计程序使用的专用指令:MOVCA,@A+PCMOVCA,@A+DPTR一般情况下,常使用后者程序设计一般规则:先确定表格存放的位置在表格中填入相应的数据查表时先将表格的首地址给DPTR,再将要查表的数据送给A,最后用MOVCA,@A+DPTR例1:假如在MCS-51单片机内部RAM中40H单元内存放的是一个角度(范围0-90),设计一段程序,计算出200sin(),把结果存入41H单元中(结果只取整数)。解题思路:先建立一个相应的数值表格,定义在程序存储器中,利用输入的值进行查表。例程:ORG0000HMOVDPTR,#TABLEMOVA,40HMOVCA,@A+DPTRMOV41H,ASJMP$TABLE:DB0,3,7,10,14,17,21,24,28,31,35,38DB41,45,48…199,200,200END查表表格内容表格的数据是怎么计算出来的?例2:假如在MCS-51单片机内部RAM中40H单元内存放的是一个参数x(范围0-10),设计一段程序,计算出5x3+4x2+3x+1,把结果存入41H和42H单元中(高位在前)。解题思路:先建立一个相应的数值表格(每个为2个字节),定义在程序存储器中,利用输入的值进行查表。例程:ORG0000HMOVDPTR,#TABLEMOVA,40HCLRCRLCA;A*2--APUSHACCMOVCA,@A+DPTRMOV41H,APOPACCINCAMOVCA,@A+DPTRMOV42H,ASJMP$TABLE:DW0001H,000DH,003FH,00B5H,018DHDW02D1H,04DBH,078DH,0B19H,0F9DH,1537HEND查表,得到高两位数表格内容查表,得到低两位数4.子程序设计在实际问题中,常常会遇到在一个程序中多次用到相同的运算或操作,若每遇到这些运算或操作,都从头编起,将使程序繁琐、浪费内存。因此在实际中,经常把这种多次使用的程序段,按一定结构编好,存放在存储器中,当需要时,可以调用这些独立的程序段。通常将这种可以被调用的程序段称为子程序。主要内容:1.主程序与子程序的关系2.子程序嵌套3.子程序的调用与返回主程序与子程序的关系子程序SUB主程序MAIN返回LCALLSUB调用子程序子程序入口地址RETORG0000HMAIN:MOVA,#0FEH;送显示初值LP:MOVR0,#10;送闪烁次数LP0:MOVP1,A;点亮LEDLCALLDELAY;延时MOVP1,#0FFH;熄灭灯LCALLDELAY;延时DJNZR0,LP0RLASJMPLPEND实例:LED灯的闪烁点亮(一)延时次数-1=0点亮相应的LEDYN熄灭相应的LED延时初值左移1位指向下一个LED设闪烁次数送显示初值开始子程序嵌套子程序嵌套(或称多重转子)是指

1 / 41
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功