51单片机指令系统(3) (51单片机指令集)

第二十一课:汇编程序的基本结构 指令学习 程序编写做到:占用存储空间少;运行时间短;程序的编制、调试及排错所需时间短;结构清晰,易读、易于移植。按结构化程序设计思想,任何复杂程序都可由顺序结构、分支结构、循环结构等构成。如图1所示。一、顺序程序举例例1、设在外RAM的60H单元存有1个字节代码,要求将其分解成两个4位字段,高4位存入原单元的低4位,其低4位存入61H单元的低4位,且要求这两个单元的高4位均为0,试编制完整程序。解: 字节分解:核心指令 ANLORL 1000HMODE: MODE:MOV R0,#60HMOVX A,@R0MOV B,AANL A,#0F0HSWAP AMOVX @R0,AANL B,#0FHMOV A,BINC R0MOVX @R0,AEND二、分支结构与分支程序设计结构:根据不同的条件,进行相应的处理。通常用条件转移指令形成简单分支结构。如: 判(A) = Z 或 NZ ,转移判(CY)= 1 或 0 ,转移判(bit)=1 或 0 ,转移CJNE 比较不相等转移例3、设a存放在累加器A中,b存放在寄存器B中,要求按下式计算Y值,并将结果Y存于累加器A 中,试编写程序。解:本题关键是判a是正数,还是负数;由ACC7便知。ORG 1000HBR: JB ACC7,MINUSCLR CSUBB A,BSJMP DONEMINUS: ADD A,BDONE: SJMP $END例4、设有两个16位无符号数NA,NB分别存放在8031单片机内部RAM的40H、41H及50H、51H单元中,当NA > NB时,将内部RAM的42H单元清0;否则,将该单元置成全1,试编程。解法I:因为无16位数的比较指令,所以,只能用8位数的比较指令。(画出流程框图)ORG 2000HCMP: MOV A,50HCJNE A,40H,CMP1MOV A,51HCJNE A,41H,CMP1SJMP NHIGHECMP1: JC HIGHE 单片机 NHIGHE:MOV 42H,#0FFHSJMP DONEHIGHE: MOV 42H,#00HDONE: SJMP $END上述程序中多次用到SJMP语句,该语句为无条件转移语句。无条件语句应尽量少用,这样可使程序结构紧凑而易读,易理解。解法II:先假设NA > NB,再来判断是否NA ≤ NBORG 3000HCMP2: MOV R0,#00HMOV A,50HCJNE A,40H,CMP3MOV A,51HCJNE A,41H,CMP3SJMP NHIGHECMP3: JC HIGHENHIGHE:MOV R0,#0FFH ;不大于标志HIGHE: MOV 42H,R0SJMP $END循环结构不但使程序简练,而且大大节省存储空间。循环程序包含四部分:初始化部分循环处理部分(主体)循环控制部分(修改地址指针、修改变量、检测循环结束条件)循环结束部分(对结果分析、处理,存放结果)循环有:单循环、多重循环。循环次数已知,可用计数器控制循环次数;循环次数未知,按问题条件控制循环是否结束。一、单循环程序1、循环次数是已知的程序例1、已知片外RAM的10H单元存放8位二进制数,要求将其转移成相应的ASCII码,并以高位在前,低位在后的顺序,依次存放到片外RAM以11H为首地址的连续单元中,试编程。解:先将中间单元置成30H,然后判欲转换位是否为1,若是,则将中间单元内容加1;否则,中间单元内容保持不变。通过左移指令实现由高到低的顺序进行转换。ORG 1000HSTART: MOV R2,#08H;循环计数初值(循环次数已知)MOV R0,#10H;地址指针初值MOVX A,@R0 ;取数MOV B,A;暂存B中LOOP: MOV A,#30H ;将中间单元(A)置成30HJNB B.7,NA ;判断转换的二进制位为0否?;若是转NAINC A ;1的ASCII码“31H”NA: INC R0;修改地址指针MOVX @R0,A ;存放转换的结果MOV A,BRL A,B ;作好准备,判断下一位MOV B,A;暂存DJNZ R2,LOOP ;判断转换结束否?未完继续SJMP $END2)循环次数未知的程序例2、设用户用键盘输入长度不超过100字节的字符串放在8031单片机外部RAM以20H为首地址的连续单元,该字符串用回车符CR(‘CR’= 0DH)作为结束标志,要求统计此字符串的长度并存入内部RAM的1FH单元中。解:从首单元开始取数,每取一数判断其是否为‘CR’,是则结束。ORG 1000HSTADA height=151 src="/upload/hcom/20230612024207xuy4u1hxvbs.gif" width=364>内循环延时:(1 + 2 × CTR)T = 500us(假设)则CTR = 250实际延时:[1 + 2 × 250] × 1us = 501us外循环延时:T +(501 + 2T)× CTS = 100ms = 100 000us所以 , CTS = 198.8 取 199实际延时:[1 + (501 + 2)×199] = 1000.98ms例4、设在8031内部RAM中存一无符号数的数组,其长度为100,起始地址是30H,要求将它们从大到小排序,排序后仍存放在原区域中,试编者按程。这就是所畏的“冒泡法”。实际上大多情况,用不到99次循环,排序就结束。为了提高排序速度,程序中可设一交换标志位,如10H位,每次循环中:若有交换则 SETB 10H若无交换则 CLR 10H每次循环结束时,测10H位,判断排序是否结束。ORG 1000HMOV R0,#30HBUBBLE: MOV B,#64HCLR 10HDEC BMOV A,@R0 ;长度计数LOOP: MOV 20H,A ;暂存,为交换作准备INC R0MOV 21H,@R0CJNE A,21H,BUEU;若(20H)≠(21H)转移JNC BUNEXT ;(20H)≥(21H)转移BUEU: MOV A,@R0 ;若(20H)< (21H)则交换MOV @R0,20HDEC R0 ;使R0退格指向小地址MOV @R0,AINC R0 ;恢复R0指向大地址SETB 10H ;置交换标志DJNZ B,LOOPBUNEXT: JB 10H,BUBBLE ;判断标志位为1否?若为1,则继续END

本文原创来源:电气TV网,欢迎收藏本网址,收藏不迷路哦!

相关阅读

添加新评论