第四章 汇编语言程序设计 程序设计概述 一、程序设计步骤 二、程序设计方法 三、汇编语言源程序的格式

Slides:



Advertisements
Similar presentations
第7章 AT89S51单片机的 串行口 1.
Advertisements

6 单片机的中断与定时系统 I/O设备必须通过I/O接口与计算机连接。 I/O接口的功能: 1.速度匹配: 锁存数据、传送联络信号。
第5章 中断系统 5.1 中断的概念 5.2 MCS-51单片机的中断流程 5.3 MCS-51的中断响应条件和中断处理
本章内容: 中断的概念 MCS-51单片机中断系统 外部事件中断及应用
第四章 指令系统及汇编语言程序设计.
8051 指令.
第4章 MCS-51程序设计 4.1 汇编语言的格式与伪指令 4.2 汇编语言程序设计步骤 4.3 查表程序设计 4.4 循环程序设计
第四章 指令系统及汇编语言程序设计.
本章分为四节,主要介绍: 4.1 程序编制的方法和技巧 4.2 源程序的编辑和汇编 4.3 基本程序结构 4.4 常用程序举例.
项目2 2个LED发光二极管控制 知识与能力目标 熟悉单片机的I/O口功能与特性。
得技通电子 问题 1 右何者非為假指令 (1) XRL (2) EQU (3) MACRO (4) ORG.
本章小结 C51单片机指令系统概述 C51单片机寻址方式 C51单片机指令系统
单片机原理与应用.
第9章 串行扩展技术 (课时:6学时).
第9章 数模转换器与模数转换器 本章学习目标 了解数模转换器的工作原理及性能指标 掌握模数转换器的应用 掌握数模转换器的应用.
第2章 MCS-51单片机指令系统与汇编语言程序设计
報告者:朱耿育 紀翔舜 組員:詹以群 張永傑 指導老師:梁新潁
复 习 一. 计算机中的数和编码 1. 2,10,16进制数及其之间的转换(整数) 按权展开,除x取余 2
第二部分 微机原理 第4章 汇编语言 程序设计 主讲教师:喻红.
单片机应用技术 项目一 循环彩灯装置 第6讲 指令功能及汇编语言程序设计(一) 《单片机应用技术》精品课程组 湖北职业技术学院机电工程系.
本章内容: 中断的概念 MCS-51单片机中断系统 外部事件中断及应用
6.3 定时器/计数器的应用 初始化 初始化的内容如下:
第8章 模拟接口 8.1 模拟接口概述 8.2 DAC及其接口 8.3 ADC及其接口.
第二部分 微机原理 第3章 MCS-51的 指令系统 主讲教师:喻红.
一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置. 一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置.
第6章 MCS - 51单片机内部定时器/ 计数器 及串行接口 6.1 定时器/计数器的结构及工作原理 6.2 方式和控制寄存器
單晶片微電腦控制實習 使用計時中斷作走馬燈 計時器的基礎實習 國立大甲高工 電機科 2018年11月21日
本章分为三节,主要介绍: 6.1 计算机串行通信基础 C51的串行口 6.3 单片机串行口应用举例.
第3章 AT89C51指令系统 3.1基本概念内部结构和引脚功能 指令、指令系统、机器代码
逻辑运算类指令 包括与、或、非、异或、清0及移位等共24条;一般不影响PSW中的标志位;助记符有:ANL、ORL、XRL、RL、RLC、RR、RRC、CLR和CPL共9种。 一、逻辑与指令 ANL A,Rn ;A←(A)∧( Rn) ANL A,direct;A←(A)∧(direct)
单片机原理及应用 MCS-51系列单片机的基本硬件结构 MCS-51指令系统 MCS-51单片机的系统扩展与应用.
4.A/D与D/A转换器 1).DAC0832与MCS-51接口
第2章 单片机的结构原理与 简单应用 (课时:10学时).
第八章 MCS-51与数码显示器和键盘的接口 一、MCS-51与数码显示器接口 数码显示器是单片机应用产品中最常用的廉价的输 出设备,它由8个发光二极管按一定规律排列而成, 当某一发光二极管导通时,则会被点亮,控制不同 组合的二极管导通,就能显示出各种字符。 1.显示器的结构.
本 章 重 点 单片机的简单I/O扩展 8255A可编程并口芯片 8279可编程键盘/显示器接口芯片 单片机键盘接口技术
单片机原理 单 片 机 单片机接口技术 单片机应用技术.
第三章 指令系统.
第3章 指令系统及程序设计举例 3.1 指令格式与寻址方式 一、指令格式 1. 指令 操作码 目标操作数,源操作数
第10章 综合实训 课题一 水温控制系统设计 一、实训目的 二、课题要求 熟悉常用温度传感器AD590的特性及接口电路的设计方法;
第8章 MCS-51串行口 8.1 串行口及其通信方式 8.2 IBM-PC系列机与 单片机 的通信技术.
第2章 单片机系统组成原理 2.1 MCS-51单片机组成原理 2.2 单片机复位电路设计 2.3 MCS-51存储器配置
6.1 输入/输出 6.2 CPU与外设数据传送方式 6. 3 MCS-51中断系统 6. 4 中断应用举例
单元五 MCS-51单片机内部资源 5.1 任务九 单片机计数并显示 5.2 任务十 单片机流水灯控制 5.3 任务十一 两台单片机数据互传
本 章 重 点 单片机的结构特点 单片机的存储器特点 I/O端口的特点 CPU时序 课时安排:3个课时.
一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置. 一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置.
第四章 指令系统及汇编语言程序设计.
第4章 中断技术 一个完整的微机系统是由硬件和软件共同构成的。微机系统的硬件有CPU、存储器和I/O口,外设组成。CPU与存储器之间的信息交换比较简单,而CPU与外设之间进行信息交换之前必须确定外设是否准备好,即选择I/O传送方式。I/O传送方式有4种:无条件、查询、中断和DMA。本章学习中断传送方式的有关内容。
数码管数字时钟电路的设计 1. 系统硬件电路的设计
第四章 MCS-51定时器/计数器 一、定时器结构 1.定时器结构框图
第3章 MCS-51指令系统 介绍MCS—51系列单片机的寻址方式 介绍MCS—51系列单片机的指令系统
第4章 80C51系列指令系统 教学目的:熟悉80C51系列单片机的寻址方式及 每一种寻址方式对应的寻址空间;掌 握每一条指令功能。
4.4 实用程序举例 延时 在程序设计过程中,有时需要程序“等待”一会儿再去处理某些事情,称之为延时。计算机延时实际就是让计算机反复执行一些空操作,这样就能起到拖延时间的作用。需要执行空操作次数的多少,取决于延时时间的长短。
教学难点: 分支程序、散转程序与子程序的设计
本章内容 MCS-51单片机指令系统的格式 MCS-51单片机寻址方式 指令系统的分析
5-6 串列埠模式0輸出埠擴充實習.
实验三 16位算术逻辑运算实验 不带进位控制的算术运算 置AR=1: 设置开关CN 1 不带进位 0 带进位运算;
汽车单片机应用技术 学习情景1: 汽车空调系统的单片机控制 主讲:向楠.
单片机原理及应用 实践部分 主讲人:刘 强 四川工商学院单片机教学团队 单片机原理及应用 实践部分 主讲人:刘 强
四、手工汇编 完成汇编的方法有两种:手工汇编和汇编程序汇编 1.手工汇编步骤 A
单片机原理与应用.
3. 逻辑运算指令 A、简单逻辑操作指令 CLR A. (不影响CY、AC、 OV标志) CPL A
简单芯片扩展I/O接口 8155可编程接口芯片及其使用 键盘及显示器接口设计 A/D和D/A转换接口技术
循环程序设计 在程序中包含重复执行的程序段称为循环程序设计。循环程序可以使程序结构性强、可读性好,从而大大提高了程序质量。
4.3 汇编语言程序设计 顺序程序设计 顺序程序设计是最基本的程序设计。它是按照指令排列的先后顺序依次执行,每条指令都必须执行,且只执行一遍。顺序程序设计一般比较单一、简单,常常作为复杂程序的一部分。
单片机应用技术 (C语言版) 第3章 MCS-51指令系统及 汇编程序设计
第二章 MCS-51单片机程序设计 第一章 8086程序设计 第三章 微机基本系统的设计 第四章 存贮器与接口 第五章 并行接口
上节复习(11.7) 1、定时/计数器的基本原理? 2、定时/计数器的结构组成? 3、定时/计数器的控制关系?
第4章 MCS-51汇编语言程序设计 教学基本要求: (1)、了解MCS-51汇编语言程序设计的特点;
第1章 微型计算机基础.
Presentation transcript:

第四章 汇编语言程序设计 4 . 1 程序设计概述 一、程序设计步骤 二、程序设计方法 三、汇编语言源程序的格式 4 . 1 程序设计概述 一、程序设计步骤 二、程序设计方法 三、汇编语言源程序的格式 汇编语言的语句一般自左到右按序至少包括以下四项: 标号:操作码 操作数;注释 注意: 1.标号的第一个字符必须是英文字母,随后的可以是英文字母或数字。 2.在操作码和操作数之间应该有空格。

4 . 2 汇编语言基本程序设计 4.2.1 顺序结构程序 例:将片外0200H、0201H单元两个无符号数相乘,结果送片内RAM的50H、51H单元。 ORG 0000H M1 EQU 0200H;乘数首地址 M2 EQU 50H;乘积首地址 AJMP MAIN ORG 0100H MAIN: MOV DPTR,#M1;指向被乘数 MOV A,#64H MOVX @DPTR,A ;将100送0200H INC DPTR MOV A,#0AH MOVX @DPTR,A;将10送0201H MOV DPTR,#M1;指向数据区 MOV R0,#M2;R0指向结果单元 MOVX A,@DPTR;取被乘数 MOV B,A INC DPTR MOVX A,@DPTR;取乘数 MUL AB MOV @R0,A;存积低字节到50H MOV A,B INC R0 MOV @R0,A;存积高字节到51H AJMP $

4.2.2 分支程序 例:设计可多达128路分支出口的转移程序。设128个出口分别转向128段小程序,它们的入口地址依次为:addr00,addr01, addr02, … ,addr7F;要转移到某分支的信息存放在工作寄存器R3中。 MOV A,R3 RL A MOV DPTR,#TAB JMP @A+DPTR TAB:AJMP addr00 AJMP addr01 … … AJMP addr7F

例:设计有256路分支出口的转移程序 MOV DPTR,#TAB MOV A,R2;取出口信息 CLR C RLC A;出口信息乘以2 JNC LOW;出口信息在0~127间则转移 INC DPH;出口信息在128~255间,则DPTR加256,使页数加1 LOW: MOV R3,A;暂存出口信息 MOVC A,@A+DPTR;查找出口地址低8位 PUSH A MOV A,R3 INC A MOVC A,@A+DPTR;查找出口地址高8位 PUSH A RET;将出口地址高8位送PC高8位,将出口地址低8位送PC低8位 TAB: DW addr 00 DW addr 01 DW addr 02 … … DW addr FF

4.2.3 循环程序 例:求无符号数累加和 。若Ai均为单字节数,并按i(i=1~n)顺序存放在片内RAM从60H开始的单元中,n放在R2中,要求它们的和(双字节)放在R3和R4中。 ORG 0000H AJMP ADD1 …….. ORG 0100H ADD1:MOV R3,#00H;部分和高字节清零 MOV R4,#00H;部分和低字节清零 MOV R2,#8;数据个数送R2 MOV R0,#60H;数据首址送R0 CLR C LOOP:MOV A,R4;取部分和低位 ADD A,@R0;与Ai相加 MOV R4,A;存部分和 INC R0;地址加1 CLR A ADDC A,R3;部分和高字节加进位 MOV R3,A;存部分和 DJNZ R2,LOOP END

4.2.4 查表程序 4.2.5 子程序及调用 1. 用工作寄存器和累加器传递参数 4.2.4 查表程序 例:已知数据0~9的平方,设变量x的值在累加器A中,查表后求 的值放回累加器,试编制程序。 ORG 0100H SQR :MOV DPTR,#TABLE MOVC A,@A+DPTR RET TABLE:DB 00H,01H,04H,09H,16H DB 25H,36H,49H,64H,81H 4.2.5 子程序及调用 1. 用工作寄存器和累加器传递参数 例:用程序实现 ,设 、 、y 分别存于片内RAM的X1、X2、Y 3个单元中。 MOV R1,A; 暂存R1中 MOV A,X2 ACALL SQR;调查表程序 ADD A,R1 MOV Y,A ORG 00H X1 EQU 30H X2 EQU 40H Y EQU 50H START:MOV A, X1 ACALL SQR;调查表程序

2. 用指针寄存器传递参数 例:将片内RAM中30H单元开始的10个数据取反后送到片内RAM中40H开始的单元中。 ORG 0100H 2. 用指针寄存器传递参数 例:将片内RAM中30H单元开始的10个数据取反后送到片内RAM中40H开始的单元中。 ORG 0100H MOV R2,#0AH;数据块长度送R2 MOV R0,#30H;要处理的数据块首址送R0 MOV R1,#40H;处理后数据块首址送R1 ACALL TRAN;调用求反子程序 ORG 0200H TRAN:PUSH A KK :MOV A,@R0;从片内RAM取数据到累加器A CPL A ;数据求反 MOV @R1,A;存数据到R1指向的片内RAM单元 INC R0 INC R1 DJNZ R2,KK;未处理完,继续转到KK MOV A,R1 ;当前存放处理结果单元地址送A CLR C SUBB A,#0AH;退回到结果数据区首址 XCH A,R1 ;交换 POP A RET

3. 用堆栈传递参数 例:将R1中的低半字节(低4位)一个16进制数转换成ASCII码,再放回R1。 ORG 00H AJMP START 3. 用堆栈传递参数 例:将R1中的低半字节(低4位)一个16进制数转换成ASCII码,再放回R1。 ORG 00H AJMP START START:MOV SP,#50H;堆栈指针 MOV A,R1 ;待处理的16进制数送A PUSH ACC ;待转换数入栈 LCALL H_ASC;调数制转换子程序 POP ACC ;从堆栈取得转换值 MOV R1,A ;转换值送R1 ORG 0E0H H_ASC:MOV R1,SP ;R1指向栈顶 DEC R1 ; R1退回到入口参数地址 DEC R1 ; XCH A,@R1;交换,取出参数送A ANL A,#0FH ;保留低半字节

MOV DPTR,#TAB;取ASCII码表首址 MOVC A,@A+DPTR;查表 XCH A,@R1 ;转化好的数据送堆栈 RET TAB DB 30H,31H,32H,33H, DB 34H,35H,36H, DB 37H,38H,39H DB 41H,42H,43H,44H DB 45H,46H

4 . 3 算术逻辑处理程序 1、多字节二进制数加法 例:两个双精度数(8字节数二进制数)相加。 BUF1 EQU 50H;定义被加数首址 4 . 3 算术逻辑处理程序 1、多字节二进制数加法 例:两个双精度数(8字节数二进制数)相加。 BUF1 EQU 50H;定义被加数首址 BUF2 EQU 60H;加数首址 N EQU 08H;加数字节数 MOV R0,#BUF1;R0指向被加数 MOV R1,#BUF2;R1指向加数 MOV R2,#N ;加数总字节数送R2 ADDBIN:CLR C ;清进位 LOOP :MOV A,@R0 ;取被加数 ADDC A,@R1 ;两数相加,带进位 MOV @R0,A ;和放回被加数单元 INC R0 ;指向被加数的下一个字节 INC R1 ;指向加数的下一个字节 DJNZ R2,LOOP;未加完转LOOP JC DON ;最高字节相加有进位转 MOV @R0,#00H;无进位R0置零 JMP STOP ;退出,暂停 DON:MOV @R0,#01H ;最高字节求和的进位存R0 STOP:

2、多字节压缩BCD码加法 例:多字节压缩BCD码加法 MOV R0,#ADR1;被加数低字节地址指针 MOV R3,#N ;字节数 ACALL BCDADD ORG 0108H BCDADD:MOV A,R0 ;两个多字节BCD码加法子程序 PUSH A ;被加数首址入栈暂存 MOV A,R3 PUSH A ;加数字节数入栈暂存 CLR C LP0 :MOV A,@R0 ;取被加数 ADDC A,@R1 ;相加 DA A ;十进制加法调整 MOV @R0,A ;存和 INC R0 ;指针加1 INC R1 DJNZ R3,LP0 ;做完加法否 POP A MOV R3,A ;恢复R3中的内容 JNC RETURN ;最高字节相加有无进位 MOV @R0,#01H INC R3 ;最高字节和有进位,扩展一个字节 RETURN :POP A MOV R0,A ;恢复R0,指向和的首址 RET

3、多字节数求补 例:多字节数求补 ADR EQU 60H N EQU 08H MOV R2,#N ;待处理的字节数送R2 MOV R0,#ADR ;R0指向待处理的数据 ACALL D_NEG;调用多字节数求补子程序 ORG 00A0H D_NEG:MOV A,R0 PUSH A ;数据区首址入栈保护 MOV A,@R0 ;从片内RAM60H取最低字节 CPL A ;求反 ADD A,#01H ;最低字节取反后加1 MOV @R0,A ;最低字节处理后放回原处 DEC R2 ;待处理字节数减1 DON : INC R0 ;R0指向下一个数 MOV A,@R0 ;下一个字节送A CPL A ADDC A,#0 ;考虑低位字节求反加1后可能的进位 MOV @R0,A ;处理完后放回原处 DJNZ R2,DON POP A ;处理完,从栈顶弹出结果数据区首址 MOV R0,A ;结果单元首址送R0 RET

4、多字节无符号数求极大值 设在DAT开始的片内RAM中存放8个无符号字节数,找出最大值,并暂存在A中。 DAT EQU 40H ORG 0AH MOV R2,#07H ;R2存比较次数 MOV R0,#DAT;R0指向数据区首址 CLR C MAX:MOV A,@R0 ;第一个数据送R3 MOV R3,A INC R0 ;指向下一个数据 MOV A,@R0 ;取下一个数据 SUBB A,R3 ;后一数减前一数,A(i+1)-A(i) JNC LP ;无借位,后一数大,不交换 MOV A,R3 ;交换数据 XCH A,@R0 ;大字符下沉 DEC R0 XCH A,@R0 ;小字符上浮 INC R0 LP:DJNZ R2,MAX RET

5、冒泡程序 例:设片内RAM 40H开始的单元有无序字符表,假设为8个字节,将其按代码值大小升序排列。 N EQU 08H ;元素个数 TAB EQU 40H ;数据区首址 MOV R2,#N MOV R0,#TAB ACALL ARRAY;调用升序排序子程序 ORG 0100H ARRAY:DEC R2 ;置外循环次数=N-1(冒泡次数) SETB 00H ;置交换标志位=1 MOV R7,#00H ;第0次冒泡,R7置0 LP0 :JNB 00H,LP3 ;无交换标志,退出 CLR 00H ;清交换标志 MOV A,R0 ;数据首址送A MOV R1,A ;R0内容暂存于R1 MOV A,R2 ;N-1送R5 MOV R5,A ;置内循环次数初值=N-1

CLR C SUBB A,R7 ;内循环次数=N-1-(R7) MOV R5,A ;更新内循环次数 LP1:MOV A,@R1;第一个数据送R3 MOV R3,A INC R1 ;指向第二个数据 MOV A,@R1;取第二个数送A SUBB A,R3 ;相邻元素比较,A(i+1)-A(i) JNC LP2 ;A(i+1)>A(i)转LP2 MOV A,R3 ;A(i+1)<A(i), A(i+1)与A(i)交换 XCH A,@R1 ;大字符A(i)下沉到A(i+1)所在单元 DEC R1 XCH A,@R1 ;小字符A(i+1) 上浮到A(i)所在单元 INC R1 SETB 00H ;有交换,设标志位为1 LP2:DJNZ R5,LP1;比较完否? INC R7 ;完成一次冒泡,R7内容加1 DJNZ R2,LP0;完成全部冒泡? LP3:RET

6、除以2的倍数的处理 例:设自P0口输入8个数据,已经存放在片内RAM60H开始的单元中,求出这8个数据的平均值,并将商放在R3、R4中。 MOV R0,#60H;R0指向数据区首址 ACALL AVG AVG:MOV R2,#08H;R2作为计数器 MOV R3,#00H;部分和高位字节单元清零 MOV R4,#00H;部分和低位字节单元清零 ACALL D_ADD;调用求累加和子程序 ACALL D_DIV8;调用除以8的子程序 RET ORG 0100H D_ADD:CLR C ;多字节累加和子程序 LOOP: MOV A,R4 ;取部分和低位字节 ADD A,@R0 ;与下一个数相加 MOV R4,A ;存部分和低位字节 INC R0 ;地址加1,指向下一个字节 CLR A ADDC A,R3 ;加上低位字节向高位的进位 MOV R3,A ; 存部分和高位字节 DJNZ R2,LOOP;未加完继续

D_DIV8:MOV R2,#03H ;双字节除以8子程序 DON:CLR C ;清进位 MOV A,R3 ;被除数高位字节送A RRC A ;被除数高位字节带进位右移一位 MOV R3,A ;存中间结果的高位字节 MOV A,R4 ;被除数低位字节送A RRC A ;被除数低位字节带进位右移一位 MOV R4,A ;存中间结果的低位字节 DJNZ R2,DON ;完成右移3位否? RET

7、双字节无符号数整数相乘 例:双字节无符号数整数相乘 MOV R1,#ADR ;置积的首地址 ACALL DW_MUL;调用双字节无符号数乘法子程序 ORG 00A0H DW_MUL:MOV R7,#04H CLEAR:MOV @R1,#00H ;存放乘积的4个单元清零 INC R1 DJNZ R7,CLEAR MOV R1,#ADR PARTMUL:MOV A,R2 ;(R2)乘(R4) MOV B,R4 MUL AB ;积的低字节在A中,高字节在B中 ACALL ADDM ;调用处理部分积子程序 MOV A,R2 ; (R2)乘(R5) MOV B,R5 MUL AB MOV A,R3 ; (R3)乘(R4)

MOV B,R4 MUL AB DEC R1 ACALL ADDM ;调用处理部分积子程序 MOV A,R3 ; (R3)乘(R5) MOV B,R5 ACALL ADDM ;调用处理部分积子程序 RET ADDM:ADD A,@R1 ;处理部分积子程序 MOV @R1,A MOV A,B INC R1 ADDC A,@R1 MOV A,@R1 ADDC A,#00H

4 . 4 数制转换程序 1、二进制数转换为十进制数 例:将R3中的二进制数转换为非压缩BCD码,存放在片内R0指向的单元。 4 . 4 数制转换程序 1、二进制数转换为十进制数 例:将R3中的二进制数转换为非压缩BCD码,存放在片内R0指向的单元。 MOV R0,#60H ;转换好的数放在60H开始的单元 B_BCD:MOV A,R3 ;取二进制数到A MOV B,#100 DIV AB ;A中的商为BCD百位数 INC R0 INC R0 ;R0指向十进制数的百位 MOV @R0,A ;存十进制数的百位 MOV A,#10 XCH A,B ;将余数交换到A中,A中10交换到B中 DIV AB ;余数再除以10,A中得到十位数,B中得到个位数 DEC R0 MOV @R0,A ;存十进制数的十位数 MOV @R0,B ;存十进制数的个位数 RET

例:双字节二进制数转换为压缩BCD数 DW_BCD:MOV A,R0 ; R0指向双字节二进制数的低地址单元 MOV R6,A ;将待转换数据指针暂存R6 MOV A,R1 ;R1指向待存BCD码的起始单元 MOV R7,A ;BCD码指针暂存R7 MOV R2,#2 ;要转换2个字节的二进制数 INC R2 ;存BCD码需3个字节 CLR C BB0:MOV @R1,#0 INC R1 DJNZ R2,BB0 ;清BCD码单元 MOV R3,#16 ;要转换的二进制数位数为16 BB3:MOV A,R6 ;R0指向待转换的二进制数 MOV R0,A MOV R2,#2 ;双字节左移需左移两次

BB1:MOV A,@R0 ;取一个字节到A RLC A ;二进制数带进位C循环左移一位 MOV @R0,A ;左移后暂存 INC R0 ;R0指向第二个字节 DJNZ R2,BB1 ;将ai移位入C中,i=15,14,13,…,0 MOV R2,#2 INC R2 ;三个单元存放BCD码 MOV A,R7 ;R1指向BCD码单元 MOV R1,A BB2: MOV A,@R1 ADDC A,@R1 ;进行y=y *2 + ai的运算 DA A ;十进制调整 MOV @R1,A ;存中间结果 INC R1 DJNZ R2,BB2 DJNZ R3,BB3 ;16位二进制数处理完否?

2、十进制数转换为二进制数 例:十进制数(多位压缩BCD码)转换成二进制数 BCD_DW:MOV A,R5 ;将BCD数的高位字节送A MOV R2,A ;暂存到R2 ACALL BCDIN1 ;调用子程序计算a3*10+a2 MOV B,#100 ; 将100送B MUL AB ; 计算(a3*10+a2)*100 MOV R6,A ;暂存乘积低位字节 XCH A,B ;将乘积的高位字节交换到A中 MOV R5,A ;存乘积高位字节 MOV A,R4 ;取BCD码的低位字节 MOV R2,A ;送R2 ACALL BCDIN1 ;调用子程序计算a1*10+a0

ADD A,R6 ;加上[(a3*10+a2)*100]的低位字节 MOV R4,A ;存结果的低位字节 MOV A,R5 ADDC A,#00H;计入进位 MOV R5,A ;存结果的高位字节 AJMP $ BCDIN1:MOV A,R2 ;取BCD码,(计算 子程序) ANL A,#0F0H ;屏蔽低4位,得高4位BCD码 SWAP A ;交换A的高低半字节 MOV B,#10 ;10送B MUL AB ; MOV R3,A ;乘积低位字节送R3 MOV A,R2 ;取BCD码 ANL A,#0FH ;屏蔽高4位,得低位BCD码 ADD A,R3 ;加低位BCD码,+ai RET

3、二进制数转换为16进制数的ASCII码 例:单字节二进制数转换为2个十六进制ASCII码 BINASC:MOV A,R2 ;取二进制数 MOV R3,A ANL A,#0FH ;屏蔽高4位 ACALL SUB1 MOV R2,A ;存低半字节的ASCII码 MOV A,R3 ;取原二进制数 ANL A,#0F0H ;屏蔽低4位 SWAP A ;A高低半字节交换 ACALL SUB1 ;调子,将16进制数转换为ASCII码 MOV R3,A ;存高半字节ASCII码 ……… SUB1:PUSH A CLR C SUBB A,#0AH POP A JC AD30 ;该数小于10转到AD30 ADD A,#07H ;大于10,为A~F AD30:ADD A,#30H RET

4、ASCII字符串转换为十六进制数 , 两两组合成 一个字节 例:将ASCII串转换为十六进制数。设在R0指向的片内RAM区存有20个十六进制数的ASCII字串。将ASCII码转换为十六进制数,然后两两组合成一个字节,从低地址单元到高地址单元依次组合。 ASCHEX:MOV R3,#N ;字节数 MOV A,R1 PUSH A ;保护R1 MOV A,R6 PUSH A ;保护R6 DON1:MOV A,@R0 ;取一个ASCII码到A,设R0指向ASC码首址 ACALL COVHEX ;调子,将ASCII码转换成十六进制数 MOV A,R7 ;取出口参数 MOV R6,A ;低半字节暂存到R6 INC R0 ;R0指向下个ASCII码 MOV A,@R0 ;取下一个ASCII码到A MOV A,R7 ;取出口参数 SWAP A

ADD A,R6 ;将两个十六进制数组合成一个字节 MOV @R1,A ;存二进制数,设R1已指向目的存储区首址 INC R1 ;R1指向下个结果单元 INC R0 ;R0指向下个ASCII码 DJNZ R3,DON1;处理完? POP A MOV R6,A ;恢复R6 MOV R1,A ;恢复R1 RET COVHEX:CLR C ;ASCII码转换为16进制数子程序 SUBB A,#30H ;ASCII码值减30H MOV R7,A ;中间结果暂存到R7 MOV A,#09H ;09H送累加器A SUBB A,R7 ;09H减ASCII码减30H后的值 JNC EXIT ;没借位跳转 CLR C ;否则先清进位 MOV A,R7 ;再将ASCII码减30H的中间结果存到A SUBB A,#07H ;再减07H MOV R7,A EXIT:RET ;返回值存于R7中

4 . 5 中断应用程序 一、MCS-51单片机中断服务程序入口地址对照表 中断源 中断服务程序入口地址 外部中断0 0003H 4 . 5 中断应用程序 一、MCS-51单片机中断服务程序入口地址对照表 中断源 中断服务程序入口地址 外部中断0 0003H 定时器/计数器0溢出 000BH 外部中断1 0013H 定时器/计数器1溢出 001BH 串行口 0023H

二、中断请求的撤除 1、定时器溢出中断请求及外部中断负边沿触发方式下的 中断请求由硬件自动撤除 2、串行口中断请求的撤除由软件实现 CLR TI ;撤除发送中断 CLR RI ;撤除接收中断 3、外部中断低电平触发方式下的中断请求撤除需外接电 路实现 在中断服务程序中用如下两条指令可实现中断请求的撤除和继续开放 ANL P1,#0FEH ORL P1,#01H 外部中断请求 INT0 P1.0 Q D S CLK 8051

三、中断系统的初始化 例:设外部中断0为低电平触发,编写中断系统初始化程序。 采用位操作: SETB EA ;允许CPU中断 SETB EX0 ;允许外部0中断 SETB PX0 ;设外部0中断为高优先级 CLR IT0 ;设外部0中断为低电平触发 采用字节操作: MOV IE,#81H ORL IP,#01H ANL TCON,#0FEH

四、外部中断源的扩展 1、定时器/计数器扩展外中断源 例:将定时器/计数器0设置为工作方式2,计数模式,计数初值为0FFH,允许中断,编写初始程序。 MOV TMOD,#06H;计数器,方式2 MOV TH0,#0FFH ;计数初值 MOV TL0,#0FFH SETB ET0 ;允许计数器中断 SETB EA ;CPU开中断 SETB TR0 ;启动计数器0 2、查询式扩展外部中断源(见实例)

五、外部中断应用程序例程 例:某工业监控系统,具有温度、压力、PH值等多路监控功能。在PH<7时,向CPU申请中断,CPU响应后令P3.0引脚输出高电平,经驱动,使加碱管道电磁阀接通1s,以调整PH值。设PH<7时外设输入正脉冲到D触发器CLK端,其中断服务程序入口为INT02。

ORG 0000H LJMP MAIN ORG 0003H LJMP 0030H ORG 0030H ;外部中断0中断服务程序入口地址 ;地址表 JB P1.0,INT00 JB P1.1,INT01 JB P1.2,INT02 JB P1.3,INT03 ORG 0080H INT00:…….. RETI INT01:……..

INT02: ;中断服务程序2 PUSH PSW ;保护现场 PUSH A ;保存现场 SETB PSW.3 ;保存现场 SETB P3.0 ;接通加碱管道电磁阀 ACALL DELAY ;调用延时程序延时1S CLR P3.0 ;1s到时关加碱管道电磁阀 ANL P1,#BFH;BF=10111111,撤除PH<7的中断请求 ORL P1,#40H ;允许PH<7的中断请求 POP A ;恢复现场 POP PSW RETI ;中断返回 INT03:…….. RETI MAIN:…….. END

4 . 6 定时器/计数器应用程序 例:设单片机晶振频率为6MHz,要求使用定时器0工作方式1产生周期为500us的等宽脉冲,并在P1.0端输出,编写程序实现。 ORG 0000H AJMP MAIN ORG 000BH AJMP INTP ORG 0100H MAIN:ANL TMOD,#0F0H;高4位不变,不影响T1的工作 ORL TMOD,#01H ;置定时器0工作方式1 MOV TH0,#0FFH ;设置计数初值 MOV TL0,#83H SETB EA ;CPU开中断 SETB ET0 ;定时器0开中断 SETB TR0 ;启动定时器0 SJMP $ ;等待中断 INTP: MOV TH0,#0FFH ;重新设置计数初值 CPL P1.0 ;输出取反 RETI END

例:已知晶振频率为6MHz,要求使用定时器0在工作方式2产生100us定时,在P1.0输出周期为200us的连续方波脉冲,编写程序。 查询方式: MAIN: ANL TMOD,#0F0H;不影响T1工作 ORL TMOD,#02H ;T0定时,方式2 MOV TH0,#0CEH ;初值 MOV TL0,#0CEH MOV IE,#00H ;禁止中断 SETB TR0 ;启动定时器0 LOOP: JBC TF0,LOOP1 AJMP LOOP LOOP1: CPL P1.0

中断方式: ORG 0000H LJMP MAIN ORG 000BH LJMP INT0 OGR 0030H MAIN:ANL TMOD,#0F0H ;不影响T1工作 ORL TMOD,#02H ;T0定时,方式2 MOV TH0,#0CEH ;初值 MOV TL0,#0CEH SETB EA ;开CPU中断 SETB ET0 ;开T0中断 SETB TR0 ;启动T0 ……… INT0: CPL P1.0 RETI

例:要求利用单片机内部的定时器/计数器,达到1分钟延时。设晶振频率12MHz。 ORG 0000H LJMP 0030H ORG 001BH ;定时器/计数器1中断服务程序 SETB F0;建立标志位F0 RETI ORG 0030H ;主程序 START: MOV TMOD,#01010001B;T0和T1置方式 … … REPEAT:MOV TH1,#15H ;置T1初值 MOV TL1,#0A0H MOV TH0,#0FCH ;置T0初值

MOV TL0,#18H CLR P3.5 ;T1输入端清零 MOV IE,#88H ;开CPU与T1中断,T0中断屏蔽 SETB TR1 ;启动T1工作 SETB TR0 ;启动T0工作 LOOP: … … JNB TF0,$ ;等T0定时到、溢出 CLR TF0 ;清T0溢出标志 JBC F0,ELSE ;如F0=1,转ELSE SETB P3.5 ;否则,T1端置1 MOV TH0,#0FCH ;T0重装载 CLR P3.5 ;T1输入端清零,令T1计一次数 SJMP LOOP ELSE: … … AJMP REPEAT

作 业 编程,利用定时器中断方式使P1.0和P1.1口分别输出周期为2ms和50ms的方波。设晶振为12MHz。

4 . 7 串行通信接口应用程序 例:用8051串行口外接74LS165移位寄存器扩展8位并行输入口,输入数据由8个开关提供,另有一个开关K提供联络信号。当开关K合上时,表示要求输入数据。输入8位开关量,对应分别处理不同的任务。 START:JB P1.1, $ ;K未合上,等待 CLR P1.0 ;74LS165并行置入数据 SETB P1.0 ;置串行移位方式 MOV SCON,#10H;串口方式0并启动接收 JNB RI , $ ;查询RI CLR RI ;清接收中断标志 MOV A,SBUF;输入数据 …….. ;据输入的各位分别处理任务 SJMP START ;准备下一次接收

例:由串行通信接口实现双机通信。将发送机8051片内RAM 40H~4FH的数据串发送到接收机8051片内RAM60H~6FH中。发送、接收机工作于方式2,TB8为奇偶校验位,接收时对数据奇偶校验。 发送程序(查询方式): MOV SCON,#80H ;串行口方式2 MOV PCON,#00H ;SMOD=0,波特率不加倍 MOV R0,#40H ;待发数据区地址指针 MOV R2,#10H ;数据长度 LOOP:MOV A,@R0 ;取发送数据 MOV C,P ;奇偶位送TB8 MOV TB8,C MOV SBUF,A ;发送数据 WAIT:JBC TI,NEXT ;发送完一帧信息后硬件置位TI SJMP WAIT NEXT: INC R0 ;修改发送数据地址指针 DJNZ R2,LOOP RET

接收程序(查询方式): MOV PCON,#00H ;置SMOD=0 MOV R0,#60H ;置数据区地址指针 MOV SCON,#90H ;串口工作方式2,并启动接收 LOOP:JBC RI,READ ;等待接收数据并清RI SJMP LOOP READ:MOV A,SBUF ;读一帧数据 MOV C,P JNC LP0 ;C不为1转LP0 JNB RB8,ERR ;RB8=0,即RB8不为P转ERR AJMP LP1 LP0 :JB RB8,ERR ; RB8=1,即RB8不为P转ERR LP1 :MOV @R0,A ;RB8=P,接收一帧数据 INC R0 DJNZ R2,LOOP RET ERR :…….. ;出错处理程序 ……..