《第14章MCS51程序设计及实用子程序.ppt》由会员分享,可在线阅读,更多相关《第14章MCS51程序设计及实用子程序.ppt(47页珍藏版)》请在优知文库上搜索。
1、第十四章第十四章 MCS-51MCS-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.1 查表程序设计 查表程序查表程序是一种常用的非数值运算程序,应用广泛。是一种常用的非数值运算程序,应用广泛。方法:方法:该方法把事先计算的结果或实验数据按一定顺序编该方法把事先计算的
2、结果或实验数据按一定顺序编成表格,存于程序存储器内,然后根据输入参数值,从表成表格,存于程序存储器内,然后根据输入参数值,从表中取得结果。中取得结果。用途:用途:n复杂代码转换显示复杂代码转换显示n数据补偿:传感器补偿数据补偿:传感器补偿n复杂函数计算:复杂函数计算:Y=SIN(X)Y=SIN(X)特点:特点:具有具有程序简单、执行速度快、精度高程序简单、执行速度快、精度高等优点,而这等优点,而这正是单片机在测控场合或智能化仪表中所需要的。正是单片机在测控场合或智能化仪表中所需要的。一、以DPTR为基地址的查表程序 MOVCMOVCA A,A+DPTRA+DPTR操作步骤:操作步骤:n初始化初
3、始化DPTR:将表格的首地址放入将表格的首地址放入DPTR中,中,作为基地址。作为基地址。n初始化初始化A:A中应该放所要查询的数据在表格中中应该放所要查询的数据在表格中的顺序号。的顺序号。n执行结果执行结果:在执行该指令后,在执行该指令后,A中存放的是在表中存放的是在表格中查到的数据。格中查到的数据。n在查询表格时,若所要查询的数据是在查询表格时,若所要查询的数据是双字节双字节的,的,则在初始化则在初始化A中的数应为顺序号的中的数应为顺序号的2倍,且应执行倍,且应执行两次本指令。两次本指令。n对于单字节表格而言,表项的个数应不大于对于单字节表格而言,表项的个数应不大于256个,个,若大于若大
4、于256时,则应适当修改时,则应适当修改DPTR的值。的值。n表格的存放位置。表格可以设在表格的存放位置。表格可以设在64K程存的任何程存的任何位置。位置。二、以PC为基地址的查表指令 MOVC AMOVC A,A+PCA+PC操作步骤:操作步骤:n用传送指令把所查数据在表格中顺序号送入累加器用传送指令把所查数据在表格中顺序号送入累加器A;n使用使用ADD A,#data指令对累加器指令对累加器A进行修正,进行修正,data值由值由下式确定:下式确定:data=数据表格首地址数据表格首地址PC当前值当前值 实际上实际上data值等于查表指令和数据表格之间的字节数;值等于查表指令和数据表格之间的
5、字节数;n执行指令完成查表,结果存放在执行指令完成查表,结果存放在A中。中。n对于双字节表格,其处理方法与以对于双字节表格,其处理方法与以DPTR为基地为基地址的情况相同。址的情况相同。n对于单字节表格而言,其项数应不大于对于单字节表格而言,其项数应不大于256。n对于双字节表格而言,其项数应不大于对于双字节表格而言,其项数应不大于128。三、两种方式的比较nPC仅能对所谓本地表格操作,即表格项数不得大仅能对所谓本地表格操作,即表格项数不得大于于256,且偏移量可能随程序的变化而变化,计算,且偏移量可能随程序的变化而变化,计算较为麻烦,其优点是少用寄存器。较为麻烦,其优点是少用寄存器。nDPT
6、R使用起来非常灵活,表项数不受限制,且表使用起来非常灵活,表项数不受限制,且表格可以放在格可以放在64K的任意地方。的任意地方。规则表规则表 X X的值为:的值为:0 0,1 1,2 2,3 3,n n Y Y的值为:的值为:y0,y1,y2,y3y0,y1,y2,y3,ynyn y0,y1,y0,y1,。ynyn的字节长度一样,这种表格比的字节长度一样,这种表格比较简单,可由较简单,可由y y值按顺序构成表格。值按顺序构成表格。查表方法:查表方法:MOVCMOVC A A,A+PCA+PCMOVCMOVC A A,A+DPTRA+DPTR四、表格形式 例:例:设有一个巡回检测报警装置,需对设
7、有一个巡回检测报警装置,需对1616路输入值进行比路输入值进行比较,当每一路输入值等于或超过该路的报警值时,实现报警。较,当每一路输入值等于或超过该路的报警值时,实现报警。设设XiXi为路数,查表时为路数,查表时XiXi按按0,1,2,0,1,2,15(i=15),15(i=15)取数,表中取数,表中报警值是报警值是2 2字节数,依字节数,依XiXi顺序列成表格放在顺序列成表格放在TABTAB中。进入查表程中。进入查表程序前,路数序前,路数XiXi放在放在R2R2中,其输入值存于中,其输入值存于(R1R0)(R1R0)当中,查表结果当中,查表结果放在放在(R4R3)(R4R3)中。若需报警,将
8、中。若需报警,将P1.0P1.0口置口置1 1,否则清,否则清0 0。报警值的单元地址报警值的单元地址=表格首地址表格首地址+(XiXi*2 2)TB1:TB1:MOVMOV A A,R2R2ADDADD A A,R2R2;A A路数路数XiXi*2 2MOVMOV R4 R4,A A;保存;保存ADDADD A A,#06H#06H;MOVCMOVC A A,A+PCA+PC;1 1XCHXCH A A,R4R4;1 1ADDADD A A,#03H#03H;2 2MOVCMOVC A A,A+PC A+PC;1 1 MOVMOV R3 R3,A A;1 1RETRET;1 1TAB1:TA
9、B1:DWDW05F0H05F0H,0E89H0E89H,0A695H0A695H,1EAAH 1EAAH DWDW0D9BH0D9BH,7F93H7F93H,0373H0373H,26D7H26D7HDWDW2710H2710H,9E3FH9E3FH,1A66H1A66H,22E3H22E3HDWDW1174H1174H,16EFH16EFH,33E4H33E4H,6CA0H6CA0HORGORG1000H1000HTB1:TB1:MOV DPTRMOV DPTR,#TAB1#TAB1 ;DPTRDPTR表格首地址表格首地址MOVMOVA A,R2R2ADDADDA A,R2R2 ;A A路
10、数路数XiXi*2 2MOV R4MOV R4,A AMOVCMOVCA A,A+DPTRA+DPTR ;取出高字节;取出高字节XCH R4XCH R4,A A ;R4 R4 高字节高字节 INC DPTRINC DPTRMOVCMOVCA A,A+DPTR A+DPTR ;取出低字节;取出低字节 MOVMOVR3R3,A A ;R3 R3 低字节低字节CLRCLRC CMOVMOVA A,R0R0 ;当前输入值与报警值比较;当前输入值与报警值比较SUBBSUBBA A,R3R3 ;低字节相减;低字节相减MOVMOVA A,R1R1SUBBSUBBA A,R4R4 ;高字节相减;高字节相减JN
11、CJNCLOOPLOOP ;(C)=0(C)=0,转移,报警,转移,报警CLRCLRP1.0P1.0RETRETLOOP:LOOP:SETB SETBP1.0P1.0RETRETORGORG2000H2000HTAB1:TAB1:DWDW05F0H05F0H,0E89H0E89H,0A695H0A695H,1EAAH1EAAHDWDW0D9BH0D9BH,7F93H7F93H,0373H0373H,26D7H26D7HDWDW2710H2710H,9E3FH9E3FH,1A66H1A66H,22E3H22E3HDWDW1174H1174H,16EFH16EFH,33E4H33E4H,6CA0H
12、6CA0H14.2 数据极值查找和数据排序 定义:定义:数据极值查找就是在指定的数据区中找出最数据极值查找就是在指定的数据区中找出最大值或最小值。大值或最小值。方法:方法:比较交换法。比较交换法。数据极值查找数据极值查找例例:从内存从内存BLOCKBLOCK单元开始有一个无符号数的数据块,单元开始有一个无符号数的数据块,块长度为块长度为LENLEN,试找出数据块中最大值,并存入,试找出数据块中最大值,并存入MAXMAX单元。单元。ORG 2000HORG 2000HLEN DATA 20HLEN DATA 20HMAX DATA 22HMAX DATA 22HMOV MAXMOV MAX,#0
13、0H#00H ;MAXMAX单元清零单元清零MOV R0MOV R0,#BLOCK#BLOCK ;数据块首地址送;数据块首地址送R0R0LOOP:LOOP:MOVMOV A A,R0R0CJNECJNE A A,MAXMAX,NEXT1NEXT1;比较;比较NEXT1:NEXT1:JCJC NEXT NEXT ;若;若(A)(MAX)(A)(MAX)(A)(MAX),交换,交换NEXT:NEXT:INCINC R0 R0DJNZDJNZ LEN LEN,LOOP LOOP;若未完,转;若未完,转LOOPLOOPSJMPSJMP$ENDEND 数据排序数据排序例:例:编写无符号数排序程序。编写无
14、符号数排序程序。假设在片内假设在片内RAMRAM中,起始地址为中,起始地址为40H40H的的1010个单元个单元中存放有中存放有1010个无符号数。试进行升序排序。个无符号数。试进行升序排序。定义:定义:数据排序是将指定数据区中的数据按升序或数据排序是将指定数据区中的数据按升序或降序排列。降序排列。方法:方法:冒泡排序法冒泡排序法解:解:R7R7:比较次数计数器,初始值为比较次数计数器,初始值为09H09H位地址位地址00H00H:数据互换的标志位数据互换的标志位 若若(00H)=0(00H)=0,无互换发生,排序完毕。,无互换发生,排序完毕。(00H)=1(00H)=1,有互换发生。,有互换
15、发生。程序流程图 ORG0400H START:MOVR0,#40H;数据区首址送;数据区首址送R0 MOVR7,#09H;每次冒泡比较次数送;每次冒泡比较次数送R7 CLR00H;互换标志位清零;互换标志位清零LOOP:MOVA,R0;取前数送;取前数送A中中 MOV2BH,A;暂存到;暂存到2BH单元中单元中 INCR0;修改地址指针;修改地址指针 MOV2AH,R0;取后数暂存到;取后数暂存到2AH单元中单元中 CLRC;清;清CY SUBBA,R0;前数减后数;前数减后数 JCNEXT;前数小于后数,则转移;前数小于后数,则转移(不互换不互换)MOVR0,2BH;前数大于后数,两数交换
16、;前数大于后数,两数交换 DECR0 MOVR0,2AH INCR0;地址加;地址加1,准备下一次比较,准备下一次比较 SETB00H;置互换标志;置互换标志NEXT:DJNZR7,LOOP;未比较完,进行下一次比较;未比较完,进行下一次比较 JB00H,START;有交换,表示未排完序,进行下一轮冒泡;有交换,表示未排完序,进行下一轮冒泡 END;无交换,表示已排好序,结束;无交换,表示已排好序,结束14.3 散转(多分支)程序设计 散转程序散转程序是一种多分支选择程序。它根据某种是一种多分支选择程序。它根据某种输入或运算结果输入或运算结果,分别转向各个处理程序。在分别转向各个处理程序。在MCS-51单片机中,散转指令为单片机中,散转指令为JMP A+DPTR,它按照,它按照程序运行时决定的地址执行间接转移指令。程序运行时决定的地址执行间接转移指令。操作步骤:操作步骤:(1)(1)将将转移表首地址转移表首地址送入送入DPTRDPTR作为基地址。作为基地址。(2)(2)将将条件标志单元内容条件标志单元内容装入装入A A中作为变址,在装中作为变址,在装入前,还应根据转移表项内容作相应变化