-----------------------Page1-----------------------单片机原理、接口及应用——嵌入式系统技术基础习题解答预备篇计算机的基础知识0.140H,62H,50H,64H,7DH,FFH0.2812,104,213,256,2936,9410.3十进制数原码补码十进制数原码补码281CH1CH250FAHFAH-289CHE4H-347815BHFEA5H10064H64H92803A0H03A0H-1308082HFF7EH-92883A0HFC60H0.4机器数真值分别为:27,233,-128,-8,14717,31467,-27824,-124780.5(1)33H+5AH=8DH,OV=1,CY=0。(2)-29H-5DH=7AH,OV=0,CY=1。(3)65H-3EH=27H,OV=0,CY=1。(4)4CH-68H=E4H,OV=0,CY=0。0.6十进制数压缩BCD数非压缩BCD数ASCII码3838H0308H3338H255255H020505H323535H483483H040803H343833H764764H070604H373634H10001000H01000000H31303030H10251025H01000205H31303235H0.7ASCII码表示的十六进制数分别为:105H,7CAH,2000H,8A50H基础篇1MCS-511MCS-5111MMCCSS--5511第章、单片机结构1.1单片微型计算机(即单片机)是包含CPU、存储器和I/O接口的大规模集成芯片,即它本身包含了除外部设备以外构成微机系统的各个部分,只需接外设即可构成独立的微机应用系统。微机处理器仅为CPU,CPU是构不成独立的微机系统的。1.2参见教材1.1.1节1.3参见教材第6页表格1.4参见教材表1.41.5参见教材表1.1和表1.21.6当PSW=10H表明选中的为第二组通用寄器R0~R7的地址为10H~17H1.7程序存储器和数据存储器尽管地址相同,但在数据操作时,所使用的指令不同,选通信号也不同,因此不会发生错误。1.8内部数据程序外部数据程序1.9振荡周期=0.1667μs机器周期=2μs指令周期=2~8μs1-----------------------Page2-----------------------1.10A=0,PSW=0,SP=07,P0~P3=FFH251251第22章、5511系列单片机的指令系统2.1参见教材2.1节2.2因为A累加器自带零标志,因此若判断某内部RAM单元的内容是否为零,必须将其内容送到A,JZ指令即可进行判断。2.3当A=0时,两条指令的地址虽然相同,但操作码不同,MOVC是寻址程序存储器,MOVX是寻址外部数据存储器,送入A的是两个不同存储空间的内容。2.4目的操作数源操作数寄存器直接SP间接寻址直接直接直接直接立即寄存器间址直接寄存器变址寄存器间址寄存器2.5Cy=1,OV=0,A=94H2.6√×√×××√√×√×××××√××××××2.7A=25H(50H)=0(51H)=25H(52H)=70H2.8SP=(61H)(SP)=(24H)SP=(62H)(SP)=(10H)SP=(61H)DPL=(10H)SP=(60H)DPH=(24H)执行结果将0送外部数据存储器的2410单元2.9程序运行后内部RAM(20H)=B4H,A=90H2.10机器码源程序7401LA:MOVA,#01HF590LB:MOVP1,A23RLAB40AFACJNE,#10,LB80F6SJMPLA2.11ANLA,#0FHSWAPAANLP1,#0FHORLP1,ASJMP$2.12MOVA,R0XCHA,R1MOVR0,ASJMP$2.13(1)利用乘法指令2-----------------------Page3-----------------------MOVB,#04HMULABSJMP$(2)利用位移指令RLAMOVB,ARLAMOVA,20HMOV20H,AANLA,#0FCHANLA,#03HSJMP$(3)用加法指令完成ADDA,ACCMOVR1,A;R1=4AMOVR0,A;R0=2AMOVA,BMOVA,#0ADDCA,B;进位×2ADDCA,#0MOVB,A;存积高位MOVB,A;B存2A的进位MOVA,R1;存积低位MOVA,R0SJMP$ADDA,ACC2.14XRL40H,#3CHSJMP$2.15MOVA,20HADDA,21HDAAMOV22H,A;存和低字节MOVA,#0ADDCA,#0MOV23H,A;存进位SJMP$2.16MOVA,R0JZZEMOVR1,#0FFHSJMP$ZE:MOVR1,#0SJMP$2.17MOVA,50HMOVB,51HMULABMOV53H,BMOV52H,ASJMP$2.18MOVR7,#0AHWOP:XRLP1,#03HDJNZR7,WOPSJMP$2.19单片机的移位指令只对A,且只有循环移位指令,为了使本单元的最高位移进下一单元的最低位,必须用大循环移位指令移位4次。ORG0MOVA,22HCLRCRLCAMOVA,20HMOV22H,ARLCAMOVA,#0MOV20H,ARLCAMOVA,21HMOV23H,ARLCASJMP$MOV21H,A3-----------------------Page4-----------------------3MSC-513MSC-51第33章、MMSSCC--5511单片机汇编语言程序设计3.1因为是多个单元操作,为方便修改地址使用间址操作。片外地址用DPTR指示,只能用MOVX指令取数到A,片内地址用R0或R1指示,只能用MOV指令操作,因此循环操作外部数据存贮器→A→内部部数据存贮器。ORG0000HINCDPTRMOVDPTR,#1000HINCR0MOVR0,#20HCJNER0,#71H,LOOPLOOP:MOVXA,@DPTRSJMP$MOV@R0,A3.2要注意两高字节相加应加低字节相加时产生的进位,同时要考虑最高位的进位。ORG0MOV51H,AMOVA,R0MOVA,#0ADDA,R6ADDCA,ACCMOV50H,AMOV52H,AMOVA,R7SJMP$ADDCA,R13.3A中放小于14H(20)的数,平方表的一个数据占2个字节,可用BCD码或二进制数存放.(如A中放的是BCD码,则要先化成二进制数再查表。)ORG0INCAMOVDPTR,#TABMOVCA,@A+DPTRADDA,ACC;A*2MOVR6,APUSHACCSJMP$MOVCA,@A+DPTRTAB:DB00,00,00,01,00,04,00,09,00,16H,……MOVR7,ADB………04H,00POPACC3.4先用异或指令判两数是否同号,在同号中判大小,异号中正数为大.ORG0BG:MOV22H,21HMOVA,20HSJMP$XRLA,21HCMP:MOVA,20HANLA,#80HCJNEA,21H,GRJZCMPGR:JNCAGJB20H.7,BGMOV22H,21HAG:MOV22H,20HSJMP$SJMP$3.5fosc=6MHZ机器周期数DELAY:MOVR1,#0F8H1LOOP:MOVR3,#0FAH1DJNZR3,$2DJNZR1,LOOP2RET2(1+(1+2*0xFA+2)*0xF8+2)*12/6MHz=(1+(1+2*250+2)*248+2)*2us=249.494ms3.6将待转换的数分离出高半字节并移到低4位加30H;再将待转换的数分离出低半字节并30H,安排好源地址和转换后数的地址指针,置好循环次数。ORG0000HMOVA,@R0MOVR7,#05HANLA,#0FHMOVR0,#20HADDA,#30HMOVR1,#25HMOV@R1,ANET:MOVA,@R0INCR0ANLA,#0F0HINCR1SWAPADJNZR7,NEADDA,#30HSJMP$4-----------------------Page5-----------------------MOV@R1,AENDINCR13.7片内RAM间址寄存器只能有R0和R1两个,而正数、负数和零共需3个寄存器指示地址,这时可用堆栈指针指示第三个地址,POP和PUSH在指令可自动修改地址。R0指正数存放地址和R1指负数存放地址,SP指源数据存放的末地址,POP指令取源数据,每取一个数地址减1。ORG0000HMOVR7,#10HMOVA,#0MOV@R0,AMOVR4,AINCR0MOVR5,AAJMPDJMOVR6,ANE:INCR5MOVR0,#40HMOV@R1,AMOVR1,#50HINCR1MOVSP,#3FHAJMPDJNEXT:POPACCZER0:INCR6JZZER0DJ:DJNZR7,NEXTJBACC.7,NESJMP$INCR4END3.8可直接用P标志判断(JBP,ret)ORG0000HMOVA,40HJBP,EN;奇数个1转移ORLA,#80H;偶数个1最高位加“1”EN:SJMP$3.9取补不同于求补码,求补码应区别正、负数分别处理,而取补不分正、负,因正、负数均有相对于模的补数。用取反加1求补也可用模(00H)减该数的方法求补。ORG0000HMOVR7,#03HAB:INCR0MOVR0,#DATAMOVA,@R0MOVA,@R0CPLACPLAADDCA,#0ADDA,#01DJNZR7,ABMOV@R0,ASJMP$3.1016个单字节累加应用ADD指令而不能用ADDC指令,和的低位存A,当和超过一个字节,和的高字节存于B,并要加进低位相加时产生的进位,16个单字节加完后,采用右移4次进行除十六求平均值的运算,商在BUF2单元,余数在BUF2-1单元。ORG0000HMOVR6,#04HMOVR7,#0FHMOVBUF2,AMOVR0,#BUF1MOVBUF2-1,#0MOVB,#0NEX:CLRCMOVA,@R0MOVA,BMOVR2,ARRCANEXT:MOVA,R2MOVB,AINCR0MOVA,BUF2ADDA,@R0RRCAMOVR2,AMOVBUF2,AMOVA,BMOVA,BUF2-1ADDCA,#0RRCAMOVB,AMOVBUF2-1,ADJNZR7,NEXTDJNZR6,NEX;以上完成求和SJMP$;以上完成除十六运算3.11将20H单元的内容分解为高4位和低4位,根据是否大于9分别作加37H和30H处理。ORG0000HMOVA,20H5-----------------------Page6-----------------------ANLA,#0F0HSJMP$SWAPAASCII:CJNEA,#0AH,NEACALLASCIINE:JCA30MOV22H,AADDA,#37HMOVA,20HRETANLA,#0FHA30:ADDA,30HACALLASCIIRETMOV21H,A3.12要注意,位的逻辑运算其中一个操作数必须在C。ORG0000HCPLCMOVC,20HANLC,53HANLC,2FHMOVP1.0,CCPLCSJMP$ORLC,/2FHEND3.13ORG0000HMOVC,ACC.3ANLC,P1.4ANLC,/ACC.5MOV20H,CMOVC,B.4CPLCANLC,/P1.5ORLC,20HMOVP1.2,CSJMP$END6-----------------------Page7-----------------------3.14设一字节乘数存放在R1,三字节的被乘数存放在data开始的内部RAM单元,且低字节存放在低位地址单元,R0作为被乘数和积的地址指针,用MUL指令完成一字节乘一字节,每一次部分积的低位加上一次部分积的高位,其和的进位加在本次部分积的高位上,并暂存,三字节乘一字节共需这样三