第四章指令系统习题4-36(1)将R6的高4位和R7的高4位交换,R6、R7的低4位内容保持不变。MOVA,R6;(A)=A1A2ANLA,#0F0H;(A)=A10MOVR3,A;(R3)=A10MOVA,R7;(A)=B1B2ANLA,#0FH;(A)=0B2ORLA,R3;(A)=A1B2MOVR4,A;(R4)=A1B2MOVA,R7;(A)=B1B2第四章指令系统习题ANLA,#0F0H;(A)=B10MOVR5,A;(R5)=B10MOVA,R6;(A)=A1A2ANLA,#0FH;(A)=0A2ORLA,R5;(A)=B1A2MOVR6,A;(R6)=B1A2MOVA,R4;(A)=A1B2MOVR7,A;(R7)=A1B2第四章指令系统习题(2)两个无符号数分别存放在30H、31H,试求出它们的和并将结果存放在32H中。MOVA,30HADDA,31HMOV32H,AHLT(3)将30H单元的内容循环左移两位,送外部RAM3000H中。MOVA,30HRLARLAMOVDPTR,#3000HMOVX@DPTR,A第四章指令系统习题(4)将程序存储器1000H的内容取出送外部RAM3000H单元。CLRAMOVDPTR,#1000HMOVCA,@A+DPTRMOVDPTR,#3000HMOVX@DPTR,A第四章指令系统习题4-37(SP)=20H,(A)=67H,(1FH)=25H,(20H)=34HPUSHACCPUSH1FH;(23H)=34HPUSH20H;(22H)=25HSWAPA;(21H)=67HMOV1FH,A;(20H)=34HRLA;(1FH)=25HMOV20H,A;SP=21HPOPDPL;(A)=ECHPOPDPH;DPTR=2534HCLR01H第五章MCS-51汇编语言程序设计5-4设常数和数据标号的定义为ORG2000HDAT1:DB1,2,3,4,5DAT2:‘ABCD’NEQU$-DAT2DAT3:DW1200H,-2TAB:DWDAT1,DAT3(1)画出上述数据或地址的存储形式(2)写出各标号的地址N=2009H-2005H=04H第五章MCS-51汇编语言程序设计标号地址内容DAT12000H01H2001H02H2002H03H2003H04H2004H05HDAT22005H41H(‘A’)2006H42H(‘B’)2007H43H(‘C’)2008H44H(‘D’)DAT32009H12H200AH00H200BHFEHTAB200CH20H200DH00H200EH20H200FH09H第五章MCS-51汇编语言程序设计5-5双字节加法。被加数放在片内RAM30H(高字节)和31H(低字节)单元中,加数放在片内RAM32H(高字节)和33H(低字节)单元中,运算结果存放在30H和31H单元中,进位存放在位寻址区的00H位。START:PUSHA;将A内容进栈保护MOVR0,#31H;地址指针MOVR1,#33HCLR00H;00H位清零MOVA,@R0;低位字节数相加ADDA,@R1第五章MCS-51汇编语言程序设计MOV@R0,ADECR0DECR1MOVA,@R0;高位字节数相加ADDCA,@R1MOV@R0,AMOV00H,CPOPA第五章MCS-51汇编语言程序设计5-6编写程序,找出片内RAM30H~5FH单元中无符号数的最大值,并存放在60H单元中。MOVR0,#30HMOVB,@R0;B中存放最大值L0:INCR0MOVA,@R0CLRCSUBBA,B;Xi+1-XiJCL1;Xi+1XiMOVB,@R0;Xi+1Xi,则交换L1:CJNER0,#5FH,L0MOV60H,BSJMP第五章MCS-51汇编语言程序设计5-7从片内RAM30H开始存放20个数,找出其中的最小数。MOVR0,#30H;首地址MOVR2,#20;20个数MOVB,@R0;B中存放最小值L0:INCR0MOVA,@R0CLRCSUBBA,B;Xi+1-XiJNCL1;Xi+1XiMOVB,@R0;Xi+1Xi,则交换L1:DJNZR2,L0SJMP$第五章MCS-51汇编语言程序设计5-8编写程序,查找片内RAM31H~50H单元中是否有常数41H,若有则将51H单元置-1;若没有,则将51H单元清0。MOVR0,#30H;首地址L0:INCR0CJNE@R0,#41H,NEQEQ:MOV51H,#0FFH;51H单元置-1SJMPED1NEQ:CJNER0,#51H,L0MOV51H,#00HED1:HLT第五章MCS-51汇编语言程序设计5-9编写程序,将片内RAM40H~6FH单元中的无符号数按照从小到大的次序排列,结果仍放在原存储空间。MOVR2,#2FH;个数LP1:MOVA,R2MOVR3,AMOVR0,#40H;地址指针指向首地址CLR00H;位地址位操作LP2:MOVA,@R0MOVB,AINCR0CLRCMOVA,@R0第五章MCS-51汇编语言程序设计SUBBA,B;Xi+1-XiJNCLESS;CY=0则转移到LESSMOVA,B;CY=1Xi+1XiXCHA,@R0DECR0MOV@R0,AINCR0SETB00H;(00H)=1LESS:DJNZR3,LP2;CY=0Xi+1XiJNB00H,STOP;(00H)=0则转移DJNZR2,LP1STOP:RET第五章MCS-51汇编语言程序设计5-10编写程序,统计片内RAM20H~5FH中出现55H的次数,并将统计结果送入60H单元。MOVR0,#20H;地址指针指向首地址MOV60H,#00H;清零L0:MOVA,@R0;取数CJNEA,#55H,L1;(A)≠55H,则转到L1INC60H;(A)=55H,L1:INCR0;取下一个数CJNER0,#60H,L0;是否到末地址?HLT第五章MCS-51汇编语言程序设计5-11编程将片内RAM30H~7FH单元清零。方法1:控制循环体的执行次数BE1:MOVR0,#30HMOVR7,#50HLP1:MOV@R0,#00HINCR0DJNZR7,LP1RET方法2:判断循环体的结束条件BE2:MOVR0,#2FHLP2:INCR0MOV@R0,#00HCJNER0,#7FH,LP2RET第五章MCS-51汇编语言程序设计5-12编程序,将片外RAM3000H~30FFH单元全部清零。MOVDPTR,#3000HMOVR0,#00HL1:MOVA,#00HMOVX@DPTR,AINCDPTRDJNZR0,L1SJMP$第五章MCS-51汇编语言程序设计5-13从片内RAMDATA1起,存放20H个数据,编写程序,将这20H个数据逐一移到片外RAMDATA2单元开始的存储空间。MOVR0,#DATA1;地址指针指向首地址MOVR7,#20H;循环次数MOVDPTR,#DATA2L1:MOVA,@R0MOVX@DPTR,AINCDPTRINCR0DJNZR7,L1SJMP$第五章MCS-51汇编语言程序设计5-14将片外RAM8000H开始的20个字节数据传送到片外RAM8100H开始的地址单元中。MOVR0,#00HMOVR1,#00HMOVR2,#20HL1:MOVP2,#80H;地址指针指向8000HMOVXA,@R0;输入数据MOVP2,#81H;地址指针指向8100HMOVX@R1,A;输出数据INCR0INCR1DJNZR2,L1HLT第五章MCS-51汇编语言程序设计5-15编程统计累加器A中“1”的个数。MOVR2,#07H;循环次数MOVR3,#00H;存放“1”的个数LP1:RLCAJNCLP2;C=0INCR3;C=1LP2:DJNZR2,LP1HLT第五章MCS-51汇编语言程序设计5-16从片内30H开始,存放50个数据。编写程序,将其中正数、负数分别送入片外RAM5000H和5500H开始的单元,分别记下正数和负数的个数并送入片内RAM70H和71H单元。MOVR0,#30H;片内RAM首地址MOVR1,#00H;清零MOVR2,#50;数据的个数MOVR3,#00H;R3存放正数个数清零MOVR4,#00H;R4存放负数个数清零T1:MOVA,@R0;取数INCR0;指针指向下一个单元CLRCSUBBA,#00HJCT2;有借位,Xi0INCR3;Xi0第五章MCS-51汇编语言程序设计MOVP2,#50H;片外正数首地址MOVR1,R3;5000HDECR1MOVX@R1,A;输出数据JMPT0;比较一个数结束T2:INCR4;Xi0MOVR1,R4DECR1;片外负数首地址MOVP2,#55H;5500HMOVX@R1,A;输出数据T0:DJNZR2,T1MOV70H,R3;正数的个数MOV71H,R4;负数的个数HLT第五章MCS-51汇编语言程序设计5-19编写程序,将30H~34H单元中压缩的BCD码转换为ASCII码,并将结果存放在片内RAM60H~69H单元中。MOVR0,#30HMOVR1,#60HT1:MOVA,@R0MOVB,AINCR0T2:ANLA,#0FHADDA,#30HMOV@R1,AINCR1MOVA,B第五章MCS-51汇编语言程序设计SWAPAANLA,#0FHADDA,#30HMOV@R1,AINCR1CJNER0,#35H,T1HLT第五章MCS-51汇编语言程序设计5-20将片内RAM30H单元的内容转换成三位BCD码,并将结果存入片外RAM1000H开始的单元。解:将BCD码先放入31H(百位)、32H(十位)、33H(个位)单元中。方法一:先得到百位BD1:MOVA,30HMOVB,#100DIVABMOV31H,AMOVA,B第五章MCS-51汇编语言程序设计MOVB,#10DIVABMOV32H,AMOV33H,B方法二:先得到个位BD2:MOVA,30HMOVB,#10DIVABMOV33H,BMOVB,#10DIVAB第五章MCS-51汇编语言程序设计MOV32H,BMOV31H,A将结果存入片外RAM1000H开始的单元MOVR0,#30HMOVDPTR,#1000HLP:INCR0MOVA,@R0MOVX@DPTR,AINCDPTRCJNER0,#33H,LPRET第七章定时器/计数器7-14设MCS-51单片机晶振频率为12MHz,使用定时器1的工作方式1,在P1.0端输出周期为100ms的方波,使用中断方式设计程序,写出相应的是初始化程序和中断服务程序。分析:晶振频率fosc=12MHz,计数周期=1μs周期100ms的方波,中断周期T1=100ms/2=50ms初值N=65536-T1×12MHz/12=15536=3CB0HORG0000HAJMPMAINORG001BH;T1的中断入口地址AJMPT1_INT;T1的中断服务程序第七章定时器/计数器ORG0100HMAIN:MOVSP,#60H;设置堆栈MOVTMOD,#10H;送模式字MOVTH1,#3CH;初值的高8位MOVTL1,#0B0H;初值的低8位SETBET1;ET1=1允许T1中断SETBEA;开中断,中断总允许SETBTR1;TR1=1启动T1工作HERE:SJMPHERE;等待T1_INT:MOVTH1;#3CH;中断服务程序MOVTL1,#0B0HCPLP1.0;P1.0取反形成方波RETIEND第七章定时器/计数器7-15对上题,在P1.0端输出周期为100ms方波的同时,还要在P1.1端输出周期为10s方波,写出相应的初始化程序和中断服务程序。分析:晶振频率fosc=12MHz,计数周期=1μs周期100ms方波,中断周期T1=100ms/2=50ms采用软件延时方法,在P1.1端输出周期为10s的方波,延时次数:5s/50ms=100ORG0000HAJMPMAINORG001BH;T1的中断入口地址AJMPT1_INT;T1的中断服务程序第七章定