第三章习题解答4.在8051片内RAM中,已知(30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H,试分析下段程序中各条指令的作用,说出按顺序执行完指令后的结果:MOV A.40H ;(A)=48HMOV R1,A ;(R1)=48HMOV P1,#0FOH ;(P1)=F0HM0V @R1,30H ;(48H)=38HMOV DPTR,#1234H ;(DPTR)=1234HMOV 40H,38H ;(40H)=40HMOV R1,30H ;(R1)= 38HMOV 90H,R1 ;(90H)= 38H ,P1的地址为90HMOV 48H,#30H ;(48H)= 30HMOV A,@R1 ; (A)= 40HMOV P2,P1 ; (P2)= 38H F0H错误8.试编程将片外数据存储器80H单元的内容送到片内RAM的2BH单元。
MOV DPTR, #0080H 或:MOV R0, #80HMOVX A, @DPTR MOV P2,#00HMOV 2BH, A MOVX A, @R0MOV 2BH, A10.试编程将片内RAM20H单元中的两个BCD数拆开,并变成相应的ASCII码存入片内RAM 21H和22H单元。
MOV A, 20H ;20H的内容不变ANL A,#0F0HSWAP A ;4次移位 RR A 也可以ADD A,#30HMOV 21H, AMOV A, 20HANL A,#0FHADD A,#30HMOV 22H, A12.试分析以下两段程序中各条指令的作用,程序执行完后转向何处?(1) MOV P1,#0CAH ;(P1)= 11001010MOV A,#56H ;(A)= 01010110JB P1.2,L1JNB ACC.3,L2 ;转向L2L1:…L2:…(2)MOV A,#43H ;(A)=01000011JBC ACC.2,L2JBC ACC.6,L2 ;转向L2L1:…L2:…18.分析下列程序执行后,(SP)的值。
MOV SP,#2FHMOV DPTR,#2000HMOV R7,#50HNEXT:MOVX A,@DPTRPUSH ADJNZ R7,NEXT ;(SP)=2FH+50H 2F+2*50错误19.试编写程序,查找在30~50H单元中是否有66H这个数据,若有将F0置1,否则将F0清0。
MOV R0,#30HCLR F0 ;MOV A,#66HL0:CJNE @R0,#66H, L1 ;SUBB A,@R0 错,因为A已发生变化,不能循环SETB F0 ;JNZ L1……SJMP STP ;MOV A,@R0 正确L1: INC R0 ; XRL A,#66HCJNE R0,#51H, L0 ; JNZ L1STP: ……第四章习题解答4.已知从内部RAM BLOCK单元开始存有一组无符号数,其长度存于LEN单元。
试编制程序,将它们按从小到大的顺序排列之后仍存放在原存储区域内。
例4-15将给定数据块中的数据排序设:N个数据依次存放在内部RAM LIST地址开始的存储区域中,将N个数比较大小之后,使它们按从小到大(或从大到小)的次序排列,仍存放在原存储区域中。
排序是在程序设计中经常使用的一种编程方法。
排序的方法有多种,本例采用了较常用的“冒泡”排序法。
冒泡排序的基本思路是:从前向后依次将相邻两个单元中的数据进行比较,即第一个数与第二个数比较,第二个数与第三个数比较……,如两数比较的大小次序符合排序顺序,则不改变它们的存放顺序,否则交换两数位置,使其符合排序要求。
由于每次冒泡后只是从前向后排定一个大数(对于升序排列),所以在整个排序过程中,执行的内容包含两层:第一层为每一轮内的两两比较,第二层为每当一轮比较之后重新组织下一轮的比较,因此宜采用二重循环结构。
源程序如下:ORG 8000HMOV R7,#N-1 ;置外循环计数 MOV R7,LENDEC R7NEXT:MOV A,R7 ;置内循环计数MOV R5,AMOV R0,#LIST ;置数据指针 LIST改为BLOCKMOV Rl,#0 ;清交换标志COMP:MOV A,@R0 ;取数据Xi,i=o~n-1MOV R3,A ;暂存XiINC R0 ;修改指针CLR C ;清进位标志CYSUBB A,@R0 ;Xi与Xi+1比较JC LESS ;Xi<Xi+1,不交换MOV A,R3 ;Xi>Xi+1,交换XCH A,@R0DEC R0MOV @R0,AINC R0 ;恢复数据指针MOV R1,#1 ;置交换标志LESS:DJNZ R5,COMP ;内循环未完,继续DJNZ R7,LOOP ;外循环未完,查交换标志SJMP STOPLOOP:CJNE R1,#0,NEXT ;有交换;继续STOP:END程序中R7为外循环计数器,R5为内循环计数器,R0为数据指针,R1为交换标志,R3为暂存寄存器。
对于n个数据的排序,外循环次数需n-1次。
内循环次数随着外循环执行次数按递减1规律变化,即第一次内循环次数为n-1,第二次内循环次数n-2,……,依此类推。
为了提高排序速度,程序中还设置了数据交换标志R1,当两数比较发生过交换,使其置1,否则清零。
在排序过程中,若两数比较没有发生过交换,说明数据顺序已排列就绪,可提前结束循环。
7.编程实现将内部RAM中以50H开始的10个字节的压缩BCD数转换成十六进制数,存放在以60H开始的单元中。
MOV R7,#10 ;循环10次MOV R1,#60H ;结果存放地址MOV R0,#50HLP: MOV A,@R0ANL A,#0F0H ;取高4位SWAP AMOV @R1,AINC R1MOV A,@R0ANL A,#0FH ;取低4位MOV @R1,AINC R0INC R1DJNZ R7,LPRET8.若晶振频率为6MHz,则下面一段延时子程序可延时多长时间?DELAY:MOV R7,#248 ;1TNOP ;1TDJNZ R7,$;2TRET ;2T解:T=1/6M*12=2um(4+248*2)T = 1ms若把$改为DELAY,则延时时间为:(4*248+2)T = 1.988ms15.求函数Y=X!(X=0,1,2,…,7。
Y用4位BCD码表示)。
方法一:查表法;X放在R3中,结果Y存放在R6、R7中(高2位在R6,低2位在R7)MOV A, R3RL AMOV DPTR,#DATAMOVC A,A+@DPTRMOV R6,AINC DPTRMOVC A,@A+DPTRMOV R7,ADATA:DB 00H,01HDB 00H,02HDB 00H,06HDB 00H,24HDB 01H,20HDB 07H,20HDB 50H,40H方法二:;MUL AB 命令限制了乘数和被乘数的范围,但是结果是216(64K),低位放入A,高位放入B; 这里这样来处理:5!=120,所以5之前的都一个算法,如果大于5,从两边同时乘。
例如7!=5!*(6*7);X放在R3中,结果放在R6R7中,高位在R6ORG 0050HMOV A,R3; 判断X的范围JNZ L1;MOV R7, #00H ; X等于0,直接输出0L1: CLR CSUBB A,#01H;JNZ L2 ; 小于5的时候可以直接用循环做,跳到LESS5MOV R7,#01H; X等于1,直接输出1L2: MOV A, R3CLR CSUBB A,#06HJNC L4 ; 大于5的时候用120 再乘上6,7MOV A, R3 ; 小于等于5的时候算X!DEC R3L3: MOV B, R3MUL AB;DJNZ R3, L3MOV R7, A ;(2~5)的阶乘放入R7ACALL CONVERT ; 转换为BCD码L4: JNZ L5 ; X=7,转L5MOV A, #120 ;X=6,X!=120*6MOV B,R3MUL AB ;L6:MOV R5,B;保存结果MOV R7,AACALL CONVERTEND;L5:MOV A, R3 ; 算6*7DEC R3MOV B, R3MUL AB;MOV B,#120MUL ABSJMP L6;;;;;;;;;下面是转化为BCD码CONVERT:MOV A,R7 ;转换低位MOV B,#64H ;B内放100DIV ABMOV R6,A ;这里是百位MOV A,BMOV B,#0AHDIV AB ;A里是十位余数在B中,就是个位RL A ;十位左移四位,把个位和十位的BCD码放到一个寄存器里面RL ARL ARL AADD A,BMOV R7,A ; R7里面为个位和十位HCCCC: MOV A,R5 ;R5中为高位十六进制数JZ STOOOP ;如果没有高位就直接结束MOV A,R7 ;不为0,就加高位数字个256ADD A,#56HDA A ;调整,如果有进位的话C会置1MOV R7,AMOV A,R6ADDC A,#02H ;这里带进位加DA A ; 再调整MOV R6, ADJNZ R5,HCCCC ;循环到高位数字为零STOOOP: RET第6章习题6解答试用中断计数设计一个秒闪电路,其功能是控制发光二极管闪亮,其闪烁频率为50Hz。
设fosc=6MHz。
解:闪烁周期T=1/50秒=20ms,采用T0定时中断10ms将P1.0取反一次。
T0采用方式1定时,初值X=65536-6*10000/12=60536=EC78H程序:ORG 0000HLJMP STARTORG 000BHLJMP PROT0ORG 1000HSTART:MOV TMOD #01H ;T0方式1,定时MOV TH0, #0ECHMOV TL0, #78HMOV IE, #82H ; SETB EASETB ET0SETB TR0SJMP $ORG 2000HPROT0: MOV TH0, #0ECHMOV TL0, #78HCPL P1.0RETI第7章习题解答串口作业:1、设计一个80C51单片机的双机通信系统,并编写程序将甲机片外RAM8000H-9000H 的数据块,通过串行口传送到乙机片外RAM3000H-4000H单元中去解:设fosc=11.0592MHZ,波特率为2400波特。
串口采用方式1,T1作波特率发生器,采用模式2,取SMOD=0,则T1计数初值为:X=256-11.0592×106×20/384×2400=244=F4H程序如下:;甲机发送程序MOV TMOD,#20H ;T1模式2MOV TL1,#0F4H ;T1计数初值MOV TH1,#0F4HSETB TR1 ;启动T1MOV SCON,#40H ;串口方式1MOV PCON,#00H ;SMOD=0,波特率不增倍MOV DPTR,#8000HLOOP: MOVX A,@DPTR ; 取发送的数据MOV SBUF, A ;发送数据JNB TI,$CLR TIINC DPTRMOV A,DPHCJNE A, #90H,LOOP ;MOV A,DPLCJNE A,#01H,LOOPSJMP $;乙机接受程序MOV TMOD,#20HMOV TL1,#0F4HMOV TH1,0F4HSETB TR1MOV SCON, #50HMOV PCON, #00H ;LOOP: JNB RI,$CLR RIMOV A, SBUFMOV DPTR,#3000H ;接收数据存储地址MOVX @DPTR, AINC DPTRMOV A,DPHCJNE A,#40H,LOOP ;MOV A,DPLCJNE A,#01H,LOOPSJMP $2、利用80c51串行口设计4位静态7段显示器,画出电路并编写程序,要求4位显示器上每隔1s交替地显示“0123”和“4567”图中P3.2改为P1.0,或将164的CLR端接地。