1、51 单片微型机原理和接口教程(周思跃_著)课后习题答案_化学工业出版社第一章习题答案1-1 请说明 CPU 的功能以及 CPU 是如何执行指令和程序的。答:CPU 的功能是执行程序和统筹处理计算机系统中各类事务。CPU 执行指令分为 3 步:取指令、分析指令、执行指令;计算机程序是由一条条指令按一定的顺序排列组成的,CPU 执行程序的过程就是一条条指令累计执行的过程,其方式分为串行作业方式和流水线作业方式。1-2 请说明单片机内部主要是由哪些部件组成的,并说明各部件的作用。答:CPU:由控制器和运算器构成,控制器的作用是执行指令和协调系统各部件的工作;运算器的作用是进行逻辑运算和算术运算。存
2、储器:存储计算机工作时使用的信息,即指令代码和数据代码。I/O 接口电路:具有数据缓冲、数据隔离及数据转换的功能。1-3 请问对于容量位 8K 的存储器芯片,它的地址线是多少根?答:8K=8192=2 13,故地址线为 13 根。另附:存储器的数据线由存储器的字长决定,例如一块 32K16(存储器容量显示格式:存储单元数存储单元的字长)的存储器,其地址线为 15 根,数据线为 16 根。1-4 将十进制数 78,134,分别用二进制数、十六进制数和 8421BCD 吗表示。答:(78) D=(1001110)B=(4E)H=(01111000)8421BCD(134)D=(10000110)B
3、=(86)H=(000100110100)8421BCD注:8421BCD 码为 4 位表示一个十进制数符,本质是符号不是数值,所以不可省略 0。 1-5 将下列真值分别转化为用 8 位和 16 位二进制数表示的原码、补码和反码。X=1000100;X8 位原 =X8 位反 =X8 位补 =01000100;X 16 位原 =X16 位反 =X16 位补=0000000001000100X= -1000100X8 位原 =11000100,X 8 位反 =10111011,X 8 位补 =10111100;X16 位原 =1000000001000100,X 16 位反 =1111111110
4、111011,X 16 位补=1111111110111100;X= -0111111X8 位原 =10111111,X 8 位反 =11000000,X 8 位补 =11000001;X16 位原 =1000000000111111,X 16 位反 =1111111111000000,X 16 位补=1111111111000001;1-6 将下列补码转化成二进制数的真值。X补 =00101100;X=101100X补 =11111111;X= -1X补 =10000000;X= -100000001-7 已知下列补码X 补 和 Y补 ,分别求X+Y 补 、X-Y 补 。并判断运算结果是否出
5、现溢出。X补 =10011001, Y补 =00101100;-Y补 =11010100, X+Y补 =X补 +Y补 =11000101 不溢出;X-Y 补 =X补 +-Y补=X补 -Y补 =01101101 溢出;X补 =11111111, Y补 =10000000;-Y9 位补 =010000000, X+Y补 =X补 +Y补 =01111111 溢出;X-Y 补 =X补 +-Y补=X补 -Y补 =01111111 不溢出;X补 =00110111, Y补 =11100000;-Y补 =00100000, X+Y补 =X补 +Y补 =00010111 不溢出;X-Y 补 =X补 +-Y补=
6、X补 -Y补 =01010111 不溢出;X补 =10000111, Y补 =11000000;-Y补 =01000000, X+Y补 =X补 +Y补 =01000111 溢出;X-Y 补 =X补 +-Y补 =X补 -Y补 =11000111 不溢出;方法提示:由于补码是按序列排列的,所以可以直接进行加和减,即X+Y 补 =X补+Y补 ;X- Y补 =X补 -Y补另补码减法也可用加法实现X-Y 补 =X补 +-Y补 。上题的第 2 小题,由于Y 8 位补=10000000=28,Y= -28,所以(-Y)= 28,已不能用 8 位补码表示,可以先扩补位 9 位补码,然后进行运算,或直接用X-Y
7、 补 = X补 -Y补 进行计算。判断结果是否溢出,可按下列方法:加法时,如果正负数相加(即两数的符号位不同),则结果肯定不溢出;如果同号数相加,结果与被加数和加数异号的则溢出(即正正相加结果为负或负负相加结果为正时) 。减法时,如果同号数相减(即两数的符号位相同),则结果肯定不溢出;如果异号数相减,结果与被加数异号的则溢出(即正负相减结果为负或负正相减结果为正时) 。此法比用变形补码直观,加和减都适用。第二章习题答案2-1 请说明单片机 89C52 内部有哪些资源。答:1 个 8 位 CPU、8KB 的 FLASH 程序存储器、256B 的 SRAM 数据存储器、4个 8 位的并行 I/O
8、口(P0,P1,P2,P3) 、1 个全双工串行口、中断系统(5 个中断源、2 个中断优先级) 、3 个 16 位的定时/计数器(T0,T1,T2 ) 、时钟电路(时钟频率 624MHZ ) 。2-2 为什么 51 系列单片机的存储器系统采用哈佛结构。答:哈佛结构指的是指令代码和数据分别存放在程序存储器和数据存储器中,两部分存储器分别采用不同的地址总线系统。单片机在工作时一般执行固定不变的应用程序代码,而作为嵌入式控制系统的核心,受限于体积要求,单片机系统一般不会带有辅助存储器(例如硬盘等) ,为了在断电时也能保存用户的应用程序,故需将程序固化在只读存储器中,而单片机工作时程序运行过程中的数据
9、是变化的,所以需要放在随机访问存储器中。2-3 51 单片机中的工作寄存器分布在存储器的哪个区域?答:分布在内部数据存储器的 00H1FH 区域。2-4 在 51 系列单片机中,工作寄存器分几个区?如何改变工作寄存器区? 答:分为 0、1、2、3 四个区。修改特殊功能寄存器 PSW 的 RS1 和 RS0 位可改变当前工作寄存器区。2-5 特殊功能寄存器和工作寄存器在存放信息方面有和区别?答:特殊功能寄存器(SFR)中存放的是一些专用信息,这些信息与下列内容有关:计算机指令的执行条件及状态标志,定时/计数器的使用控制、中断系统的使用、并行 I/O 及串行 I/O 接口的使用。工作寄存器只是用于
10、暂时存放指令执行过程中一般的被操作数据。2-6 特殊功能寄存器的地址空间如何?答:特殊功能寄存器(SFR)的地址为 8 为二进制编码,地址范围为80H0FFH,但各特殊功能寄存器的地址并非连续分布的。指令通过直接寻址的方式才能访问到。2-7 51 单片机中的位寻址区在哪里?它们的地址空间如何?答:51 单片机的位寻址区分布在两个地方。一部分位于内部数据存储器中字节地址为 20H2FH 的 16 个单元中,这部分包括 128 个位,位地址空间为00H7FH;另一部分位于字节地址能被 8 整除的特殊功能寄存器中 , 位地址空间为 80H0FFH。2-8 请指出下列位地址所在的内部数据存储器单元的字
11、节地址或 SFR 名称。答: 00H 内部 RAM 的 20H 单元;(20H).020H 内部 RAM 的 24H 单元;(24H).00A0H P2;P2.00B0H P3;P3.064H 内部 RAM 的 2CH 单元;(2CH).4E6H 累加器 ACC; ACC.6。提示:1) 内部数据存储器内的可寻址位,其位地址(00H7FH)与所在单元的字节地址(20H2FH)间的关系如下:位地址(字节地址20H)8DX, DX该位在字节单元中的位置(D0D7)位地址8,商20H字节地址,余数 DX2) SFR 中的可位寻址(位地址 80H0FFH) 的寄存器,其最低位的位地址与其字节地址相同。
12、关系如下:位地址8,商*8SFR 的字节地址,余数 DX, DX该位在 SFR 中的位置(D0D7)2-9 若某 51 单片机应用系统将 F000HFFFFH 地址空间分配给它外部的 I/O 接口,那么该单片机应用系统最多给外部数据存储器分配多少单元?地址空间如何?答:51 单片机的外部 I/O 接口和外部数据存储器是统一编制的,占用同一个地址空间,地址空间的容量为 64KB,地址范围为 0000HFFFFH。据题意,系统已将 F000HFFFFH 地址空间分配给它外部的 I/O 接口,则只剩下 0000HEFFFH可分配给外部数据存储器,容量为 60KB。2-10 在图 2-9 中的电容 C
13、,如果它取值太小,对复位电路有何影响?答:51 单片机上电复位,需要在 RST 引脚上保持 10ms 以上的高电平。如果 C太小,则其充电时间变短,上电后,RST 引脚上高电平保持的时间太短,则单片机内部复位将不能完全完成,有些寄存器内容将变得不确定。2-11 上电复位和人工按钮复位后对内部数据存储器具有什么不同的影响?答:上电复位后,内部数据存储器中的内容为不确定的状态。人工按钮复位后,内部数据存储器中的内容不变(因为没有断电) 。2-12 51 应用系统中,为何要对堆栈指针 SP 重新设置?答:复位后(SP)=07H ,则堆栈是从 08H 开始存放数据的。而内部数据存储器中00H1FH 单
14、元为工作寄存器区,而 20H2FH 单元为位寻址区,在实际的应用系统中,这些区域都可能使用到。故一般将堆栈设置在地址 30H 以后的单元中,所以需要对堆栈指针 SP 重新设置。2-13 51 单片机中的 I/O 接口中,那个接口在作为准双向口时需要外接电阻?若对某一接口进行读引脚的操作,必须事先对该接口做什么操作?答:P0 口需外接上拉电阻(因为 P0 是集电极开路结构) 。若需对某个接口读引脚(即读取外部输入信号的状态) ,需要对该接口的口锁存器写入 1(例如:若需要读取 P1.0、P1.1 、P1.2、P1.3 的引脚状态时,需要先执行 MOV P1, #0FH。这也是为什么复位后(P0)
15、= (P1)=(P2)=(P3)=0FFH 的道理。 )第三章习题答案3-1 指令的格式是由哪些部分组成的?每部分的含义是什么?答:指令由操作码和操作数组成。在形式上操作码和操作数都是二进制代码。操作码用来表示指令的种类和功能,经由控制器中的指令译码器译码后产生控制信号。操作数是指令的操作对象,表示被操作数据或数据所在的存储单元地址。3-2 什么是寻址方式?51 系列指令系统有哪些寻址方式?答:指令中给出操作数的方式叫做寻址方式。51 系列机给出的寻址方式一般有7 中:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址、位寻址(直接寻址的一个特例地址指向位单元) 。3-3 对于
16、内部数据存储器 00H1FH 区域的访问有哪些寻址方式?对于外部数据存储器的访问有哪些寻址方式?对于特殊功能寄存器的访问有哪些寻址方式?答:对于内部数据存储器 00H1FH 区域的访问有直接寻址、寄存器寻址、寄存器间接寻址三种方式。对于外部数据存储器的访问只有寄存器间接寻址一种方式(以 DPTR 或 R0、R1为指针) 。对于特殊功能寄存器的访问只有直接寻址一种方式。同时对于内部数据存储器80H0FFH 的 128 个单元的访问只有寄存器间接寻址一种方式(以 R0、R1 或SP 为指针) ;借助于两种不同的寻址方式,可以将在地址上重合(80H0FFH)的 SFR 和内部 RAM 高 128 字
17、节单元的两部分空间加以区分。3-4 51 系列单片机有哪些标志位?这些标志位存放在哪里?答:51 单片机在程序运行时通常需要一下标志位:Cy,AC,OV , P,RS1,RS0,它们都存放在特殊功能寄存器 PSW(程序状态字寄存器)中。3-5 分析下列各指令的操作数,指出它们的寻址方式。MOV R4, 38H ;寄存器寻址,直接寻址ADD A, R1 ;寄存器寻址,寄存器间接寻址MOVC A, A+DPTR ;寄存器寻址,变址寻址(又称基址寄存器加变址寄存器间接寻址)MOVX A, DPTR ;寄存器寻址,寄存器间接寻址DEC B ;直接寻址SETB 24H ;位寻址(直接寻址的一种,只是给出
18、的直接地址是位地址)CJNE A, #100, NEXT ;寄存器寻址,立即寻址,相对寻址ANL 30H, #00H ;直接寻址,立即寻址PUSH P1 ;寄存器间接寻址(指针为 SP,只是在堆栈操作指令中省略了) ,直接寻址堆栈操作除了用 PUSH 和 POP 指令,完全可以用其它指令来完成,举例如下:PUSH P1可用下列程序段完成INC SPMOV R0, SPMOV R0, P1POP P1可用下列程序段完成MOV R0, SPMOV P1, R0DEC SP提示:上题答案中按操作数先后顺序给出其对应的寻址方式。3-6 下列各指令或指令组执行前有关寄存器和存储器的状态如下表,要求分析各
19、指令或指令组执行后有关寄存器、存储器和标志位的状态。内部数据存储器和特殊功能寄存器外部数据存储器程序存储器寄存器名内容单元地址内容单元地址内容单元地址内容程序计数器内容B 64H 73H 10H 900BH 12H 1206H 35H (PC)=1200HACC 03H 72H 11H 900AH 83H 1205H 34HPSW 80H 71H 00H 9009H D1H 1204H 33H 标号及标号值DPL 05H 70H 80H 9008H 79H 1203H 32H NEXT1=0800HDPH 90H 9007H 0CH 1201H 31H NEXT2=0900HSP 71H 36
20、H F8H 9006H 23H 1200H 30H NEXT3=1280HR0 00H 35H 2BH 9005H 13H LOOP=1148HR1 36H 34H 36H 9004H 4DHR2 35H 33H 74H 9003H 2EHR3 B7H 32H 59H 9002H 7FHR4 03H 9001H 54HR5 F6H 26H 66H 9000H 38HR6 E4H 25H 55HR7 21H 24H 44HP0 7CHP2 90H提示:在上表中需注意几点:(PSW)=80H,即 Cy=1, AC=0, RS1=RS0=0(故当前工作寄存器区为 0 区)。工作寄存器区为 0 区时,
21、R0R7 指向内部数据存储器的00H07H,所以当指令中出现直接地址 00H07H 中的某个时,其初始条件即为R0R7 中某个对应的寄存器的值。另,因为(DPH)=90H, (DPL)=05H, 所以(DPTR)=9005H。标号值实质上是代表标号所在处的指令在程序存储器中的地址,标号往往出现在程序转移指令中,指出转移指令的目标地址。 MOV R0,#32; (R0)=32=20H MOV 25H,R1; (25H)= 0F8H MOVX A,DPTR; (A)=13H P=1 MOVX A,R0; (A)=38H P=1 MOVC A,A+PC; (A)=33H P=0 MOV A,04H;
22、 (A)=03H P=0 XCH A,34H; (A)=36H (34H)= 03H XCHD A,R1; (A)=08H (36H)=0F3H PUSH DPL; (SP)=72H (72H)=05H POP DPH; (DPH)=00H (SP)=70H SUBB A,R1; (A)=0CCH Cy=1 P=0 AC=1OV=0 ADD A,R6; (A)=0E7H Cy=0 P=0 AC=0OV=0 ADDC A,36H; (A)=0FCH Cy=0 P=0 AC=0OV=0 MUL AB; (A)=2CH (B)=01H INC R0; (R0)= 01H DEC A; (A)=02H
23、 P=1 ADD A,#49H;DA A; (A)=52H Cy=0 P=1 ANL A, R1; (A)=02H (R1)=36H P=1 ORL A,32H; (A)=5BH P=1 ORL 26H,#35H; (26H)=77H P=0 XRL A,R0; (A)=03H P=0 XRL A, ACC; (A)=0 P=0 XRL A,#0FFH; (A)=0FCH P=0 CPL A; (A)=0FCH P=0 RL A; (A)=06H Cy=1 RRC A; (A)=81H Cy=1 MOV C,(25H).2; Cy=1 MOV F0,C; (PSW)=0A0H SETB RS0
24、; (PSW)=88H CLR C; (PSW)=0 ANL C,(24H).0 Cy=0 JZ NEXT1; (PC)=1202H JC NEXT2; (PC)= 0900H CJNE A, 25H, NEXT3; (PC)= 1280H Cy=1 DJNZ R7,LOOP; (PC)= 1148H (R7)=20H LCALL 1800H; (PC)=1800H (SP)=73H (72H)=03H(73H)=12H RET; (PC)=0080H (SP)=6FH ANL C, /32H; Cy=0 (32H)=1 ,提示此处 32H 为位存储器 STOP: JBC P0.3, STOP
25、; (PC)=1200H (P0)=74H JNB P0.4, NEXT1; (PC)=1203H 分析下列程序段的功能。 MOV A, R3MOV R4, A功能:将 R3 中的内容送入 R4,即(R3)R4 MOV A, R5CPL AMOV R5, A功能:R5 中的数据按位取反后送回 R5 MOV A, R4MOV B, R5DIV ABMOV R4, BMOV R5, A功能:R4 中的数除以 R5 中的数,结果商送入 R5,余数送入 R4 MOV C, P1.1ANL C, P1.2ANL C, /P1.3MOV P1.6, C功能:P1.1P1.2P1.6 MOV C, 0ORL
26、 C, 1MOV F0, CMOV C, 2ORL C, 3ANL C, F0MOV P1.7, C功能:(20H).0(20H).1) (20H).2(20H).3) P1.7 CLR CMOV A, R4RLC AMOV R4, AMOV A, R3RLC AMOV R3, A功能:R3、R4 中的内容左移一位,R4 最低位移入 0,R4 最高位移入 R3 最低位,R3 最高位移出至 Cy。 CLR CMOV A, R5RLC AADD A, R5MOV R5, A功能: CLR AMOV R0, AMOV R7, ALOOP: MOV R0, AINC R0DJNZ R7, LOOPST
27、OP: SJMP STOP功能:将内部数据存储器 00H0FFH 256 个单元全部清零。 PUSH ACCPUSH BPOP ACCPOP B功能:利用堆栈将 ACC 与 B 中的内容互换,即(ACC)(B) MOV R0, #30HXCHD A, R0SWAP AINC R0XCHD A, R0SWAP AMOV 40H , A功能:将 ACC 的低四位送入 30H 单元低四位,ACC 的高四位送入 31H 的低四位,而原先 30H 单元的低四位送入 40H 单元的低四位,原 31H 单元的低四位送入40H 单元的高四位。举例说明如下,设程序段运行前有(ACC)=12H,(30H)=34H
28、,(31H)=56H;则程序段运行后有(30H)=32H,(31H)=51H, (ACC)= (40H)=64H;该程序段可用来将单字节 BCD 转压缩 BCD.3-8 指出下列指令中哪些是合法指令,哪些是非法指令。MOV P1, R4 ;合法MOV R2,R4 ;非法CLR R3 ;非法RLC R5 ;非法MOV 30H, 31H ;合法MOV 00H, P ;非法ORL 40H, R7 ;非法PUSH R6 ;非法POP R0 ;非法INC DPTR ;合法注:常见的错误还有类似:MOV R0, C; ADD 30H,31H; MOV A, R5; DEC DPTR 等,编程时切记勿错!3
29、-9 按要求编制下列各程序段。将内部数据存储器 30H 和 31H 单元的内容互换。法一:MOV A, 30HXCH A ,31HMOV 30H, A法二:XCH A, 30HXCH A ,31HXCH A, 30H比较法一、法二的优缺点,你认为哪个方法更好?将寄存器 R7 的内容向右循环移位一次。XCH A, R7RR AXCH A, R7将寄存器 R3 的内容乘以 4(结果不超出 8 为二进制数的范围) 。法一:MOV A, R3MOV B, #4MUL ABMOV R3, A法二:XCH A, R3RL ARL AXCH A, R3将寄存器 DPTR 的内容减 1。法一:判断 DPL=0
30、 否?如是, DPL 减 1 后,DPH 也减 1;否则,DPH 不变。XCH A, DPLJNZ NOBDEC DPHNBO: XCH A, DPL DEC DPL法二:(DPH)(DPL) -1DPH,DPL(即 DPTR)CLR CXCH A, DPLSUBB A, #1XCH A, DPL XCH A, DPHSUBB A, #0XCH A, DPH法三:(DPH)(DPL)+0FFFFHDPTRXCH A, DPLADD A, #0FFHXCH A, DPL XCH A, DPHADDC A, #0FFHXCH A, DPH比较以上各方法,其中法三利用了-1 的补码是 0FFFFH
31、的原理,将减法改为了加法。将寄存器 R6 的内容压入堆栈 (设寄存器工作在 3 区)PUSH 1EH将 R4, R5 寄存器连接起来循环右移一位。(设 R4 为高 8 位,R5 为低 8 位;执行完后 R4R5 中的内容右移一位,R4 的最低位移入 R5 的最高位,同时 R5 的最低位移入 R4 的最高位)XCH A, R4 ;将 R4 中的内容送入 ACC,同时将 ACC 的内容放入 R4 中暂存。RRC A ;ACC 中原先 R4 的内容右移一位,同时 Cy 移入最高位,而原先 R4的最低位移入 Cy 位XCH A, R5 ;R5 中的内容送入 ACC,上一步中产生的 ACC 的内容送入
32、R5 暂存RRC A ;ACC 中原先 R5 的内容右移一位,Cy(即原 R4 的最低位)移入最高位,而原 R5 的最低位移入 Cy 位XCH A, R5 ;将结果送入 R5(R5 移位已完成) ,同时将第三步暂存在 R5 中的内容取出。MOV ACC.7, C ;将 Cy 位中存放的原 R5 的最低位送入 ACC 的最高位(即送入R4 的最高位)XCH A, R4 ; 将结果送入 R4,同时取出 ACC 原来的值第四章习题答案4-1 用伪指令将下列常数依次定义在 1600H 为首地址的程序存储器中。0,1,4 ,9,16 ,25 ,36,49 ,64,81答:ORG 1600HDB 0,1,
33、4,9,16,25,36,49,64,814-2 用伪指令将下列常数依次定义在 1700H 为首地址的程序存储器中,要求数据类型一致。0,1,8 ,27,64 ,125 ,216 ,343,512,729答:提示:因为 343,512,729 为双字节数据(255),所以所有数据均应以双字节存入。ORG 1700HDW 0,1,8,27,64,125,216,343,512,7294-3 用伪指令将字节型变量 X1、X2 定义在内部数据存储器 30H、31H 单元中,将字节型变量 Y1、Y2 定义在外部数据存储器 2000H、2001H 单元中。答: X1 DATA 30HX2 DATA 31
34、HY1 XDATA 2000HY2 XDATA 2001H4-4 用伪指令将 ASCII 码字符串“Beijing,tjjtds!”定义在 1200H 为首地址的程序存储器中。答: ORG 1200HDB Beijing,tjjtds!4-5 用伪指令将逻辑变量 A1、A2 定义在 00H、01H 位单元中答: A1 BIT 00HA2 BIT 01H4-6 编一程序段,将 1400H 为首地址的外部数据存储器中 200 个单字节数据转移至 1500H 为首地址的外部数据存储器中。MOV DPTR, #1400H ;用 DRTR 指向源数据块单元地址MOV P2, #15H ;用 P2,R0
35、指向目标地址MOV R0, #00HMOV R7, #200 ;数据个数送入 R7LOOP: MOVX A, DPTRMOVX R0, AINC DPTR ;修改源数据块指针INC R0 ;修改目标单元地址指针DJNZ R7, LOOPSJMP 4-7 编一程序段,将 30H 为首地址的内部数据存储器中 20 个单字节补码数据中的负数传送至 2400H 为首地址的外部数据存储器中。MOV R0, #30H ;用 R0 指向源数据块首地址MOV DPTR, #2400H ;用 DRTR 指向目标区首地址MOV R7, #20 ;数据个数送入 R7LOOP: MOV A, R0 ;取出源数据JNB
36、 ACC.7, NEXT ;若源数据最高位=0,则表示数据为非负数,无需传送,可直接取下个数据MOVX DPTR, A ;若取出的数据为负数,则传送到外部 RAM,同时修改DPTRINC DPTRNEXT: INC R0DJNZ R7, LOOPSJMP 4-8 编一程序段,将 40H 为首地址的内部数据存储器中 25 个单字节数据,依次下移一个单元。提示:根据题意即将 40H58H 中的数据依次送入 41H59H 中XCH A, 40H ;ACC 内容送入 40H 暂存保护,同时取出 40H 单元中内容MOV R0, #41H ;R0 指向目标单元首地址MOV R7, #25 ;数据长度送
37、R7LOOP: XCH A, R0 ;前一个单元数送后一个单元,同时取出后一个单元原先的数据暂存入 ACCINC R0DJNZ R7, LOOPMOV A, 40H ;恢复 ACC 原来的内容STOP: SJMP STOP4-9 编一程序段,完成函数 y=x2+5x+6 的计算。设 0x 10 。提示:据题意 6y156,即结果为单字节数据。X DATA 30HY DATA 31HMOV A, XMOV B, XMUL ABMOV Y, A ;X2YMOV A, XMOV B, #5MUL ABADD A, Y ; X2+5X ACCADD A, #6 ; X2+5X+6 ACCMOV Y,
38、A ; X2+5X+6 YSTOP: SJMP STOP讨论:有时仔细分析问题,可以将程序变得更简单,如上题中y=x2+5x+6=(x+2)(x+3),则程序为X DATA 30HY DATA 31HMOV A, XADD A, #2MOV B, A ; (x+2)INC A ; (x+3)MUL ABMOV Y, A ; X2+5X+6 YSTOP: SJMP STOP4-10 编一程序段,完成逻辑函数 L= 的计算。提示:此程序按照 51 汇编程序标准格式编写,整个程序构成一个完整结构,单片机运行时将反复执行该程序,即当输入变量发生变化时,输出逻辑函数 L 将立刻发生相应的变化。X BIT
39、 P1.0Y BIT P1.1Z BIT P1.2 ;分别定义变量 X,Y,Z 由 P1 口的低三位(P1.0,P1.1,P1.2)输入L BIT P1.7 ;定义函数 L 由 P1.7 输出ORG 0 ;用户程序第一条指令必须放在程序存储器 0000H 单元中LJMP MAIN ;此处安排一条长调换指令,跳到主程序处,目的:避开 03H 开始的中断入口ORG 200H ;主程序安排在程序存储器 200H 单元开始MAIN: MOV C, XANL C, /YANL C, ZCPL CMOV L, CSJMP MAIN ;真正的实用程序必须构成一个死循环结构,使得单片机可以反复地执行;用户设定
40、的功能讨论一:若上列函数改为 L=XY+XZ+YZ,如何编程,给两个答案,自己比较体会!MOV C, XANL C, YMOV F0, CMOV C, XANL C, ZORL C, F0MOV F0, CMOV C, YANL C, ZORL C, F0MOV L, CMOV C, XANL C, YJC OUTMOV C, XANL C, ZJC OUTMOV C, YANL C, ZOUT: MOV L, C讨论二:若上列函数改为 L=(X+Y)(X+Z)(Y+Z),如何编程,给两个答案,结合讨论一自己比较体会!MOV C, XORL C, YMOV F0, CMOV C, XORL C
41、, ZANL C, F0MOV F0, CMOV C, YORL C, ZANL C, F0MOV L, CMOV C, XORL C, YJNC OUTMOV C, XORL C, ZJNC OUTMOV C, YORL C, ZOUT: MOV L, C4-11 阅读下列各程序段,并说明其功能。START: MOV DPTR, #1000HMOV R7, #10MOVX A,DPTRMOV B, A ;取出外部 RAM 单元 1000H 单元中的数送入 BLOOP: INC DPTR ;每次循环逐个取出外部 RAM 单元 1001H 开始的单元中的内容MOVX A, DPTRCJNE A,
42、 B, COMP ;比较(A) 和(B),无论是否相等,均转向下条指令,判断 Cy 位COMP: JC NEXT ;Cy=1,则(A) (B),不作处理,直接进下个循环,取下个数据判断MOV B, A ;若 Cy=0,则(A) (B),将(A)BNEXT: DJNZ R7, LOOPSTOP: SJMP STOP功能:判断外部数据寄存器 1000H 开始的 11 个单元中的最大值,将最大值送入寄存器 B。START: MOV R2, #0MOV R7, #8MOV A, R3 ;(R3) ACCLOOP: RLC A ;8 次循环,每次循环,将 R3 中的内容由最低位开始,逐位移入 CyJNC
43、 NEXT ;Cy=0,则不做任何操作,直接进入下个循环INC R2 ;若上句条件不成立,即 R3 中移出的位=1, 则(R2)+1 R2NEXT: DJNZ R7, LOOPSTOP: SJMP STOP功能:统计 R3 中 1 的个数,并将统计结果送入 R2。START: MOV 30H, #0MOV R0, #50HLOOP: MOV A, R0CJNE A, #0FFH, NEXTSJMP STOPNEXT: INC 30HINC R0SJMP LOOPSTOP: SJMP STOP功能:统计存放在内部数据存储器 50H 开始的数据块的长度(即数据块占多少个字节) ,数据块以 0FFH
44、 为结束标志。4-12 编一子程序,将一个非压缩 8421BCD 码(即单字节 BCD 码)转换成七段显示码。设 09 的 BCD 码对应的七段显示码分别为3FH、06H、6BH、4FH、66H 、6DH 、7DH、07H、7FH、6FH。进子程序前,BCD码被放在累加器 ACC 中;子程序运行后,相应的七段码也放在 ACC 中。 (即入口参数和出口参数均在 ACC 中) 。;BCD 码转换成显示码;入口参数:子程序名 CHSEG,单字节 BCD 码放在累加器 ACC 中;出口参数:七段显示码放在 ACC 中CHSEG: ADD A, #1 ;加上偏移量,偏移量为 MOVC A, A+PC 指
45、令与数据表首间的字节数MOVC A, A+PCRET ;单字节指令DB 3FH, 06H, 6BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH ;数据表一般紧跟着 RET 指令有另一法,不需计算偏移量CHSEG: ADD A, #SEGTB-SSG ;用标号表达式,让编译程序计算偏移量MOVC A, A+PCSSG: RETSEGTB: DB 3FH, 06H, 6BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH4-13 编一子程序,将一个 09 的七段显示码转换成对应的格雷码。09 的格雷码请参阅本书表 1-2。设进子程序前,七段显示码被放
46、在内部数据存储器 40H中;子程序运行后,相应的格雷码放在内部数据存储器 50H 中。 (即入口参数为 40H,出口参数为 50H) 。算法一提示:根据 09 的序号依次查出对应的显示码,然后与 40H 中的内容比较,如果相等,则根据当前序号查表得到对应的格雷码。; 显示码转换成格雷码;入口参数:子程序名 CHGRY,七段显示码被放在内部数据存储器 40H 中,影响ACC,B,Cy 位;出口参数:格雷码放在内部数据存储器 50H 中CHGRY: PUSH ACC ;保护现场PUSH BPUSH PSWMOV B, #0 ;用 B 记录 09 的序号NEXT: MOV A, B ;ADD A,
47、#SEGTB-SSG ;用标号表达式,让编译程序计算偏移量MOVC A, A+PC ;根据当前序号,查取对应的显示码SSG: CJNE A, 40H, NEQ ;比较取得的显示码与源单元中的显示码MOV A, B ;如果相等,则根据当前序号,查取对应的格雷码ADD A, #GRYTB-SGRMOVC A, A+PCSGR: MOV 50H, A ;将查取的格雷码送入目标单元POP PSW ;恢复现场POP BPOP ACCRET ;返回NEQ: INC B ;如果不想等,则将序号增 1,查取下个显示码作比较SJMP NEXTSEGTB: DB 3FH, 06H, 6BH, 4FH, 66H,
48、6DH, 7DH, 07H, 7FH, 6FH ;显示码表GRYTB: DB 00H, 01H, 03H, 02H, 04H, 05H, 07H, 06H, 08H, 09H ;格雷码表算法二提示:直接将显示码转化成格雷码,程序烦了些,但方法很简单。; 显示码转换成格雷码;入口参数:子程序名 CHGRY,七段显示码被放在内部数据存储器 40H 中,影响ACC,Cy 位;出口参数:格雷码放在内部数据存储器 50H 中CHGRY: PUSH ACC ;保护现场PUSH PSWMOV A, 40HCJNE A, #3FH, NEQ0MOV 50H, #00H ;40H 单元中的内容=0 的显示码,则将 0 的格雷码送入 50HNEQ0: CJNE A, #06H, NEQ1MOV 50H, #01H ;40H 单元中的内容=1 的显示码,则将 1 的格雷码送入 50HNEQ1: CJNE A, #6BH, NEQ2MOV 50H, #03H ;40H 单元中的内容=2 的显示码,则将 2 的格雷码送入 50HNEQ2: CJNE A, #4FH, NEQ3MOV 50H, #02H ;40H 单元中的内容=3 的显示码,则将 3 的格雷码送入 50HNEQ3: CJNE A, #66H, NEQ4MOV 50