单片机接口及其技术复习要点.docx_第1页
单片机接口及其技术复习要点.docx_第2页
单片机接口及其技术复习要点.docx_第3页
单片机接口及其技术复习要点.docx_第4页
单片机接口及其技术复习要点.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1什么是单片机!在一块集成电路芯片上集成微处理器、存储器I/O接口电路,从而构成了单芯片微型计算机。其特点是:体积小、控制功能强,性价比高,其非凡的嵌入式应用形态对于满足应用式需求具有独特的优势.280C51单片机的基本结构,包括CPU系统(1 8位CPU,含布尔处理器2 时钟电路3 总线控制)、存储器系统(1 4k字节的数据存储器(ROM/EPROM/Fash、可外扩至64k)2 128字节的数据存储器(RAM, 可外扩至64k),3特殊功能寄存器SPR) I/O口等和其他功能单元(四个并行I/O口,2两个十六位定时/计数器。3一个全双工异步并行口(UART),4中断系统(五个中断源,两个优先级).3 80C51单片机的复位操作及其复位后的状态 复位是使单片机或系统中的其他部件处于某种确定的初始状态,其工作就是从复位开始的。复位操作有两种基本形式一是上电位,要求接通电源后单片机自动实现复位操作。二是上电与按键均有效的复位。实际应用中如果在单片机断电后,有可能在较短的时间内再次充电可以在R1上并接一个二极管,可以有效地提高此种情况下复位的可靠性。单片机复位后的状态 单片机的复位操作时单片机进入初始化状态。初始化后,程序计数器PC=0000H,所以程序从0000h地质单元开始执行。单片机启动后,片内的ram为随机值运行中的复位操作不改变ram的内容。复位后寄存器的状态时确定的p0-P3=FFH,SP为07h,sbuf 不定,ip ie 和pcon的有效值为0,其余的特殊功能寄存器状态均为00h。 PC = 0000H RAM:随机值(运行中复位不改变RAM内容) SFR: P0P3=FFH SP=07H IP、IE和PCON:有效位为0 PSW=00H(状态确定) 相应的意义:P0P3=FFH,相当于各口锁存器已写入1,此时不但可以使出,也可以输入。SP=07F堆栈指针指向片内RAM的07H单元(入栈的内容将写入08H单元)IP、IE和PCON的有效位为0,个中断源处于低优先级且均被关断、串行通信的波特率不加倍。PSW=00H,当前工作寄存器为零组。4 80C51单片机的数据存储器配置,包括工作寄存器 区、位寻址区等。80C51单片机的数据存储器也分为片内、外两部分。对于基本型的单片机,共有片内ram128字节,分为工作寄存器区、位寻址区、通用RAM区三部分,寻址范围为00H-7FH。对于增强型的单片机,共有256字节,低128字节地址范围00H-7FH与基本型相同。对于高128字节80H-FFH只能采取间接寻址方式访问(旨在与SFR的访问相区别)。片外RAM地址空间为64KB,地址范围0000H-FFFFH。访问片外RAM时采用专门的指令MOVX实现,这时读/RD或写/WR信号有效;访问片内RAM时使用MOV指令,无读写信号产生。工作寄存器区(含寄存器组03)寄存器组0:地址00H07H寄存器组1:地址08H0FH寄存器组2:地址10H17H寄存器组3:地址18H1FH。工作寄存器组共32个字节,分四个工作寄存器组,每组占8个单元,分别称为:R0、R1R7。当前工作寄存器组的选择由特殊功能寄存器中的程序状态寄存器psw的rsi、rso来决定。位寻址区片内RAM位寻址区共16个字节,人们常将程序状态寄存器标志、位控制变量设在位寻址区内。对于该区未用到的单元也可以作为通用RAM使用。通用RAM区 30H7FH,共80字节 数据缓冲 堆栈 SP指示栈顶 复位时SP=07H 系统初始化通常重新设置,RAM内容查看 MAIN:MOV R7,#16 MOV A,#00H MOV R0,#30H LOOP:MOV R0,A INC R0 INC A DJNZ R7,LOOP SJMP $ END5 80C51单片机的时钟,包括其产生、表现。产生:一是内部时钟方式 二是外部时钟方式。表现。外部 只要在单片机的XTAL1和XTAL2引脚外接晶振即可。晶振CYS的晶振频率要小于12MHz,典型值为6MHz12MHz或11.0592MHz。80C51的单片机时钟信号 1个机器周期:12个晶荡周期(或6个时钟周期)。指令的执行时间称作指令周期 (单、双、四周期)晶振信号经分频后形成两个错开的信号P1和P2. P1和P2的周期也称为S中状态,它是周期的2倍,及一个S状态包含两个晶振周期。晶振信号12分频后形成机器周期,即一个机器周期包含12个晶荡周期。指令的执行时间称作指令周期。6 80C51单片机的中断源、中断优先级以及中断允许与 优先级控制。单片机的中断源:计算机具有实时处理的能力能对外界发生的事件进行及时的处理需要靠计算机的中断系统来实现。中断的处理过程描述为!CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理(中断服务)完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。能够向CPU发出中断申请的部件称为中断源。中断允许控制:cpu对中断系统所有中断以及某个中断源的开放和屏蔽是由允许寄存器ie控制的。Ie的状态可通过程序由软件设定。中断优先级控制:80c51单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的优先级都是由中断优先级寄存器ip中的相应位来规定的。80C51单片机的中断优先级有三条原则:CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。正在进行的低优先级中断服务,能被高优先级中断请求所中断。为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器,其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。中断响应的条件: 无同级或高级中断正在服务 有中断请求信号 相应的中断源已打开,即EA=1,中断源对应中断允许位也为1。 当前的指令周期已经结束 如果当前指令为RETI或访问IE和IP的指令,至少还要再执行完一条指令。中断响应时间:自中断源提出中断申请,到cpu响应中断,需要经历一定的时间,如果中断响应过程受阻就要增加等待时间,。若同级或高级中断正在进行需要的附加时间取决于正在执行的终端服务程序的长短,等待的时间不确定;若没有同级或高级中断正在进行所需要的附加等待时间在三至五个机器周期。原因:若查询周期不是在执行的指令的最后机器周期附加等待时间不会超过三个机器周期,2 若查询机器周期恰逢reti或访问ip、Ie指令,而这类指令之后又跟着mul或div指令,则由此引起的附加等待时间不会超过五个机器周期。中断响应过程:cpu中断响应过程如下:将相应优先级状态触发器置1(以阻断后来的同级或低级的中断请求)执行硬件LCALL指令(pc入栈保护断点,将相应中断服务程序入口地址送pc)执行中断服务程序。中断返回:中断服务的程序的最后一条指令必须是中断返回指令reti。Reti指令能使cpu结束中断服务的执行。其功能是将断点地址从堆栈弹出送pc,cpu从原断点继续执行程序。将相应优先级状态触发器清零,恢复原来工作状态。7 80C51单片机的寻址方式。寻址方式有七种:寄存器寻址,直接寻址,寄存器间接寻址,立即寻址,变址寻址,相对寻址和位寻址,8 80C51单片机的数据传送指令,MOV、MOVC、MOVX、PUSH、POP等。数据传送是进行数据处理的最基本操作,这类指令一般不影响标志寄存器psw的状体。传送指令分两大类,一是采用mov操作符,为一般传送指令;二是采用非mov操作符,称为特殊传送指令。MOV、MOVC、MOVX、PUSH、POP等为特殊传送指令;读取rom中常数表的表项指令movc,读取片外ram及接口单元数据的指令movx,堆栈操作指令push和pop:堆栈是在内部ram、中按“先进先出”的规则组织的一片存储区,此区的一端固定,称为栈底,另一端是活动的称为栈顶,栈顶的位置由栈指针sp指示。在80c51中,堆栈设置在片内低端的128个单元,且生长方向是向上的。程序汇编的步骤:1. 分析问题针对现有条件,明确程序设计时应该“做什么”2. 确定算法解决“怎样做”的问题 3. 绘制程序流程图用图形的方法描绘解决问题的思路4. 分配内存单元确定程序和数据区的起始地址 5. 编写源程序用指令的形式将程序流程图实现出来6. 汇编用开发机或仿真器将源程序转换成机器码,便于单片机识别7. 在线仿真调试查错、改错,对程序进行优化。程序编制的方法与技巧:尽量采用模块化程序设计方法;是把一个完整的程序分成若干个功能相对独立的、较小的程序模块,对各个程序模块分别进行设计、编制程序和调试,最后把各个调试好的程序模块装配起来进行联调,最终成为一个有实用价值的程序。模块化程序设计的优点是:对单个程序模块设计和调试比较方便、容易完成,一个模块可以被多个任务共用。尽量采用循环结构和子程序结构;采用循环结构和子程序结构,可以使程序的总容量减小,提高程序的效率,节省内存。尽量少用无条件转移指令;少用无条件转移指令,可以保证程序的条理更加清晰,从而减少错误发生。充分利用累加器;累加器是主程序和子程序之间信息传递的桥梁,利用累加器传递入口参数或返回参数比较方便。这时,一般不要把累加器内容压入堆栈。对于通用子程序要保护现场;由于子程序的通用性,除了保护子程序入口参数的寄存器内容外,还要对子程序中用到的其它寄存器内容一并入栈保护。对于中断处理,还要保护程序状态字在中断处理程序中,既要保护处理程序中用到的寄存器内容,还要保护程序状态字PSW。否则,当中断服务程序执行结束返回主程序时,整个程序的执行可能会被打乱。汇编语言的语句格式:80C51单片机汇编语言的语句行由4个字段组成,汇编程序能对这种格式正确地进行识别。这4个字段的格式为:标号: 操作码操作数 ;注释括号内的部分可根据实际情况取舍,各字段之间要用分隔符分隔。可用作分隔符的符号有冒号、空格、逗号、分号等。1、标号标号是指令的符号地址。有了标号,程序中的其它语句才能很方便地访问该语句。有关标号的规定为:标号要由18个ASCII码字符组成,但必须以字母开头,其余字符可以是字母、数字或其它特定字符。不能使用汇编语言已经定义了的符号作为标号,如指令助记符MOV、伪指令记忆符END以及寄存器的符号名称R1等。标号后边必须跟冒号。同一标号在一个程序中只能定义一次,不能重复定义。2、操作码 操作码用于规语句执行的操作。它用指令助记符或伪指令助记符表示,是汇编语句中唯一不能空缺的部分。3、操作数操作数用于给指令的操作提供数据或地址。在一条语句中,可能没有操作数,可能只有1个操作数,还可能同时包含23个操作数。各操作数之间要以逗号分隔。操作数一般以下面几种形式出现:常数工作寄存器名特殊功能寄存器名标号名符号“$”,表示程序计数器PC的当前值。如:SJMP $ 表达式4注释注释不属于语句的功能部分,它只是对语句的解释说明,只要用“;”开头,就表明以下为注释内容。使用注释可使程序文件的编制显得更加清楚,便于编程人员的阅读和维护。注释的长度不限,一行不够可以换行接着书写,但换行后仍要以“;”开头。源程序的编辑和汇编由于通用微型计算机的普及,现在单片机应用系统的程序设计都借助于通用微型计算机。全过程可概括为“机器编辑交叉汇编串行传送”三个部骤,基本程序结构:程序结构通常分为三种形式:顺序结构、分支结构、循环结构。顺序程序 顺序程序是最简单的程序结构,它既无分支,又无循环,在执行时单片机是按程序中指令的顺序逐条进行的。分支程序 分支结构可以分成单分支、双分支和多分支几种情况。分支程序在单片机系统中应用较多,在编程时有许多技巧,设计要点如下:(1)先建立可供条件转移指令测试的条件。(2)选用合适的条件转移指令。(3)在转移的目的地址处设定标号。循环程序 按某种控制规律重复执行的程序称为循环程序。循环程序 有先执行后判断和先判断后执行两种基本结构。1.循环初值(初始化)规定循环体中各控制变量的初始状态。2.循环处理(循环体)这是循环程序需要重复执行的部分。对这部分编程的时候要注意两个问题:指令要具有通用性,程序要便于修改。程序尽可能简化。3.循环修改 循环程序每执行一次,都要对数据的地址指针、循环次数等作一次修改,这就是循环修改。4.循环控制 根据循环结束条件,判断循环是否结束。常用作循环控制的变量是循环次数。例1 设内部RAM中(50H)=40H,(40H)=10H,P1口作输入口,(P1)=0ABH,问程序执行后各存储器中的数据是什么?MOV R0,#50H;立即数50H送R0中,(R0)=50HMOV A,R0;R0间接寻址,将50H单元内容送A,(A)=40HMOV R1,A;A送R1,(R1)=40HMOV B,R1;R1间接寻址,将40H单元内容送B,(B)=10HMOV R1,P1;将P1内容送40H单元,(40H)=0ABHMOV P2,P1;将P1内容送P2 ,(P2)=0ABH执行结果:(R0)=50H,(A)=40H,(R1)=40H(B)=10H,(P1)=0ABH,(40H)=0ABH(P2)=0ABH例把片外RAM的36H单元中的数据送到片外RAM的1200H单元。分析(36H)(1200H)程序如下:MOV R1,#36HMOVX A ,R1MOV DPTR,#1200HMOVX DPTR, A例设(60H)=X,(70H)=Y,试用堆栈指令实现60H和70H单元内容的互换。MOV SP,#50H ;设栈底PUSH 60H ;51H(60H),X压入51H单元PUSH 70H ;52H(70H),Y压入52H单元POP 60H ;60H(52H),Y弹出进入60H单元POP 70H ;70H(51H),X弹出进入70H单元例若(A)=84H,(30H)=8DH,执行指令ADD A,30H 之后,即:(A)=11H,(CY)=1,(AC)=1,(OV)=1(D7有进位,D6无进位),(P)=0。【例】若(A)0110 1001B,表示的BCD码为BCD (69)(R2)0101 1000B,表示的BCD码为BCD (58) ,执行指令:ADD A,R2DA A(A)0010 0111B,即BCD (27) 且(CY)1,即正确的结果为:127例若(A)0101 0110B,表示的BCD码为(56)BCD,(R2)0110 0111B,表示的BCD码为(67)BCD,(CY)0。执行以下指令:ADD A,R2DA A由于(A)0010 0011B,即,且(CY)1,结果为BCD数123例若(A)=C9H,(R2)=54H,(CY)=1,执行指令SUBB A,R2即:(A)=74H,(CY)=0,(AC)=1,(OV)=1(位6有借位,位7无借位),(P)=0。例若(A)=50H,(B)=A0H,执行指令MUL AB 之后,(A)=00H,(B)=32H,(OV)=1,(CY)=0。例若(A)=FBH(251),(B)=12H(18),执行指令DIV AB 之后,(A)=0DH,(B)=11H,(OV)=0,(CY)=0。例若(A)=C3H,(R0)=AAH,执行指令ANL A,R0 之后,(A)=82H例若(A)=C3H,(R0)=55H,执行指令ORL A,R0 之后,(A)=D7H例若(A)=C3H,(R0)=55H,执行指令ORL A,R0 之后,(A)=D7H例若(A)=A5H,执行指令CLR A 之后,(A)=00H。例8 编程实现将P1口低4位的值存入30H单元,屏蔽高4位。MOV A,P1ANL A,#0FHMOV 30H,A例编程实现将P1口低4位的值保持不变,而高4位置1。结果存入30H单元。MOV A,P1ORL A,#0F0HMOV 30H,A例编程实现将P1口的高4位取反,而低4位保持不变,结果存入40H单元。MOV A,P1XRL A,#0F0HMOV 40H,A例:若(A)= BDH = 1011 1101B,(CY)0。执行指令RLC A后,(CY)=1,(A)= 01111010B = 7AH,(CY)1。结果为:17AH(378)2BDH(189)例有一段程序如下:MOV 23H,#0AHCLR ALOOPX:ADD A,23HDJNZ 23H,LOOPXSJMP $该程序执行后:(A)=10+9+8+7+6+5+4+3+2+1=37H例若(CY)=1,(P3)=1100 0101B,(P1)=00110101B。执行以下指令:MOV P1.3,CMOV C,P3.3MOV P1.2,C结果为:(CY)=0,P3的内容未变,P1的内容变为00111001B。例若(P1)=1001 1101B。执行指令CLR P1.3后,结果为:( P1 )=1001 0101B。例若(P1)=1001 1100B。执行指令SETB P1.0 后,(P1)1001 1101B。例若(P1)=1001 1100B,(CY)1。执行指令ANL C, P1.0 后,结果为:P1 内容不变,而(CY)0。11、若(R1)=30H,(A)=40H,(30H)=60H,(40H)=08H。试分析执行下列程序段后上述各单元内容的变化。MOV A,R1MOV R1,40HMOV 40H,AMOV R1,#7FH答:(R1)=7FH(A)=60H(30H)=08H(40H)=60H12、若(A)=E8H,(R0)=40H,(R1)=20H,(R4)=3AH,(40H)=2CH,(20)=0FH,试写出下列各指令独立执行后有关寄存器和存储单元的内容?若该指令影响标志位,试指出CY、AC、和OV的值。(1)MOV A,R0(2)ANL 40H,#0FH(3)ADD A,R4(4)SWAP A(5)DEC R1(6)XCHD A,R1答:(1)(A)=2CH(2)(40H)=0CH(3)(A)=22H,(CY)=1,(AC)=1,(OV)=0(4)(A)=8EH(5)(20H)=0EH,P=1(6)(A)=EFH,(20)=08H把BLOCK单元开始存放的10个无符号数进行求和,并将结果存入SUM单元.的编程:LEN EQU 10SUM EQU 21HBLOCK EQU 22HCLR AMOV R7,LENMOV R0,BLOCKLOOP:ADD A,R0INC R0DJNZ R7,LOOPMOV SUM,AEND。例2 数据传送将地址为2000H、2001H、2002H的片外数据存储单元内容分别传送到2002H、2003H和2004H单元中。ORG 0000HAJMP 0100H ;转到主程序起始地址ORG 0100HMOV DPTR, #2002H ;最后一个数据的起始地址MOVX A,DPTR ;2002H单元的数据送AMOV DPTR, #2004H ;最后一个数据的目的地址MOVX DPTR,A ;2002H单元的数据送2004H单元MOV DPTR, #2001H ;中间数据的起始地址MOVX A,DPTR ;2001H单元的数据送AMOV DPTR, #2003H ;中间数据的目的地址MOVX DPTR,A ;2001H单元的数据送2003H单元MOV DPTR, #2000H ;第一个数据的起始地址MOVX A,DPTR ;2000H单元的数据送AMOV DPTR, #2002H ;第一个数据的目的地址MOVX DPTR,A ;2000H单元的数据送2002H单元SJMP $END例3 查表程序 有一变量存放在片内RAM的20H单元,其取值范围为:00H05H。要求编制一段程序,根据变量值求其平方值,并存入片内RAM的21H单元。程序如下:#2000H DPTR(20H) A(A+DPTR) AA 21H开始结束ORG 1000HSTART:MOV DPTR,#2000HMOV A,20HMOVC A,A+DPTRMOV 21H,ASJMP $ORG 2000HTABLE:DB 00,01,04,09,16,25END。例4已知30H单元存有8位二进制数的BCD码,请将其转换为共阴显示的字形码,然后从P1 口输出。设这些字形码存放在标号为TABLE 的存储单元。ORG 0000HAJMP MAIN ;转到主程序起始地址ORG 0100HMAIN:MOV DPTR, #TABLE ;字形码表首地址送DPTRMOV A,30H ;取数MOVC A,A+DPTR ;查表取值送AMOV P1, A ;字形码送P1SJMP $TABLE:DB 3FH,06H,5BH,4FH,66H;04共阴字形码DB 6DH,7DH,07H,7FH,6FH;59共阴字形码END双字节无符号数加法。设被加数存放在内部RAM的51H、50H单元,加数存放在内部RAM的61H、60H单元,相加的结果存放在内部RAM的51H、50H单元,进位存放在位寻址区的00H位中。程序段如下:MOV R0,50H ;被加数的低字节地址MOV R1,60H ;加数的低字节地址MOV A,R0 ;取被加数低字节ADD A,R1 ;加上加数低字节MOV R0,A ;保存低字节相加结果INC R0 ;指向被加数高字节INC R1 ;指向加数高字节MOV A,R0 ;取被加数高字节ADDC A,R1 ;加上加数高字节(带进位加)MOV R0,A ;存高字节相加结果MOV 00H,C ;保存进位。例6 求单字节有符号数的二进制补码。设有一个单字节二进制数存于A中。例7: 已知内RAM30H单元存有一个ASCII码,试对其进行判断,如果是“$”(24H),将其存入40H,否则存入31H单元。程序如下:ORG 0000HAJMP MAINORG 0100HMAIN:MOV A,30HCJNE A,#24H,DY31 ; 不是“$”,转去ZY31MOV 40H,A ;是“$”,存入40H单元AJMP END0DY31:MOV 31H,A ; 不是$,存入31H单元END0:SJMP $END例8 设变量x 以补码的形式存放在片内RAM的30H单元,变量y 与x 的关系是:当x 大于0时,y =x;当x =0时,y =20H;当x 小于0时,y =x+5。编制程序,根据x 的大小求y并送回原单元。程序段如下:START:MOV A,30HJZ NEXTANL A,#80H ;判断符号位JZ LPMOV A,#05HADD A,30HMOV 30H,ASJMP LPNEXT:MOV 30H,#20HLP:SJMP $例9 编程实现以下数据传送功能:将BUF为起始地址的50个数取反后,传送到以DATA为起始地址的内存单元中。程序如下:START:MOV R0,#SBUF ;数据的源地址MOV R1,#DATA ;数据的目的地址MOV R7,#50 ;循环次数LOOP:MOV A,R0 ; 源地址中数据送ACPL A ;取反MOV R1 , A ;取反后的数据送目的地址INC R0 ;源地址加1,准备取下一个数INC R1 ;目的地址加1,准备接收下一个数DJNZ R7 ,LOOP ;循环结束?未结束重新取数RET例10 50ms延时程序。若晶振频率为12MHz,则一个机器周期为1s。执行一条DJNZ指令需要2个机器周期,即2s。采用循环计数法实现延时,循环次数可以通过计算获得,并选择先执行后判断的循环结构。程序段如下:DEL:MOV R7,#200 ;1 sDEL1:MOV R6,#123 ;1 sNOP ;1 sDEL2:DJNZ R6,DEL2 ;2s,计(2123)sDJNZ R7,DEL1 ;2s,RET共计(21232 2)200+1 s,即50.001ms例11 无符号数排序程序。在片内RAM中,起始地址为30H的8个单元中存放有8个无符号数。试对这些无符号数进行升序排序 数据排序常用的方法是冒泡排序法。设R7为比较次数计数器,初始值为07H,位地址00H为数据互换标志位。START:CLR 00H ;互换标志清0MOV R7,#07H ;各次冒泡比较次数MOV R0,#30H ;数据区首址LOOP:MOV A,R0 ;取前数MOV 2BH,A ;暂存INC R0MOV 2AH,R0 ;取后数CLR CSUBB A,R0 ;前数减后数JC NEXT ; 前数小于后数,不互换MOV R0,2BHDEC R0MOV R0,2AH ;两数交换INC R0 ;准备下一次比较SETB 00H ;置互换标志NEXT:DJNZ R7,LOOP ;进行下一次比较JB 00H,START ;进行下一轮冒泡SJMP $例将内部RAM中起始地址为data的数据串传送到外部RAM中起始地址为buffer的存储区域内,直到发现$ 字符停止传送。程序段如下:MOV R0,#dataMOV DPTR,#bufferLOOP0:MOV A,R0CJNE A,#24H,LOOP1 ;判断是否为 $ 字符SJMP LOOP2 ;是 $ 字符,转结束LOOP1:MOVX DPTR,A ;不是 $ 字符,执行传送INC R0INC DPTRSJMP LOOP0 ;传送下一数据LOOP2: 例编写程序,实现c=a2+b2 。设a,b,c分别存于内部RAM的30H,31H,32H三个单元中。程序段如下:START:MOV A,30H ;取aACALL SQR ;调用查平方表MOV R1,A ;a2 暂存于R1中MOV A,31H ;取bACALL SQR ;调用查平方表ADD A,R1 ;a2+b2 存于A中MOV 32H,A ;存结果SJMP $SQR :MOV DPTR,#TAB ;子程序MOVC A,A+DPTR ;RETTAB :DB 0,1,4,9,16 ,25,36,49,64,81例将R0和R1指向的内部RAM 中两个3字节无符号整数相加,结果送到由R0指向的内部RAM中。入口时,R0和R1分别指向加数和被加数的低位字节;出口时,R0指向结果的高位字节。低字节在高地址,高字节在低地址。实现程序:NADD:MOV R7,#3 ;三字节加法CLR C ;NADD1:MOV A,R0 ;取加数低字节ADDC A,R1 ;被加数低字节加AMOV R0,A ;DEC R0DEC R1DJNZ R7,NADD1INC R0RET例把内部RAM中20H单元中的1个字节十六进制数转换为2位ASCII码,存放在R0指示的两个单元中。MAIN:MOV A,20H ;SWAP APUSH ACC ;参数入栈ACALL HEASCPOP ACCMOV R0,A ;存高位十六进制数转换结果INC R0 ;修改指针PUSH 20H ;参数入栈ACALL HEASCPOP ACCMOV R0,A ;存低位十六进制数转换结果SJMP $HEASC:MOV R1,SP ;借用R1为堆栈指针DEC R1DEC R1 ;R1指向被转换数据XCH A,R1 ;取被转换数据ANL A,#0FH ;取一位十六进制数ADD A,#2 ; 所加值为MOVC与DB间字节数MOVC A,A+PC ;查表XCH A,R1 ;1字节指令,存结果于堆栈RET ;1字节指令ASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H例多字节无符号数的加法。设两个N字节的无符号数分别存放在内部RAM中以DATA1和DATA2开始的单元中。相加后的结果要求存放在DATA2数据区。MOV R0,#DATA1 ;MOV R1,#DATA2 ;MOV R7,#N ; 置字节数CLR C ;LOOP:MOV A,R0 ;ADDC A,R1 ;求和MOV R1,A ;存结果INC R0 ;修改指针INC R1 ;DJNZ R7, LOOP ;例多字节无符号数的减法。设两个N字节的无符号数分别存放在内部RAM中以DATA1和DATA2开始的单元中。相减后的结果要求存放在DATA2数据区。MOV R0,#DATA1 ;MOV R1,#DATA2 ;MOV R7,#N ;置字节数CLR C ;LOOP:MOV A,R0 ;SUBB A,R1 ;求差MOV R1,A ;存结果INC R0 ;修改指针INC R1 ;DJNZ R7, LOOP ;例将1位十六进制数转换成相应的ASCII码。设十六进制数存放在R0中,转换后的ASCII 码存放于R2中。实现程序如下:HASC:MOV A,R0 ;取4位二进制数ANL A,#0FH ;屏蔽掉高4位PUSH ACC ;4位二进制数入栈CLR C ;清进(借)位位SUBB A,#0AH ;用借位位的状态判断该数在09还是AF之间POP ACC ;弹出原4位二进制数JC LOOP ;借位位为1,跳转至LOOPADD A,#07H ;借位位为0,该数在AF之间,加37HLOOP:ADD A,#30H ;该数在09之间,加30HMOV R2,A ;ASCII码存于R2RET例将多位十六进制数转换成ASCII码。设地址指针R0指向十六进制数低位,R2中存放字节数,转换后地址指针R0指向十六进制数的高位。R1指向要存放的ASCII码的高位地址。实现程序如下:HTASC:MOV A,R0 ;取低4位二进制数ANL A,#0FH ;ADD A,#15 ;偏移量修正MOVC A,A+PC ;查表MOV R1,A ;存ASCII码INC R1 ;MOV A ,R0 ;取十六进制高4位SWAP AANL A,#0FH ;ADD A,#06H ;偏移值修正MOVC A,A+PC ;MOV R1,AINC R0 ;指向下一单元INC R1 ;DJNZ R2,HTASC ;字节数存于R2RETASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H例双字节二进制数转换成BCD码。设(R2R3)为双字节二进制数,(R4R5R6)为转换完的压缩型BCD码。DCDTH:CLR A ;MOV R4,A ;R4清0MOV R5,A ;R5清0MOV R6,A ;R6清0MOV R7,#16 ;计数初值LOOP:CLR C ;MOV A,R3 ;RLC A ;MOV R3,A ;R3左移一位并送回MOV

温馨提示

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

评论

0/150

提交评论