单片机原理与应用及C51程序设计第一章第二章第三章1.在MCS-51单片机中,寻址方式有几种?其中对片内RAM可以用哪几种寻址方式?对片外RAM可以用哪几种寻址方式?答:寻址方式可分为数的寻址和指令寻址,数的寻址有:常数寻址(立即寻址)、寄存器数寻址(寄存器寻址)、存储器数寻址(直接寻址方式、寄存器间接寻址方式、变址寻址方式)和位寻址,指令的寻址有绝对寻址和相对寻址。
片内RAM寻址有:寄存器寻址、直接寻址方式和寄存器间接寻址方式。
片外RAM 寻址有:寄存器间接寻址方式。
2.在对片外RAM单元寻址中,用Ri间接寻址与用DPTR间接寻址有什么区别?答:片外数据存储器寻址中,用Ri间接寻址只能访问低端的256字节单元,而用DPTR作指针间接访问可访问整个64K字节。
3.在位处理中,位地址的表示方式有哪几种?答:1.直接位地址(00H~0FFH)。
例如:20H2.字节地址带位号。
例如:20H.3表示20H单元的3位。
3.特殊功能寄存器名带位号。
例如:P0.1表示P0口的1位。
4.位符号地址。
例如:TR0是定时/计数器T0的启动位。
4.写出完成下列操作的指令。
(1)R0的内容送到R1中。
MOV A,R0MOV R1,A(2)片内RAM的20H单元内容送到片内RAM的40H单元中。
MOV 40H,20H(3)片内RAM的30H单元内容送到片外RAM的50H单元中。
MOV A,30HMOV R0,#50HMOVX @R0,A(4)片内RAM的50H单元内容送到片外RAM的3000H单元中。
MOV A,50HMOV DPTR,#3000HMOVX @DPTR,A(5)片外RAM的2000H单元内容送到片内RAM的20H单元中。
MOV DPTR,#2000HMOVX A,@DPTRMOV 20H,A(6)片外RAM的1000H单元内容送到片外RAM的4000H单元中。
MOV DPTR,#1000HMOVX A,@DPTRMOV DPTR,#4000HMOV @DPTR,A(7)ROM的1000H单元内容送到片内RAM的50H单元中。
MOV A,#0MOV DPTR,#1000HMOVC A,@A+DPTRMOV 50H,A(8)ROM的1000H单元内容送到片外RAM的1000H单元中。
MOV A,#0MOV DPTR,#1000HMOVC A,@A+DPTRMOVX @DPTR,A5.区分下列指令有什么不同?(1)MOV A,20H和MOV A,#20H答:前者源操作数是直接寻址,后者源操作数立即寻址。
(2)MOV A,@R1和MOVX A,@R1答:前者源操作数是访问片内数据存储器,后者源操作数访问片外数据存储器低256字节。
(3)MOV A,R1和MOV A,@R1答:前者源操作数是寄存器寻址,后者源操作数寄存器间接寻址。
(4)MOVX A,@R1和MOVX A,@DPTR答:前者源操作数是访问片外数据存储器低256字节,后者源操作数访问片外数据存储器整个64K字节。
(5)MOVX A,@DPTR和MOVC A,@A+DPTR答:前者源操作数是访问片外数据存储器,后者源操作数访问程序数据存储器。
6.设片内RAM的(20H)=40H,(40H)=10H,(10H)=50H,(P1)=0CAH。
分析下列指令执行后片内RAM 的20H、40H、10H单元以及P1、P2中的内容。
MOV R0,#20H ;R0=20HMOV A,@R0 ;A=40HMOV R1,A ;R1=40HMOV A,@R1 ;A=10HMOV @R0,P1 ;(40H)=0CAHMOV P2,P1 ;P2=0CAHMOV 10H,A ;(10H)=10HMOV 20H,10H ;(20H)=10H结果:(20H)=10H、(10H)=10H、(40H)=0CAH、P2=0CAH和P1=0CAH7.已知(A)=02H,(R1)=7FH,(DPTR)=2FFCH,片内RAM(7FH)=70H,片外RAM(2FFEH)=11H,ROM (2FFEH)=64H,试分别写出以下各条指令执行后目标单元的内容。
(1)MOV A,@R1 结果:累加器A等于70H(2)MOVX @DPTR,A 结果:片外RAM(2FFCH)单元等于02H(3)MOVC A,@A+DPTR 结果:累加器A等于64H(4)XCHD A,@R1 结果:累加器A等于00H,片内RAM(7FH)单元等于72H8.已知:(A)=78H,(R1)=78H,(B)=04H,CY=1,片内RAM(78H)=0DDH,(80H)=6CH,试分别写出下列指令执行后目标单元的结果和相应标志位的值。
(1)ADD A,@R1 ;累加器A等于55H,CY等于1(2)SUBB A,#77H ;累加器A等于00H,CY等于0(3)MUL AB ;累加器A等于E0H,B寄存器等于01H,CY等于1,OV等于0(4)DIV AB ;累加器A等于1EH,B寄存器等于00H,CY、OV等于0(5)ANL 78H,#78H ;片内RAM(78H)单元等于58H(6)ORL A,#0FH ;累加器A等于7FH(7)XRL 80H,A ;片内RAM(80H)等于14H9.设(A)=83H,(R0)=17H,(17H)=34H,分析当执行完下面指令段后累加器A、R0、17H单元的内容。
ANL A,#17H ;A=03HORL 17H,A ;(17H)=37HXRL A,@R0 ;A=34HCPL A ;A=CBH结果:A=CBH,(R0)=17H,(17H)=37H10.写出完成下列要求的指令。
(1)累加器A的低2位清零,其余位不变。
ANL A,#11111100B(2)累加器A的高2位置“1”,其余位不变。
ORL A,#11000000B(3)累加器的高4位取反,其余位不变。
XRL A,#11110000B(4)累加器第0位、2位、4位、6位取反,其余位不变。
XRL A,#01010101B11.说明LJMP指令与AJMP指令的区别?答:LJMP指令后面提供的是16位目标地址,所以可以转移到64KB程序存储器的任意位置,缺点是:执行时间长,字节数多。
AJMP指令后带的是11位直接地址,执行时,先将程序指针PC的值加2(该指令长度为2字节),然后把指令中的11位地址addr11送给程序指针PC的低11位,而程序指针的高5位不变,只能在当前2K 范围内转移。
12.设当前指令CJNE A,#12H,10H的地址是0FFEH,若累加器A的值为10H,则该指令执行后的PC值为多少?若累加器A的值为12H呢?答:指令执行后的PC值为1011H,若累加器A的值为12H,则指令执行后的PC值为1001H。
13.用位处理指令实现P1.4=P1.0∧(P1.1∨P1.2)∨/P1.3的逻辑功能。
程序:MOV C,P1.1ORL C,P1.2ANL C,P1.0ORL C,/P1.3MOV P1.4,C14.下列程序段汇编后,从1000H单元开始的单元内容是什么?ORG 1000HTAB:DB 12H,34HDS 3DW 5567H,87H答:(1000H)=12H,(1001H)=34H,(1002H)=00H,(1003H)=00,(1004H)=00,(1005H)=67H,(1006H)=55H,(1007H)=87H,(1008H)=00H15.试编一段程序,将片内RAM的20H、21H、22H单元的内容依次存入片外RAM的20H、21H、22H中。
程序:MOV R0,#20HMOV R2,#03HLOOP:MOV A,@R0MOVX @R0,AINC R0DJNZ R2,LOOPSJMP $16.编程实现将片外RAM的2000H~2030H单元的内容,全部搬到片内RAM的20H单元开始位置,并将源位置清零。
程序:MOV R0,#20HMOV DPTR,#2000HMOV R2,#31HLOOP:MOVX A,@DPTRMOV @R0,AMOV A,#00MOVX @DPTR,AINC DPTRINC R0DJNZ R2,LOOPSJMP $17.编程将片外RAM的1000H单元开始的100个字节数据相加,结果放于R7R6中。
程序:MOV DPTR,#1000HMOV R2,#100MOV R7,#00MOV R6,#00LOOP:MOVX A,@DPTRADD A,R6MOV R6,AMOV A,R7ADDC A,#0MOV R7,AINC DPTRDJNZ R2,LOOPSJMP $18.编程实现R4R3⨯R2,结果放于R7R6R5中。
程序:ORG 0100HMUL1:MOV A,R2MOV B,R3MUL AB ;R2⨯R3,结果的低字节直接存入积的R5MOV R5,A ;结果的高字节存入R6中暂存起来MOV R6,BMUL2:MOV A,R2MOV B,R4MUL AB ;R2 R4,结果的低字节与R6相加后,再存入R6中ADD A,R6MOV R6,AMOV A,B ;结果的高字节加上进位位后存入R7中ADDC A,#00MOV R7,ASJMP $19.编程实现把片内RAM的20H单元的0位、1位,21H单元的2位、3位,22H单元的4位、5位,23H 单元的6位、7位,按原位置关系拼装在一起放于R2中。
程序:MOV C,20H.0MOV A.0,CMOV C,20H.1MOV A.1,CMOV C,21H.2MOV A.2,CMOV C,21H.3MOV A.3,CMOV C,22H.4MOV A.4,CMOV C,22H.5MOV A.5,CMOV C,23H.6MOV A.6,CMOV C,23H.7MOV A.7,CMOV R2,A20.用查表的方法实现一位十六进制数转换成ASCII。
程序:(设一位十六进制数放在R2中,轮换的ASCII也放于R2中)C16STASC:MOV DPTR,#TABMOV A,R2MOVC A,@A+DPTRMOV R2,ARETTAB:DB 30H,31H,32H,33H,34H,35H,36H,37HDB 38H,391H,41H,42H,43H,44H,45H,46H21.编程统计从片外RAM2000H开始的100个单元中“0”的个数放于R2中。
程序:MOV DPTR,#2000HMOV R3,#100MOV R2,#00LOOP:MOVX A,@DPTRJNZ NEXTINC R2NEXT:INC DPTRDJNZ R3,LOOPSJMP $第四章4-2有哪里些数据类型是MCS-51系列单片机直接支持的?答:见P89,基本类型:字符型,整型,长整型,浮点型,特殊功能寄存器;构造类型:数组类型,结构体类型,共用体,枚举指针类型空类型4-3 C51特有的数据结构类型有哪些?答:特殊功能寄存器,位类型4-4 C51的存储类型有几种?它们分别表示的存储器区域是什么?答:见P94页:存储器类型有:data, bdata,idata,pdata,xdata4-5 C51中bit位与sbit位有什么区别?答:bit是定义一个一般的位变量;而使用sbit定义可位寻址字节或是特殊功能寄存器的的位,定义时必指定其位地址,其存储空间为内部RAM中的位寻址区20H-2FH(位地址为:00H~7FH),4-6 在C51通过绝对地址来访问的存储器有几种方式?答:使用C51运行库中预定义宏,通过指针访问,使用C51扩展关键字_at_4-7 在C51中,中断函数与一般函数有什么不同?答:见P112页:7点4-8 按指定存储器类型和数据类型,写出下列变量的说明形式答:(1)在data定义字符变量var11:char data var11(2)在idata定义整型变量var12:char idata var12(3)在xdata定义无符号字符数组var11[4]:unsigned char xdata var13[4](4) 在xdata定义一个指向无符号字符的指针px: unsigned char xdata* px(5)定义可寻址位变量flag: bit flag;(6)定义特殊功能寄存器变量p3: sfr p3=0xb0(7) 定义特殊功能寄存器变量SCON:sfr SCON = 0x98(8)定义16位特殊功能寄存器变量T0:sfr16 T0=0x8a (无法真正与实际相匹配)4-9 设a=3,b=4,c=5,写出下列关系表达式或逻辑表达式的结果答:(1) a+b>c && b==c (False)(2) a||b+c&&b-c (True)(3)!(a>b) && !c|| 1 (True)(4)!(a+b)+c-1&&b+c/2 (True)4-10 break与continue语句的区别是什么?答:见P110; 使用break语句可以跳出switch和循环体,提前结束循环而接着执行循环结构下面的语句continue语句使用在循环体结构中,用于结束本次循环,跳过该语句下面尚未执行的语句,直接进行下一否执行循环的判断。