第二章作业(P40)2-4MCS-51单片机中执行程序的地址放在哪?由几个位组成?最大寻址范围是多少?答:放在程序计数器PC中,16位,64KB。2-5在程序存储器中,0000H、0003H、000BH、0013H、001BH、0023H这6个单元有什么特定的含义?答:0000H复位后,PC=0000H,开始执行程序的地址0003H外部中断0(INT0)入口地址000BH定时器0中断(TF0)入口地址0013H外部中断1(INT1)入口地址001BH定时器1中断(TF1)入口地址0023H串行口中断TI/RI入口地址2-10开机复位以后,CPU使用哪一组工作寄存器?它们的地址是什么?如何改变当前工作寄存器?答:使用第0组工作寄存器,00H-07H,通过修改PSW中的RS1和RS0两位来改变当前的工作寄存器。第三章作业(P75)3-7指出指令中的50H或66H个代表什么?解:①MOVA,#50H立即数MOVA,50H直接地址MOV50H,#20H直接地址MOVC,50H位地址MOV50H,20H直接地址②MOV@R0,#66H立即数MOVR6,#66H立即数MOV66H,#45H直接地址MOV66H,C位地址MOV66H,R1直接地址3-9写出能完成下列数据传送的指令:解:①R1中内容传送到R0;MOVA,R1MOVR0,A②内部RAM20H单元中的内容送到30H单元;MOV30H,20H③外部RAM20H单元中的内容送到内部RAM20H单元;MOVR0,#20HMOVXA,@R0MOV20H,A④外部RAM2000H单元中的内容送到内部RAM20H单元;MOVDPTR,#2000HMOVXA,@DPTRMOV20H,A⑤外部ROM2000H单元中的内容送到内部RAM20H单元;MOVDPTR,#2000HMOVA,#00HMOVCA,@A+DPTRMOV20H,A⑥外部2000H单元中的内容送到外部RAM3000H单元;MOVDPTR,#2000HMOVXA,@DPTRMOVDPTR,#3000HMOVX@DPTR,A3-11已知:(20H)=X;(21H)=Y;(22H)=Z,请用图示说明下列程序执行后堆栈的内容是多少?①MOVSP,#70H②MOVSP,#60HPUSH20HPUSH22HPUSH21HPUSH21HPUSH22HPUSH20H解:(73H)=Z;(72H)=Y;(71H)=X;(63H)=X;(62H)=Y;(61H)=Z;3-20试编出能完成如下操作的程序:解:①使20H单元中数的高两位变“0”,其余位不变;ANL20H,#3FH②使20H单元中数的高两位变“1”,其余位不变;0RL20H,#0C0H③使20H单元中数的高两位变反,其余位不变;XRL20H,#0C0H④使20H单元中数的高四位变“1”,低四位变“0”;MOV20H,#0F0H⑤使20H单元中数的所有位变反。XRL20H,#0FFH3-27已知:外部RAM2000H为始址的存储区有20个带符号补码数,请编一程序把正数和正零取出来放到内部RAM20H为始址的存储区(负数和负零不作处理)。解:ORG0000HAJMPMAINORG0100HMAIN:MOVR0,#14HMOVR1,#20HMOVDPTR,#2000HROT:MOVXA,@DPTRJBACC.7,NEXTMOV@R1,AINCR1NEXT:INCDPTRDJNZR0,ROTSJMP$END第四章作业(P104)4-7已知RAM的BLOCK单元,请编写其中可以统计正负数个数分别存入NUM和NUM+1单元的程序。解:ORG0100HLENDATA20HNUMDATA21HBLOCKDATA23HMAIN:MOVNUM,#00HMOVNUM+1,#00HMOVR0,#BLOCKLOOP:MOVA,@R0JNBACC.7,POSIINCNUM+1SJMPNEXTPOSI:INCNUMNEXT:INCR0DJNZLEN,LOOPSJMP$END4-9外部RAM从2000H-2100H单元有一数据块,请编出将它们传送到外部RAM3000H-3100H区域的程序。解:采用当型循环,判断程序结束条件ORG1000HMOVDPTR,#2000HNEXT:MOVXA,@DPTRORLDPH,#10H;将DPH中的20H变成30HMOVX@DPTR,AANLDPH,#0EFH;将DPH中的30H变成20HINCDPTRMOVA,DPHCJNEA,#21H,NEXTMOVXA,@DPTR;将2100H单元的数据送AMOVDPH,#31HMOVX@DPTR,A;将A的数据送3100H单元SJMP$END4-11将内部RAM的AAA单元中8位无符号数转换成BCD码表示的十进制数。(要求用连续除10的方法实现)解:ORG0100HAAADATA20HBAIDATA21HSHIDATA22HGEDATA23HMOVA,AAAMOVB,#0AHDIVABMOVGE,BMOVB,#0AHDIVABMOVSHI,BMOVBAI,ASJMP$END4-15请编写能从内部RAM的BLOCK为起始地址的20个无符号数找出最小值,并把它送到MIN单元的程序。解:ORG0100HMINDATA20HBLOCKDATA21HMAIN:MOVR0,#BLOCKMOVR2,#13HMOVA,@R0LOOP:INCR0MOVB,@R0CJNEA,B,NEXTNEXT:JCNEXT1MOVA,@R0NEXT1:DJNZR2,LOOPMOVMIN,ASJMP$END第五章作业(P155)6-4编程,利用定时器T0(工作在方式1)产生一个50Hz的方波,由P1.0输出,晶振频率为12MHz。解:按照题意,定时器T0需要工作在方式1定时10ms,则TMOD控制字为01H;已知fosc=12MHz,则机器周期为1µs。定时初值=216–10ms/1µs=55536=D8F0H,即TH0=0D8H,TL0=0F0H。则相应的程序如下:ORG0000HAJMPSTARTORG2000HSTART:MOVTMOD,#01H;写入工作方式字MOVTH0,#0D8H;写入计数初值MOVTL0,#0F0HSETBTR0;启动T0LOOP:JBCTF0,PE;TF0=1溢出转移PE,并清除TF0AJMPLOOP;TF0为0转LOOP等待PE:MOVTH0,#0D8H;重装初值MOVTL0,#0F0HCPLP1.0;取反AJMPLOOP;转LOOP等定时时间到END6-5在8051单片机中,已知晶振频率为12MHz,试编程使P1.0和P1.2分别输出周期为2ms和500ms的方波。设晶振频率为6MHz,试用T0作为外部计数器,编程实现每当计到1000个脉冲,使T1开始2ms定时,定时时间到后,T0又开始计数,这样反复循环下去。解:1)按照题意,定时器T0需要工作在方式1定时1ms,则TMOD控制字为01H;已知fosc=12MHz,则机器周期为1µs。定时初值=216–1ms/1µs=64536=FC18H,即TH0=0FCH,TL0=18H。则相应的程序如下:主程序:ORG1000HSTART:MOVTMOD,#01HMOVTH0,#0FCHMOVTL0,#18HMOVIE,#82H;开T0中断SETBTR0;启动T0MOVR0,#0FAH;软件计数器赋初值LOOP:SJMP$;等待中断中断程序:ORG000BHAJMPBRT0ORG0080HBRT0:CPLP1.0DJNZR0,NEXT;250ms未到,转NEXTCPLP1.2;250ms到,改变P1.2电平MOVR0,#0FAHNEXT:MOVTH0,#0FCHMOVTL0,#18HRETIEND2)按照题意,定时器T0需要工作在方式1计数方式,定时器T1需要工作在方式1定时方式,则TMOD控制字为15H;T0计数初值为216–1000=64536=FC18H,即TH0=0FCH,TL0=18H;已知fosc=6MHz,则机器周期为2µs。T1定时初值=216–2ms/2µs=64536=FC18H,即TH1=0FCH,TL1=18H。则相应的程序如下:ORG2000HSTART:MOVTMOD,#15H;写入工作方式字MOVTH0,#0FCH;写入计数初值MOVTL0,#18HMOVTH1,#0FCHMOVTL1,#18HSETBTR0;启动T0LOOP:JBCTF0,PE;TF0=1溢出转移PE,并清除TF0AJMPLOOP;TF0为0转LOOP等待PE:SETBTR1;启动T1定时,关T0计数CLRTR0LOOP1:JBCTF1,PE1;TF1=1溢出转移PE1,并清除TF1AJMPLOOP1;TF1为0转LOOP1等待PE1:MOVTH0,#0FCH;重装初值MOVTL0,#18HMOVTH1,#0FCHMOVTL1,#18HSETBTR0;启动T0计数,关T1定时CLRTR1AJMPLOOPEND6-6已知单片机系统时钟频率为6MHz,若要求定时值分别为0.1ms、1ms和10ms,定时器T0工作在方式0、方式1和方式2时,定时器对应的初值各为多少?解:已知fosc=6MHz,则机器周期为2µs。方式0的初值分别为:8142(1FCEH),即TH0=0FEH,TL0=0EH;7692(1E0CH),即TH0=0F0H,TL0=0CH;3192(0C78H),即TH0=63H,TL0=18H。方式1的初值分别为:65486(FFCEH);65036(FE0CH);60536(EC78H)。方式2定时0.1ms的初值为206(CEH),不能直接定时1ms和10ms。第六章作业(P210)8-2什么是半双工、全双工方式?MCS-51单片机属于哪种传送方式?解:1)半双工方式——通信双方只有一条双向传输线,允许数据双向传送,但每个时刻上只能有一方发送,另一方接收,这是一种能够切换传送方向的单工方式;2)全双工方式——通信双方有两条传输线,允许数据同时双向传送,其通信设备应具有完全独立的收发功能。单片机属于全双工传送方式。8-6设串行口通信波特率为2400bps,异步帧信号由8位数据,无校验位和一个停止位组成,请问传输1024个字节数据,需要多少时间?解:每一个字符规定包含10个位(一个起始位、8个数据位和1个停止位),则每秒钟可以传送240个字节数据,传输1024个字节数据共需要4.2667秒8-7请用中断法编出串行口方式1下的发送程序,设单片机主频为6MHz,波特率为1200bps,发送数据缓冲区在外部RAM,始址为Tblock,数据块长度为30,采用偶校验,放在发送数据第8位(数据块长度不发送)。解:串行口工作在方式1,定时器T1工作在方式2,作为波特率发生器。定时常数:X=256―(fosc*2SMOD)/(384*波特率)取SMOD=1,则X=229.96=230=E6H。(若取SMOD=0,则X=F3H)采用中断方式编程,单片机发送程序如下:主程序:ORG2000HTblockDATA2000HMOVTMOD,#20H;定时器(波特率)初始化MOVTL1,#0E6HMOVTH1,#0E6HCLRET1;关定时器T1中断SETBTR1;启动T1MOVSCON,#40H;串行口初始化(方式1)MOVPCON,#80H;SMOD=1MOVDPTR,#TblockMOVR7,#1EHTRS:MOVXA,@DPTRMOVC,PSW.0MOVACC.7,CMOVSBUF,A;启动发送DECR7INCDPTRSETBEA;允许串行口中断WAIT:SETBESSJMPWAIT;等待串行口中断中断服务程序:ORG0023HLJMPSBVORG0100HSBV:CLRESCLRTIMOVXA,@DPTRMOVC,PSW.0MOVACC.7,CMOVSBUF,A;启动发送DJNZR7,NEXTSJMP$NEXT:INCDPTRRETI;中断返回END第七章作业(补充题)7-1如下图所示8051