nbhkdz.com冰点文库

单片机实训典型子程序

时间:2011-01-04


单片机软件系统概况
硬件系统作为实体, 为计算机工作提供了物质基础和条件, 但要使计算 机有效地工作,还必须有软件系统的配合。 计算机的软件系统主要包括系统软件、应用软件和程序设计语言三部 分。单片机系统由于受硬件支持和实际需要所限,其软件系统比较简单。单 片机系统管理只使用简单的操作系统程序, 通常称之为监控程序, 因此监控 程序就成为单片机中最重要的系统软件。 单片机系统只有监控程序和目标码 的应用程序。 单片机系统中的人机界面接口、相互通道接口(通信接口)程序设计属 监控程序设计, 需要结合具体硬件电路进行。 单片机系统中的前向通道接口 (开关量或模拟量数据采集)和后向通道接口(数据输出)程序、数据处理 程序、控制(算法)程序设计都属于应用程序设计,数据处理程序和控制程 序设计中涉及许多通用程序设计。 下面介绍一些通用程序设计:

查表类程序设计
1.查表求 ASC 码 入口条件:R0 低四位存放一个 16 进制数(0~F) 。 出口信息:将查得的 ASCII 码送回 R0。 FINDASC: MOV A,R0 ANL A,#0FH ADD A,#02H MOVC A,@A+PC MOV R0,A RET ASCTAB: DB ‘0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’ DB ‘8’,’9’,’A’,’B’,’C’,’D’,’E’,’F’ 2.顺序查找 ROM 表格(单字节) 入口条件:待查找内容存放在 30H 中,表格字节数存于 R7 中。 出口信息:OV=0 时,顺序号在 A 中;OV=1 时,未找到。 FINDROM: MOV R2,#0 ;顺序号初始化(指向表首) MOV A,R7 MOV R6,A ME1: MOV A,R2 MOV DPTR,#TAB MOVC A,@A+DPTR CJNE A,30H,ME2 CLR OV MOV A,R2 SJMP JSH ME2: INC R2 DJNZ R6,ME1 SETB OV JSH: RET TAB: DB ….. 3.顺序查找 ROM 表格(双字节) 入口条件:待查找内容在 R4(高字节)、R5(低字节)中,数据总个数在 R7 中。 出口信息:OV=0 时,顺序号在 A 中;OV=1 时,未找到。 FINDDROM: MOV A,R7 MOV R6,A

MOV R2,#0 MOV DPTR,#TAB MN1: CLR A MOVC A,@A+DPTR XRL A,R4 JNZ MN2 MOV A,#1 MOVC A,@A+DPTR XRL A,R5 JNZ MN2 CLR OV MOV A,R2 SJMP JSH MN2: INC DPTR INC DPTR INC R2 DJNZ R6,MN1 SETB OV JSH: RET TAB: DB …

代码转换类程序设计
1.十六进制数到 ASCII 码的转换 入口条件:R2(高四位为 0000,低四位为 0000-1111 的一个十六进制数 0-F)。 出口信息:R2(相应的 ASCII 码)。 HASC: MOV A,R2 ADD A,#0F6H JNC AD30H ADD A,#07H AD30H: ADD A,#30H MOV R2,A RET 2.ASCII 码转换成十六进制数(一) 入口条件:待转换的 ASCII 码(30H~39H 或 41H~46H)在 A 中。

出口信息:转换后的十六进制数(00H~0FH)仍在累加器 A 中。 ASCH1: CLR C SUBB A,#30H JNB ACC.4,ASH1 SUBB A,#7 ASH1: RET 2.ASCII 码转换成十六进制数(二) 入口条件:待转换的 ASCII 码(30H~39H 或 41H~46H)在 R2 中。 出口信息:转换后的十六进制数(00H~0FH)仍在 R2 中。 ASCH2: MOV A,R2 CLR C SUBB A,#30H MOV R2, A SUBB A,#0AH JC RET1 MOV A,R2 SUBB A,#07H MOV R2, A RET1: RET 3.单字节十六进制数转换成双字节 ASCII 码 入口条件:待转换的单字节十六进制数在累加器 A 中。 出口信息:高四位的 ASCII 码在 A 中,低四位的 ASCII 码在 B 中。 HASC: MOV LCALL XCH SWAP ANL ADD DA ADDC DA B,A ;暂存待转换的单字节十六进制数 HAS1 ;转换低四位 A,B ;存放低四位的 ASCII 码 A ;准备转换高四位 A,#0FH ;将累加器的低四位转换成 ASCII 码 A,#90H A A,#40H A

HAS1:

RET 4.ASCII 码到 BCD 码的转换 说明:将 ASCII 码减去 30H,结果为 0-9 的,则为所求 BCD 码;结果 ? 0 或 ≥ 10 结果单元送 0FFH。 入口条件:R2(ASCII 码) 。 出口信息:R3(低四位为所求 BCD 码) 。 ASCIIBCD: MOV A,R2 CLR C SUBB A,#30H MOV R3,A JC NOBCD SUBB A,#0AH JC RET1 NOBCD: MOV R3,#0FFH RET1: RET 5.多字节 BCD 码到 ASCII 码的转换 入口条件:R0(BCD 码高位字节地址指针) ;R2(字节数) 。 出口信息:R1(ASCII 码首地址指针) 。 BCDASC: MOV A,@R0 MOV R3,A ANL A,#0F0H SWAP A ADD A,#30H MOV @R1,A INC R1 MOV A,R3 ANL A,#0FH ADD A,#30H MOV @R1,A INC R1 INC R0 DJNZ R2,BCDASC RET

6.单字节十六进制整数转换成单字节BCD码整数 入口条件:待转换的单字节十六进制整数在累加器 A 中。 出口信息:转换后的BCD码整数(十位和个位)仍在累加器 A 中,百位 在 R3 中。 HBCD: MOV DIV MOV MOV XCH DIV SWAP ORL RET B,#100 ;分离出百位,存放在 R3 中 AB R3,A A,#10 ;余数继续分离十位和个位 A,B AB A A,B ;将十位和个位拼装成BCD码

7.单字节 BCD 码到二进制数的转换 说明:高位 BCD 码乘 10 加低位 BCD 码。 入口条件:R2(BCD 码) 出口信息:R2(8 位无符号二进制整数) BCD2B: MOV A,R2 ANL A,#0F0H SWAP A MOV B,#0AH MUL AB MOV R3,A MOV A,R2 ANL A,#0FH ADD A,R3 MOV R2,A RET

数值(定点数)运算类程序设计
1.双字节 BCD 码加法 BCD 码加法需对运算结果进行二-十进制调整。 入口条件:R5(高) 、R4(低)为被加数;R3(高) 、R2(低)为加数。

出口信息:R6(万) 、R5(千、百) 、R4(十、个)为和值。 DUBCDA: MOV A,R4 ADD A,R2 DA A MOV R4,A MOV A,R5 ADDC A,R3 DA A MOV R5,A CLR A ADDC A,#00H MOV R6,A RET 2.双字节 BCD 码减法 说明:MCS-51 既没有十进制减法指令,也没有十进制减法调整指令,所以 先将减数进行十进制求补, 把减法变成加法, 然后用十进制加法调整指令来 调整运算结果,所得到的是十进制补码形式的差值,此时 C=1 表示差值为 正,C=0 表示差值为负。 入口条件:R5(高) 、R4(低)为被减数;R3(高) 、R2(低)为减数。 出口信息:R5(高) 、R4(低)为补码形式的差值。 CDS: CLR C MOV A,#99H SUBB A,R3 MOV R3,A CLR C MOV A,#9AH SUBB A,R2 ADD A,R4 DA A MOV R4,A MOV A,R3 ADDC A,R5 DA A MOV R5,A RET

3.单字节 BCD 数的乘法子程序 说明:采用“累加法”求解。编程时注意两个问题,一是每次累加后及时用 “DA A”调整;二是处理好积的低 8 位向高 8 位的进位关系。 入口条件:60H(被乘数) ;61H(乘数) 。 出口信息:62H(乘积高 8 位) ;63H(乘积低 8 位) 。 BCDMUL: MOV 63H,#0 MOV 62H,#0 CLR A LP: PUSH ACC MOV A,60H ADD A,63H DA A MOV 63H,A CLR A ADDC A,62H DA A MOV 62H,A POP ACC ADD A,#01H DA A CJNE A,61H,LP RET 4.多字节无符号数加法 说明:从低位开始加起。 入口条件:R0(被加数低位字节地址指针) ;R1(加数低位字节地址指针) ; R3(字节数) 。 出口信息:R0(和值低位字节地址指针) ;R3(和值字节数) 。 MADD: MOV A,R0 MOV R2,A MOV A,R3 MOV R7,A CLR C LP: MOV A,@R0 ADDC A,@R1 MOV @R0,A

INC R0 INC R1 DJNZ R7,LP JNC LAR INC R3 MOV @R0,#01H LAR: MOV A,R2 MOV R0,A RET 5.多字节无符号数减法 说明:从低位开始减,最后 C=0,结果为正;C=1,结果为负(补码) 。 入口条件:R0(被减数低位字节地址指针) ;R1(减数低位字节地址指针) ; R3(字节数) 。 出口信息:R0(差值低位字节地址指针) ;R3(差值字节数) 。 MSUB: CLR 07H ;正负标志位清 0 MOV A,R0 MOV R2,A MOV A,R3 MOV R7,A CLR C LP0: MOV A,@R0 SUBB A,@R1 MOV @R0,A INC R0 INC R1 DJNZ R7,LP0 JNC LP1 SETB 07H ;差值为负,置位标志位 LP1: MOV A,R2 MOV R0,A RET 6.单字节无符号数排序 说明:R0 存放一批数据的首址指针;R2 存放字节数。将一批数据从小到大 的次序排列。 00H 位为发生交换的标志, 只有不发生交换时, 排序才算结束。

ROLE1: MOV A,R0 MOV R1,A MOV A,R2 MOV R5,A CLR 00H DEC R5 MOV A,@R1 LP0: MOV R3,A INC R1 CLR C MOV A,@R1 SUBB A,R3 JNC LP1 SETB 00H MOV A,R3 XCH A,@R1 DEC R1 XCH A,@R1 INC R1 LP1: MOV A,@R1 DJNZ R5,LP0 JB 00H,ROLE1 RET 7.找单字节无符号最大数 说明:R0 存放一批数据的首址指针;R2 存放字节数。从一批数据中找出最 大数并存于首址指针所指向的单元。 MAX: MOV A,R0 MOV R1,A DEC R2 MOV A,@R1 LP0: MOV R3,A INC R1 CLR C SUBB A,@R1 JNC LP1 MOV A,@R1

SJMP LP1: MOV LP2: DJNZ MOV RET

LP2 A,R3 R2,LP0 @R0,A

8.双字节无符号数乘法 入口条件:被乘数放 R5(高) 、R4(低) ;乘数放 R3(高) 、R2(低) 。 出口信息:R1(积的高位字节地址指针) 。 DUMUL: MOV A,R1 MOV R6,A MOV R7,#4 CL: MOV @R1,#00H INC R1 DJNZ R7,CL DEC R1 MM: MOV A,R2 MOV B,R4 MUL AB ACALL ADDM MOV A,R2 MOV B,R5 MUL AB ACALL ADDM INC R1 MOV A,R3 MOV B,R4 MUL AB ACALL ADDM MOV A,R3 MOV B,R5 MUL AB ACALL ADDM MOV A,R6 ; 恢复地址指针 MOV R1,A RET ADDM: ADD A,@R1

MOV @R1,A MOV A,B DEC R1 ADDC A,@R1 MOV @R1,A DEC R1 MOV A,@R1 ADDC A,#00H MOV @R1,A INC R1 RET 9.双字节二进制无符号数除法 说明:对于多字节除法,最常用的算法是“移位相减”法。为便于编程,将 余数和被除数组合在一起循环左移, 每一次移位后, 判断余数是否大于除数, 若大于,余数减去除数,商上 1,否则商上 0。被除数左移空出的低位空间 正好用来存放商。 入口条件:R7(高) 、R6(低) ,被除数;R5(高) 、R4(低) ,除数。 出口信息:R7(高) 、R6(低) ,商;R3(高) 、R2(低) ,余数。 DDIV: MOV A,R4 JNZ DD0 MOV A,R5 JZ ERR DD0: MOV R2,#0 MOV R3,#0 MOV R1,#16 DD1: CLR C MOV A,R6 RLC A MOV R6,A MOV A,R7 RLC A MOV R7,A MOV A,R2 RLC R2 MOV R2,A MOV A,R3

RLC A MOV R3,A CLR C MOV A,R2 ;部分余数减除数,先减低 8 位 SUBB A,R4 MOV R0,A MOV A,R3 SUBB A,R5 JC DD2 INC R6 ;部分余数大于除数,商上 1 MOV R3,A MOV 02H,00H DD2: DJNZ R1,DD1 CLR F0 RET ERR: SETB F0 RET 10.双字节无符号数求平均值 说明:R0:数据区首址,R1:数据总个数;平均值(a1+a2+ … +an)/ n 存于 R3(高) 、R2(低)中。 MEAM1: MOV A,R1 MOV R7,A MOV R2,#00H MOV R3,#00H MOV R4,#00H LP0: MOV A,R2 ADD A,@R0 MOV R2,A MOV A,R3 INC R0 ADDC A,@R0 MOV R3,A MOV A,R4 ADDC A,#00H MOV R4, A INC R0

LOOP:

LP1:

DJNZ R7,LP0 MOV R5,#00H ;除以 n MOV R7,#18H CLR C MOV A,R2 RLC A MOV R2,A MOV A,R3 RLC A MOV R3,A MOV A,R4 RLC A MOV R4,A MOV A,R5 RLC A MOV R5,A CLR C SUBB A,R1 ;部分余数减除数 JC LP1 MOV R5,A INC R2 DJNZ R7,LOOP RET


赞助商链接

MCS-51单片机实用子程序库

MCS-51单片机实用子程序库_电子/电路_工程科技_专业资料。C51单片机各种汇编子程序,有各种计算、进制转换等。《MCS-51单片机实用子程序库(96年版) 》周航慈 目前...

单片机实验四 数据区传送子程序 实验报告

单片机实验四 数据区传送子程序 实验报告_工学_高等教育_教育专区。佛山科技学院 佛山科学技术学院 实课程名称 专业班级 指导教师 验实验项目 姓成名绩 报 告数据...

单片机课程实验报告-延时子程序

单片机实验报告 实验报告 单片机实验报告一、实验目的:学习 P1 口的使用方法,学习延时子程序的编写 二、实验要求:以 P1 口作为输出口,控制 6 个发光二极管,模拟...

单片机习题答案

单片机习题答案_工学_高等教育_教育专区。一 1....(ACALL addr11)要注意,被调用的子程序的首地址与...10.AT89C51 单片机响应外部中断的典型时间是多少?...

单片机与接口技术作业答案

第三次作业 一、判断题; 1.中断服务子程序的末尾有返回指令是 RET。 2.MCS―51 单片机的串行口收发不能同时进行。 4.I/O 口作输入用途之前相应端口必须先...

单片机实验四数据区传送子程序实验报告

单片机实验四数据区传送子程序实验报告 - 佛山科学技术学院 实验报告 课程名称实验项目数据区传送子程序 专业班级姓名学号 指导教师成绩日期年月日 实验目的 掌握 RAM...

单片机原理及应用第2章习题解答

单片机原理及应用第2章习题解答_教育学_高等教育_教育专区。第2章 思考题及...用子程序返回指令时,再进行出栈保护,把保护的断点送回到 来 中的内容。 答:...

单片机简答题与答案

(2) 执行硬件中断服务子程序调用, 并把当前程序计数器 PC 的内容压入堆栈,...单片机题库简答题 7页 1下载券 单片机实验简答题 1页 1下载券 单片机简答题...

单片机:子程序调用

单片机:子程序调用 - 子程序调用 下图为整个程序运行结果 ORG 0000H MOV A, #0 LCALL SUB1 MOV B,#10 SUB1: MOV A,#100 RET END ...

单片机课后题

3、在 8051 单片机中,堆栈操作的指令有 PUSH 和 POP 两个。 4 、在 8051 单片机中,子程序调用的指令有 ACALL 和 LCALL 两个。 5、CJNE 指令都是 3 字节...