习题1.什么是MCS-51单片机的最小系统?答:所谓最小系统,是指一个真正可用的单片机的最小配置系统。对于单片机内部资源已能够满足系统需要的,可直接采用最小系统。2.简述半导体存储器的分类?答:半导体存储器按读写工作方式可分为两种:只读存储器ROM(ReadOnlyMemory)和随机读写存储器RAM(RandomAccessMemory)。只读存储器ROM有MROM-掩膜型ROM,PROM-可编程ROM,EPROM-可擦除的PROM,E2PROM-电擦除的PROM,FlashMemory-快擦型存储器;随机读写存储器RAM有静态RAM-SRAM,动态RAM-DRAM,非易失性RAM-NVRAM。3.简述存储器扩展的一般方法。答:存储器芯片与单片机扩展连接具有共同的规律。即不论何种存储器芯片,其引脚都呈三总线结构,与单片机连接都是三总线对接。另外,电源线接电源线,地线接地线。4.什么是部分译码法?什么是全译码法?它们各有什么特点?用于形成什么信号?答:部分译码就是存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线仅用一部分参加译码。部分译码使存储器芯片的地址空间有重叠,造成系统存储器空间的浪费。全译码就是存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线全部参加译码。这种译码方法中存储器芯片的地址空间是唯一确定的,但译码电路要相对复杂。译码形成存储器芯片的片选信号线CE。5.采用部分译码为什么会出现地址重叠情况,它对存储器容量有何影响?答:部分译码就是存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线仅用一部分参加译码。参加译码的地址线对于选中某一存储器芯片有一个确定的状态,而与不参加译码的地址线无关。也可以说,只要参加译码的地址线处于对某一存储器芯片的选中状态,不参加译码的地址线的任意状态都可以选中该芯片。正因为如此,部分译码使存储器芯片的地址空间有重叠,造成系统存储器空间减少。6.存储器芯片的地址引脚与容量有什么关系?答:容量(Q)与地址线数目(N)满足关系式:Q=2N。7.MCS-51单片机的外部设备是通过什么方式访问的?答:MCS-51单片机扩展的外部设备与片外数据存储器统一编址,即外部设备占用片外数据存储器的地址空间。按片外数据存储器的访问方式访问。8.何为键抖动?键抖动对键位识别有什么影响?怎样消除键抖动?答:按键时,无论按下键位还是放开键位都会产生抖动,如果对抖动不作处理,必然会出现按一次键而输入多次,为确保按一次键只确认一次,必须消除按键抖动。消除按键抖动通常有硬件消抖和软件消抖两种方法。9.矩阵键盘有几种编码方式?怎样编码?答:通常有以下两种方法进行编码;(1)用连接键盘的I/O线的二进制组合进行编码。(2)顺序排列编码。210.简述对矩阵键盘的扫描过程。答:矩阵式键盘的工作过程可分为两步:第一步是CPU首先检测键盘上是否有键按下;第二步是识别哪一个键按下。(1)检测键盘上是否有键按下的处理方法是:将列线送入全扫描字,读入行线的状态来判别。(2)识别键盘中哪一个键按下的处理方法是:将列线逐列置成低电平,检查行输入状态,称为逐列扫描。11.共阴极数码管与共阳极数码管有何区别?答:共阴极结构,8段发光二极管的阴极端连接在一起,阳极端分开控制,使用时公共端接地,要使哪根发光二极管亮,则对应的阳极端接高电平;共阳极结构,8段发光二极管的阳极端连接在一起,阴极端分开控制,使用时公共端接电源,要使哪根发光二极管亮,则对应的阴极端接地。12.简述LED数码管显示的译码方式。答:所谓译码方式是指由显示字符转换得到对应的字段码的方式。对于LED数码管显示器,通常的译码方式有硬件译码方式和软件译码方式两种。13.简述LED动态显示过程。答:LED动态显示是将所有的数码管的段选线并接在一起,用一个I/O接口控制,公共端不是直接接地(共阴极)或电源(共阳极),而是通过相应的I/O接口线控制,工作过程为:第一步使右边第一个数码管的公共端D0为1,其余的数码管的公共端为0,同时在I/O(1)上发送右边第一个数码管的字段码,这时,只有右边第一个数码管显示,其余不显示;第二步使右边第二个数码管的公共端D1为1,其余的数码管的公共端为0,同时在I/O(1)上发送右边第二个数码管的字段码,这时,只有右边第二个数码管显示,其余不显示,依此类推,直到最后一个,这样4个数码管轮流显示相应的信息,一次循环完毕后,下一次循环又这样轮流显示,从计算机的角度看是一个一个地显示,但由于人的视觉暂留效应,只要循环的周期足够快,则看起来所有的数码管就都是一起显示的了,这就是动态显示的原理。14.使用2764(8KB8)芯片通过部分译码法扩展24KB程序存储器,画出硬件连接图,指明各芯片的地址空间范围。答:使用2764(8K8)芯片通过部分译码法扩展24KB程序存储器,须要3块。采用线译码,P2.5与第一片2764的CE相连,P2.6与第二片2764的CE相连,P2.7与第三片2764的CE相连,硬件连接如下:3P2.6P2.5ALE8031PSENEAP2.774LS373OEA0~A7A8~A12CED0~D7OE2764(1)A0~A7A8~A12CE2764(2)OEP0588885885D0~D7G8D0~D7OE2764(3)A0~A7A8~A12CE85P2.4~P2.0地址空间如下:第一片:1100000000000000~1101111111111111;即C000H~DFFFH;第二片:1010000000000000~1011111111111111;即A000H~BFFFH;第三片:0110000000000000~0111111111111111;即6000H~7FFFH;15.使用6264(8KB8)芯片通过全译码法扩展24KB数据存储器,画出硬件连接图,指明各芯片的地址空间范围。答:使用6264(8K8)芯片通过全译码法扩展24KB程序存储器,须要3块。采用138译码器译码,硬件连接如下:74LS138P2.6P2.5ALE8031PSENEAP2.774LS373OEA0~A7A8~A12CED0~D7OE6264(1)A0~A7A8~A12CE6264(2)OEP0588885885D0~D7G8D0~D7OE6264(3)A0~A7A8~A12CE85VccP2.4~P2.0GCBAG1G2G2Y3Y2Y1Y0地址空间如下:第一片:40000000000000000~0001111111111111;即0000H~1FFFH;第二片:0010000000000000~0011111111111111;即2000H~3FFFH;第三片:0100000000000000~0101111111111111;即3000H~5FFFH;16.试用一片74LS373扩展一个并行输入口,画出硬件连接图,指出相应的控制命令。答:硬件电路图如下:74LS373的输入端为扩展的输入口,输出端接8051的数据总路线P0口,控制端接高电平,输出允许由片外数据存储器读信号RD和P2.0控制。当片外数据存储器读信号RD和P2.0同为低平时从74LS373中读入输入的数据。P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.08051RDQ0Q1Q2Q3Q4Q5Q6Q7OEGD0D1D2D3D4D5D6D774LS373P2.0++5V输入数据的命令如下:MOVDPTR,#0FE00HMOVXA,@DPTR17.用8255A扩展并行I/O,实现把8个开关的状态通过8个二极管显示出来,画出硬件连接图,用汇编语言和C语言分别编写相应的程序。答:硬件电路图如下:8051与8255的连接略,设8255的A,B,C和控制控口的地址为7F00H,7F01H,7F02H,7F03H。8255的A口接8个开关,B口接8个发光二极管。58051系统总线8255APA0PA1PA2PA3PA4PA5PA6PA7PB0PB1PB2PB3PB4PB5PB6PB7+5V+5VK0K7L0L7程序如下:汇编程序ORG0000HLJMPMAINORG0100HMAIN:MOVDPTR,#7F03HMOVA,#90HMOVX@DPTR,ALOOP:MOVDPTR,#7F00HMOVXA,@DPTRMOVDPTR,#7F01HMOVX@DPTR,ASJMPLOOPSJMP$ENDC语言程序:#includereg51.h#includeabsacc.hmain(){unsignedchari;XBYTE[0x7f03]=0x90;while(1){i=XBYTE[0x7f00];XBYTE[0x7f01]=i;6}}}18.用汇编语言编写出定时扫描方式下矩阵键盘的处理程序。该程序放于定时器的中断服务程序中。定时器每10ms中断一次,执行一次中断服务程序。F1和F2标志位用片内RAM的50H和51H单元。ACALLKS1JNZLK1MOV50H,#0;无键按下,F1的F0标志清0结束MOV51H,#0SJMPOUTLK1:CJNE50H,#1,OUT1;有键按下检查F1标志是否为1,不为1置1结束。CJNE51H,#01,OUT;再检查F2标志是否为1,为1说明已处理按键则结束。LK2:MOVR2,#0FEH;扫描查询键码MOVR4,#00HLK4:MOVDPTR,#7F00HMOVA,R2MOVX@DPTR,AINCDPTRINCDPTRMOVXA,@DPTRJBACC.0,LONEMOVA,#00HAJMPLKPLONE:JBACC.1,LTWOMOVA,#08HAJMPLKPLTWO:JBACC.2,LTHRMOVA,#10HAJMPLKPLTHR:JBACC.3,NEXTMOVA,#18HLKP:ADDA,R4;求键码放累加大器A,MOV51H,#1;F2标志置1,结束SJMPOUTNEXT:INCR4MOVA,R2JNBACC.7,KENDRLAMOVR2,ASJMPLK4KEND:SJMPOUT;扫描完结束KS1:MOVDPTR,#7F00H;检查有无按键MOVA,#00HMOVX@DPTR,AINCDPTRINCDPTR7MOVXA,@DPTRCPLAANLA,#0FHRETOUT1:MOV50H,#1OUT:19.用C语言编写出定时扫描方式下矩阵键盘的处理程序。F1和F2标志已在主函数前定义。//************检测有无键按下函数************ucharcheckkey()//检测有无键按下函数,有返回0xff,无返回0{uchari;XBYTE[0x7f00]=0x00;i=XBYTE[0x7f02];i=i&0x0f;if(i==0x0f)return(0);elsereturn(0xff);}//************键盘扫描函数************ucharkeyscan()//键盘扫描函数,如果有键按下,则返回该键的编码,如果无键按下,则返回0xff{ucharscancode;//定义列扫描码变量ucharcodevalue;//定义返回的编码变量ucharm;//定义行首编码变量uchark;//定义行检测码uchari,j;if(checkkey()==0)return(0xff);//检测有无键按下,无返回0xffelse{delay(200);//延时if(checkkey()==0)return(0xff);//检测有无键按下,无返回0xffelse{scancode=0xfe;m=0x00;//列扫描码,行首码赋初值for(i=0;i8;i++){k=0x01;XBYTE[0x7f00]=scancode;//送列扫描码for(j=0;j4;j++){if((XBYTE[0x7f02]&k)==0)//检测当前行是否有键按下{codevalue=m+j;//按下,求编码while(checkkey()!=0);//等待键位释放return