《第14章MCS51程序设计及实用子程序》由会员分享,可在线阅读,更多相关《第14章MCS51程序设计及实用子程序(47页珍藏版)》请在金锄头文库上搜索。
1、第十四章第十四章 MCS-51 MCS-51程序设计及实用子程序程序设计及实用子程序14.1 14.1 查表程序设计查表程序设计14.2 14.2 数据极值查找和数据排序数据极值查找和数据排序14.3 14.3 散转程序设计散转程序设计14.4 14.4 循环程序设计循环程序设计14.5 14.5 定点数运算程序设计定点数运算程序设计14.6 14.6 数据的拆拼数据的拆拼14.7 14.7 码制转换码制转换盟块桑麻汞汞孺假恍拟坝葫婶腺吝檬座荆五实佳爷仟将哗薯砒碟飞垫跪阶第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序14.1 查表程序设计 查表程序查表程序是一种常
2、用的非数值运算程序,应用广泛。是一种常用的非数值运算程序,应用广泛。方方法法:该该方方法法把把事事先先计计算算的的结结果果或或实实验验数数据据按按一一定定顺顺序序编编成成表表格格,存存于于程程序序存存储储器器内内,然然后后根根据据输输入入参参数数值值,从从表表中取得结果。中取得结果。用途:用途:n复杂代码转换显示复杂代码转换显示n数据补偿:传感器补偿数据补偿:传感器补偿n复杂函数计算:复杂函数计算:Y=SIN(X)Y=SIN(X)特特点点:具具有有程程序序简简单单、执执行行速速度度快快、精精度度高高等等优优点点,而而这这正是单片机在测控场合或智能化仪表中所需要的。正是单片机在测控场合或智能化仪
3、表中所需要的。熟钝炕阎呀肯诗接培祭斑驭仪芽萨质坊秒斟汀躬锥呸户池分啤恰元嘻烈瞩第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序一、以DPTR为基地址的查表程序 MOVCMOVCA A,A+DPTRA+DPTR操作步骤:操作步骤:n初初始始化化DPTR:将将表表格格的的首首地地址址放放入入DPTR中中,作为基地址。作为基地址。n初初始始化化A:A中中应应该该放放所所要要查查询询的的数数据据在在表表格格中中的顺序号。的顺序号。n执执行行结结果果:在在执执行行该该指指令令后后,A中中存存放放的的是是在在表表格中查到的数据。格中查到的数据。晋寂仍琼站出诉某搓埂推影涛羽骤其胆
4、再锦劣芭啥脏挤钦艳机恩伯谁舒冶第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序注意事项n在在查查询询表表格格时时,若若所所要要查查询询的的数数据据是是双双字字节节的的,则则在在初初始始化化A中中的的数数应应为为顺顺序序号号的的2倍倍,且且应应执执行行两次本指令。两次本指令。n对对于于单单字字节节表表格格而而言言,表表项项的的个个数数应应不不大大于于256个个,若大于若大于256时,则应适当修改时,则应适当修改DPTR的值。的值。n表表格格的的存存放放位位置置。表表格格可可以以设设在在64K程程存存的的任任何何位置。位置。蚊呜西业结傲芜海遁浩增帘札懦妇庸潘迷藻绵疼稼疹
5、镀愚症盟吼肇碎窟埃第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序二、以PC为基地址的查表指令 MOVC AMOVC A,A+PCA+PC操作步骤:操作步骤:n用传送指令把所查数据在表格中顺序号送入累加器用传送指令把所查数据在表格中顺序号送入累加器A;n使使用用ADDA,#data指指令令对对累累加加器器A进进行行修修正正,data值值由由下式确定:下式确定:data=数据表格首地址数据表格首地址PC当前值当前值实际上实际上data值等于查表指令和数据表格之间的字节数;值等于查表指令和数据表格之间的字节数;n执行指令完成查表,结果存放在执行指令完成查表,结果存放在A
6、中。中。矢抉煎镐萧妙舔席样些帅湿录蓟泌律阶亿监影叠牵拾院昏购玖抠枪浚厉副第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序注意事项n对对于于双双字字节节表表格格,其其处处理理方方法法与与以以DPTR为为基基地地址的情况相同。址的情况相同。n对于单字节表格而言,其项数应不大于对于单字节表格而言,其项数应不大于256。n对于双字节表格而言,其项数应不大于对于双字节表格而言,其项数应不大于128。戌锌枫词敦探琼供旬颊今唯奋染变护然铣邦副乓阴旺宫举斩臼塌揍翟挫渴第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序三、两种方式的比较nPC仅仅能能对对所所
7、谓谓本本地地表表格格操操作作,即即表表格格项项数数不不得得大大于于256,且且偏偏移移量量可可能能随随程程序序的的变变化化而而变变化化,计计算算较为麻烦,其优点是少用寄存器。较为麻烦,其优点是少用寄存器。nDPTR使使用用起起来来非非常常灵灵活活,表表项项数数不不受受限限制制,且且表表格可以放在格可以放在64K的任意地方。的任意地方。贿私挨病宅绊膀椒客炙惜什瑞富诉叉登权葫纯镊挤莉斋眶盾寅识淄瘫央脊第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序规则表规则表 X X的值为:的值为:0 0,1 1,2 2,3 3,n n Y Y的值为:的值为:y0,y1,y2,y3y0
8、,y1,y2,y3,ynyn y0,y1,y0,y1,。ynyn的的字字节节长长度度一一样样,这这种种表表格格比比较简单,可由较简单,可由y y值按顺序构成表格。值按顺序构成表格。查表方法:查表方法:MOVCMOVC A A,A+PCA+PCMOVCMOVC A A,A+DPTRA+DPTR四、表格形式仔替谅因锚汹挤墩刺浓敲枯涯垛燎林顾允酒诉辱室裔诺永棠援棕胆鸳副哩第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序 例例:设设有有一一个个巡巡回回检检测测报报警警装装置置,需需对对1616路路输输入入值值进进行行比比较,当每一路输入值等于或超过该路的报警值时,实现报警。
9、较,当每一路输入值等于或超过该路的报警值时,实现报警。 设设XiXi为为路路数数,查查表表时时XiXi按按0,1,2,15(i=15)0,1,2,15(i=15)取取数数,表表中中报报警警值值是是2 2字字节节数数,依依XiXi顺顺序序列列成成表表格格放放在在TABTAB中中。进进入入查查表表程程序序前前,路路数数XiXi放放在在R2R2中中,其其输输入入值值存存于于(R1R0)(R1R0)当当中中,查查表表结结果果放在放在(R4R3)(R4R3)中。若需报警,将中。若需报警,将P1.0P1.0口置口置1 1,否则清,否则清0 0。报警值的单元地址报警值的单元地址= =表格首地址表格首地址+
10、+(Xi*2Xi*2)度挛碍辕波撼究慎恶畸魁醇衔牢彝灰搬账妹锰舶虐妆节灰吕挪妆急艘倘回第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序查表程序清单(方法查表程序清单(方法查表程序清单(方法查表程序清单(方法1 1)TB1:TB1:MOVMOV A A, R2 R2ADDADD A A, R2 R2;AA路数路数Xi*2Xi*2MOVMOV R4 R4, A A;保存;保存ADDADD A A, #06H#06H;MOVCMOVC A A, A+PC A+PC;1 1XCHXCH A A, R4 R4;1 1ADDADD A A, #03H#03H;2 2MOVCMO
11、VC A A, A+PC A+PC ;1 1 MOVMOV R3 R3,A A;1 1RETRET;1 1TAB1:TAB1: DWDW05F0H05F0H,0E89H0E89H,0A695H0A695H,1EAAH 1EAAH DWDW0D9BH0D9BH,7F93H7F93H,0373H0373H,26D7H26D7HDWDW2710H2710H,9E3FH9E3FH,1A66H1A66H,22E3H22E3HDWDW1174H1174H,16EFH16EFH,33E4H33E4H,6CA0H6CA0H不速汗质拒镇紊五营禹纳颖闻酬锅缅去翻妨循凿旱半轮忘诲酉哇佬洋烦甘第14章MCS51程序设
12、计及实用子程序第14章MCS51程序设计及实用子程序查表程序清单(方法查表程序清单(方法查表程序清单(方法查表程序清单(方法2 2)ORGORG1000H1000HTB1:TB1:MOV DPTRMOV DPTR,#TAB1 #TAB1 ;DPTRDPTR表格首地址表格首地址MOVMOVA A, R2 R2ADDADDA A, R2 R2 ;A A路数路数Xi*2Xi*2MOV R4MOV R4,A AMOVCMOVCA A, A+DPTR A+DPTR ;取出高字节;取出高字节XCH R4XCH R4, A A ;R4 R4 高字节高字节 INC DPTR INC DPTRMOVCMOVCA
13、 A, A+DPTR A+DPTR ;取出低字节;取出低字节 MOVMOVR3R3,A A ;R3 R3 低字节低字节CLRCLRC CMOVMOVA A,R0R0 ;当前输入值与报警值比较;当前输入值与报警值比较SUBBSUBBA A,R3R3 ;低字节相减;低字节相减MOVMOVA A,R1R1SUBBSUBBA A,R4R4 ;高字节相减;高字节相减JNCJNCLOOPLOOP ;(C)=0(C)=0,转移,报警,转移,报警CLRCLRP1.0P1.0RETRET湘丰砍漓卷臃六假奠妨胞组替悼墅无愈痉宗俯脆宙兼兔药决郭穷闻综勃登第14章MCS51程序设计及实用子程序第14章MCS51程序设
14、计及实用子程序查表程序清单(方法查表程序清单(方法查表程序清单(方法查表程序清单(方法2 2)续)续)续)续LOOP:LOOP: SETB SETBP1.0P1.0RETRETORGORG2000H2000HTAB1:TAB1:DWDW05F0H05F0H,0E89H0E89H,0A695H0A695H,1EAAH1EAAHDWDW0D9BH0D9BH,7F93H7F93H,0373H0373H,26D7H26D7HDWDW2710H2710H,9E3FH9E3FH,1A66H1A66H,22E3H22E3HDWDW1174H1174H,16EFH16EFH,33E4H33E4H,6CA0H6
15、CA0H捕鞠屁刃签箍锥柠族伦秋励驹沦收薄旁失扛详麦籍坦岩樱始烧械腥担洽眩第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序14.2 数据极值查找和数据排序 定义:定义:数据极值查找就是在指定的数据区中找出最数据极值查找就是在指定的数据区中找出最大值或最小值。大值或最小值。方法:方法:比较交换法。比较交换法。数据极值查找数据极值查找例例: :从内存从内存BLOCKBLOCK单元开始有一个无符号数的数据块,单元开始有一个无符号数的数据块,块长度为块长度为LENLEN,试找出数据块中最大值,并存入,试找出数据块中最大值,并存入MAXMAX单元。单元。卜迫倦输头碟莹疑宜袄候刊
16、支娃葛搅邵遣隆绸婉比窗雾扑跟橙虏亚录并敏第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序ORG 2000HORG 2000HLEN DATA 20HLEN DATA 20HMAX DATA 22HMAX DATA 22HMOV MAXMOV MAX,#00H #00H ;MAXMAX单元清零单元清零MOV R0MOV R0,#BLOCK #BLOCK ;数据块首地址送;数据块首地址送R0R0LOOP:LOOP:MOVMOV A A,R0R0CJNECJNE A A,MAXMAX,NEXT1NEXT1;比较;比较NEXT1:NEXT1:JCJC NEXT NEXT ;
17、若;若(A)(MAX)(A)(MAX)(A)(MAX),交换,交换NEXT:NEXT:INCINC R0 R0DJNZDJNZ LEN LEN,LOOP LOOP ;若未完,转;若未完,转LOOPLOOPSJMPSJMP $ $ENDEND党广观圃鸿与掇尔孕惫设熏徽袜狞皱念愁盆极厘庐鳃络倔诌耳夏粳泪芋被第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序 数据排序数据排序例:例:编写无符号数排序程序。编写无符号数排序程序。 假假设设在在片片内内RAMRAM中中,起起始始地地址址为为40H40H的的1010个个单单元元中存放有中存放有1010个无符号数。试进行升序排序。个
18、无符号数。试进行升序排序。定定义义:数数据据排排序序是是将将指指定定数数据据区区中中的的数数据据按按升升序序或或降序排列。降序排列。方法:方法:冒泡排序法冒泡排序法解:解:R7R7:比较次数计数器,初始值为比较次数计数器,初始值为09H09H位地址位地址00H00H:数据互换的标志位数据互换的标志位 若若(00H) =0(00H) =0,无互换发生,排序完毕。,无互换发生,排序完毕。 (00H) =1 (00H) =1,有互换发生。,有互换发生。造脊冕竹景瞧腰膘槛抽饶憾灯涧旗袖井木倚简妹泅效抉据赚藻阂脓椽锦徽第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序程序流程图
19、碳俯建塔薪兜新廉入谢步坠疹养霞段佐蔑省家孔垂亥潭及骇兑萌践兑圭秆第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序ORG0400HSTART:MOVR0,#40H;数据区首址送;数据区首址送R0MOVR7,#09H;每次冒泡比较次数送;每次冒泡比较次数送R7CLR00H;互换标志位清零;互换标志位清零LOOP:MOVA,R0;取前数送;取前数送A中中MOV2BH,A;暂存到;暂存到2BH单元中单元中INCR0;修改地址指针;修改地址指针MOV2AH,R0;取后数暂存到;取后数暂存到2AH单元中单元中CLRC;清;清CYSUBBA,R0;前数减后数;前数减后数JCNEX
20、T;前数小于后数,则转移;前数小于后数,则转移(不互换不互换)MOVR0,2BH;前数大于后数,两数交换;前数大于后数,两数交换DECR0MOVR0,2AHINCR0;地址加;地址加1,准备下一次比较,准备下一次比较SETB00H;置互换标志;置互换标志NEXT:DJNZR7,LOOP;未比较完,进行下一次比较;未比较完,进行下一次比较JB00H,START;有交换,表示未排完序,进行下一轮冒泡;有交换,表示未排完序,进行下一轮冒泡END;无交换,表示已排好序,结束;无交换,表示已排好序,结束邪涣抢蜡辐仰会牧待价盎窃扁氯拒冈顺缴诗盯码玫呆赤颧泅迫貉擎俭隐性第14章MCS51程序设计及实用子程序
21、第14章MCS51程序设计及实用子程序14.3 散转(多分支)程序设计 散散转转程程序序是是一一种种多多分分支支选选择择程程序序。它它根根据据某某种种输输入入或或运运算算结结果果,分分别别转转向向各各个个处处理理程程序序。在在MCS-51单单片片机机中中,散散转转指指令令为为JMPA+DPTR,它它按按照照程序运行时决定的地址执行间接转移指令。程序运行时决定的地址执行间接转移指令。操作步骤:操作步骤: (1) (1)将将转移表首地址转移表首地址送入送入DPTRDPTR作为基地址。作为基地址。 (2)(2)将将条条件件标标志志单单元元内内容容装装入入A A中中作作为为变变址址,在在装装入前,还应
22、根据转移表项内容作相应变化。入前,还应根据转移表项内容作相应变化。 (3) (3)实现实现程序转移程序转移。掂跪屹泌录游峰棒蹿溶报继哩配鸯惠控醋叙俱宿润伞缸蘸儡抵忙捐狸茶芜第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序根据根据转移表转移表的不同可以分为三种散转程序:的不同可以分为三种散转程序:一、使用转移指令表的散转程序一、使用转移指令表的散转程序1.应用场合应用场合根根据据标标志志单单元元的的内内容容是是0,1,n,分分别别转转向向处处理理程程序序0,处处理程序理程序1,处理程序处理程序n。2.实现方法实现方法n用用直直接接转转移移指指令令(AJMP或或LJMP
23、指指令令)组组成成一一个个转转移移表表,然然后后把把标标志志单单元元的的内内容容读读入入累累加加器器A,转转移移表表首首地地址址放放入入DPTR中,再利用指令中,再利用指令JMPA+DPTR实现散转。实现散转。n散转点超过散转点超过256时,对时,对DPTR进行修正。进行修正。案蹿壬彻滚漳律阉寅现哭撵触弗磷渗御夷于窒矾慷色蛆渣宅殖幻徒恼福堰第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序例:例:要求根据寄存器要求根据寄存器R7的内容转向各个处理程序。的内容转向各个处理程序。 即(即(R7R7)=0=0,转向,转向PRG0PRG0 即(即(R7R7)=1=1,转向,转
24、向PRG1PRG1 即(即(R7R7)=2=2,转向,转向PRG2PRG2 即(即(R7R7)=n=n,转向,转向PRGnPRGnR7=?0处处理理一一处处理理二二处处理理1n孩糜铺聘准慷夯服潞堤室肘市韶称喊煎众搔克类颠啸程笛代用版搽姚邀敦第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序程序清单程序清单JUMP1: MOVJUMP1: MOV DPTR DPTR,#JPTAB1#JPTAB1 MOV A MOV A,R7R7 ADD ADD A A,R7R7;AA(R7)*2(R7)*2 JNC JNC NADD NADD;判断是否有进位;判断是否有进位 INC I
25、NC DPH DPH;有进位则加到高字节地址;有进位则加到高字节地址NADD:NADD: JMPJMP A+DPTR A+DPTRJPTAB1: AJMP PRG0JPTAB1: AJMP PRG0 AJMP PRG1 AJMP PRG1 AJMP PRGn AJMP PRGn贝杂贾厩余秉拷亿蜡伦豢胡潭骑房仁庞哨嫡墩垛捕激借怨舍淖汇怔些耙拐第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序注意事项注意事项(1 1)在在上上例例中中,由由于于AJMPAJMP指指令令的的指指令令长长度度为为2 2个个字字节节,因因而而在在散散转转时时采采用用自自加加的的方方法法使使变变址
26、址实实现现乘乘2 2;若若改改用用LJMPLJMP指指令令,由由于于其其指指令令长长度度为为3 3字字节节,因因而而应应使使变变址址乘乘3 3来来修正。当修正产生进位时,要将修正。当修正产生进位时,要将进位加到进位加到DPHDPH中中。(2 2)由由于于使使用用了了AJMPAJMP指指令令,PRG0PRG0、PRG1PRG1、等等处处理理程程序序的的入口与相应的入口与相应的AJMPAJMP指令必须在同一个指令必须在同一个2K2K范围范围内。内。(3 3)由由于于R7R7是是单单字字节节,因因而而散散转转点点不不能能大大于于256256个个。为为了了克克服此局限性,可通过服此局限性,可通过修改修
27、改DPTRDPTR的办法的办法来增加散转点。来增加散转点。操榴矢埋磅蕾亥舍屿憎锁怔棍顺挺栖滦朵俏尺想寿夺留辑复染椰氏孺坪殆第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序二、使用地址偏移量表的散转程序二、使用地址偏移量表的散转程序1.1.应用场合应用场合 转转向向的的程程序序均均在在同同一一页页(256256字字节节),即即转转移移表表的的大小与各个处理程序的总长度必须小于大小与各个处理程序的总长度必须小于256256字节。字节。2.2.实现方法实现方法n利利用用指指令令JMPA+DPTR与与伪伪指指令令DB汇汇编编时时的的计算功能实现散转。计算功能实现散转。n本本
28、方方法法的的关关键键在在于于建建立立一一个个转转向向地地址址偏偏移移量量表表(各处理程序首地址各处理程序首地址与与表格首地址表格首地址之间偏移量之间偏移量)。诫佃吟撑谈呆豪现秒迂蚜隘丧暴恿骋叔好裴芭鳖妹俘铱胎宏恳楚淆淀英拿第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序例:例:要求按要求按R7R7的内容转向的内容转向5 5个处理程序。个处理程序。JUMP3:JUMP3:MOVMOVA A,R7R7MOVMOVDPTRDPTR,#TAB3#TAB3MOVC AMOVC A,A+DPTRA+DPTRJMPJMPA+DPTRA+DPTRTAB3:TAB3:DBDBPRG0
29、-TAB3PRG0-TAB3DBDBPRG1-TAB3PRG1-TAB3 DBDBPRG4-TAB3PRG4-TAB3PRG0:PRG0:PRG1:PRG1:PRG2:PRG2: 本例的散转范围小于本例的散转范围小于256256,同上例一样,本例也可通过,同上例一样,本例也可通过变通的方法,使这能在变通的方法,使这能在64K64K范围内实现散转。范围内实现散转。隶矛装寻避肘萝两郡租坎昌泛哀或痛先芹孰滑乍告酷贷楔膳胀戏孜珍惰也第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序三、使用转向地址表的散转程序三、使用转向地址表的散转程序1.1.应用场合应用场合 转向范围较大时
30、。转向范围较大时。2.2.实现方法实现方法 建建立立转转向向地地址址表表,它它的的表表项项为为各各个个处处理理程程序序的的入入口口地地址址。散散转转时时使使用用查查表表指指令令,按按某某个个单单元元的的内内容容查查表表找找到到对对应应的的转转向向地地址址,把把它它装装入入DPTR中中,然然后后对对累累加加器器A清清零零,再再利利用指令用指令JMPA+DPTR直接转向各个处理程序。直接转向各个处理程序。 例:例:根据寄存器根据寄存器R7R7的内容转向相应的处理程序中去,的内容转向相应的处理程序中去,设各处理程序入口地址分别为设各处理程序入口地址分别为PRG0PRG0,PRG1PRG1,PRGnP
31、RGn渔驭表勺悟芯挚切顶沟嘎唤嚷莎艺职袱演围铡力骚饰哼匀篇霓钟纶吝肺坛第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序 MOV MOVDPTRDPTR,#TAB4#TAB4;指向地址表;指向地址表MOVMOVA A,R7R7ADDADDA A,R7R7;A(R7*2)A(R7*2)JNCJNCNADDNADDINCINCDPHDPH;若;若(R7*2)256(R7*2)256,则加进位,则加进位NADD: MOVNADD: MOVR3R3,A AMOVCMOVCA A,A+DPTRA+DPTR;查转移地址高;查转移地址高8 8位位XCHXCHA A,R3R3INCI
32、NCA AMOVCMOVCA A,A+DPTRA+DPTR;查转移地址低;查转移地址低8 8位位MOVMOVDPLDPL,A AMOVMOVDPHDPH,R3R3;将转移地址赋给;将转移地址赋给DPTRDPTRCLRCLRA AJMPJMPA+DPTRA+DPTR;实现散转;实现散转程序清单程序清单虞带铭桐捶席痛僧雏顾醉稍辰矾珊喧旧盯纠符送坠异泄谆嵌构筏滓也现吗第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序TAB4:TAB4:DWDWPRG0PRG0;低位字节在高地址;低位字节在高地址DWDWPRG1PRG1DWDWPRG2PRG2 DWDWPRGnPRGn程序清
33、单程序清单( (续续) ) 本本例例的的散散转转范范围围为为64K64K,但但散散转转数数n n应应小小于于256 256 (R7(R7为为8 8位位) )。可可以以通通过过双双字字节节加加法法运运算算修修改改DPTRDPTR的的方方法法来来使使散散转转点点大大于于256256个。个。令薪臂午匣窝夷嘶闽防素泰弓绊摸番爱靴孜孤念聋绵钝又蓑楷娥翠蝉曲宏第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序四、利用四、利用“RETRET”指令实现的散转程序指令实现的散转程序本本方方法法的的关关键键在在于于将将处处理理子子程程序序的的目目的的地地址址压压入入椎椎栈栈,然然后后通通
34、过过“RET”指指令令来来将将目目的的地地址址弹弹出出到到PC中中,从从而而实实现现程程序序转转移移。即即利利用用RET指指令令来来代替两个代替两个POP指令。指令。例例:要要求求根根据据R7的的内内容容转转向向各各处处处处理理程程序序,设设各各处处理理程程序序的的转转向向地地址址分分别别为为PRG0,PRG1,PRGn齿逆跑积祟序电窃制征伎王住蘸量沃七荫飞掣汇分技堂囱沾傲麻再我恕坡第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序 JUMP5: JUMP5:MOVMOVDPTRDPTR,#TAB5#TAB5MOVMOVA A,R7R7ADDADDA A,R7R7;
35、A(R7*2) A(R7*2) JNCJNCNADDNADDINCINCDPHDPH NADD: NADD:MOVMOVR3R3,A AMOVCMOVCA A,A+DPTRA+DPTR;查高位地址;查高位地址XCHXCHA A,R3R3INCINCA AMOVCMOVCA A,A+DPTRA+DPTRPUSHPUSHACCACC;低位地址;低位地址PUSHPUSH03H03H;PUSHPUSH R3R3高位地址高位地址RETRET;转向地址;转向地址PCPC,转移,转移TAB5:TAB5:DWDWPRG0PRG0;转移地址表;转移地址表DWDWPRG1PRG1DWDWPRGnPRGn程序清单程
36、序清单哺纪渔居坚少弹轻贾恩空糯藩罩酥坪额摩状门灯岳舔设唉腑臆中酞魂响义第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序14.4 循环程序设计 n包含多次重复执行的程序段,循环结构使程序紧凑包含多次重复执行的程序段,循环结构使程序紧凑。 n循环程序的构成循环程序的构成及各个环节任务:及各个环节任务:初始化部分初始化部分 循环准备工作。如:清结果单元、循环准备工作。如:清结果单元、 设指针、设循环控制变量初值等设指针、设循环控制变量初值等循环体循环体 循环工作部分:需多次重复处理循环工作部分:需多次重复处理 的工作的工作 循环控制部分:循环控制部分: 1. 1.修改指针
37、和循环控制变量。修改指针和循环控制变量。 2. 2.检测循环条件:满足循环条件,继续循环,否则退出循环。检测循环条件:满足循环条件,继续循环,否则退出循环。结束部分结束部分 处理和保存循环结果。处理和保存循环结果。循环控制 ?循环工作循环结束循环初始化 Y YN N德戮捎台宠巍蚀镁虏期饺姥摇襟浙橇疟仿谰赐井博寅严赛稼狗裤争淋奉得第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序单重循环:循环体中不套循环。 例例:求求n n个个单单字字节节数数据据的的累累加加,设设数数据据串串已已在在43H43H起起始始单单元,数据串长度在元,数据串长度在42H42H单元,累加和不超过
38、单元,累加和不超过2 2个字节。个字节。SUMSUM: MOVMOVR0R0,#42H #42H ;设地址指针;设地址指针MOVMOVA A,R0R0MOVMOVR7R7,A A ;循环计数器;循环计数器nnCLRCLRA A ;结果单元清;结果单元清0 0MOVMOVR3R3,A AADD1ADD1:INCINCR0R0 ;修改指针;修改指针ADDADDA A,R0 R0 ;累加;累加JNC NEXTJNC NEXT ;处理进位;处理进位INCINCR3R3 ;有进位,高字节加;有进位,高字节加1 1NEXT:NEXT: DJNZ DJNZ R7,ADD1 R7,ADD1 ;循环控制:数据是
39、否加完?;循环控制:数据是否加完?MOVMOV40H40H,A A ;循环结束,保存结果;循环结束,保存结果MOVMOV41H41H,R3R3RETRET鞍绰钒平损膳适眩傀屏搅止砚煌渠防馆沛告凋霉会粱腮碟撑毖崔革奈营提第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序多重循环:多重循环:循环体中套循环结构。循环体中套循环结构。内循环控制内循环控制?循环工作循环工作循环结束循环结束外循环控制外循环控制?内循环初始化内循环初始化开始开始外循环初始化外循环初始化例:例:延时程序设计延时程序设计DELAYDELAY:MOVMOVR7R7,#200 #200 ;1 1个机器周期
40、个机器周期DE1DE1:MOVMOVR6R6,#123 #123 ;1 1200200NOPNOP ;1 1200200DE2DE2:DJNZDJNZR6R6,DE2 DE2 ;2 2123123200200DJNZDJNZR7R7,DE1 DE1 ;2 2200200RETRET ;2 2如晶体振荡器频率为如晶体振荡器频率为12MHz12MHz,则其,则其延时时间延时时间为:为:1+(1+1+21+(1+1+2123+2)123+2)200+2=50.003ms200+2=50.003ms这是一个这是一个50ms50ms的精确延时程序。的精确延时程序。敦敢成半蜗疲肄州峰匡尘诞晒侵拼模棘纲慰够
41、巴磅支惮拔券舌伙搂语阉拐第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序14.5 运算程序设计 一、多字节加法一、多字节加法例例:设设有有两两个个4 4字字节节的的二二进进制制数数2F5BA7C3H2F5BA7C3H和和14DF35B8H14DF35B8H,分分别别放放在在以以40H40H和和50H50H为为起起始始地地址址的的单单元元中中(低低位位在在低低地地址址),试编程求这个数之和,结果放在以试编程求这个数之和,结果放在以40H40H为起始地址的单元中。为起始地址的单元中。ORGORG0000H0000HLJMPLJMPMAINMAINORGORG0100H0
42、100HMAIN:MAIN: MOV R0 MOV R0,#40H#40HMOVMOVR1R1,#50H#50HMOVMOVR7R7,#04H#04HLCALL JASUBLCALL JASUBLJMPLJMP$ $ 以上为主程序以上为主程序JASUBJASUB: CLR CLR C CJASUB1JASUB1:MOVMOV A A,R0R0 ADDC AADDC A,R1R1 MOV MOV R0,A R0,A INC INC R0 R0 INC INC R1 R1 DJNZ R7,JASUB1 DJNZ R7,JASUB1 RET RET END ENDADDCADDCA A,RnRnAD
43、DCADDCA A,directdirectADDCADDCA A,RiRiADDCADDCA A,#data#data捕鲜剖晴纵淬幕供铁誊渔君退蝴磋匪奔惩门稚瘤贱芦逃筏嫁淮稻异太汾纱第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序多字节多字节BCDBCD码加法码加法 与多字节加法程序类似,但需在加法指令后加一条与多字节加法程序类似,但需在加法指令后加一条十进制加法调整十进制加法调整指令。指令。主程序与前面相同。主程序与前面相同。DADD: CLRDADD: CLRC CJAD1:JAD1: MOVMOVA A,R0R0ADDCADDCA A,R1R1DADAA A
44、MOVMOVR0R0,A AINCINCR0R0INCINCR1R1DJNZDJNZR7R7,JAD1JAD1RETRETORGORG0000H0000HLJMPLJMPMAINMAINORGORG0100H0100HMAINMAIN: MOV MOVR0R0,#40H#40HMOVMOVR1R1,#50H#50HMOVMOVR7R7,#04H#04HLCALL DADDLCALL DADDLJMPLJMP$ $ 以上为主程序以上为主程序妮硕风瓤缀俘寥炮弯唯烈讹惰揉署癸华马镣剿俐省爱邮邯就以吸灭采跌十第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序二、多字节减法二、
45、多字节减法 多字节减法程序和多字节加法程序类似,只需将加法指令多字节减法程序和多字节加法程序类似,只需将加法指令换为换为减法指令减法指令即可。即可。例:例:在在43H40H依次存放被减数依次存放被减数443ADD7BH;在;在53H50H中中依次存放减数依次存放减数14DF35B8H,试编程求二者之差。,试编程求二者之差。ORGORG0000H0000HLJMPLJMPMAINMAINORGORG0100H0100HMAINMAIN:MOVMOVR0R0,#40H#40HMOVMOVR1R1,#50H#50HMOVMOVR7R7,#04H#04HLCALL JIANSUBLCALL JIANS
46、UBLJMPLJMP$ $ 以上为主程序以上为主程序JIANSUBJIANSUB: CLR CLRC CJIAN1JIAN1: MOV MOVA A,R0R0 SUBBSUBBA A,R1R1 MOV MOVR0R0,A A INC INCR0R0 INC INCR1R1 DJNZ R7 DJNZ R7,JIAN1JIAN1 RET RET END END 此程序也可以推广到此程序也可以推广到N N个字节个字节的情况。的情况。甭炭咒泛揪仕爷小野乐瞄揍轿截丽枷窖洲林谜冤从泳忱宝汽浓屎奎滋控姨第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序14.6 数据的拆拼BBCD:
47、MOVBBCD:MOVA A,R0R0 ANL ANLA A,#0FH#0FH MOV MOVR5R5,A A MOV MOVA A,R0R0ANLANLA A,#0F0H#0F0HSWAPSWAPA AMOVMOVR6R6,A ARETRET例:例:转换前转换前R0中为压缩中为压缩BCD码码XY程序清单:程序清单:0Y0X转换后转换后R6R5中为非压缩中为非压缩BCD码码倔贬洛侦榷焊下括蔽迢堰雄育坞康刨菠批边寇瘫拟垄筒剩柴放外踩形之琅第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序14.7 码制转换 在在计计算算机机内内部部,任任何何数数据据都都是是以以二二进进制
48、制的的形形式式存存储储,但但是是,当当我我们们在在作作I/OI/O操操作作时时,往往往往需需要要其其它它形形式式的的数数据据格格式式,如如ASCIIASCII码码、BCDBCD码码、八八进进制制数数等等,这这就就需要做一些数据格式的互换操作。需要做一些数据格式的互换操作。一、一、ASCII码与二进制数的相互转换码与二进制数的相互转换二进制与二进制与ASCIIASCII码的相互关系为:码的相互关系为:数字数字0 09 9对应的对应的ASCIIASCII码为码为30H30H39H39H,即加,即加30H30H字母字母A AF F对应的对应的ASCIIASCII码为码为41H41H46H46H,即加
49、,即加37H37H(1)ASCII(1)ASCII到二进制的转换到二进制的转换通过以上介绍的二者之间的关系,不难画出流程图:通过以上介绍的二者之间的关系,不难画出流程图:示叮冤休意药埠颜忱架与笺朋拍皋啄咆艾底宝邓爬剩区苞吭唯象八茫剖莱第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序开始开始取操作数取操作数清进位标志清进位标志减减30H差差9?转换正确转换正确结束结束减减07HY转换正确转换正确NASCTOHEX:ASCTOHEX:MOVMOVA A,R2R2CLRCLRC CSUBBSUBBA A,#30H#30HCJNECJNEA A,#0AH#0AH,NEXTN
50、EXTNEXT:NEXT: JCJCTOKTOKSUBBSUBBA A,#07H#07HTOK:TOK:MOVMOVR2R2,A ARETRET例:例:转换前转换前R2R2为为ASCIIASCII码码, ,转换后转换后R2R2为二进制。为二进制。趟磐恒裂己檬狐毕毁竞菏赏挟脆尝免崩鹊毛式聂剐橇趣俐旺朝蘸学诗氰良第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序(2)(2)二进制到二进制到ASCIIASCII码码HEXTOASCII:HEXTOASCII:MOVMOVA A,R2R2ANLANLA A,#0FH #0FH ;取低四位的二进制码;取低四位的二进制码ADDAD
51、DA A,#90H#90HDADAA A ;若;若(R2)9(R2)9,则加,则加66H66H,且产生,且产生CyCyADDCADDCA A,#40H#40HDADAA AMOVMOVR2R2,A ARETRET例:例:转换前转换前R2R2为二进制,转换后为二进制,转换后R2R2为为ASCIIASCII码。码。 当二进制数当二进制数0AH0AH时时, ,加加30H30H即得相应的即得相应的ASCIIASCII,当二进,当二进制数介于制数介于0AH0AH、0FH0FH之间(包括之间(包括0AH0AH、0FH0FH),则加),则加37H37H即得即得到相应的到相应的ASCIIASCII。下例为另一
52、算法。下例为另一算法。9040+130906611374060戊励筋氨咋文番犹浓酣河润苛咳琳惕满完锗素子阿恐炽返茄昧岸酚拧霖兔第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序例:例:8 8位二进制转换成位二进制转换成BCDBCD码。码。BINBCD1: MOV BBINBCD1: MOV B,#100#100 DIV AB DIV AB;(A)=(A)=百位数百位数 MOV R0 MOV R0,A A INC R0 INC R0 MOV A MOV A,#10 #10 XCH A XCH A,B B DIV AB DIV AB;(A)=(A)=十位数,十位数,(B)
53、=(B)=个位数个位数 MOV R0 MOV R0,A A INC R0 INC R0 XCH A XCH A,B B MOV R0 MOV R0,A A RET RET程序名:程序名:BINBCD1功能:功能: 0FFH内的二进制数转换为内的二进制数转换为BCD码码入口:入口: A存要转换的二进制数存要转换的二进制数出口出口: R0存放存放BCD数数 百、十、个位数的地址百、十、个位数的地址二、二进制数到二、二进制数到BCD码的转换码的转换肃锋刑材厂忿但厄关得哆泪拣于吟手苇祖选坎纵维法披郭姑挨福盒龙鞘谋第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序子程序设计子程
54、序设计1.子程序入口用标号作为子程序入口用标号作为子程序名子程序名;2.调调用用子子程程序序之之前前设设置置好好堆堆栈栈,子子程程序序嵌套须考虑嵌套须考虑堆栈容量堆栈容量;3.提提供供足足够够的的调调用用信信息息,如如:子子程程序序名名、入口参数和出口参数等;入口参数和出口参数等;4.用用返返回回指指令令RET结结束束子子程程序序,并并保保证证堆栈栈顶为调用程序的返回地址。堆栈栈顶为调用程序的返回地址。补充:子程序设计屹吐究挝赔稽抹黎艳自降碳禄赃皖搔括疼倡早疗捷坤了汕崎矢摧由莹廓弯第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序子程序调用时的参数传递子程序调用时的参
55、数传递入口参数:入口参数:调用子程序之前,需要传给子程序的参数。调用子程序之前,需要传给子程序的参数。出口参数:出口参数:子程序送回调用程序的结果参数。子程序送回调用程序的结果参数。参数传递方式:参数传递方式: 1.寄存器寄存器传送参数传送参数2.堆栈堆栈传送参数传送参数设计子程序应满足设计子程序应满足通用性通用性的要求,不针对具体数据编程。的要求,不针对具体数据编程。浸苑揩膨酷炽馁妙横苟壮韩招桥滇镀艳似娠姬虽挫壕特蹭玩叫凯挽俭漠外第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序1. 1. 通过寄存器传递参数通过寄存器传递参数 这这种种方方法法应应用用最最为为广广泛
56、泛、也也最最易易使使用用,它它是是在在调调用用子子程程序序之之前前,对对需需要要使使用用的的寄寄存存器器预预先修改后,再来调用子程序。先修改后,再来调用子程序。尼荫冤渡景藕程臆稀角秩怖赫署攀圃灼徽榴墅沤坎脂惫者承锌酮捎锹览喻第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序例:例:试编程对试编程对30H39H单元清零单元清零MAIN:MAIN: MOV MOV R0 R0,#30H#30H MOV MOV R7 R7,#0AH#0AH LCALL SUBRT LCALL SUBRT SUBRT: MOVSUBRT: MOV A A,#00H#00HRESU:RESU:
57、 MOV MOV R0 R0,A A INC INC R0 R0 DJNZ R7 DJNZ R7,RESURESU RET RET叁晦方辐侥逸彬井那域溅娃瞬增壕诺捞屈雅齿冒渡陋查端癣粒窃很座炕剩第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序二、通过椎栈传递参数二、通过椎栈传递参数MAIN:MAIN: MOVMOV70H70H,#30H#30HMOVMOV71H71H,#0AH#0AHPUSHPUSH70H70HPUSHPUSH71H71HLCALLLCALL SUBRTSUBRTSUBRT:POPSUBRT:POPDPHDPHPOPPOPDPLDPLPOPPOP0
58、7H 07H ;R7R7POPPOP00H 00H ;R0R0SUB1:SUB1: MOVMOVA A,#00H#00H LOOP:LOOP: MOVMOVR0R0,A AINCINCR0R0DJNZDJNZR7R7,LOOPLOOPPUSHPUSHDPLDPLPUSHPUSHDPHDPHRETRET 对对于于简简单单程程序序而而言言,这这种种方方法法反反而而较较笨笨,较较易引起混淆。易引起混淆。例:例:试编程对试编程对30H39H单元清零单元清零演棺慌棘几勘泳纷疮挽乱纹婴檀扩撼卯软游瞄跺顺善戍疗拥膨平翌斯湿潭第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序n查表程
59、序设计,注意表格的设计:规则变量表和非查表程序设计,注意表格的设计:规则变量表和非 规则变量表;规则变量表;n数据极值查找和数据排序;数据极值查找和数据排序;n散转程序设计:三种转移表的设计及转移范围;散转程序设计:三种转移表的设计及转移范围;n循环程序设计;循环程序设计;n定点数运算程序设计;定点数运算程序设计;n码制转换;码制转换;n子程序设计:参数传递的两种方法。子程序设计:参数传递的两种方法。本章总结本章总结扣英磁狈跟课院枚槛诀私棋喳目迫扔敦驼酚疡浴顶舒叠俺蔬藏末帛疮鱼赎第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序本本 章章 结结 束束妆绥棠塑他舒炎挝筷巍弗售墙榨系触巴甘条恭谈抛割录泊音戒傍钮肚凛烟第14章MCS51程序设计及实用子程序第14章MCS51程序设计及实用子程序