北航单片机答案单片机基础问答题答案:第2章1、.8051单片机芯片包含哪些主要逻辑功能部件?各有什么主要功能?答:CPU:控制单片机各部份协调工作进行算术和逻辑运算内部数据存储器:存储数据内部程序存储器:存储程序定时器/计数器,并行I/O口串行口,中断控制系统,时钟电路2、MCS—51单片机的EA信号有何功能?在使用8031时EA信号引脚应如何处理?答:访问程序存储器控制信号,EA=0访问外部程序存储器,EA=1访问内部程序存储器。8031无内部程序存储器,所以EA接地。3、MCS—51RST/VPD(9脚)答:单片机有哪些信号需要芯片引脚以第二功能的方式提供?答:P3口,ALE/PROG(30脚),EA/VPP(31脚),4、内部RAM低128单片划分为哪3个主要部分?说明各部分的使用特点?1.寄存器区,可寄存器寻址2.位寻址区,可位寻址3.用户RAM区,其单元地址为30H~7FH,一般还把堆栈开辟在用户RAM区5、程序计数器(PC)作为不可寻址寄存器,它有哪些特点?A.自动加1功能,从而实现程序的顺序执行。B.上电复位功能。C.能接收内部数据总线上来的数据,主要通过转移,调用,返回等指令改变其内容以实现程序的转移,转移范围216=64K=65536。PC没有地址,是不可寻址的。6、堆栈有哪些功能?堆栈指示器(SP)的作用是什么?在程序设计时,为什么还要对SP重新赋值?答:堆栈是一种数据结构,堆栈的最大特点就是“后进先出”的数据操作规则。堆栈是为子程序调用和中断操作而设立的。其具体功能有两个:保护断点和保护现场。堆栈指示器SP的作用是指示栈顶地址。程序设计时一般把SP值初始化为30H以后,因为复位时,SP初始化为07H,而这里是寄存器区和位寻址区。7、MCS—51的4个I/O口在使用上有哪些分工和特点?试比较各口的特点?答:P1口:只有一种功能通用I/O口P2口:通用I/O口和地址总线高八位P3口:一种功能通用I/O口和第二功能状态答:PC是一个16位的计数器。其内容为将要执行的指令地址,寻址范围达64KB。有以下功能:P0口:一种功能通用I/O口和AB/DB复用总线答:按复位键以重新启动。8、MCS—51单片机运行出错或程序进入死循环,如何摆脱困境?9、什么是指令周期,机器周期和时钟周期?如何计算机器周期的确切时间?答:执行一条指令所需的时间称之为指令周期,机器周期就是振荡脉冲的十二分频,时钟周期定义为状态(用S表示),2个振荡脉冲。10、使单片机复位有哪几种方法?复位后机器的初始状态如何?答:复位操作有上电自动复位和按键手动复位两种方式。按键手动复位有电平方式和脉冲方式两种。它们的复位状态如下:PC0000HACCPSWSPDPTRIPIE07H00H00HP0~P30000HFFHTL1TH0TL0TCON00H00HTMOD0x000000B00Hxx000000BSCONTH100H00H00H不定SBUF00HPCON0xxx0000b-----------------------------------------------------------------------------------------------------------单片机基础编程题答案:第4章1、把长度为10H的字符串从内部RAM的输入缓冲区inbuf向设在外部RAM输出缓冲区outbuf进行传送,一直进行到遇见回车符CR或整个字符传送完毕。ORGMOVMOVMOVCJNESJMPLL:INCINC0030HR0,#inbufR4,#10HR1,#outbufA,@R0;从内部RAM取数LOOP:MOVMOVXR0R1STOP;是转停止传送A,#0DH,LL;是否为回车符CR@R1,A;不是则传送到外部RAMDJNZSTOP:R4,LL;沒传送完则循环SJMP$2、内部RAM从list单元开始存放一正数表,表中之数作无序排列,并以“-1”作结束标志。编程实现在表中找出最小数。ORGMOVR0,#list0030HMOVA,@R0;取第一个正数MOV3AH,@R0LOOP:INCR0;指向下一个正数CJNEA,3AH,CHK;前一个数与后一个数比较CHK:MOVA,@R0;前一个数大,取后一个数LOOP1:XCHA,3AHCJNEA,#0FFH,LOOPMOV3BH,AJCLOOP1;前一个数小,则转XCHA,3AH;取最小数SJMP$3、求8个数的平均值,这8个数以表格形式存放在从table开始的单元中。ORG0030HMOVR0,#tableMOVR6,#07HMOVR3,#00HMOVA,@R0CLRCADDJNCINCLOOP:INCR0LOOP1A,@R0;累加LOOP1:DJNZCLRCMOVMOVR3R6,LOOPR5,#03HR2,AA,R3;除8LOOP2:MOVRRCAMOVR3,AMOVA,R2RRCAMOVDJNZR5,LOOP2R2,A4、把一个8位二进制数的各位用ASCII码表示之(亦即为“0”的位用30H表示,为“1”的位用31H表示)。该数存放在内部RAM中byte单元中。变换后行到的8个ASCII码存放在外部RAM以buf始的存储单元中去。ORGMOVMOVMOVMOVMOVJCMOVSJMP0030HR0,#byteR5,#08HA,@R0R7,AADPTR,#bufLOOP:RLCLOOP1LOOP1:LOOP2A,#30HMOVA,#31HLOOP2:MOVXMOVINCDPTRA,R7@DPTR,ADJNZ5、搜索一串ASCII码字符中最后一个非空格字符,字符串从外部RAM8100H单元开始存放,并用一个回车符(0DH)作结束。编程实现搜索并把搜索R5,LOOP到的非空格字符的地址存入内部RAM单元40H和41H中,其中高字节放入41H单元。ORG0030HMOVDPTR,#8100HMOV40H,#00HMOV41H,#00HINCDPTRLOOP:MOVXA,@DPTRCJNEA,#0DH,LOOP;是否为回车符clrcloop1:mova,dpl;dptr-1,指向0dh单元地址subba,#01hmovdpl,amova,dphmovdph,aclrcsubba,#00hloop2:mova,dpl;dptr-1,调整单元地址subba,#01hmovdpl,amova,dphmovdph,asubba,#00hmovxa,@dptr;取下一个数cjnea,#20h,loop3;是否为空格字符,不是转sjmploop2;是空格字符则转调整单元地址loop3:mov41h,dph;地址sjmp$endmov40h,dpl;存最后一个非空格字符的6、比较两个ASCII码字符串是否相等。字符串的长度在内部RAM41H单元,第一个字符串的首地址为42H,第二个字符串的首地址为52H。如果两个字符串相等,则置内部RAM40H单元为00H;否则置40H单元为FF。ORGMOVR0,#42H0030HMOVR1,#52HMOVR7,41HLOOP:MOVA,@R0MOV30H,@R1INCINCR0R1CJNEA,30H,LKDJNZMOVSJMPLK:DD:MOV40H,#0FFHSJMPDDDD40H,#00HR7,LOOP7.外部RAM首址为table的数据表中,有10个字节的数据。编程将每个字节的最高位无条件地置“1”。ORG0030HMOVMOVSETBINC8、DPTR,#tableR6,#10E7HLOOP:MOVXA,@DPTRMOVX@DPTR,ADJNZR6,LOOPDPTR8000H开始的有200个字节的源数据区,隔一个单元送到4000H开始的数据区。在目0030HDPL的数据区中,每隔两个单元写一个数。如遇0DH(回车)则传送结束。ORGMOVDPTR,#8100H;源数据区首址DPH;源首址暂存堆栈;PUSHPUSHMOVMOVMOVMOVPOPINCINCDPTR,#4000H;目的数据区首址R2,DPL;目的首址暂存寄存器R3,DPHR7,#200;LOOP:POPMOVXDPLDPHDPTRDPTRA,@DPTR;取出数据;;取回源地址;源地址增量PUSHPUSHMOVMOVLL:DPLDPL,R2DPH;源地址暂存堆栈;取回目的地址;LP;是0DH则传送结束;;隔一个单元CJNEA,#0DH,LL;是否为0DHSJMPINCMOVXDPTR@DPTR,A;目的地址增量DPH,R3;数据送目的区INCINCMOVMOVDPTR;隔两个单元DPTRR2,DPL;目的地址暂存寄存器R3,DPH;LP:9、ORGRETDJNZ;返回主程序R7,LOOP;没完,继续循环输入缓冲区inbuf存有80个字节,编程实现将其中所有的组分隔符(1DH)地址依次压0030H入separ栈中。MOVMOVMOVCJNESP,#separR4,#80R0,#inbufA,@R0LOOP:MOVMOVA,#1DH,LPP;是否为1DH7FH,R0;是则将组分隔符7FH;地址依次压入separ栈中。PUSHDJNZLPP:INCR010、内部RAM缓冲区buffin向外部RAMbuffou传送一个字符串,遇0DH结束,置PSW的F0位为“1”;或传送完128个字符后结束,并置PSW的OV位为“0”。ORGMOVMOVMOVCJNESJMPINCINC0030HR0,#buffinR7,#128R4,LOOPDPTR,#buffouA,@R0LOOP:MOVLP:MOVX@DPTR,AR0DPTROVSTOPA,#0DH,LPDJNZCLRSJMPPP:R7,LOOPSTOP:SETBPP11、编写读取运行定时器中计数器值并送LED显示器的程序。可根据需要定义子程序。12、求16位带符号二进制补码数的绝对值。假定补码放在内部RAM的num和num+1单元中,求得的绝对值仍放在原单元中。SJMPF0PPORG0030HMOVR0,#num+1MOVA,@R0DECR0MOVINCMOVJNBACC.7,KKMOVA,@R0R0@R0,AA,@R0A,#00HCPLAADDCMOV@R0,AKK:SJMPKK13、求16位补码数的原码。16位补码数放在内部RAM的data和data+1单元中,转换后得到的原码仍放在原单元中。ORG0030HMOVR0,#data+1MOVA,@R0DECR0CPLAMOVINCMOVJNBACC.7,KKMOVA,@R0ADDA,#01HR0@R0,AA,@R0A,#00HCPLAADDCMOV@R0,AKK:SJMPKK14、从内部RAM20H单元中开始存放一组带符号数,字节数存在1FH中,请统计出其中大于0,等于0和小于0的数的数目,并把统计结果分别存入one、two、therr3个单元中。ORGMOVMOVCLRMOVMOVMOVJNZ0030HR0,#20HR7,1FHone,Atwo,Atherr,AALOOP:MOVKKA,@R0INCtwo;0单元计数SJMPKPKK:INCone;正数单元计数SJMPKPPP:KP:INCtherr;負数单元计数INCR0R7,LOOPJBACC.7,PPDJNZ15、5个双字节数,存放在外部RAM从barf开始的单元中,求它们的和,并把和存放在sumg开始单元中,请编程实现。START:MOVMOVMOVMOVINCR1,#SUMGR2,#04HR3,AR0R0,#BARFMOVXA,@R0MOVLOOP:MOVXADDINCMOVMOVXADDCMOVJNCCLRA,@R0INCR4,AMOVXR0A,@R0A,R3R0R3,AA,R4A,@R0R4,AHERADDCMOVMOVINCHER:MOVXMOVINCAA,#00HR5,AR2,LOOPDJNZ@R1,AA,R3R1MOVXMOV@R1,AR1A,R4MOVXHERE:@R1,ASJMPA,R5$16、把外部RAM中block1为首地址的数据块传送到内部RAM以block2为首地址的单元中去,数据块的长度为N字节。MOVMOVMOVMOVINCINCLOOP:R0,#BLOCK1R1,#BLOCK2MOVXR0R1R7,#NA,@R0@R1,ADJNZCPLAR7,LOOPADDA,#01H-------------------------------------------------------------------------------------------------------------单片机基础问答题答案:第5章1、在MCS-51单片机系统中,外接程序存储器和数据存储器共用16位地址线和8位数据线,为什么不会发生冲突?答:外接程序存储器和数据存储器的连接信号不同,及所使用的指令不同。外接程序存储器连接PSEN信号,数据存储器连接WR,RD信号,另外访问外接程序存储器用MOVC指令,访问外接数据存储器用MOVX指令。2、3、以两片Intel2716给80C51单片机扩展一个4KB的外部程序存储器,要求地址空间与8051的内部ROM相銜接,请画出逻辑连接图。试以一片Intel2716和一片Intel6116组成一个既有程序存储器又有数据存储器的存储器扩展系统,请画出逻辑连接图,并说明各芯片的地址范围。4.以译码编址方式,把4片Intel6116组成8KB的数据存储器,请画出逻辑连接图,并说明各芯片的地址范围。-------------------------------------------------------------------------------------------------------------第六章习题编程题和问答题1、单片机用内部定时方法产生频率为100KHZ等宽矩形波,假定单片机的晶振频率为12MHZ,请编程实现。答:定时5μs,方式0:X=8187方式1:X=65531FFFBH方式2:X=251用方式2:MOVMOVSETBLOOP:FBHMOVIE,#00HFF1BHMOVTMOD,#02HTH0,#0FBHTL0,#0FBHTR0JBCTF0,LOOP1SJMPLOOPLOOP1:CPLP1.0SJMPLOOP2、有晶振频率为6MHZ的MCS-51单片机,使用定时器0以定时方法在P1.0输出周期为400us,占空比为10:1的矩形脉冲,以定时工作方式2编程实现。答:定时400μs,占空比为10:1,以定时工作方式2编程:高电平=40μs,低电平=360μs((-X)*2*-X)*2*=360*=40*X=76=4CHX=236=0ECHMOVIE,#00HMOVMOVTMOD,#02HTH0,#4CHMOVTL0,#0ECHCLRSETBTR0SETBSJMPTF0LOOP:JBCTF0,LOOP1LOOP1:CLRLOOP2:JBCLOOPP1.0P1.0MOVTH0,#0ECHSJMPLOOP2TF0,LOOP3LOOP3:SETBP1.0MOVLOOP4:TH0,#4CHJBCTF0LOOP1SJMPLOOP43、以定时器/计数器1进行外部事件计数。每计数1000个脉冲后,定时器/计数器1转为定时工作方式,定时10ms后,又转为计数方式,如此循环不止。假定单片机晶振频率为6MHZ,请使用工作方式1编程实现。答:计数:定时10ms:(LOOP:MOV-1000=64536=0FC18H-X)*2*IE,#00H=10*X=60536=0EC78HMOVTMOD,#50HMOVTH1,#0FCHMOVTH0,#18HCLRTF1SETBTR1LOOP1:SJMPLOOP2:MOVLOOP1JBCTF1,LOOP2MOVTH1,#0ECHCLRTF1TL1,#78HMOVTMOD,#10HSETBTR1LOOP3:JBCSJMPTF0,LOOPLOOP34、以中断方法设计单片机秒、分脉冲发生器。假定P1.0每秒钟产生一个机器周期的正脉冲,P1.1每分钟产生一个机器周期的正脉冲。答:时钟计时的关键问题是秒的产生,因为秒是最小时钟单位,但使用MCS-51的定时器/计数器进行定时,即使按方式1工作,其最大定时时间也只能达到131毫秒。离1S还差很远。为此,可把秒计时用硬件定时和软件计数相结合的方法实现,即:把定时器的定时时间定为125ms,这样计数溢出8次就可得到1s。而8次计数可用软件方法实现。为得到125ms定时,可使用定时器/计数器0,以工作方式1进行,假定单片机为6MHZ晶振,设计数初值为X,则有如下等式:(―X)×2=125000计算得计数初值X=3036=0BDCH,二进制表示为0000101111011100B(2)定时器定时采用中断方式完成,以便于通过中断服务程序进行溢出次数(每次125ms)的累计。计满8次即得到秒计时。通过在程序中的数值累加和数值比较来实现从秒到分的计时。ORGORGLJMPLJMPORG0000H000BPITOMAINMAIN:MOV0030HMOVTMOD,#01H;SP,#60H;确立堆栈区定时器0,工作方式1MOVMOVCLRCLRTL0,#0DCH;装计数器初值P1.0P1.1TH0,#0BHSETB8CH;TR0置1,定时开始SETBSETBMOVMOVSJMP$0AFH;EA置1,中断总允许R7,#08H0A9H;ET0置1,定时器0中断允许;要求的计数溢出次数R6,#00H;分缓冲单元清0PITO:PUSHMOVMOVMOVDECJNZMOVPUSHTL0,#0DCHTH0,#0BHAA,R7R7,AACCPSW;中断服务程序,现场保护;计数器重新加载;循环次数减1SETBP1.0;P1.0每秒钟产生一个机器CLRINCR6;秒加1A,R6P1.0;周期的正脉冲RET0;不满8次,转RET0返回MOVXRLA,#60;判是否到60秒JNZSETBCLRRET0P1.1;P1.1每分钟产生一个机器RET0:POPACCPOPRETIPSWP1.1;周期的正脉冲5、一个定时器的定时时间有限,如何实现两个定时器的串行定时,以满足较长定时时间的要求。答:一个定时器的定时时间到,再启动另一个定时器。二个定时器循环启动。6、使用一个定时器,如何通过软硬件结合的方法,实现较长时间的定时?答:定时器的定时时间到以后,再用软件计数,用硬件定时和软件计数相结合的方法实现。7、假定单片机晶振频率为6MHZ,要求每隔100ms,从外部RAM以data开始的数据区传送一个数据到P1口输出,共传送100个数据。要求以两个定时器串行定时方法实现。答:设计数初值为X,则有如下等式:(―X)×2*=500*计算得计数初值X=6=06H,二进制表示为00000110B8、每隔1秒钟读一次P1.0,如果所读的状态为“1”,内部RAM10H单元加1,如果所读的状态为“0”,则内部RAM11单元加1。假定单片机晶振频率为12MHZ,请以软硬件结合方法定时实现之。答:计算计数初值:(ORG-X)*1*0000HMAIN=50*计算得计数初值X=15536=3CB0H,二进制表示为0011110011010000BLJMPORGORGLJMP000B0030HPITOMAIN:MOVMOVMOVSETBSETBSETBMOVMOVMOVMOVTMOD,#01H;定时器0,工作方式1TL0,#0B0H;装计数器初值TH0,#3CH8CH;TR0置1,定时开始SP,#60H;确立堆栈区0AFH;EA置1,中断总允许R7,#20;要求的计数溢出次数10H,#00H11H,#00HPUSHPSW0A9H;ET0置1,定时器0中断允许SJMP$PITO:PUSHMOVMOVTL0,#0B0HTH0,#3CHACC;中断服务程序,现场保护;计数器重新加载MOVDECJNZJBMOVMOVAA,R7R7,A;循环次数减1INC11HSJMPPP:ACC.7,PPA,P1RET0;不满20次,转RET0返回RET0INCRET0:POPACCPOPRETIPSW10H