• 717.00 KB
  • 2022-04-22 11:19:26 发布

《单片机原理及接口技术》(第二版)余锡存著 课后习题答案.doc

  • 51页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'第二章1.89C51、87C51、80C51和80C31单片机的主要区别在那里?答:相同之处是:制造工艺都为CHMOS,都有128字节片内RAM、两个定时/计数器、4个8位I/O并行口,一个串行口和5个中断源。主要区别:①89C51片内4K字节FLASHROM;②87C51片内4K字节EPROM;③80C51片内4K字节掩膜ROM;④80C31片内无程序存储器。2.MCS-51单片机引脚有多少I/O线?它们和单片机对外的地址总线和数据总线有何关系?答:4个8位I/O并行口,一个串行口;其中P0口为外接程存和数存的地址低8位和数据总线的时分复用接口;其中P2口为外接程存和数存的地址高8位总线接口;其中P1口为真正的用户口线;其中P3口有第2功能;以上4个口线在没有专用功能时,也可以做通用I/O口线用。3.简述8031片内RAM区地址空间的分配特点。 答:MCS-51单片机片内RAM为256字节,地址范围为00H~FFH,分为两大部分:低128字节(00H~7FH)为真正的RAM区;高128字节(80H~FFH)为特殊功能寄存器区SFR。在低128字节RAM中,00H~1FH共32单元是4个通用工作寄存器区。每一个区有8个通用寄存器R0~R7。4.MCS-51单片机由哪几个部分组成。答:①一个8位CPU;②4KBROMorEPROM(8031无ROM);③128字节RAM数据存储器;④21个特殊功能寄存器SFR;⑤4个8位并行I/O口,其中P0、P2为地址/数据线,可寻址64KB程序存储器和64KB数据存储器;⑥一个可编程全双工串行口;⑦具有5个中断源,两个优先级,嵌套中断结构;⑧两个16位定时器/计数器;⑨一个片内振荡器及时钟电路。7.8.4.5.6.5.MCS-51单片机的信号各自的功能是什么?答:都是控制总线①:访问内部程序存储器的控制信号/编程电压输入端。时,CPU从片内读取指令,CPU从片外读取指令。 ②:地址锁存允许/编程信号线。③:外部程序存储器读选通信号。④:复位输入信号/掉电保护后备电源引脚。6.MCS-51单片机如何实现工作寄存器组的选择?RS1(PSW.4)、RS0(PSW.3)为工作寄存器组的选择位;①取值为00时选择第0组工作寄存器,片内RAM地址是00H~07H,名称为R0~R7;②取值为01时选择第1组工作寄存器,片内RAM地址是08H~0FH,名称为R0~R7;③取值为10时选择第2组工作寄存器,片内RAM地址是10H~17H,名称为R0~R7;④取值为11时选择第3组工作寄存器,片内RAM地址是18H~1FH,名称为R0~R7。4.什么是时钟周期、机器周期、指令周期?当单片机的时钟频率为12MHz时,一个机器周期是多少?ALE引脚的输出频率是多少?(1)振荡周期:也称时钟周期,是指为单片机提供时钟脉冲信号的振荡源的周期。(2)状态周期:每个状态周期为时钟周期的2倍,是振荡周期经二分频后得到的。(3)机器周期:一个机器周期包含6个状态周期S1~S6,也就是12个时钟周期。 在一个机器周期内,CPU可以完成一个独立的操作。(4)指令周期:它是指CPU完成一条操作所需的全部时间。每条指令执行时间都是有一个或几个机器周期组成。MCS-51系统中,有单周期指令、双周期指令和四周期指令。当单片机的时钟频率为12MHz时,一个机器周期是多少1μs(微秒);ALE引脚的输出频率是多少2μs(微秒)。第三章1.MCS-51指令系统按功能分为几类?具有几种寻址方式?他们的寻址范围如何?答:①按功能分为5类,分别是:数据传送类、算术操作类、逻辑操作类、控制转移类和位操作类;②具有7种寻址方式;③立即寻址,寻址范围是程序存储器;直接寻址,寻址范围是内部RAM低128字节和高128字节;寄存器寻址,寻址范围是四组工作寄存器R0~R7;寄存器间接寻址,寻址范围是内部RAM的低128和外部RAM低64K可寻址空间;基址寄存器加变址寄存器间接寻址,寻址范围是程序存储器;相对寻址,寻址范围是以下一条指令为相对地址的-128~+127字节范围内;位寻址,寻址范围是可位寻址空间,包括内部RAM的可寻址位,特殊功能寄存器中的可寻址位。 2.设内部RAM中59H单元的内容为50H,写出当执行下列程序段后寄存器A,R0,和内部RAM中50H、51H单元的内容为和值?答:MOVA,59H;(A)=(59H)=50HMOVR0,A;(R0)=50HMOVA,#00;(A)=00MOV@R0,A;((R0))=(50H)=00MOVA,#25H;(A)=25HMOV51H,A;(51H)=25HMOV52H,#70H;(52H)=70H执行下列程序段后:(A)=25H,(R0)=50H,(50H)=00、(51H)=25H3.PSW中Cy与OV有何不同?下列程序段执行后(Cy)=?(OV)=?。MOVA,#56HADDA,#74H答:Cy—进位、借位标志位;OV—溢出标志位。MOVA,#56H;(A)=56H=01010110BADDA,#74H;(A)=56H+74H=0CAH=11001010B,程序执行后:(Cy)=0(OV)=14.MOVCA,@A+DPTR与MOVXA,@DPTR指令有何不同? 答:①MOVCA,@A+DPTR;寻找的操作数在程序存储器中,地址是:(A)+(DPTR);②MOVXA,@DPTR;寻找的操作数在外部数据存储器中,地址是:(DPTR)。5.AJMP、LJMP、SJMP指令功能上有何不同?答:相同之处,都是无条件转移指令。①AJMPaddr11;下调指令为基准的2KB范围内的跳转指令。②LJMPaddr16;转移的目标地址可以在64KB程序存储器的任何地方。③SJMPrel;下调指令为基准的-128B~+127B范围内的短跳转指令。6.设堆栈指针SP中的内容为60H,内部RAM中30H和31H单元的内容分别为24H和10H,执行下列程序段后,61H,62H,30H,31H,DPTR及SP中的内容将有何变化?PUSH30HPUSH31HPOPDPLPOPDPHMOV30H,#00HMOV31H,#0FFH答:PUSH30H;(61H)=(30H)=24H PUSH31H;(62H)=(31H)=10HPOPDPL;(DPL)=(62H)=10HPOPDPH;(DPH)=(61H)=24HMOV30H,#00H;(30H)=00HMOV31H,#0FFH;(31H)=0FFH程序执行后:(61H)=24H,(62H)=10H,(30H)=00H,(31H)=0FFH,(DPTR)=2410H7.试分析下列程序段,当程序执行后,位地址00H和01H中的内容将为何值?P1口的8条I/O线为何状态?CLRCMOVA,#66HJCLOOP1CPLCSETB01HLOOP1:ORLC,ACC.0JBACC.2,LOOP2LOOP2:MOVP1,A答:CLRC;(Cy)=0MOVA,#66H;(A)=66H=01100110BJCLOOP1;因此时(Cy)=0,所以不跳转CPLC;(Cy)=1 SETB01H;(01H)=1LOOP1:ORLC,ACC.0;(Cy)=(Cy)∨(ACC.0)=1JBACC.2,LOOP2;因(ACC.2)=1LOOP2:MOVP1,A;(P1)=01100110B8.要完成以下的数据传送,应如何用MCS-51指令实现?⑴R1的内容传送到R0;⑵片外RAM20H单元的内容送R0;⑶片外RAM20H单元的内容送片内RAM20H单元;⑷片外RAM1000H单元的内容送片内RAM20H单元;⑸ROM2000H单元的内容送R0;⑹ROM2000H单元的内容送片内RAM20H单元;⑺ROM2000H单元的内容送片外RAM20H单元。答:⑴R1的内容传送到R0;MOVA,R1MOVR0,A⑵片外RAM20H单元的内容送R0;MOVR1,#20HMOVXA,@R1MOVR0,A⑶片外RAM20H单元的内容送片内RAM20H单元;MOVR1,#20H MOVXA,@R1MOV20H,A⑷片外RAM1000H单元的内容送片内RAM20H单元;MOVDPTR,#20HMOVXA,@DPTRMOV20H,A⑸ROM2000H单元的内容送R0;MOVDPTR,#2000HCLRAMOVCA,@A+DPTRMOVR0,A⑹ROM2000H单元的内容送片内RAM20H单元;MOVDPTR,#2000HCLRAMOVCA,@A+DPTRMOV20H,A⑺ROM2000H单元的内容送片外RAM20H单元。MOVDPTR,#2000HCLRAMOVCA,@A+DPTRMOVR0,#20HMOVX@R0,A 9.分析以下程序每条指令执行的结果:MOVA,#25H;(A)=25HMOVR1,#33H;(R1)=33HMOV40H,#1AH;(40H)=1AHMOVR0,40H;(R0)=1AHADDA,R1;(A)=25H+33H=58HADDCA,@R0;(A)=58H+(1AH)+(Cy)=58HADDCA,40H;(A)=58H+1AH+(Cy)=72H10.设A=83H,R0=17H,(17H)=34H,执行下列程序后,(A)=?ANLA,#17H;(A)=10000011B∧00010111B=00000011BORL17H,A;(17H)=00110100B∨00000011B=00110111BXRLA,@R0;(A)=00000011B⊕00110111=00110100BCPLA;(A)=11001011B11.两个4位BCD码数相加,被加数和加数分别存于30H、31H和40H、41H单元中(次序为千位、百位在低地址中,十位、个位在高地址中),和数放在50H、51H、52H中(52H用于存放最高位的进位),试编写加法程序。解:ORG00HMOV30H,#12H;MOV31H,#34H;MOV40H,#56H;MOV41H,#78H;MOVA,31H;取被加数十个位 ADDA,41H;相加,(A)=(31H)+(41H)DAA;十进制调整MOV51H,A;存十位个位运算结果MOVA,30H;取被加数千百位ADDCA,40H;相加,(A)=(30H)+(40H)DAA;十进制调整MOV50H,A;存千位百位运算结果CLRA;清AADDCA,#0;将进位加到A中MOV52H,A;存进位SJMP$12.试编写一程序,查找内部RAM单元的20H~50H中是否有0AAH这一数据,若有,则将51H单元置为01H,若没有,则使51H单元置0。解:ORG00HMOV30H,#0AAH;MOVR1,#31H;MOVR0,#20H;BIJIAO:MOVA,@R0CJNEA,#0AAH,LOOP;MOV51H,#01HSJMPJIESHULOOP:INCR0 DJNZR1,BIJIAOMOV51H,#00HJIESHU:SJMP$第四章1、若有两个符号数X,Y分别存放在内部存储器50H、51H单元中,试编写一个程序实现X*10+Y,结果存入52H、53H中。1ORG00H000078502MOVR0,#50H0002E63MOVA,@R0000375F00A4MOVB,#0AH0006A45MULAB0007086INCR00008267ADDA,@R00009088INCR0000AA6F09MOV@R0,B000C0810INCR0000DF611MOV@R0,A12END2、在以3000H为首地址的外部RAM中,存放了14个以ASCII码表示的0~9的数,试编写程序将它们转换成BCD码,并以压缩BCD形式存放在以2000H为首地址的外部RAM中。1ORG00H 00009030002MOVDPTR,#3000H;原始数据首地址000378073MOVR0,#07;循环次数000579304MOVR1,#30H;转换结果暂存区指针0007E05CH1:MOVXA,@DPTR0008550F6ANLA,#00001111B000AC47SWAPA000BF5F08MOVB,A000DA39INCDPTR000EE010MOVXA,@DPTR000F550F11ANLA,#00001111B001145F012ORLA,B0013F713MOV@R1,A00140914INCR10015A315INCDPTR0016D8EF16DJNZR0,CH1001890200017MOVDPTR,#2000H;转换结果存储区001B7A0718MOVR2,#07H;结果个数001D793019MOVR1,#30H001FE720CH2:MOVA,@R1;3、采样的5个值分别存放在R0、R1、R2、R3、R4中,求出它们的中间值,并存放在R2中。 1ORG00H>000078052MOVR0,#5000279063MOVR1,#600047A074MOVR2,#700067B085MOVR3,#800087C096MOVR4,#9000AE47CLRA;000BC38CLRC;000CE89MOVA,R0;000D2910ADDA,R1;000E2A11ADDA,R2;000F2B12ADDA,R300102C13ADDA,R4001175F00514MOVB,#500148415DIVAB0015FA16MOVR2,A001617END18END4、以BUF1为起始地址的外部数据存储区中存放着16个单字节的无符号数,求其平均值并送入R2中。1ORG00H2BUF1EQU#1000H 00009010003MOVDPTRBUF10003AA004MOVR2,0000578165MOVR0,#16H0007E06SUM:MOVXA,@DPTR00082A7ADDA,R20009FA8MOVR2,A000AA39INCDPTR000BD8FA10DJNZR0,SUM000D75F01011MOVB,#10H00108412DIVAB0011FA13MOVR2,A14END5、试编写程序,将内部RAM单元中DATA1开始的20个单字节数依次与DATA2单元为起始地址的20个单字节数据进行交换。>1DATA1EQU#30H2DATA2EQU#50H3LENEQU#164ORG0H000078305MOVR0,DATA1000279506MOVR1,DATA200047A107MOVR2,LEN0006E68EXC:MOVA,@R0 0007C79XCHA,@R10008F610MOV@R0,A00090811INCR0000A0912INCR1000BDAF913DJNZR2,EXC14END6、某场歌手赛,共有10个评委,试编写一程序,输入10个评分,去掉最高分和最低分,求平均分(均为BCD码)。ORG0HNEQU#5BLOCKEQU#30HISELSORT:MOVR7,NDECR7MOVR1,BLOCKISST1:MOVR0,BLOCKMOVA,R7MOVR6,AMOVA,@R0MOVB,AISST2:INCR1MOVA,@R1CLRC SUBBA,BJCISST3MOVA,@R1MOVR2,AMOVB,@R1ISST3:DJNZR6,ISST2MOVA,BXCHA,@R1MOVB,R2MOV@R1,BMOV@R1,ADJNZR7,ISST1MOVR0,BLOCKMOV@R0,#0;去掉最低分MOVA,BLOCKADDA,#9MOVR0,AMOV@R0,#0;去掉最高分AD:MOVR0,BLOCKINCROMOVR1,#8CLRA CLRCMOVB,#0ADL:ADDA,@R0DAAMOVR2,AADDCA,#0MOVB,AMOVA,R2DJNZR1,ADLMOVR5,0MOVR4,BMOVR3,AMOVR2,#0MOVR1,#8R5R4R3/R2R1=R4R3MOVR1,#00HMOVR2,#0FHMOVR3,#04HMOVR4,#05HMOVR5,#06HLCALL_DIVAJMP$ _DIV:;{CLRCMOV30H,#0MOV31H,#0MOV32H,#0_DIV_LOOP:CLRCMOVA,R3SUBBA,R1MOVR3,AMOVA,R4SUBBA,R2MOVR4,AMOVA,R5SUBBA,#0MOVR5,AJC_DIV_END_INC_SHANG:CLRCMOVA,30HADDCA,#1MOV30H,AMOVA,31HADDCA,#0 MOV31H,AMOVA,32HADDCA,#0MOV32H,ALJMP_DIV_LOOP_DIV_END:CLRCMOVA,R1ADDCA,R3MOVA,R2ADDCA,R4MOVR3,30HMOVR4,31HEND7、编写将一个十六进制数转换为十进制数的子程序。>000078FE2MOVR0,#FEH000279303MOVR1,#30H0004E84HEXBCD:MOVA,R0000575F0645MOVB,#1000008846DIVAB0009F77MOV@R1,A000A740A8MOVA,#10000CC5F09XCHA,B 000E8410DIVAB000F0911INCR10010F712MOV@R1,A00110913INCR10012A7F014MOV@R1,B15RET8、在内部RAM的BLOCK开始的单元中有一无符号数据块,数据长度为LEN。试编程求其中最大的数并存入MAX中。MCS511ORG0H2LENEQU#10;数据块长度3MAXEQU#40H000078304MOVR0,#30H;BLOCK首地址0002790A5MOVR1,LEN0004196DECR1;循环次数0005C37CLRC0006E68LOOP:MOVA,@R00007089INCR000089610SUBBA,@R00009400211JCEXCHANG000B800212SJMPNEXT000D86F013EXCHANG:MOVB,@R0 000FC314NEXT:CLRC0010D9F415DJNZR1,LOOP001285F04016MOV40H,B;MAX单元17END9、试编程将内部RAM中41H~43H单元中的数左移4位,移出部分送50H。题意不清。10、在外部RAM中BLOCK开始的单元中有一数据块,数据长度为LEN,试编程统计其中的正数、负数和零的个数分别存入内部RAM的Pcount、Mcoun和Zcount单元。MCS51>1ORG0H2LENEQU#10;数据块长度3PCOUNTEQU#30H4MCOUNTEQU#31H5ZCOUNTEQU#32H6BLOCKEQU#40H000078407MOVR0,BLOCK;BLOCK首地址0002790A8MOVR1,LEN0004E69LOOP:MOVA,@R00005C310CLRC0006B4000411CJNEA,#0H,SULT10009053212INC32H 000B800913SJMPSULT2000D3314SULT1:RLCA;移出符号位以判断正负!000E400415JCNEG0010053016INC30H0012800217SJMPSULT20014053118NEG:INC31H00160819SULT2:INCR00017D9EB20DJNZR1,LOOP11、试编写一查表求平方的子程序SQR(设X在累加器A中,A小于15,平方数存入工作寄存器R7中)。00009000082MOVDPTR,#TAB000378303MOVR0,#30H0005E64MOVA,@R00006935MOVCA,@A+DPTR0007FF6MOVR7,A0008010104097TAB:DB1,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225000C10192431001040516479001490A9C4E18END 12、试编写一程序,将外部数据区DATA1单元开始的50个单节数逐一依次移动到内部RAM中DATA2单元开始的数据区中。>MCS511ORG0H2DATA1EQU#1000H3DATA2EQU#30H4LENEQU#10H00009010005MOVDPTR,DATA1000378306MOVR0,DATA2000579107MOVR1,LEN0007E08LOOP:MOVXA,@DPTR0008F69MOV@R0,A0009A310INCDPTR000A0811INCR0000BD9FA12DJNZR1,LOOP13END13、14,略第五章1、简述中断、中断源、中断源优先级及中断嵌套的含义。中断是单片机实时地处理内部或外部事件的一种内部机制。当某种内部或外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后,又返回被中断的程序处,继续执行下去、。 中断的意义在于资源共享和应急处理。中断的功能有四:一、调整CPU与外设的速度配合;二、实时控制的实现;三、故障检测;四、实现人机交流引起中断的原因,或者能够发出中断请求信号的来源统称为中断源。通常中断源有以下几种:  (1)外部设备请求中断。一般的外部设备(如键盘、打印机和A/D转换器等)在完成自身的操作后,向CPU发出中断请求,要求CPU为他服务。 由计算机硬件异常或故障引起的中断,也称为内部异常中断。  (2)故障强迫中断。计算机在一些关键部位都设有故障自动检测装置。如运算溢出、存储器读出出错、外部设备故障、电源掉电以及其他报警信号等,这些装置的报警信号都能使CPU中断,进行相应的中断处理。  (3)实时时钟请求中断。在控制中遇到定时检测和控制,为此常采用一个外部时钟电路(可编程)控制其时间间隔。需要定时时,CPU发出命令使时钟电路开始工作,一旦到达规定时间,时钟电路发出中断请求,由CPU转去完成检测和控制工作。 (4)数据通道中断。数据通道中断也称直接存储器存取(DMA)操作中断,如磁盘、磁带机或CRT等直接与存储器交换数据所要求的中断。为了使得系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程度,硬件将中断源分为若干个级别,称作中断优先级。   中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行,这个过程称为是中断嵌套。2、MCS-51单片机提供了几个中断源?几个中断优先级?MCS-51单片机的中断源共有三类,分别是外部中断、定时计数器中断和串行通信口中断,第一类有IE0和IE1,第二类有TF0和TF1,第三类的RI、TI合二为一。MCS-51单片机分两个优先级,每个中断源的优先级都可以通过中断优先级寄存器IP中的相应位进行设定。在同级优先级中,五个中断源的优先级次序由高到低分别是:IE0、TF0、IE1、TF1、RI或TI。3、简述TCON、SCON、IE、IP四个特殊功能寄存器各位的定义及功能。TCON(TimerControlRegister)定时器/计数器控制寄存器 TCON在特殊功能寄存器中,字节地址为88H,位地址(由低位到高位)为88H一8FH,由于有位地址,所以可以于进行位操作。  TCON的作用是控制定时器的启、停,标志定时器溢出和中断情况。其中,TFl,TRl,TF0和TR0位用于定时器/计数器;IEl,ITl,IE0和IT0位用于中断系统。如图所示:TF1TR1TF0TR0IE1IT1IE0IT0其中,TF1:定时器1溢出标志位。当定时器1计满溢出时,由硬件使TF1置“1”,并且申请中断。进入中断服务程序后,由硬件自动清“0”,在查询方式下用软件清“0”。  TR1:定时器1运行控制位。由软件清“0”关闭定时器1。当GATE=1,且INT1为高电平时,TR1置“1”启动定时器1;当GATE=0,TR1置“1”启动定时器1。   TF0:定时器0溢出标志。其功能及操作情况同TF1。  TR0:定时器0运行控制位。其功能及操作情况同TR1。  IE1:外部中断1请求标志位。  IT1:外部中断1触发方式选择位。当IT1=0,为低电平触发方式;当IT1=1,为下降沿触发方式。  IE0:外部中断0请求标志位。  IT0:外部中断0触发方式选择位。当IT0=0,为低电平触发方式;当IT0=1,为下降沿触发方式。TCON中低4位与中断有关。由于TCON是可以位寻址的,因而如果只清溢出或启动定时器工作,可以用位操作命令。例如:执行“CLRTF0”后则清定时器0的溢出;执行“SETBTR1”后可启动定时器1开始工作。SCON(SerialPortControlRegister)串行口控制寄存器寄存器地址98H,位寻址9FH~98H。位地址9F9E9D9C9B9A9998位符号SM0SM1SM2RENTB8RB8TIRISM0、SM1:串行口工作方式选择位SM2:多机通信控制位REN:允许/禁止串行口接收的控制位TB8:在方式2和方式3中,是被发送的第9位数据,可根据需要由软件置1或清零,也可以作为奇偶校验位,在方式1中是停止位。RB8:在方式2和方式3中,是被接收的第9位数据(来自第TB8位);在方式1中,RB8收到的是停止位,在方式0中不用。TI——串行口发送中断请求标志位 当发送完一帧串行数据后,由硬件置1;在转向中断服务程序后,用软件清0。RI——串行口接收中断请求标志位     当接收完一帧串行数据后,由硬件置1;在转向中断服务程序后,用软件清0。此处的“软件清零”,意指需要用户用指令清零。IE(interruptEnableRegister):中断允许控制寄存器寄存器地址A8H,位寻址AFH~A8H。位地址AFAEADACABAAA9A8位符号EA/ET2ESET1EX1ET0EX0EA:中断允许总控制位当EA=0时,中断总禁止。当EA=1时,中断总允许后中断的禁止与允许由各中断源的中断允许控制位进行设置。EX0(EX1):外部中断允许控制位当EX0(EX1)=0禁止外中断当EX0(EX1)=1允许外中断ET0(EX1):定时/计数中断允许控制位当ET0(ET1)=0  禁止定时(或计数)中断当ET0(ET1)=1  允许定时(或计数)中断 ET2:定时器2中断允许控制位,在AT89S52、AT89C52中ES:串行中断允许控制位当ES=0  禁止串行中断当ES=1  允许串行中断IP(InterruptPriorityRegister):中断优先级控制寄存器寄存器地址B8H,位寻址BFH~B8H。位地址BFBEBDBCBBBAB9B8位符号//PT2PSPT1PX1PT0PX0PX0——外部中断0优先级设定位;PT0——定时中断0优先级设定位;PX1——外部中断1优先级设定位;PT1——定时中断1优先级设定位;PS——串口中断优先级设定位;PT2——定时器2优先级设定位(8052才有)。4、简述MCS-51单片机的中断响应过程。MCS-51单片机的中断响应过程可简单归纳为5步:(1)中断源检测:在每条指令结束后,系统都自动检测中断请求信号,如果有中断请求,且CPU处于开中断状态下,则响应中断。(2)保护现场:在保护现场前,CPU自动将当前PC压入堆栈。此时,一般要关中断,以防止现场被破坏。保护现场一般是用堆栈指令将原程序中用到的寄存器推入堆栈。 (3)中断服务:即为相应的中断源服务。(4)恢复现场:用堆栈指令将保护在堆栈中的数据弹出来,在恢复现场前要关中断,以防止现场被破坏。在恢复现场后应及时开中断。(5)返回:CPU将推入到堆栈的断点地址弹回到程序计数器,从而使CPU继续执行刚才被中断的程序。5、说明MCS-51单片机响应中断后,中断服务程序的入口地址。MCS-51单片机响应中断后,其中断矢量是由硬件自动生成的。各中断源的中断服务程序的入口地址如下表。6、指出哪几个中断申请标志在CPU响应中断响应后能被硬件自动清零。除了串行通信中断申请标志在CPU响应中断后需要用户用软件指令清零中断申请标志外,其余的中断源的申请标志都是在CPU响应后由硬件自动清零的。它们分别是:外部中断0申请标志(IE0)、外部中断1申请标志(IE1)、定时计数器0溢出标志(IT0)和定时计数器1溢出标志(IT1)。7、在MCS-51单片机的应用系统中,如果有多个外部中断源,怎样进行处理?在多中断源的系统中,假如各中断源之间很少发生竞争,那么采用“线或非”连接,用软件查询的方式进行控制如图。 如果个中断源之间有优先级的区别,固定优先级时用“菊花链”电路,不定优先级时用8259.8、外部中断INT0、INT1的两种触发方式在原理上有何区别?如何用软件设置?ITx为外部中断触发方式选择。当ITx为0时为低电平触发方式,CPU在每个机器周期的S5P2采样ITx,当Itx输入低电平的时,就置位IEx,采用这种触发方式时,外部中断源的低电平必须保持到CPU响应为止。ITx为1的时候边沿触发方式,CPU在每个机器周期的S5P2采样ITx,如果在相邻的两个机器周期内,前一个机器周期为高,后一个机器周期为低,则置位IEx,因此,采用边沿触发时,高电平和低电平的保持时间需在12拍以上。设置外部中断信号触发方式,可通过对TCON寄存器(字节地址88H,位地址88H~8FH)中的ITx位置一或置零进行。 9、在一个应用系统中,晶振频率为12MHz,一个外部中断请求信号的宽度是300ns的负脉冲,该采用哪种触发方式?如何实现?晶振频率为12MHz时,机器周期为1微秒,采用边沿触发时,请求信号至少应该保持1微秒,所以只能对原信号进行展宽,常用的方法是连接一个单稳态电路,其时常数不在1-1.5微秒之间即可。10、MCS-51的中断服务程序能否放在65KB程序存储器的任意区域?如何实现?MCS-51的中断服务程序可以放在65KB程序存储器的任意区域,只要在对应的中断矢量入口填写相应的跳转指令即可。例如外部中断IE1的中断服务程序的起始地址为3400H,则在0013H单元内填写LCALL3400H。第六章1、8051单片机内设几个可编程的定时/计数器?它们有几种工作方式?如何选择和设定?作为定时器或计数器,它们的波特率各为多少?8051单片机内设有两个钧为16位的可编程的定时/计数器,共有4种工作方式,即:方式0—13位定时/计数器、方式1—16位定时/计数器、方式2—自动重载初值得8位定时/计数器和方式3—T0为两个独立的8位定时/计数器,在方式3下,T1停止工作。8051定时/计数器的工作方式由控制寄存器TMOD的M0、M1两位设置,因为TMOD的地址为89H,所以M0、M1不能位寻址,只能通过字节操作的方式对M0、M1的值进行设定。 当用定时/计数器作为波特率发生器时,根据串口的工作模式,有三种情形:方式0的波特率为主振频率fosc的十二分之一;方式2的波特率依照下式确定:,其中,SMOD为PCON寄存器中的波特率倍增位。方式1和方式3的波特率计算依照下列关系求的TH1即可:   2、定时/计数器作定时器用时,其定时时间有哪些因素有关?做计数器用时,对外部计数频率有何限制?8051的定时/计数器工作在定时器状态时,输入的时钟脉冲是由晶体振荡器的输出经12分频得到的,故其频率为晶振频率的十二分之一。所以,定时输出是晶振频率处以12再除以计数值。8051的定时/计数器工作在计数器状态时,需要两个机器周期才能识别一个从“1”到“0”的跳变,故最高计数频率不大于晶振频率的二十四分之一。3、8051单片机的晶振频率为6MHz,若只使用T0产生500微秒定时,可以选择哪几种定时方式?分别写出定时器的方式控制字和计数器初值。选择方式0或方式1,计数器初值为8192-250,或65536-250。.此处给一个C语言写的程序段,定时信号由P1.0输出:ORG0000HLJMPMAINORG000BH LJMPTO_INTERRUPTMAIN:SETBEAMOVTH0,(65536-250)/256MOVTL0,(65536-250)%256SETBTR0SETBET0SJMP$T0_INTERRUPT:CLRTR0MOVTH0,(65536-125)/256MOVTL0,(65536-125)%256P1^0=~P1^0SETBTR0RETI4、某8051系统晶振频率为6MHz,先欲从P1.7引脚输出一个连续5Hz的方波信号,请编写程序。5Hz的方波周期为200毫秒,高低电平各持续100毫秒,若晶振频率为6MHz,则机器周期为2微秒,故其计数值应为:N=100ms/2μs=50000采用方式1进行计数,则X=M-N=65536-50000=15536H=0C350H程序编写如下:MOVTMOD,#05H;设置T0工作方式,定时,方式1 MOVTH0,#0C3H;写入计数器初值MOVTL0,#050H;SETBTR0;启动T0LOOP:JBCTF0,$;查询定时器溢出标志MOVTH0,#0C3H;MOVTL0,#050HCPLP1.7SJMPLOOP;END也可以用C语言编写:用定时/计数器T0从P1.7输出周期为5s的方波,晶振频率为6MHz。#include#defineucharunsignedchar#defineuintunsignedintsbitD1=P1^0;uchara;voidinit()              //初始化{   TMOD=0x01;            //选择定数计数器0的工作方式为16位定时器   TH0=(65535-50000)%256;//赋初值,定时100ms    TL0=(65535-50000)/256;   EA=1;                 //中断控制允许   ET0=1;   a=0;   TR0=1;                //启动定时器0}voidtime0()interrupt1//定时器0中断函数{   TH0=(65535-50000)%256;//赋初值,定时100ms   TL0=(65535-50000)/256;   a++;   TR0=1;   }voidmain(){   init();   while(1)   {       while(a==25)//半个周期(2500ms)时,P1.7上的电平跳变一次。       {            a=0;           P1.7=~P1.7;    //取反       }   }}5、某单片机系统,时钟频率为12MHz,定时/计数器T0用于20ms定时,T1用于100次计数,两者要求重复工作,问:(1)、外部计数脉冲从何引脚输入?(2)、编写达到上述要求的程序。(3)、利用定时/计数器T0、T1编写延时2S的程序。答:(1)既然使用T1作为计数器,外部计数脉冲当然应该从P3.5输入。(2)T0用作20ms定时,故N0=20ms/1μs=20000X0=M-N=65536-20000=45535=B1E0HT1的计数值为100,所以X=65536-100=65436=FF9CH为使俩部件同时工作,将T0设为查询方式,T0设为中断方式。MOVTMOD,#15H;T0定时,方式1;T1计数,方式1MOVTH0,#0B1H;写入T0定时器初值MOVTL0,#0E0H;MOVTH1,#0FFH;写入T1计数器初值MOVTL1,#09CH;MOVSP,#60H;设置堆栈 ORG001BHAJMPT1INTSETBTR0;启动T0SETBTR1;启动T1LOOP:JBCTF0,$;查询定时器溢出标志MOVTH0,#0B1H;MOVTL0,#0E0HCLRP1.0;设定时输出为P10SETBP1.0ENDT1INT:MOVTH1,#0FFH;写入T1计数器初值MOVTL1,#09CH;RETI(3)、延时2s,可以将T0设置成方式1,输出周期为200毫秒的等宽脉冲,设该信号由P1.0输出。再由T1进行计数,将P1.0输出连接道T1输入。则T1的计数值为100,工作方式选方式1;TO高低电平各持续100毫秒,若晶振频率为6MHz,则机器周期为2微秒,故其计数值应为:N=100ms/2μs=50000TO采用方式1进行计数,则X=M-N=65536-50000=15536=0C350H T1采用方式1进行计数,则X=M-N=65536-100=65436=0FF9CH方式字:GATE1=0,C/T1=1,M11=0,M10=1,GATE0=0,C/T0=0,M01=0,M00=1故为:051H程序编写如下:MOVTMOD,#051H;设置T0工作方式,定时,方式1MOVTH0,#0C3H;写入T0计数器初值MOVTL0,#050H;MOVTL1,#09CH;写入T1计数值MOVTH1,#0FFHSETBTR0;启动T0LOOP:JBCTF0,$;查询定时器溢出标志MOVTH0,#0C3H;MOVTL0,#050HCPLP1.0SJMPLOOP;JBCTF1,$CPLP1,1;输出2S信号MOVTL0,#050H;MOVTL1,#09CH;写入T1计数值SJMPLOOPEND 6、为什么T1用作波特率发生器时常用工作方式2?若T1设置为方式2,用作波特率发生器,晶振频率为6Mhz,求可能产生的波特率的变化范围。答:串行通信通常是持续的,即很少进行但帧通信,这就要求通信时钟(波特率发生器)必须持续工作,同时为确保时钟准确,就要尽量减少计时中断服务程序中的延时和不确定因素,采用方式2,因为是自动重载计数器初值,简洁、准确。方式2下的波特率计算由下式决定:波特率=2SMOD×fosc/64所以其波特率最高为:187500,最低为:93750。7、怎样选择串行口的工作模式?REN位的作用是什么?TI和RI何时置1?何时清零?串行口的工作模式选择当然是根据工程需要。REN作为SCON寄存器的允许接收位,其作用不言而喻,REN可由用户使用指令进行赋值,REN=1时,允许串行口接收数据,否则不能。所以,在进行串行通信时,接受端的SCON中的REN必须提前(初始化)置位为1。8、试设计一个8051单片机双机通信系统,编程将A机片内RAM中60H—6FH的数据块传送到B机机片内RAM中60H—6FH单元中。连接如图示意: 甲机发送(采用查询方式):MOVSCON,#80H;设置工作方式2MOVPCON,#00;置SMOD=0,波特率不加倍MOVR0,#60H;数据区地址指针MOVR2,#10H;数据长度LOOP:MOVA,@R0;取发送数据MOVC,P;奇偶位送TB8MOVTB8,CMOVSBUF,A;送串口并开始发送数据WAIT:JBCTI,NEXT;检测是否发送结束并清TISJMPWAITNEXT:INCR0;修改发送数据地址指针DJNZR2,LOOPRET 乙机接收(查询方式):MOVSCON,#90H;模作模式2,并允许接收MOVPCON,#00H;置SMOD=0MOVRO,#60H;置数据区地址指针MOVR2,#10H;等待接收数据长度LOOP:JBCRI,READ;等待接收数据并清RISJMPLOOPREAD:MOVA,SBUF;读一帧数据MOVC,PJNCLP0;C不为1转LP0JNBRB8,ERR;RB8=0,即RB8不为P转ERRAJMPLP1LP0:JBRB8,ERR;RB8=1,即RB8不为P转ERRLP1:MOV@R0,A;RB8=P,接收一帧数据INCR0DJNZR2,LOOPRETERR:…;出错处理程序…9、试述MSC-51单片机的多机通信原理。答:多机通信系统如下图所示可见是一个主从结构。 多机通信基于如下机制:SM2=1&TB8=1可以接受数据SM2=1&TB8=0不能接受数据SM2=0无论TB8为何值均可以接受数据所以,从机在初始化时将串口通信模式设置为模式2或模式3,且置SM2=1,并允许串口中断;每一个从机对应一个唯一确定的地址码,当主机要与某从机通信时,先发送一个地址帧,其中的TB8=1,所有从机均可以接受到此帧,然后与本机的地址码进行比较,如果相符,则置本机SM=0,地址码不符的其他从机的SM2仍为1;从第二帧开始主机开始发送数据帧,其特征是TB8=0,由于地址不符的从机的SM2仍为1,接受不到此信息,只有地址码符合的那个从机由于其SM2=0,接受到数据帧后其RI自动置一,允许CPU读取接受到的信息。10、试用8051串行口扩充I/O口,控制16个发光二极管,画出电路并编写显示程序。 答:将8051的串行口扩充为I/O口,最常用的方式是外接移位寄存器74164,原理图如下:对应的程序可写成:MOVR0,DBUF;显示缓冲区指针MOVSCON,0;初始化,设置串口工作方式SETBP0.1CLRP0.1;移位寄存器清零MOVA,@R0;读数据MOVXABUF,A;显示JBCTI,$;等待传输完毕CLRTI;清除发送中断标志INCR0;移动显示区指针MOVA,R0;读下一位MOVXSBUF,AJBCTI,$CLRTIEND 第七章1、如何构造MCS-51单片机扩展的系统总线?MCS-51单片机的总线扩展关键在于利用其自身的ALE信号,将P0口设置为地址/数据复用线,在ALE高电平期间,P0口输出低八位地址A0-A7,故仅需在片外加接一片地址锁存器(如74LS373),用ALE高电平的边沿作为触发信号,即可将P0口的地址信息所存。在ALE无效期间,P0口传送数据,作为数据总线使用。结构示意如下图:2、什么是完全译码?什么是部分译码?各有什么特点?部分译码就是存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线仅用一部分参加译码。而所谓全译码就是存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线全部参加译码。部分译码后,空间地址可能重复,完全译码可杜绝此弊。 3、采用2764芯片扩展程序存储器容量,分配的地址范围为8000H-BFFFH,采用完全译码,试选择芯片数,分配地址,并画出与单片机的连接电路。2764的芯片容量为8*8K,8000H——BFFFH的地址范围为16K(BFFFH-8000H=3FFFH=16K),故需两片。设为U1和U2,则U1可分配地址为8000H——9FFFH,U2可分配地址为A000H——BFFFH。2764有13根地址线,对仅有16根地址线的8051,高位地址线仅剩3根,故可选用74LS138作为全译码部件,电路如右:4、要求8255A的A口工作在方式0输出,B口工作在方式1输入,C口的PC7为输入,PC1为输出,试编写8255A的初始化程序。根据8255A的方式控制字,可得: D7=1(命令标志),D6、D5=00(A口方式0),D4=0(A口输出),D3=1(C高四位输入),D2=1(B口方式1),D1=1(B口输入),D0=0(C口低四位输出),所以命令字应为:10001110B=8EH所以有如下初始化语句:MOVDPTR,#PIO-0;8255A命令端口MOVA,#08EHMOVX@DPTR,A5、若将8255A的CS引脚与8051的P2.0相连,试画出8255A与8031的连接图,并写出最小、最大两组地址。由于使用P2.0进行线选,尚有7根地址线未曾使用,故本接口有128个地址组,其中,最小地址组为:0000000000000000B——0000000000000011B即0000H——0003H最大地址组为:1111111000000000B——1111111000000011B即FE00H——FE03H 具体连接如下图所示:6、8155A的RAM和I/O如何编制?若将8155的CE接到8051的P2.0,IO/M接到8031的P2.1,则其RAM的地址和IO的地址分别为多少?8155芯片中的RAM和I/O均占用单片机系统片外的RAM地址,其中,高八位地址由CE和IO/M决定。当CE=0且IO/M=0时,低八位的00H—FFH为RAM的有效地址;当CE=0且IO/M=1时,由低八位中的末3位决定接口中各个端口的地址。将8155的CE接到8051的P2.0,IO/M接到8031的P2.1,则相当于线选译码方式,这时,其RAM的地址应该为0000H—00FFH,而IO的地址应该为0200H—0205H。 7、要求8155I/O工作在ALT1,A、B口均为输入,定时器对输入脉冲24分频后输出连续方波,试进行初始化编程。8155的命令字如下所示:根据题意,TM2、TM1=11,IEB、IEA=00,PC2、PC1=00,PB=0,PA=0,故命令字应为0C0H。定时/计数器要求输出连续方波,那就是M2、M1=01,则有:TH=11000000B=C0HTL=24D=18H所以有如下的初始化程序:MOVDPTR,#8155-0;8155命令端口MOVA,#0C0H;命令字 MOVX@DPTR,A;写入命令字MOVDPTR,#8155-4;定时/计数器低字节TLMOVA,#18H;写入分频系数MOVX@DPTR,AINCDPTR;指针指向定时/计数器高字节THMOVA,#0C0H;MOV@DPTR,A8、简述非编码式键盘行扫描法与线反转法的工作原理。(1)、行扫描法通过行线发出低电平信号,如果该行线所连接的键没有按下的话,则列线所接的端口得到的是全“1”信号,如果有键按下的话,则得到非全“1”信号。为了防止双键或多键同时按下,往往从第0行一直扫描到最后1行,若只发现1个闭合键,则为有效键,否则全部作废。找到闭合键后,读入相应的键值,再转至相应的键处理程序。(2)、线反转法线反转法也是识别闭合键的一种常用方法,该法比行扫描速度快,但在硬件上要求行线与列线外接上拉电阻。先将行线作为输出线,列线作为输入线,行线输出全“0”信号, 读入列线的值,然后将行线和列线的输入输出关系互换,并且将刚才读到的列线值从列线所接的端口输出,再读取行线的输入值。那么在闭合键所在的行线上值必为0。这样,当一个键被按下时,必定可读到一对唯一的行列值。9、若采用8255A作为8*5的键盘接口芯片,A口为行线,B口为列线,试画出键盘接口电路。根据题意可作下图:'