1、1,单片机原理与应用 第 十一 讲主要内容实用程序举例(二)1. 子程序的递归调用2. 排序3. 多字节BCD码加法4. 双字节无符号数乘法运算程序,2,子程序的递归调用子程序自已能调用自己,称为子程序的递归调用。 在单片机应用中,用特殊的方式处理这类调用。例: 汉字 LCD 液晶显示器界面处理中设子程序显示 PAGE1: “欢迎使用本仪器, 某某公司” PAGE2: “ 1. 电压上限设定 ”“ 2.电流上限设定 ”“ 3. 时 间 校 验 ” TIMESUB:“ 时 间 校 验 ”原时间: 09年 06月 04 日 21 时 35分 20秒校验时间: 09年 06月 04 日 21 时 4
2、5分 10秒,3,采用非常简单的记标志方式解决,子程序不再嵌套。PAGE2: “ 1. 电压上限设定 ”“ 2. 电流上限设定 ” “ 3. 时 间 校 验 ”当光标在 1 处时,按下 “确认键” 则 置标志 2FH.0=0当光标在 2 处时,按下 “确认键” 则 置标志 2FH.1=0当光标在 3 处时,按下 “确认键” 则 置标志 2FH.2=0当退出键按下时则 置标志 2FH.3=0子程序 PAGE2 正常结束;主程序LCALL PAGE1M1: LCALL PAGE2JNB 2FH.0, M2JNB 2FH.1, M3JNB 2FH.2, M4JNB 2FH.2, M5; 退出键按下M
3、2: LCALL DIANYA; 调电压设定子程序 AJMP M1 M3: LCALL DIANLIU; 调电流设定子程序 AJMP M1M4: LCALL TIMESUB ; 调时间校验子程序AJMP M1M5: 主程序,4,2排序排序是软件滤波方法的基础,对采集到的 N 个数先进行排序,然后去除若干个最大值和若干个最小值,对剩余的数进行平均。例4.20 将片内RAM 30H开始的连续16个单元的数据按从小到大的顺序排序。此题采用的是冒泡排序法,即对这16个数据组成的数据串,依次将相邻两数分别进行比较,若后面的数小于前面的数,则比较的相邻两数互换,且置位地址单元7FH为1。若这组数据比较完后
4、,相邻两数有交换(即交换标志位7FH为1),则再重新进行两两比较,直到16个数已从小到大排序,相邻两数比较后不再交换为止。交换标志位7FH用来控制是否再需要重新两两比较。程序流程如图4-7所示。,5,图4-7 排序程序流程图,6,ORG 2000H SORT: MOV R1,#30H ;指向数据块首地址MOV R7,#10H ;数据块长度送R7CLR 7FH ;交换标志位清零DEC R7 ;块长减1为比较次数LOOP1: MOV A,R1;取相邻两数中的前一个数MOV 20H,AINC R1MOV A,R1;取相邻两数中的后一个数 CJNE A,20H,LOOP;相邻两数比较 LOOP: JN
5、C NEXT ;前者小于后者转至NEXTXCH A,20H ;前者大于后者,相邻两数互换,即后面数小MOV R1,ADEC R1MOV R1,20HINC R1 ;恢复数据块指针 SETB 7FH ;置1标志位 NEXT: DJNZ R7,LOOP1 ;所有相邻两数未比较完,转至LOOP1JB 7FH,SORT ;交换标志位为1,转至SORTRET,7,4.4.4 算术运算1多字节BCD码加法例4.21 已知在BLOCK1和BLOCK2为始址的存储区中分别有长度为N字节压缩的BCD码,请编写程序使它们相加并将和送入BLOCK1为始址的存储单元。 使用加法指令从低字节相加,因为是BCD码相加,还
6、需用DA指令调整。,8,ORG 0100HMOV R7,#N ;数据块长度送R7MOV R0,#BLOCK1 ;被加数始址送R0MOV R1,#BLOCK2 ;加数始址送R1CLR C ;CY清零LOOP: MOV A,R0 ;被加数送AADDC A,R1 ;相加DA A ;BCD码调整MOV R0。A ;存和INC R0 ;修改被加数地址指针INC R1 ;修改加数地址指针DJNZ R7,LOOP ;未加完,则转至LOOPMOV R0,#00H ;无进位则保存JNC RTN ;最高位无进位转至RTNMOV R0,#01H ;有进位则保存 RTN: RET 说明: 其和放在BLOCK1为起始地
7、址单元中,长度为N+1,9,2双字节无符号数乘法运算程序例4.22 已知在寄存器R4R5和R2R3中分别存放有双字节的被乘数和乘数(R5、R3存放低8位,R4、R2存放高8位),试编程求积并存入BLOCK开始的连续四个存储单元(低字节在前,高字节在后)。AT89C51乘法指令只能完成两个8位无符号数相乘,因此16位无符号数求积必须将它们分解成四个8位数相乘来实现,其方法是边乘边加。原理和过程如图4-8所示。,10,图4-8 双字节无符号数乘法原理图,11,图中ab为16位被乘数,cd为16位乘数(a、c代表高8位,b、d代表低8位),而其后跟H表示乘积后的高8位,跟L表示乘积后的低8位。 OR
8、G 1000H BLOCK EQU 30H MOV R0,#BLOCK ;指向积单元首址 MOV A,R5 MOV B,R3 MUL AB ;bd MOV R0,A ;保存bdL,12,MOV A,B INC R0 MOV R0,A ;保存bdH MOV A,R4 MOV B,R3 MUL AB ;ad ADD A,R0 ;bdH+adL R0 指向 BLOK+1 MOV R0,A INC R0 MOV A,B ADDC A,#00H ;adH+进位R0 指向 BLOK+2,13,MOV R0,A DEC R0 ;R0 指向 BLOK+1 MOV A,R5 MOV B,R2 MUL AB ;b
9、c ADD A,R0 ;bcL与bdh、adL、进位累加 MOV R0,A MOV A,B,14,INC R0; R0 指向 BLOK+2 ADDC A,R0 ;bcH与adH、进位累加 MOV R0,A INC R0 ;指向 BLOK+3 CLR A ADDC A,#00H MOV R0,A ;保存进位 MOV A,R4,15,MOV B,R2 MUL AB ;ac DEC R0 指向 BLOK+2 ADD A,R0 ;acL与adH、bcH、进位累加 MOV R0,A MOV A,B INC R0;指向 BLOK+3 ADDC A,R0 ;ac与进位累加 MOV R0,A RET,16,单片机原理与应用 第 十一 讲小结1. 主要内容实用程序举例(二)1. 子程序的递归调用2. 排序3. 多字节BCD码加法4. 双字节无符号数乘法运算程序要求掌握常规子程序的编程,重点是要搞清算法,画出完整的流程图,