D幻灯片定稿第4章MCS-51汇编语言程序设计_第1页
D幻灯片定稿第4章MCS-51汇编语言程序设计_第2页
D幻灯片定稿第4章MCS-51汇编语言程序设计_第3页
D幻灯片定稿第4章MCS-51汇编语言程序设计_第4页
D幻灯片定稿第4章MCS-51汇编语言程序设计_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MCS-51汇编语言程序设计第4章·单片机原理与应用课程Contents本章目录MCS-51汇编语言程序设计核心章节导览01汇编语言基础概述02程序结构与基本设计03分支与循环程序设计04数制转换与查表程序05子程序设计与实际应用CHAPTER01汇编语言基础概述从程序设计语言分类到MCS-51汇编开发流程MCS-51·程序设计程序设计语言的分类与特点程序设计语言按抽象层次分为机器语言、汇编语言和高级语言三类。MCS-51单片机开发中,汇编语言凭借高执行效率和对硬件的精确控制能力,在实时控制与底层驱动领域具有不可替代的优势,尽管其可移植性较差。机器语言由二进制0和1直接构成指令和数据,是硬件唯一能识别的语言,执行效率最高。完全依赖硬件结构,可移植性极差,编写繁琐且难于调试,实际开发中一般不直接使用。0&1汇编语言使用助记符表示机器指令,与机器语言一一对应,可读性显著优于机器语言。面向机器,须熟悉硬件与指令系统才能编程,通用性差但运行效率高。MOV·ADD高级语言接近自然语言,如C、BASIC等,简单易学,不依赖硬件,可移植性好。需经编译或解释翻译后才能执行,生成代码占用存储多、执行时间较长。C·BASICMCS-51·汇编基础汇编语言源程序的语句类型机器指令由CPU直接执行,每条对应唯一机器码;伪指令不产生机器码,仅为汇编器提供地址分配与数据定义等控制信息。指令性语句(机器指令)01即MCS-51指令系统中的全部指令,如MOV、ADD、JMP等,每条指令都有唯一对应的机器代码02是CPU真正能够识别并执行的指令,直接控制硬件完成数据传送、算术运算、逻辑判断等操作03编写时必须严格遵循指令格式和操作数规则,否则汇编器报语法错误,无法生成目标代码指示性语句(伪指令)01不直接产生机器代码,机器不能执行,仅在汇编过程中为汇编程序提供控制或指示信息02常用伪指令包括ORG(指定起始地址)、EQU(符号赋值)、DB/DW(定义数据)、END(程序结束)03合理使用伪指令可精确控制程序在存储器中的布局、定义常量和数据表,是规范编程的重要工具MCS-51·AssemblyProcess汇编过程与目标文件生成汇编是将汇编语言源程序转换为机器语言目标程序的关键过程。汇编器在转换过程中完成机器码生成、地址分配、语法检查和文件输出四项核心任务,但仅能检测语法层面的错误,程序逻辑错误仍需通过调试手段发现。单片机开发板编程烧录实拍01机器码生成:确定每条汇编指令对应的机器码,将助记符逐一翻译为CPU可执行的二进制代码02地址分配:根据ORG伪指令指定起始地址,自动为每条指令分配程序存储器中的连续存放地址03语法检查:报告拼写错误、操作数不匹配等语法与编辑错误,但不能检测程序逻辑错误04文件输出:产生OBJ/HEX目标文件供烧录,同时生成LST列表文件便于对照源代码与机器码Chapter03·PseudoInstructionsMCS-51常用伪指令详解MCS-51汇编语言提供了ORG、EQU、DB/DW、END等伪指令,用于控制程序存储地址分配、符号定义和数据表建立。MCS-51常用伪指令功能速查表伪指令格式示例功能说明ORGORG0030H指定程序或数据块的起始存放地址,后续指令从该地址开始连续分配EQUCOUNTEQU30H将表达式值赋给符号名,后续程序中可用符号名代替具体数值或地址DBDB30H,31H,32H定义字节数据,将一组8位数据依次存入连续的存储单元DWDW1234H,5678H定义字数据,将一组16位数据按高字节在前的顺序存入连续存储单元BITFLAGBITP1.0定义位地址符号,将位地址赋给符号名以便在位操作指令中使用ENDEND标记源程序结束,汇编器遇到此伪指令即停止汇编处理六条常用伪指令覆盖地址定位、符号定义、数据定义和程序终止等核心汇编控制功能CHAPTER02程序结构与基本设计掌握顺序、分支、循环三种基本程序结构的设计方法CHAPTER04·程序设计顺序程序设计顺序程序按指令书写顺序逐条执行,无跳转和循环,是数据搬移、格式转换与简单计算的基础单元。基本概念:顺序程序又称简单程序,CPU从第一条指令开始,按存储器地址递增的顺序逐条执行,直到最后一条指令结束。例4-1BCD→ASCII:利用数字0-9的ASCII码值(30H–39H)与BCD码差值为30H的规律,分别取出低4位和高4位各加30H,存入片外1000H、1001H单元。例4-2双字节BCD加法:X存于30H/31H,Y存于32H/33H;先低位字节相加并用DAA修正,再带进位高位相加,结果Z存入34H/35H/36H。单片机实验箱·顺序程序编程实验场景MCS-51ASSEMBLY双字节BCD码加法程序详解多字节BCD码加法必须逐字节从低位到高位依次运算,每个字节相加后都要用DAA指令进行十进制调整修正,高位字节需使用ADDC指令将低位产生的进位纳入计算,最终结果可能比操作数多出一个进位字节。STEP01低位字节处理→34HMOVA,30H取出X低位,ADDA,32H加上Y低位,DAA进行BCD码十进制调整,结果存入34H单元。此步骤完成最低有效字节的加法运算并产生进位标志。STEP02高位字节处理→35HMOVA,31H取出X高位,ADDCA,33H带进位加上Y高位,DAA修正后存入35H单元。ADDC指令确保低位进位被正确传递至高位运算,保证多字节加法的连续性。STEP03进位字节处理→36HMOVA,#0配合ADDCA,#0将最高位进位取出,DAA修正后存入36H单元。此步骤确保双字节加法溢出时有正确的进位记录,完整保留运算结果的所有有效位。MCS-51汇编语言分支程序设计基础分支程序根据条件判断结果选择不同执行路径,是汇编语言中实现逻辑决策的核心结构。MCS-51通过条件转移指令(JZ/JNZ/JC/JB等)实现分支跳转,程序设计的关键在于合理设置条件判断点和各分支的入口地址。01分支结构原理—分支程序根据条件判断结果选择不同处理路径,类似于高级语言中的if-else结构,是程序逻辑控制的基本手段02条件转移指令—MCS-51提供丰富的条件转移指令:JZ/JNZ(零/非零判断)、JC/JNC(进位判断)、JB/JNB(位状态判断)、CJNE(比较不等转移)等03设置分支条件—首先明确分支条件:通过比较运算(SUBB)、位测试(JB/JNB)或状态标志(JZ/JC)建立判断依据04防止穿透执行—各分支出口需使用无条件转移指令(SJMP/LJMP)跳过其他分支,避免程序穿透到不该执行的代码段分支执行流程条件判断成立不成立分支A处理路径1分支B处理路径2SJMP继续执行SJMP跳转指令防止分支穿透执行MCS-51·分支程序设计两数比较大小——分支程序实例无符号数大小比较通过SUBB减法指令实现,利用进位标志C的状态判断大小关系:C=0表示被减数≥减数,C=1表示被减数<减数。结合JNC条件转移指令实现分支选择,确保较大值始终保留在累加器A中。01数据读取通过MOVXA,@DPTR分别从外部RAM地址ST1(8040H)和ST2(8050H)读取两个无符号二进制数到累加器A和寄存器R2MOVX02大小判断CLRC清除进位后执行SUBBA,R2做减法比较,JNCBIG1判断无借位时跳转,即A≥R2时直接将结果存入SUBB+JNC03数据交换有借位时(A<R2),执行XCHA,R2将较大值交换到累加器A,确保存入ST3(8060H)的始终为较大值XCHCHAPTER03分支与循环程序设计多分支散转结构与循环控制的实现方法MCS-51·BRANCH&LOOP正负零统计——分支与循环综合实例统计P1口输入数据中正数、负数、零的个数是一个典型的分支-循环复合结构程序。循环通过SJMP无条件跳转实现持续采集,分支通过JZ(判零)和JB(判符号位)两级条件判断实现三分类统计,三个工作寄存器分别作为独立计数器。01初始化阶段:CLRA清零累加器后分别送入R0、R1、R2三个计数器,确保统计开始前所有计数器归零CLRA02循环采集与零值判断:ENTER标签处从P1口读取数据到A,JZZERO指令检测A是否为零,为零则跳转至ZERO标签处R2加1后跳回ENTER继续采集JZ03符号位判断与分类计数:JBP1.7,NEG检测最高位(符号位),为1表示负数跳转至NEG处R1加1;不为零且符号位为0则为正数,R0加1后SJMPENTER继续循环JBMCS-51·PROGRAMMING多分支转移(散转)程序设计散转程序通过JMP@A+DPTR间接转移指令实现根据输入值直接跳转到对应处理分支,避免了多级嵌套条件判断的低效结构。SECTION01散转程序基本原理根据某个输入变量或状态值,从多个处理分支中选择一个执行,类似于高级语言中的switch-case结构MCS-51通过JMP@A+DPTR指令实现间接转移,目标地址=DPTR基地址+A中偏移量,可灵活跳转到地址表中的任意入口SECTION02实现步骤与要点01建立跳转地址表—用DW伪指令将各分支入口地址依次排列在程序存储器中,形成连续的地址表02计算偏移量—输入值乘以2(每个地址占2字节)得到在地址表中的字节偏移,送入累加器A03设置基地址—用MOVDPTR,#TABLE将地址表首地址装入DPTR,执行JMP@A+DPTR完成跳转MCS-51ASSEMBLY循环程序设计方法循环程序通过条件转移指令实现代码段的重复执行,是数据处理、延时控制和批量操作中不可或缺的结构。MCS-51的DJNZ指令集计数减1与条件跳转于一体,是实现循环的核心指令,嵌套循环时需注意内外层计数器独立分配。循环四要素初始化设置循环变量初值与指针→循环体执行核心代码段→DJNZ减1判零实现条件控制→出口处理保存结果并恢复状态四步闭环DJNZ核心指令自动将Rn减1,若不为零则跳转到rel处继续循环,一条指令同时完成计数与条件判断两个操作,是实现循环的首选DJNZ多重循环设计内外层循环变量必须使用不同寄存器分配,内层循环的初始化和出口处理不能破坏外层循环的计数器状态内外独立CHAPTER04数制转换与查表程序二进制与BCD码、十六进制与ASCII码的转换实现MCS-51·汇编指令应用8位二进制数转换为BCD码8位二进制数转BCD码采用连续除法策略:先除100得百位,余数再除10得十位和个位。巧妙利用DIVAB指令同时产生商(A)和余数(B)的特性,配合SWAP指令调整半字节位置,最终将百位和压缩BCD码分别存入指定RAM单元。01百位提取将A中的8位二进制数用DIVAB除以B中的100,商(百位数)留在A中,余数留在B中,百位数存入21H单元。DIVAB÷10002十位与个位提取XCHA,B将余数交换到A,再用DIVAB除以10,商(十位数)在A中、余数(个位数)在B中。XCH+DIV÷1003压缩BCD码合并SWAPA将十位数调整到A的高半字节,ADDA,B将个位数加到低半字节,合并后的压缩BCD码存入20H单元。SWAP+ADDCONVERSIONPRINCIPLE十六进制数转换为ASCII码十六进制转ASCII码利用数字与字母ASCII码值的固定偏移规律:数字0-9偏移量为30H,字母A-F偏移量为37H。ASCII码值规律分析01数字字符转换数字0-9的ASCII码为30H-39H,即数值加30H即可得到对应ASCII码。例如:数值5加30H得到35H,即字符'5'的ASCII码。02字母字符转换字母A-F的ASCII码为41H-46H,即数值(0AH-0FH)加37H即可得到对应ASCII码。例如:数值0BH加37H得到42H,即字符'B'的ASCII码。程序实现策略01判断分支法先判断待转换值是否≤9,是则加30H,否则加37H。通过CJNE或SUBB指令配合条件转移实现分支选择,逻辑清晰但代码稍长,适合资源受限场景。02查表法替代用DB伪指令预存0-9和A-F的ASCII码表,通过MOVCA,@A+DPTR指令直接查表获取。代码简洁执行快,但需占用额外ROM空间存储码表。DATALOOKUP查表程序设计方法查表法以预存数据表替代实时计算,是汇编语言中"空间换时间"的经典策略。MCS-51提供两条查表指令:MOVCA,@A+DPTR可访问64KB全地址空间的数据表,MOVCA,@A+PC适合短距离紧凑查表,二者在LED段码、键值映射等场景中广泛应用。01MOVCA,@A+DPTRDPTR装入数据表首地址,A中为表内偏移量,执行后A获得表中对应位置的数据,可访问整个64KB程序存储器空间适合大容量数据表(如LED段码表、字符字模表),表的位置灵活,可在程序任意位置定义,是最常用的查表方式64KB全地址空间02MOVCA,@A+PC以当前PC值加偏移量为地址读取数据,数据表必须紧跟在查表指令之后,偏移范围仅256字节,但无需占用DPTR寄存器适合小规模紧凑数据表,在DPTR已被占用或需要节省寄存器的场景中尤为实用,代码结构紧凑256B偏移范围MCS-51·ARITHMETIC算术逻辑处理程序实例双字节数据存储和BCD码累加是MCS-51算术逻辑处理的典型场景。前者通过间接寻址和XCH交换指令实现多字节数据的有序存储;后者通过子程序封装DAA修正操作,确保BCD码运算的中间结果和最终结果始终保持合法的十进制格式。01双字节存储R0指向35H,先用MOV@R0,A存入低字节,INCR0后XCHA,R2将高字节换入A再存入36H,最后XCH恢复R2原值。35H–36H间接寻址02BCD码累加主程序将R1–R4中的数据依次加入A,每次加法后ACALL调用子程序SUB执行DAA十进制调整,保证中间结果为合法BCD码。R1–R4逐次累加03子程序SUB设计先将A暂存R7,执行DAA修正后通过@R0存入RAM并INCR0更新指针,再从R7恢复A后RET返回,R0指针自动递增便于连续存储。DAA十进制修正CHAPTER05子程序设计与实际应用模块化编程思想与定时器、中断、键盘、LED显示驱动SubroutineDesign子程序设计原则与规范子程序通过LCALL/ACALL调用和RET返回实现代码复用,是汇编语言模块化编程的核心。设计时必须严格遵循现场保护、参数传递约定和现场恢复的规范。01设计要点明确入口/出口参数:通过约定寄存器或RAM单元传递输入数据和返回结果,调用前后双方对数据位置有一致理解现场保护与恢复:子程序使用寄存器前必须PUSH压栈保存原值,返回前POP弹栈恢复,防止覆盖主程序数据导致逻辑错误返回指令规范:必须使用RET指令返回调用点,严禁用LJMP替代,否则嵌套调用时返回地址将不正确02堆栈管理MCS-51堆栈在片内RAM中向上生长(SP递增),初始化时需将SP设置到安全区域(如MOVSP,#60H),避免与工作寄存器区冲突SP≥60H嵌套调用时堆栈深度累加,需确保总压栈量不超过片内RAM上限(128字节或256字节),否则会发生堆栈溢出≤128/256BytesMCS-51汇编语言程序设计定时器/计数器应用程序设计MCS-51的定时器/计数器通过TMOD配置工作方式、TH/TL装入初值实现精确定时或外部计数。采用中断方式处理定时器溢出事件,既保证定时精度又不占用CPU轮询时间,是实现LED闪烁、PWM输出、通信波特率发生等功能的标准方案。TMOD工作方式配置:通过TMOD寄存器设置定时器为方式0(13位)、方式1(16位)、方式2(8位自动重装)或方式3(双8位),选择定时或计数模式3CB0H初值计算方法:定时初值=最大计数值−定时时间/机器周期,如12MHz晶振下方式1定时50ms,初值=65536−50000=15536(3CB0H),分别装入TH和TLIRQ中断驱动流程:置位ET0/ET1允许定时器中断、EA开总中断、TR0/TR1启动定时器,溢出时CPU自动跳转至中断向量地址执行服务程序Auto-Reload初值重装策略:方式2支持自动重装(TL溢出时自动从TH加载),适合反复定时且精度要求高的场景,免去软件重装初值的时间误差MCS-51InterruptSystem外部中断应用程序设计MCS-51提供INT0和INT1两个外部中断源,支持低电平和下降沿两种触发方式。外部中断程序设计包括触发方式配置、中断允许设置和中断服务程序编写三个环节,是按键检测、外部设备请求响应和紧急事件处理的核心机制。中断配置与触发触发方式设置:TCON寄存器IT0/IT1位控制触发模式。IT=0为低电平触发,外部引脚持续低电平期间中断请求标志反复置位,适合需要持续检测的场景;IT=1为下降沿触发,仅在高电平跳变到低电平时产生一次中断请求,抗干扰能力强,适合边沿检测应用。中断允许配置:IE寄存器完成三级使能控制。EX0/EX1位分别允许INT0/INT1中断,EA位为总中断开关。配置时必须按"EA→EXn"顺序使能,任何一级未开启都会导致中断无法响应,是调试阶段最常见的配置遗漏点。设计要点:低电平触发需确保中断服务程序执行时间短于低电平持续时间,否则会造成重复进入;下降沿触发需保证脉冲宽度大于12个时钟周期以确保可靠采样。中断服务程序设计中断向量与入口:INT0固定指向0003H,INT1固定指向0013H。由于相邻中断向量间隔仅8字节,通常在该地址放置LJMP指令跳转到实际服务程序存储区,避免程序代码与后续向量地址(如定时器中断向量)发生空间冲突。标准程序框架:服务程序遵循"保护→处理→恢复→返回"四步结构。使用PUSH/POP完成现场保护,核心处理逻辑尽量精简,最后以RETI指令返回。RETI会自动清除中断优先级触发器,允许同级或更低优先级中断响应。实时性保障:中断服务程序执行时间应控制在系统最小响应周期内。对于耗时操作应采用"中断标记+主程序处理"的异步模式,避免长时间关中断影响系统实时响应能力。SerialPortProgramming串行口应用程序设计MCS-51串行口支持四种工作方式,其中方式1(8位UART异步通信)最为常用。波特率由定时器T1溢出率决定,需精确计算T1初值以保证通信准确。01工作方式选择SCON寄存器SM0/SM1配置四种方式——方式0(同步移位,波特率固定fosc/12)、方式1(8位UART,波特率可变)、方式2/3(9位UART,方式3波特率可变更适合多机通信)SM0/SM102波特率计算与T1配置T1设为方式2自动重装,波特率=2SMOD×fosc/(32×12×(256−TH1)),常用9600bps在11.0592MHz晶振下TH1=FDH9600bps03收发流程控制发送数据写入SBUF后硬件自动移位输出,TI标志置位表示完成;接收时REN=1允许接收,RI标志置位表示数据就绪,中断服务程序中读取SBUF并清标志SBUFKEYBOARDPROGRAMMING键盘程序设计键盘程序需完成按键检测、键值识别和抖动消除三项核心任务。独立式键盘适合少量按键直接读取I/O状态;矩阵式键盘通过逐行扫描定位按键位置,用较少的I/O线支持更多按键。软件消抖(延时10-20ms后二次确认)是保证按键识别准确性的必要环节。独立式键盘01每个按键直接连接一根I/O线,通过读取I/O口电平状态判断按键是否按下,编程简单直接,适合按键数≤8的简单场景。硬件连接直观,无需复杂扫描逻辑,响应速度快,是嵌入式系统中最基础的按键输入方案。≤8键02消抖处理:检测到按键按下后延时10-20ms再次读取确认,避免机械触点抖动导致一次按键被误识别为多次。软件消抖成本低、实现灵活,配合中断或查询方式均可稳定工作。10–20ms矩阵式键盘01按键排列成N行×M列矩阵,用N+M根I/O线实现N×M个按键,扫描时逐行输出低电平、读取列值判断按下位置。相比独立式大幅节省I/O资源,是扩展按键数量的经典设计方案。N×M矩阵02键值计算:行号×列数+列号得到键值索引,再通过查表获取按键对应的功能码或字符值,支持16键甚至更多。矩阵扫描配合编码转换,可灵活实现数字键盘、功能键盘等复杂输入界面。16+键MCS-51ASSEMBLYLED动态显示驱动程序设计LED动态显示利用人眼视觉暂留效应,通过快速轮流点亮各位数码管实现多位同时显示的视觉效果。LED七段数码管·共阴极结构实物01段码表建立—共阴极数码管0-9段码为3FH/06H/5BH/4FH/66H/6DH/7DH/07H/7FH/6FH,用DB伪指令在ROM中建立段码表,显示时根据数字值查表获取对应段码。02动态扫描流程—取缓冲区数据→查表得段码→送段码口→送位选信号→延时1-5ms→关闭当前位→指向下一位→循环扫描。03显示缓冲区设计—在片内RAM开辟连续单元存储各位待显示数字的段码或数字值,显示程序只需扫描缓冲区即可,实现显示内容与扫描逻辑的解耦。1–5ms每位置选延时·保证亮度均匀无闪烁CHAPTERREVIEW本章知识体系总结MCS-51汇编语言程序设计涵盖语言基础、程序结构、数据处理和实际应用四个层次。从机器语言和汇编语言的基本概念出发,通过顺序、分支、循环三种结构构建程序逻辑,借助数制转换和查表法处理数据,最终在定时器、中断、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论