AT89S51汇编语言程序设计_第1页
AT89S51汇编语言程序设计_第2页
AT89S51汇编语言程序设计_第3页
AT89S51汇编语言程序设计_第4页
AT89S51汇编语言程序设计_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

AT89S51汇编语言程序设计从硬件控制原理到工程实践的系统化学习Contents课程目录AT89S51汇编语言程序设计——从架构原理到工程实践的系统化学习路径01AT89S51架构与汇编语言本质02源程序结构与工程规范03指令系统与寻址方式04程序设计基本结构05中断系统与定时器编程06综合案例与工程实践CHAPTER01AT89S51架构与汇编语言本质理解汇编语言作为CPU指令集符号化表达的工程意义COREHARDWAREAT89S51核心硬件架构AT89S51基于8051内核采用哈佛总线架构,CPU通过8位ALU与累加器A完成所有运算,4KBFlashROM与128BRAM独立编址,配合32个GPIO、双定时器与5源中断系统,构成了汇编编程必须精确掌控的完整硬件资源池。CPU内核8位ALU搭配累加器A与寄存器B,所有算术逻辑运算均需A参与,结果回写A中。支持加、减、乘、除、与、或、异或、移位等完整指令集程序状态字PSW包含CY进位、AC辅助进位、OV溢出、P奇偶等标志位,直接影响条件跳转判断与中断响应16位程序计数器PC自动递增寻址,支持64KB程序存储器空间的最大寻址范围,支持跳转、调用与中断向量表8位ALU存储器体系4KBFlash程序存储器用于存放代码与常量表,通过MOVC指令读取,支持在线ISP编程与1000次擦写周期128字节内部RAM低32字节为工作寄存器区(4组R0-R7),高96字节为通用数据区,支持位寻址与堆栈操作21个特殊功能寄存器SFR集中在80H-FFH地址段,统一控制CPU状态与外设行为,包括ACC、B、PSW、SP、DPTR等核心寄存器4KBFlashROM外设资源P0-P3共32个GPIO引脚,P0口复用地址/数据总线需外接上拉,P3口复用中断与串口功能,支持位操作与字节操作两个16位定时器/计数器T0与T1,支持定时、计数和波特率发生三种工作模式,可配置13位、16位、8位自动重装等模式5个中断源含2个外部中断(INT0/INT1)、2个定时器中断和1个串口中断,分高/低两级优先级,支持自动向量跳转32GPIOAT89S51ASSEMBLY汇编语言的三大不可替代性汇编语言作为CPU指令集的符号化表达,在嵌入式底层开发中具有时序确定性、资源零开销和硬件直控性三大不可替代优势,是排查C51编译器优化副作用、定位硬件时序异常的唯一可靠手段。时序确定性每条指令执行周期由硬件固化(1/2/4个机器周期),可用DJNZ循环配合晶振频率计算绝对精确延时,无任何运行时开销1/2/4CYCLES资源零开销无函数调用栈帧管理、无参数传递协议、无运行时库依赖,读端口并置位仅需3字节机器码,代码密度远超C51编译器3BYTES硬件直控性通过SETBP1.7等指令原子操作SFR任意位,避免C语言位域操作可能引入的读-修改-写竞争风险SFRBIT-OP调试回溯能力当C51程序出现难以复现的中断响应延迟或外设寄存器异常时,唯有回溯到汇编层面才能准确定位编译器优化引入的副作用DEBUGTRACECHAPTER02源程序结构与工程规范掌握汇编源程序四段式格式与工程化代码组织方法ASSEMBLYSTRUCTURE汇编源程序的四段式结构AT89S51汇编源程序采用标号、操作码、操作数、注释的四段式格式,每一字段都有明确的硬件或工具链依据——标号解耦逻辑意图与物理地址,操作码映射CPU指令译码器,操作数指定寻址方式,注释保障代码可维护性。标号冒号强制分隔标号与操作码,遗漏冒号将导致汇编器将标号误判为操作码引发编译错误禁止与SFR保留字冲突,如将标号设为ACC会被替换为0xE0导致非法操作工程意义在于解耦逻辑意图与物理地址,程序偏移时标号引用自动更新Label·逻辑地址操作码操作码是唯一不可省略的字段,AT89S51的111条指令分为五大类涵盖数据传送、算术运算、逻辑运算、控制转移和位操作111条指令操作数分为寄存器直接寻址、直接地址、立即数和间接地址四种形式,不同指令对操作数类型有严格限制多操作数指令用逗号分隔源和目的操作数,如MOVA,R0表示将R0内容传送到累加器AOperand·4种寻址注释以分号开头,汇编器忽略其内容,但对代码可读性和团队协作至关重要优秀的注释应说明"为什么这样做"而非"做了什么",如解释选择特定延时常数的晶振频率依据Comment·可维护性ASSEMBLERDIRECTIVES伪指令与程序组织伪指令虽不生成机器码,却是汇编程序工程化组织的核心工具:ORG精确定位代码起始地址与中断向量,EQU实现常量符号化管理,DB/DW支持ROM数据表定义,END标记编译边界,共同保障程序的结构清晰与可维护性。ORG地址定位ORG(Origin)设定程序起始地址,ORG0000H定义复位入口,ORG0003H–002BH定位各中断向量,确保中断服务程序在硬件规定地址处正确响应,是单片机系统启动配置的关键指令。0000H→002BHEQU符号常量EQU(Equate)为常量赋符号名,如CRYSTALEQU11059200,后续涉及晶振频率的定时器初值计算均可引用符号名,修改时仅需改一处定义,大幅提升代码可维护性与可读性。CRYSTALEQUDB/DW数据定义DB(DefineByte)与DW(DefineWord)在ROM中定义数据表,常用于七段显示码表、串口通信协议帧头、查表算法常量等数据的集中管理,实现程序与数据的分离存储。ROMDATAEND编译边界END标记源程序编译边界,汇编器遇到END后停止处理;BIT伪指令定义可位寻址的符号名,提升位操作指令的可读性,二者共同完善汇编程序的结构化组织。END/BITCHAPTER03指令系统与寻址方式深入理解111条指令的功能分类与7种寻址方式的适用场景AT89S51·ADDRESSINGMODES七种寻址方式详解AT89S51的7种寻址方式覆盖了从立即数嵌入到ROM查表的全部数据获取路径,正确选择寻址方式直接影响代码效率与硬件访问能力——立即寻址适合常数加载,间接寻址实现指针操作,变址寻址支撑查表算法,位寻址提供单引脚原子控制。BASIC基础寻址MOVA,#30H立即寻址:操作数嵌在指令中以#号标识,适合常数加载与初始值设定MOVA,30H直接寻址:用地址直接访问内部RAM或SFR,访问特殊功能寄存器的主要方式MOVA,R0寄存器寻址:通过R0-R7访问当前寄存器组,单字节指令执行速度最快INDIRECT间接与变址寻址MOVA,@R0寄存器间接寻址:@R0/@R1作指针访问内部RAM,实现数据块搬移的基础MOVCA,@A+DPTR变址寻址:@A+DPTR或@A+PC从ROM读取常数表,支撑七段码表与字符表查找MOVXA,@DPTR外部间接寻址:@DPTR/@Ri访问外部RAM与IO,用于扩展存储器与外设通信CONTROL控制与位寻址SJMPrel相对寻址:以PC当前值加8位有符号偏移量跳转,范围-128到+127字节,适合短距离分支SETBP1.7位寻址:操作20H-2FH位寻址区或可位寻址SFR的单个位,实现引脚原子级控制7种方式覆盖从常数加载、指针操作、ROM查表到引脚控制的完整数据获取路径AT89S51·AssemblyInstructions数据传送指令系统数据传送指令是AT89S51汇编编程的核心骨架,MOV系列覆盖内部RAM全部寻址方式,PUSH/POP实现堆栈管理,XCH系列支持数据交换,MOVX和MOVC分别打通外部RAM访问与ROM查表路径,共同构成了完整的数据搬运体系。MOV支持寄存器、直接、间接、立即四种寻址组合,是数据搬运的基础PUSH/POP先入后出堆栈操作,压栈SP+1,弹出SP-1XCH字节交换、低4位交换与高低半字节交换MOVX外部RAM读写,用于扩展存储器访问MOVCROM查表读取常数,七段码表查找核心DPTR16位指针寻址64KB,可拆分为DPH/DPL单片机扩展外部RAM存储器电路板实物AT89S51INSTRUCTIONSET算术运算指令详解AT89S51算术运算指令以累加器A为核心,ADD/ADDC支持单字节与多字节加法,SUBB配合CLRC实现减法,MUL/DIV完成8位乘除法运算,DAA指令在ADD后执行BCD码调整——这组指令是定时器初值计算、传感器数据处理和协议校验的运算基础。单片机数码管显示BCD码实验台实景ADD加法指令ADDA,src与ADDCA,src分别实现不带进位和带进位加法,ADDC在多字节加法中累加低字节的CY进位标志,支持16位及以上数据运算。SUBB减法指令SUBBA,src为唯一减法指令(带借位),执行前必须先CLRC清除CY,否则上次运算的进位会被错误扣除,影响结果准确性。MUL/DIV乘除指令MULAB将A×B结果低8位存A、高8位存B,影响CY和OV;DIVAB将商存A、余数存B,除数为0时OV置1表示溢出。DAA十进制调整DAA必须在ADD后紧跟执行,将A中二进制结果调整为BCD码格式,如67H+56H经DA调整后得到正确BCD结果23H且CY=1。INC/DEC增减指令INC和DEC对操作数加1或减1但不影响任何标志位,常用于循环计数器和数组指针的步进更新,执行速度快且不影响程序状态。AT89S51·INSTRUCTIONSET逻辑运算与移位指令逻辑运算指令通过ANL掩码、ORL置位、XRL翻转实现对数据位的精确操控;移位指令RL/RR/RLC/RRC支持循环与带进位移位,是串行数据收发、CRC校验和位序列处理的核心工具,配合SWAP指令可高效完成BCD码与二进制数之间的格式转换。01逻辑掩码与位操控:ANLA,#0FH用掩码保留低4位、屏蔽高4位;ORLA,#80H强制置位最高位;XRLA,#0FFH实现累加器按位取反。02清零与取反指令:CLRA将累加器清零,CPLA按位取反且不影响标志位,CLRC和CPLC单独操作进位标志位。03循环移位指令:RL/RRA实现8位不带进位循环移位,RLC/RRCA带CY一起9位循环移位,常用于串行位数据逐位收发。04半字节交换:SWAPA交换累加器高低4位,如A=12H经SWAP后变为21H,在BCD码拆包与打包操作中频繁使用。数字逻辑电路实验板·芯片与连线实物CHAPTER04程序设计基本结构用跳转与比较指令构建顺序、分支、循环三大控制流AT89S51Assembly·ControlTransfer控制转移指令体系控制转移指令通过LJMP/AJMP/SJMP实现无条件跳转,通过JZ/JNZ/JC/JNC/JB等实现条件分支,DJNZ将减1与零判断合为一条指令高效构建循环,CJNE在比较的同时设置CY标志实现大小判断——这些指令的组合使用覆盖了所有程序控制流需求。无条件跳转LJMPaddr16·跳转至64KBROM空间任意地址,占3字节,适合跨模块长距离跳转AJMPaddr11·2KB范围内跳转,占2字节,适合子程序调用和大循环体内部跳转SJMPrel·8位有符号偏移量,范围−128~+127字节,占2字节,代码最紧凑条件跳转与循环JZ/JNZ根据A是否为零跳转;JC/JNC根据CY标志跳转,用于算术运算后条件分支JB/JNB根据指定位状态跳转;JBC跳转时自动清除该位DJNZRn减1后判零,非零则跳转,一条指令实现循环计数CJNE比较A与立即数,不等则跳转且设置CY:A<data时CY=1,否则CY=0Chapter16·汇编语言程序设计分支结构程序设计汇编分支结构通过CJNE比较指令与JC/JNC条件跳转的组合实现if-else逻辑,CJNE在比较不相等时跳转并根据大小关系设置CY标志,配合LJMP跳过非匹配分支到达公共出口,可构建任意复杂度的多路条件判断。01两路分支:CJNEA,#threshold,NEXT配合JC/JNC实现——CY=1表示A<阈值走低温分支,CY=0表示A>阈值走高温分支。02多路分支:采用逐级比较-分流结构,每次CJNE后根据结果跳转或继续比较下一个阈值,最终用LJMP跳过剩余分支到达公共出口。03散转分支:用JMP@A+DPTR实现多路跳转表,将分支编号乘以2作为偏移量加到DPTR上,直接跳到对应处理程序入口。04注意事项:各分支代码末尾必须用LJMP跳到公共出口,否则会"穿透"执行下一分支代码导致逻辑错误。单片机连接DS18B20温度传感器实验场景CHAPTER04·LOOPDESIGN循环结构程序设计汇编循环以DJNZ实现计数循环,嵌套可构建精确软件延时——时序精度取决于晶振频率与机器周期的确定关系。01计数循环:MOVR7,#N初始化计数器,循环体末尾DJNZR7,LOOP每次减1判零,非零继续循环,等效于for(i=N;i>0;i--)。02条件循环:在循环体内用CJNE比较或JB/JNB位测试设定退出条件,满足时用SJMP跳出,等效于while循环。03嵌套延时:两层DJNZ嵌套实现毫秒级延时。如12MHz晶振下内层250×2μs=500μs,外层200次=100ms,总延时精确可算。04寄存器保护:循环体内若需使用R2–R7,必须在进入前PUSH入栈保存,退出后POP恢复,避免计数器被循环体代码覆盖。示波器测量单片机GPIO输出时序信号的实验场景SUBROUTINEDESIGN子程序设计与参数传递子程序通过ACALL/LCALL调用与RET返回实现代码复用,参数传递支持寄存器、间接地址、直接地址和堆栈四种方式;现场保护与恢复是子程序设计的工程铁律——入口PUSH保存、出口POP恢复,否则寄存器值被篡改将导致主程序逻辑崩溃。2/3字节ACALLaddr11在2KB范围内调用(占2字节),LCALLaddr16可调用64KB空间任意子程序(占3字节),CPU自动将返回地址压栈REGISTER入口参数通过A/R0-R7传入,出口参数通过A/R0-R7返回,速度最快但寄存器数量有限STACK主程序PUSH参数入栈,子程序POP取出,适合多层嵌套调用且不影响寄存器状态PUSH/POP子程序入口PUSHPSW和所用寄存器,出口前POP恢复,确保主程序寄存器状态不被破坏单片机实验箱·模块化设计CHAPTER05中断系统与定时器编程掌握5源中断系统的配置流程与双定时器的精确时基控制AT89S51·InterruptSystem中断系统架构与配置AT89S51的5源中断系统通过硬件向量地址实现快速响应,IE寄存器控制中断使能(EA为总开关),IP寄存器设定两级优先级,TCON/SCON寄存器管理触发方式与中断标志——正确配置这些SFR是中断服务程序能被正确触发和执行的前提。AT89S51中断源与向量地址对照表中断源向量地址IE使能位标志位触发方式外部中断0(INT0)0003HEX0(IE.0)IE0(TCON.1)低电平/下降沿(IT0控制)定时器0溢出(TF0)000BHET0(IE.1)TF0(TCON.5)计数器溢出自动置位外部中断1(INT1)0013HEX1(IE.2)IE1(TCON.3)低电平/下降沿(IT1控制)定时器1溢出(TF1)001BHET1(IE.3)TF1(TCON.7)计数器溢出自动置位串行口(RI/TI)0023HES(IE.4)RI/TI(SCON)接收完成/发送完成5个中断源各有固定向量地址,硬件响应中断后自动跳转至对应地址执行ISRInterruptServiceRoutine中断服务程序编程规范中断服务程序必须遵循"向量跳转→保护现场→服务逻辑→恢复现场→RETI返回"的五步规范流程,其中RETI指令不可替代RET。STEP01向量入口在ORG0003H/000BH等向量地址处放置LJMPISR_LABEL,将控制流跳转到实际中断服务程序所在位置。LJMPSTEP02保护现场ISR入口PUSHACC、PUSHPSW及所有被修改的R0–R7寄存器,防止中断服务代码覆盖主程序数据。PUSHSTEP03恢复现场ISR出口前按相反顺序POP各寄存器,确保主程序恢复执行时所有寄存器状态与中断前完全一致。POPSTEP04RETI返回RETI弹出返回地址并清除中断优先级触发器;误用RET将导致同级中断被永久屏蔽。RETI≠RETTIMERCONFIGURATION定时器工作原理与模式配置AT89S51双定时器通过TMOD寄存器配置四种工作模式,模式1(16位)和模式2(8位自动重装)最常用——定时时间由(最大计数值-初值)×机器周期精确决定,12MHz晶振下模式1最大可定时65.536ms,超出需求时需配合软件计数器进行多次中断累加。定时器四种工作模式对比模式位宽最大计数特点典型应用模式013位8192TH高8位+TL低5位,兼容8048极少使用,历史遗留模式116位65536TH+TL全16位,溢出后需重装初值精确定时、PWM生成模式28位自动重装256TL计数溢出后自动从TH重装串口波特率发生器模式3双8位(仅T0)256×2T0拆为两个独立8位定时器需要额外定时器资源时模式1适合精确定时,模式2适合波特率发生,模式0和模式3使用频率较低TIMERINTERRUPT定时器中断编程实战案例以T0模式1实现1秒定时为例,50ms单次定时初值为3CB0H(12MHz晶振),中断服务程序中重装初值并累加软件计数器,计满20次后翻转LED——这一"硬件定时+软件计数"的组合模式是单片机精确时基控制的标准范式。01初始化配置TMOD设置01H选择T0模式1(16位定时器),GATE=0由TR0软件控制启停装入初值TH0=3CH、TL0=B0H(50ms@12MHz),开中断SETBET0、SETBEA,启动SETBTR0R7初始化为20作为软件计数器,每次中断减1,减到0表示累计1秒到达02中断服务程序ISR入口重装初值TH0=3CH、TL0=B0H(模式1溢出后不自动重装,必须手动重装)DJNZR7,EXIT递减软件计数器,未到20次直接退出等待下次中断计满20次时CPLP1.0翻转LED引脚状态,MOVR7,#20重置计数器,RETI返回T0定时器控制LED闪烁·面包板实验场景CHAPTER06综合案例与工程实践通过完整项目案例将指令系统、程序结构与中断定时器知识融会贯通CASESTUDY·01案例一:P1口流水灯控制流水灯项目综合运用数据传送、循环移位与软件延时三大基础技能,移位法代码紧凑适合规则模式,查表法灵活度高适合自定义亮灭序列——两种实现思路代表了汇编编程中"计算"与"查表"两种核心数据生成策略。移位法实现01初始化MOVA,#0FEH让最低位LED先亮(低电平驱动),MOVP1,A输出到P1口02循环体中RLA循环左移一位,MOVP1,A更新输出,调用延时子程序后SJMP回循环起点03移位法代码仅占约10字节,执行效率高,但只能实现规则的逐位移位流水效果RLA·约10字节查表法实现01在ROM中用DB定义8个状态字节(0FEH,0FDH,0FBH…),DPTR指向表首地址02循环中MOVA,R0取索引,MOVCA,@A+DPTR查表取状态值,MOVP1,A输出,R0递增后模8循环03查表法可自定义任意亮灭模式(如呼吸灯、对称闪烁),只需修改ROM中的数据表即可,灵活性远超移位法MOVC·灵活度高CASESTUDY02案例二:数码管动态扫描显示数码管动态扫描利用人眼视觉暂留效应,通过定时器中断以2ms间隔逐位切换显示,8位数码管一轮扫描16ms达到62Hz刷新率单片机驱动多位数码管显示的电路板模块实物01七段码表DB3FHROM中用DB定义0-9的段选编码,MOVCA,@A+DPTR根据数字索引查出对应段码02位选切换P2口输出R0作为位指针指向当前数码管,每次中断R0加1模8循环,P2口输出位选信号03中断驱动T02msT0模式2(8位自动重装)定时2ms中断,ISR中完成取数→查表→送段码→送位选04消影处理P2=0FFH切换位选前先关闭所有位选(P2=0FFH),送新段码后再开启下一位,避免鬼影AT89S51·CASESTUDY案例三:4×4矩阵键盘扫描矩阵键盘扫描通过行线逐行输出低电平、列线读取按键状态实现16键检测,行扫描用RLA移位实现,列检测用JNB逐位判断——整个程序融合了I/O操作、循环移位、条件分支与延时消抖,是顺序/分支/循环三种基本结构的综合应用典范。01P1高4位全输出低电平,读低4位判断是否有键按下,全高则无按键,有低则进入逐行扫描流程全扫检测02检测到按键后调用10ms延时子程序,再次读取列线确认按键仍在按下状态,排除机械抖动引起的误触发10ms03R2初始化为4控制行数,每次RLA将低电平扫描信号移到下一行,读列线用JNBP1.0~P1.3判断列号RLA移位04行号×4+列号得到0-15的唯一键值,存入显示缓冲区或作为功能分支索引号,用JMP@A+DPTR跳转到对应处理程序0–15键值4×4矩阵键盘连接单片机实验板实物场景AT89S51·SerialCommunication案例四:UART串口通信编程AT89S51串口方式1(8位UART)由定时器1模式2提供波特率时钟,12MHz晶振下TH1=FDH产生9600bps——收发逻辑集成在0023H向量处的串口中断服务程序中。01·初始化配置定时器配置:TMOD设置20H选择T1模式2(自动重装),TH1=TL1=FDH产生9600bps波特率(12MHz晶振)串口配置:SCON设置50H选择方式1(8位UART),REN=1允许接收,SMOD位决定是否波特率加倍中断使能:SETBEA、SETBES开启串口中断,SETBTR0启动定时器1,串口即可收发数据02·收发实现单片机通过RS232转接模块进行串口通信发送:MOVSBUF,A将累加器数据写入发送缓冲器,JBCTI,DONE等待发送完成标志TI自动置位后清除接收:中断方式下RI置位触发0023H向量跳转,ISR中MOVA,SBUF读取接收数据并CLRRI清除标志协议处理:可在ISR中实现帧头检测(0xAA)、数据长度校验和CRC校验等简单通信协议逻辑CASESTUDY·ADC0809案例五:ADC0809模数转换驱动ADC0809作为外部IO设备通过MOVX指令与AT89S51交互——写操作启动转换并选择通道,读操作获取8位数字量,EOC引脚状态决定查询或中断两种等待策略,完整的驱动流程体现了外部IO寻址、状态查询与数据处理的汇编编程范式。ADC0809模数转换芯片·8通道·8位分辨率01通道选择与启动:MOVR0,#7FH指向ADC0809地址,MOVA,#channel选通道,MOVX@R0,A写入启动转换MOVX@R0,A02等待转换完成:查询方式用JBP3.3,$循环等待EOC引脚变高;中断方式将EOC接INT0,中断触发后读取数据JBP3.3,$03读取转换结果:MOVXA,@R0从ADC0809读取8位数字量(0-255),存入显示缓冲区或参与后续运算0–25504标度变换:MULAB将数字量乘以参考电压系数,5V量程下实际电压=数字量×5/255,用乘除法指令组合实现V=D×5/255ComprehensiveProject综合项目:60秒倒计时计时器60秒倒计时系统以T0定时器中断为时基核心,主程序轮询按键实现启动/暂停控制,中断服务程序完成秒计数递减与数码管刷新——定时器、中断、显示、按键四大模块通过共享RAM单元协同工作,体现了嵌入式系统的状态机设计思想。系统架构01T0模式1定时50ms中断,软

温馨提示

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

最新文档

评论

0/150

提交评论