1、第一章1-4运算器,控制器,存储器,输入设备,输出设备1-9(7) 1-11(3) 1-12(4) 1-16(3)见例1-171-19(1)0100 01111-20(1)41 42 38第二章2-2 见书p30,2-4 见书p31,2-5 见书p31,2-6 见书p32,2-9 见书p38,2-10 见书p39,2-13 见书p43,2-14 见书p46,3-8 按要求写出相应的指令。(1)把寄存器R6的内容送到累加器A中。(2)把外部RAM 1000H单元的内容传送到内部RAM 30H单元中。(3)清除内部RAM 3FH 单元的高4位。(4)使累加器A的最低位置1。(5)清除进位位。(6)
2、使ACC.4和ACC.5置1。(7)把外部ROM 2000H单元中的内容送到内部RAM的20H单元中。(8) 把外部ROM 2000H单元中的内容送到外部RAM的3000H单元中。 答案:(1) MOV A,R6(2) MOV DPTR,#1000HMOVX A,DPTRMOV R0,#30HMOV R0,A (3) ANL 3FH,#0FH(4)ORLA,#01H(5)CLRC(6)ORLA,#30H(7)CLR AMOVDPTR,#2000HMOVCA,A+DPTRMOV20H,A(8)CLR AMOVDPTR,#2000HMOVCA,A+DPTRMOVDPTR,#3000HMOVXDPT
3、R,A 3-10 编写程序段完成如下要求。(1)将寄存器R0中的内容乘以10(积小于256)。(2)将片内RAM 30H单元开始的15个字节的数据传送到片外RAM 3000H开始的单元中。(3)将片外RAM 2000H开始的5个字节的数据传送到片内RAM 20H开始的单元中。(4)有10个字节的二进制数存放在片内RAM以 40H开始的单元内,编程找出其中的最大值并存于内部50H单元中。(5)将片外RAM空间2000H200AH中的数据的高4位变零,低4位不变,原址存放。(6)将外部RAM 2040H单元的内容与3040H单元的内容互换。答案:(1) MOV B,#0AHMOV A,R0MUL
4、ABMOV R0,A(2)ORG 0000HMOV R0,#30HMOV DPTR,#3000HMOV R7,#0FHLOOP: MOV A,R0MOVX DPRT,AINC R0INC DPTRDJNZ R7,LOOPSJMP $END(3)MOV DPTR,#2000HMOV R0,#20HMOV R7,#05HLOOP:MOVX A,DPTRMOV R0,AINC R0INC DPTRDJNZ R7,LOOPEND(4) ORG 0000HMOV A,40H;A寄存器放最大值,且初始化最大值(默认第一个数)MOV R3,#09H;比较次数MOV R0,#41HSTART:CJNE A,R
5、0,LOOPLOOP:JNC LOOP1;如果比A小,则跳转到LOOP1MOV A,R0;如果比A大,则更新A的值LOOP1:INC R0DJNZ R3 STARTMOV 50H,ASJMP $END(5) MOV DPTR,#20000HMOV R1,#0BHLOOP:MOVX A,DPTRANL A,#0FHMOVX DPTR,AINC DPTRDJNZ R1,LOOPSJMP $(6) MOV DPTR,#2040HMOVX A,DPTRMOVR0,#20HMOV R0,AMOV DPTR,#3040HMOVX A,DPTRXCH R0,AMOVX DPTR AMOV A,R0MOV D
6、PTR,#2040HMOVX DPTR,A3-15 设有一带符号的十六位数以补码形式存放在R2、R3寄存器中,试编制求其原码的程序。ORG 0000HSTART:MOV A,R3JB ACC.7,NEXT;判读符号位,如果是正数则原码与补码一样,如果为负,求原码的方法是符号位不变,其余位取反加1MOV R3,AHERE:SJMP $NEXT:XRL A,#7FH;高八位,符号位不变,其余取反MOV R3,A;放回R3MOV A,R2;低八位XRL A,#0FFH;取反ADD A,#01H;加1MOV R2,A;放回R2MOV A,R3;看低八位是否有向高八位进位ADDC A,#00HMOV R
7、3,ASJMP $END3-16 设有一不带符号的十六进制数组,存放在8031单片机片内RAM以BUFFER为首址的连续单元中,其长度为30个字节,要求统计小于10,等于10及大于10的数的个数,并把它们分别存放到片内RAM的LESS、EQUAL、BIG单元中,试编制实现上述要求的程序并画出相应的流程图。ORG 0000HBUFFER DATA 10HLESS DATA 30HEQUALDATA 31HBIG DATA 32HMOV R0,#BUFFERMOV R7,#1EHMOV LESS,#00HMOV EQUAL,#00HMOV BIG,#00HNEXT:CJNE R0,#0AH, LO
8、OP1;循环次数INC EQUALAJMP LOOP3LOOP1:JC LOOP2INC BIGAJMP LOOP3LOOP2:INC LESSLOOP3:INC R0DJNZ R7, NEXTSJMP $END3-17 在外部RAM 1000H单元开始的存储区域存放着10个用ASCII码表示的09之间的数字,请编程将它们转换成BCD码,然后存放在2000H2004H单元(以压缩BCD码存放)。ORG 0000HMOV R2,#05HMOV DPTR,#1000HMOV R0,#20HLOOP:MOVX A,DPTRANL A,#0FHMOV R4,AINC DPTRMOVX A,DPTRAN
9、L A,#0FHSWAP AADD A,R4MOV R0,AINC R0 INC DPTRDJNZ R2,LOOPMOV R5,#05HMOV R0,#20HMOV DPTR,#2000HLOOP1: MOV A,R0MOVX DPTR,AINC R0 INC DPTRDJNZ R5,LOOP1SJMP $END3-18 设有50个无符号8位二进制数,存放在8031单片机内部RAM以BOFER为首址的连续单元中,试编制将其中最小数存放到内部RAM的MIN单元的程序并画出相应的流程图。ORG 0000HBOFER DATA 20HMIN DATA 60HMOV R2,#31H;循环49次MOV
10、R1,# BOFER+1MOV MIN,BOFER;把最小值放A,且初始化时把第一个数放入ALOOP:CJNE R1,MIN,LOOP1LOOP1:JNC LOOP2; R1MINMOV MIN,R1 ;MIN R1,MIN要更新LOOP2:INC R1DJNZ R2,LOOPSJMP $END3-19 设有一字符串存放在8031单片机内部RAM以20H为首址的连续单元中,字符串以回车结束。要求统计该字符串中字符B(B=42H)的个数,并将其存入外部RAM的40H单元中。试编写实现上述要求的程序并画出相应的流程图。ORG 0000HMOV R0,#20HMOV R1,#00H;B的个数初始化L
11、OOP:MOV A,R0CJNE A,#42H,NEXT;不为B则跳转LOOP1: INC R1; 为B则使计数器加1 INC R0 AJMP LOOPNEXT:CJNE A,#0DH,LOOP1;判断是否结束(回车键)MOV DPTR,#0040H;把结果放外部RAM中MOV A,R1MOVX DPTR,ASJMP $END3-23 已知MDA和MDB单元内分别存有两个小于10的整数a和b,试用查表子程序实现c=a2+2ab+b2,并把和存于MDC和MDC+1单元中(MDC单元中放低字节,MDC+1单元中放高字节)。ORG 0000HMDA DATA 20HMDB DATA 21HMDC D
12、ATA 22HORG0000HCLR CMOV A,MDAACALL SQRMOV R2,AMOV A,MDBACALL SQRADD A,R2MOV R2,A;a2+b2结果暂时放入R2MOV B,MDA;下面算2*a*bMOV A,MDBMUL ABRL AADDC A,R2MOV MDC,ACLR AADDC A,#00HMOV MDC+1,ASJMP$SQR:ADD A,#01HMOVC A,A+PCRETSQRTAB:DB 0 1 4 9 16 25 36 49 64 81 100 121 DB 144 169 196 225END3-25 设有一长度为20H的字符串,存放在8031
13、单片机片内RAM以10H为首地址的连续单元中,试编制将其中数字与字母分开并将它们分别送到以30H和50H为首地址的连续单元中的程序。ORG 0000HMOV R2,#20H;循环次数MOV R1,#10HMOV 60H,#30H;数字存储首地址MOV 61H,#50H;字母存储首地址LOOP:MOV A,R1 CJNE A,#40H,NEXTNEXT:JNC NEXT1;如果是字母则跳转到NEXT1 MOV R0,60H ;是数字,把数字的存储地址给R0 MOV R0,A INC 60H SJMP LOOP1NEXT1: MOVR0,61HMOV R0,A;是字母,把字母的存储地址给R0 IN
14、C 61HLOOP1:INC R1 DJNZ R2,LOOP SJMP$ END第四章4-3,见书 略4-4,见书 略4-5,见书 略4-8,见书 略4-9,见书 略4-16,16. 高电平: 初值: 低电平: 初值: ORG 0000HAJMP MAINORG 000BHAJMP TOINTMAIN: MOV TMOD, #01H MOV TH0, #FDHMOV TL0, #64HMOV IE, #82HSETB P1.0SETB TR0SJMP $TOINT: MOV C, P1.0JC NEXTMOV TH0, #0FDHMOV TL0, #64HSJMP COMNEXT: MOV T
15、H0, #0FAHMOV TL0, #0CAHCOM: CPL P1.0RETIEND4-17,定时器50ms,循环2次可得100ms,设定初值3CB0HORG 0000HAJMP MAINORG 001BHAJMP BRT1MAIN: MOV TMOD #10HMOV TH1, #3CHMOV TL1, #0B0HMOV R1,#10HMOV R0,#70HMOV R2,#5MOV R3,#02HMOV IE,#88HSETB TR1LOOP: SJMP $BRT1: MOV TH1, #3CHMOV TL1, #0B0HDJNZ R3, DONEMOV R3, #02HDJNZ R2, L
16、OOPCLR ET1SJMP DONELOOP: MOV R4, #10LOOP1: MOV A,R1MOV R0,AINC R1INC R0DJNZ R4, LOOP1DONE: RETI END4-26,串行接口设置为方式1,采用定时器T1方式2作为波特率发生器,SMOD=0,则计数初值0E6H分别装入TL1,TH1,程序如下:ORG0000HAJMP MAINORG 0023HAJMP PR1RBLOCK DATA 2000HMAIN: MOV TMOD, #20HMOV TL1, #0E6HMOV TH1, #0E6HMOV PCON, #00HSETB TR1MOV SCON, #5
17、0HMOV DPTR, # RBLOCK MOV R2, #30SETB EASETB ESWAIT: JB PSW.5 ERROR1SJMP WAITERROR1: CLR EASJMP $PR1: CLR RIMOV A, SBUFMOV C, PSW.0JC ERRORANL A, #7FHMOVX DPTR, ADJNZ R2, NEXTCLR EASJMP $ERROR: SETB PSW.5 SJMP NEXT1NEXT: INC DPTRNEXT1: RETIEND第五章5-8 要在单片机片外扩展16KB数据存储器,选择其地址为00003FFFH。如选用6264为存储器芯片,74
18、LS138为译码器,试画出硬件的连接图。(图中右边的6116应该改为6264) 5-9 要在单片机片外扩展32KB数据存储器,选择其地址为8000HFFFFH。如选用线选法,试设计其硬件的连接图。 5-11 决定8155端口地址的引脚有哪些? 的作用是什么?T/IN和 的作用是什么?1.AD0AD7(8条) 三态地址/数据线控制总线(8条) I/O总线(22条)电源线(2条)2. 为I/O口及存储器选择信号,若 =0,则选择存储器;否则选择I/O口;3.T/IN为定时器输入,定时器工作所需的时钟信号由此端输入。 为定时器输出;5-13 LED数码管显示器在单片机系统中有哪几种显示方式?LED显
19、示器的显示方式可分为静态显示和动态显示两种。静态显示是指每个数码管的段选线控制是独立的,其特点是各LED管能稳定地同时显示各自的字形。动态显示又称扫描显示方式,它是将每个数码管的段选线同名相连,在某一时刻只让一根位选线有效,同时在段选线上输出该位要显示的字形码,在下一时刻改变要显示的字位并在段选线上输出相应的字形码,如此各LED轮流地一遍一遍地显示各自的字符,由于视觉器官具有视觉暂留效应,从而看到的是各LED似乎在同时显示不同的字形。5-14 以共阴极数码管为例说明其字形码是如何形成的?共阴极是把八个二极管的阴极接在一起作为位选线,低电平有效。下图为八段LED数码显示管的结构和原理图。管脚信号
20、ah用来控制显示的字形,称为段选线,一般将段选线的高低电平按h、g、f、e、d、c、b、a顺序排列,形成十六进制编码,称为字形码 5-16 已知30H单元中有一带符号数,若它是正数,则在图5-41所示接口电路中自左至右不断地依次显示0;若它是负数,则自右至左不断地依次显示1。试编写相应的程序。ORG0000HSTART: MOVR1, #06H;数码管个数MOVR2, #20H;负数时数码管自右向左显示时初始位控制字MOVR3, #01H;正数时数码管自左向右显示时初始位控制字MOVR7, #02H;延时1ms,内部循环MOVR6, #0FFH;延时1ms,外部循环MOVA, #0EH;命令控
21、制字,B口输出,C口输出MOVDPTR, #2100H;命令寄存器地址MOVDPTR, A;写命令MOVA, 30H;取出30H单元的数,判断正负JBACC.7,NEG ;如果为负则跳转至NEGSJMPPOS;如果为正则跳转至POSNEG:MOVA, #06H;“1”的字形码MOVDPTR, #2102H;B寄存器MOVXDPTR, A;NXN:MOVA,R2;负数的位控制字MOVDPTR, #2103H;C寄存器MOVXDPTR, A;输出位控制字,控制数码管的显示RRA;位控制字右移一位,实现数码管自右向左点亮MOVR2,A;把位控制字放回R2寄存器ACALLDL;调用延时程序,延时1ms
22、NEXTN:DJNZR1, NXN;判断数码管是否已经循环完毕SJMPJS;如果显示完毕则跳转至JSPOS:MOVA, #3FH; “0”的字形码MOVDPTR, #2102H; B寄存器MOVXDPTR, A;NXP:MOVA,R3; 正数的位控制字MOVDPTR, #2103H; C寄存器MOVXDPTR, A;RLA; 位控制字左移一位,实现数码管自左向右点亮MOVR3, A; 把位控制字放回R3寄存器ACALLDL; 调用延时程序,延时1msNEXTP:DJNZR1, NXP; 判断数码管是否已经循环完毕JS:SJMPSTART; 如果显示完毕则跳转至JSDL:MOVR6, #0FFH
23、;延时1ms子程序DL6:DJNZR6, DL6;DJNZR7, DL;RETEND5-18设计具有三个按键的电路并编写相应的程序:当第一个按键按下时,将40H单元置1;当第二个按键按下时,40H单元置2;当第三个按键按下时,40H单元置0。 ORG0000HSCAN:MOVDPTR, #0101HMOVA, #00HMOVDPTR, AMOVDPTR, #0103HMOVXA, DPTRANLA, #07HCJNEA, #07H, KEYSCANKEYSCAN:ACALLDYRMSMOVR2, #0FEHKEYSM1:MOVA, R2MOVDPTR, #0101HMOVXDPTR, AMOV
24、DPTR, #0103HMOVXA, DPTRANLA, #07HCJNEA, #07H, JSADDSJMP$JSADD:JBACC.0, JSADD1MOV40H, #01HAJMPDONEJSADD1:JBACC.1, JSADD2MOV40H, #02HAJMPDONEJSADD2:JBACC.2, DONEMOV40H, #00HDONE:SJMP$DYRMS:MOVR7, #18HDYRMS1:MOVR6, #0FFHDYRMS2:DJNZR6, DYRMS2DJNZR7, DYRMS1RETEND第六章6-5 见书p211,6-6 见书p213,6-8 仿书p216,6-10见书
25、p219,6-11 见书p221,3.解:分辨率为 6-8利用8051单片机和DAC0832产生的梯形波(如图6-16所示,梯形波的斜边采用步幅为1的线性波形,幅度从00H80H,水平段调用延迟程序维持),编写梯形波产生的程序。若水平段由8051的内部定时器/计数器来维持,程序应怎样编制? 图6-16 梯形波8 ORG 0000HTIXING: MOV A, #00HMOV DPTR, #7FFFHMOV R2, #80HUP: MOVX DPTR, AINC ADJNZ R2, UPACALL DELAYDOWN: MOVX DPTR, ADEC AJNZ DOWNACALL DELAYSJ
26、MP UPDELAY: MOV R4, #02HDEL1: MOV R5, #0F4HDEL2: DJNZ R5, DEL2DJNZ R4, DEL1RETEND若是采用定时器维持水平段:ORG 0000HAJMP MAINORG 000BHAJMP T0INTMAIN: MOV TMOD, #01HMOV TH0, #0D8HMOV TL0, #0FAHMOV IE, #82HMOV A, #00HMOV DPTR, #7FFFHMOV R2,#80HUP: MOVX DPTR,AINC ADJNZ R2, UPSETB F0SETB TR0SJMP $T0INT: CLR TR0JB F0
27、, DOWNCLR AMOV R2, #80HUP: MOVX DPTR, AINC ADJNZ R2, UPSETB F0SJMP FANDOWN: MOVX DPTR,ADEC AJNZ DOWNCLR F0FAN:MOV TH0, #0D8HMOV TL0, #0FAHSETB TR0RETI12. ORG 0000HADC: MOV DPTR, #7FFFHMOV R0, #30HLOOP: MOV A, #01HMOVX DPTR,AMOV R2,#05HDL: DJNZ R2,DLWAIT: JB P3.3,WAITMOVX A,DPTRMOV R0, ASJMP ADCEND6-
28、13参考图6-13所示的电路原理图,若使ADC0809的8个模拟通道地址处于4000H5FFFH,接口电路应如何改动?编写程序,定时1s对IN7通道进行A/D转换,利用8051的定时器/计数器T0实现定时,结果存于8051的内部RAM 50H单元。13. 定时器50ms,循环20次可得1s,设定初值3CB0HORG 0000HAJMP MAINORG 000BHAJMP TOINTMAIN: MOV TMOD,#01HMOV R1,#20LOOP: MOV TH0,#03CHMOV TL0,#0B0HMOV DPTR,#6007HMOVX DPTR,AMOV R0, #50HSETB ET0SETB EASETB TR0SJMP $TOINT: DJNZ R1,LOOP MOV R1,#20MOVX A,DPTR MOV R0,AMOVX DPTR,ALOOP: MOV TH0,#03CHMOV TL0,#0B0HRETIEND