单片机基础问答题答案:第2章1、.8051单片机芯片包含哪些主要逻辑功能部件?各有什么主要功能?答:CPU:控制单片机各部份协调工作进行算术和逻辑运算内部数据存储器:存储数据内部程序存储器:存储程序定时器/计数器,并行I/O口串行口,中断控制系统,时钟电路2、MCS—51单片机的EA信号有何功能?在使用8031时EA信号引脚应如何处理?答:访问程序存储器控制信号,EA=0访问外部程序存储器,EA=1访问内部程序存储器。8031无内部程序存储器,所以EA接地。3、MCS—51单片机有哪些信号需要芯片引脚以第二功能的方式提供?答:P3口,ALE/PROG(30脚),EA/VPP(31脚),RST/VPD(9脚)4、内部RAM低128单片划分为哪3个主要部分?说明各部分的使用特点?答:1.寄存器区,可寄存器寻址2.位寻址区,可位寻址3.用户RAM区,其单元地址为30H~7FH,一般还把堆栈开辟在用户RAM区5、程序计数器(PC)作为不可寻址寄存器,它有哪些特点?答:PC是一个16位的计数器。其内容为将要执行的指令地址,寻址范围达64KB。有以下功能: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口和第二功能状态P0口:一种功能通用I/O口和AB/DB复用总线8、MCS—51单片机运行出错或程序进入死循环,如何摆脱困境?答:按复位键以重新启动。9、什么是指令周期,机器周期和时钟周期?如何计算机器周期的确切时间?答:执行一条指令所需的时间称之为指令周期,机器周期就是振荡脉冲的十二分频,时钟周期定义为状态(用S表示),2个振荡脉冲。10、使单片机复位有哪几种方法?复位后机器的初始状态如何?答:复位操作有上电自动复位和按键手动复位两种方式。按键手动复位有电平方式和脉冲方式两种。它们的复位状态如下:PC0000HTCON00HACC00HTL000HPSW00HTH000HSP07HTL100HDPTR0000HTH100HP0~P3FFHSCON00HIPxx000000BSBUF不定IE0x000000BPCON0xxx0000bTMOD00H-----------------------------------------------------------------------------------------------------------单片机基础编程题答案:第4章1、把长度为10H的字符串从内部RAM的输入缓冲区inbuf向设在外部RAM输出缓冲区outbuf进行传送,一直进行到遇见回车符CR或整个字符传送完毕。ORG0030HMOVR0,#inbufMOVR1,#outbufMOVR4,#10HLOOP:MOVA,@R0;从内部RAM取数CJNEA,#0DH,LL;是否为回车符CRSJMPSTOP;是转停止传送LL:MOVX@R1,A;不是则传送到外部RAMINCR0INCR1DJNZR4,LL;沒传送完则循环STOP:SJMP$2、内部RAM从list单元开始存放一正数表,表中之数作无序排列,并以“-1”作结束标志。编程实现在表中找出最小数。ORG0030HMOVR0,#listMOVA,@R0;取第一个正数LOOP:INCR0;指向下一个正数MOV3AH,@R0CJNEA,3AH,CHK;前一个数与后一个数比较CHK:JCLOOP1;前一个数小,则转MOVA,@R0;前一个数大,取后一个数LOOP1:XCHA,3AHCJNEA,#0FFH,LOOPXCHA,3AH;取最小数MOV3BH,ASJMP$3、求8个数的平均值,这8个数以表格形式存放在从table开始的单元中。ORG0030HMOVR0,#tableMOVR6,#07HMOVR3,#00HMOVA,@R0CLRCLOOP:INCR0ADDA,@R0;累加JNCLOOP1INCR3LOOP1:DJNZR6,LOOPCLRCMOVR5,#03HMOVR2,ALOOP2:MOVA,R3;除8RRCAMOVR3,AMOVA,R2RRCAMOVR2,ADJNZR5,LOOP24、把一个8位二进制数的各位用ASCII码表示之(亦即为“0”的位用30H表示,为“1”的位用31H表示)。该数存放在内部RAM中byte单元中。变换后行到的8个ASCII码存放在外部RAM以buf始的存储单元中去。ORG0030HMOVR0,#byteMOVDPTR,#bufMOVR5,#08HMOVA,@R0LOOP:RLCAMOVR7,AJCLOOP1MOVA,#30HSJMPLOOP2LOOP1:MOVA,#31HLOOP2:MOVX@DPTR,AMOVA,R7INCDPTRDJNZR5,LOOP5、搜索一串ASCII码字符中最后一个非空格字符,字符串从外部RAM8100H单元开始存放,并用一个回车符(0DH)作结束。编程实现搜索并把搜索到的非空格字符的地址存入内部RAM单元40H和41H中,其中高字节放入41H单元。ORG0030HMOVDPTR,#8100HMOV40H,#00HMOV41H,#00HLOOP:MOVXA,@DPTRINCDPTRCJNEA,#0DH,LOOP;是否为回车符loop1:mova,dpl;dptr-1,指向0dh单元地址clrcsubba,#01hmovdpl,amova,dphsubba,#00hmovdph,aloop2:mova,dpl;dptr-1,调整单元地址clrcsubba,#01hmovdpl,amova,dphsubba,#00hmovdph,amovxa,@dptr;取下一个数cjnea,#20h,loop3;是否为空格字符,不是转sjmploop2;是空格字符则转调整单元地址loop3:mov40h,dpl;存最后一个非空格字符的mov41h,dph;地址sjmp$end6、比较两个ASCII码字符串是否相等。字符串的长度在内部RAM41H单元,第一个字符串的首地址为42H,第二个字符串的首地址为52H。如果两个字符串相等,则置内部RAM40H单元为00H;否则置40H单元为FF。ORG0030HMOVR0,#42HMOVR1,#52HMOVR7,41HLOOP:MOVA,@R0MOV30H,@R1CJNEA,30H,LKINCR0INCR1DJNZR7,LOOPMOV40H,#00HSJMPDDLK:MOV40H,#0FFHDD:SJMPDD7.外部RAM首址为table的数据表中,有10个字节的数据。编程将每个字节的最高位无条件地置“1”。ORG0030HMOVDPTR,#tableMOVR6,#10LOOP:MOVXA,@DPTRSETBE7HMOVX@DPTR,AINCDPTRDJNZR6,LOOP8、8000H开始的有200个字节的源数据区,隔一个单元送到4000H开始的数据区。在目的数据区中,每隔两个单元写一个数。如遇0DH(回车)则传送结束。ORG0030HMOVDPTR,#8100H;源数据区首址PUSHDPL;源首址暂存堆栈PUSHDPH;MOVDPTR,#4000H;目的数据区首址MOVR2,DPL;目的首址暂存寄存器MOVR3,DPH;MOVR7,#200LOOP:POPDPH;取回源地址POPDPL;MOVXA,@DPTR;取出数据INCDPTR;源地址增量INCDPTR;隔一个单元PUSHDPL;源地址暂存堆栈PUSHDPH;MOVDPL,R2;取回目的地址MOVDPH,R3;CJNEA,#0DH,LL;是否为0DHSJMPLP;是0DH则传送结束LL:MOVX@DPTR,A;数据送目的区INCDPTR;目的地址增量INCDPTR;隔两个单元INCDPTRMOVR2,DPL;目的地址暂存寄存器MOVR3,DPH;DJNZR7,LOOP;没完,继续循环LP:RET;返回主程序9、输入缓冲区inbuf存有80个字节,编程实现将其中所有的组分隔符(1DH)地址依次压入separ栈中。ORG0030HMOVSP,#separMOVR0,#inbufMOVR4,#80LOOP:MOVA,@R0CJNEA,#1DH,LPP;是否为1DHMOV7FH,R0;是则将组分隔符PUSH7FH;地址依次压入separ栈中。LPP:INCR0DJNZR4,LOOP10、内部RAM缓冲区buffin向外部RAMbuffout传送一个字符串,遇0DH结束,置PSW的F0位为“1”;或传送完128个字符后结束,并置PSW的OV位为“0”。ORG0030HMOVR0,#buffinMOVDPTR,#buffoutMOVR7,#128LOOP:MOVA,@R0CJNEA,#0DH,LPSJMPSTOPLP:MOVX@DPTR,AINCR0INCDPTRDJNZR7,LOOPCLROVSJMPPPSTOP:SETBF0PP:SJMPPP11、编写读取运行定时器中计数器值并送LED显示器的程序。可根据需要定义子程序。12、求16位带符号二进制补码数的绝对值。假定补码放在内部RAM的num和num+1单元中,求得的绝对值仍放在原单元中。ORG0030HMOVR0,#num+1MOVA,@R0JNBACC.7,KKDECR0MOVA,@R0MOV@R0,AINCR0MOVA,@R0CPLAADDCA,#00HMOV@R0,AKK:SJMPKK13、求16位补码数的原码。16位补码数放在内部RAM的data和data+1单元中,转换后得到的原码仍放在原单元中。ORG0030HMOVR0,#data+1MOVA,@R0JNBACC.7,KKDECR0MOVA,@R0CPLAADDA,#01HMOV@R0,AINCR0MOVA,@R0CPLAADDCA,#00HMOV@R0,AKK:SJMPKK14、从内部RAM20H单元中开始存放一组带符号数,字节数存在1FH中,请统计出其中大于0,等于0和小于0的数的数目,并把统计结果分别存入one、two、three3个单元中。ORG0030HMOVR0,#20HMOVR7,1FHCLRAMOVone,AMOVtwo,AMOVthree,ALOOP:MOVA,@R0JNZKKINCtwo;0单元计数SJMPKPKK:JBACC.7,PPINCone;正数单元计数SJMPKPPP:INCthree;負数单元计数KP:INCR0DJNZR7,LOOP15、5个双字节数,存放在外部RAM从barf开始的单元中,求它们的和,并把和存放在sumg开始单元中,请编程实现。START:MOVR0,#BARFMOVR1,#SUMGMOVR2,#04HMOVXA,@R0MOVR3,AINCR0MOVXA,@R0MOVR4,ALOOP:INCR0MOVXA,@R0ADDA,R3MOVR3,AINCR0MOVXA,@R0ADDCA,R4MOVR4,AJNCHERCLRAADDCA,#00HMOVR5,AHER:DJNZR2,LOOPMOVA,R3MOVX@R1,AINCR1MOVA,R4MOVX@R1,AINCR1MOVA,R5MOVX@R1,AHERE:SJMP$16、把外部RAM中block1为首地址的数据块传