第5章单片机原理课后答案说课讲解.docx
《第5章单片机原理课后答案说课讲解.docx》由会员分享,可在线阅读,更多相关《第5章单片机原理课后答案说课讲解.docx(12页珍藏版)》请在冰豆网上搜索。
第5章单片机原理课后答案说课讲解
习题
1.什么是MCS-51单片机的最小系统?
答:
所谓最小系统,是指一个真正可用的单片机的最小配置系统。
对于单片机内部资源已能够满足系统需要的,可直接采用最小系统。
2.简述存储器扩展的一般方法。
答:
存储器芯片与单片机扩展连接具有共同的规律。
即不论何种存储器芯片,其引脚都呈三总线结构,与单片机连接都是三总线对接。
另外,电源线接电源线,地线接地线。
3.什么是部分译码法?
什么是全译码法?
它们各有什么特点?
用于形成什么信号?
答:
部分译码就是存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线仅用一部分参加译码。
部分译码使存储器芯片的地址空间有重叠,造成系统存储器空间的浪费。
全译码就是存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线全部参加译码。
这种译码方法中存储器芯片的地址空间是唯一确定的,但译码电路要相对复杂。
译码形成存储器芯片的片选信号线
。
4.采用部分译码为什么会出现地址重叠情况,它对存储器容量有何影响?
答:
部分译码就是存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线仅用一部分参加译码。
参加译码的地址线对于选中某一存储器芯片有一个确定的状态,而与不参加译码的地址线无关。
也可以说,只要参加译码的地址线处于对某一存储器芯片的选中状态,不参加译码的地址线的任意状态都可以选中该芯片。
正因为如此,部分译码使存储器芯片的地址空间有重叠,造成系统存储器空间减少。
5.存储器芯片的地址引脚与容量有什么关系?
答:
容量(Q)与地址线数目(N)满足关系式:
Q=2N。
6.MCS-51单片机的外部设备是通过什么方式访问的?
答:
MCS-51单片机扩展的外部设备与片外数据存储器统一编址,即外部设备占用片外数据存储器的地址空间。
按片外数据存储器的访问方式访问。
7.何为键抖动?
键抖动对键位识别有什么影响?
怎样消除键抖动?
答:
按键时,无论按下键位还是放开键位都会产生抖动,如果对抖动不作处理,必然会出现按一次键而输入多次,为确保按一次键只确认一次,必须消除按键抖动。
消除按键抖动通常有硬件消抖和软件消抖两种方法。
8.矩阵键盘有几种编码方式?
怎样编码?
答:
通常有以下两种方法进行编码;
(1)用连接键盘的I/O线的二进制组合进行编码。
(2)顺序排列编码。
9.简述对矩阵键盘的扫描过程。
答:
矩阵式键盘的工作过程可分为两步:
第一步是CPU首先检测键盘上是否有键按下;第二步是识别哪一个键按下。
(1)检测键盘上是否有键按下的处理方法是:
将列线送入全扫描字,读入行线的状态来判别。
(2)识别键盘中哪一个键按下的处理方法是:
将列线逐列置成低电平,检查行输入状态,称为逐列扫描。
10.共阴极数码管与共阳极数码管有何区别?
答:
共阴极结构,8段发光二极管的阴极端连接在一起,阳极端分开控制,使用时公共端接地,要使哪根发光二极管亮,则对应的阳极端接高电平;共阳极结构,8段发光二极管的阳极端连接在一起,阴极端分开控制,使用时公共端接电源,要使哪根发光二极管亮,则对应的阴极端接地。
11.简述LED数码管显示的译码方式。
答:
所谓译码方式是指由显示字符转换得到对应的字段码的方式。
对于LED数码管显示器,通常的译码方式有硬件译码方式和软件译码方式两种。
12.简述LED动态显示过程。
答:
LED动态显示是将所有的数码管的段选线并接在一起,用一个I/O接口控制,公共端不是直接接地(共阴极)或电源(共阳极),而是通过相应的I/O接口线控制,工作过程为:
第一步使右边第一个数码管的公共端D0为1,其余的数码管的公共端为0,同时在I/O
(1)上发送右边第一个数码管的字段码,这时,只有右边第一个数码管显示,其余不显示;第二步使右边第二个数码管的公共端D1为1,其余的数码管的公共端为0,同时在I/O
(1)上发送右边第二个数码管的字段码,这时,只有右边第二个数码管显示,其余不显示,依此类推,直到最后一个,这样4个数码管轮流显示相应的信息,一次循环完毕后,下一次循环又这样轮流显示,从计算机的角度看是一个一个地显示,但由于人的视觉暂留效应,只要循环的周期足够快,则看起来所有的数码管就都是一起显示的了,这就是动态显示的原理。
13.使用2764(8KB⨯8)芯片通过部分译码法扩展24KB程序存储器,画出硬件连接图,指明各芯片的地址空间范围。
答:
使用2764(8K⨯8)芯片通过部分译码法扩展24KB程序存储器,须要3块。
采用线译码,P2.5与第一片2764的CE相连,P2.6与第二片2764的CE相连,P2.7与第三片2764的CE相连,硬件连接如下:
地址空间如下:
第一片:
1100000000000000~1101111111111111;即C000H~DFFFH;
第二片:
1010000000000000~1011111111111111;即A000H~BFFFH;
第三片:
0110000000000000~0111111111111111;即6000H~7FFFH;
14.使用6264(8KB⨯8)芯片通过全译码法扩展24KB数据存储器,画出硬件连接图,指明各芯片的地址空间范围。
答:
使用6264(8K⨯8)芯片通过全译码法扩展24KB程序存储器,须要3块。
采用138译码器译码,硬件连接如下:
地址空间如下:
第一片:
0000000000000000~0001111111111111;即0000H~1FFFH;
第二片:
0010000000000000~0011111111111111;即2000H~3FFFH;
第三片:
0100000000000000~0101111111111111;即3000H~5FFFH;
15.试用一片74LS373扩展一个并行输入口,画出硬件连接图,指出相应的控制命令。
答:
硬件电路图如下:
74LS373的输入端为扩展的输入口,输出端接8051的数据总路线P0口,控制端接高电平,输出允许由片外数据存储器读信号RD和P2.0控制。
当片外数据存储器读信号RD和P2.0同为低平时从74LS373中读入输入的数据。
输入数据的命令如下:
MOVDPTR,#0FE00H
MOVXA,@DPTR
16.用8255A扩展并行I/O,实现把8个开关的状态通过8个二极管显示出来,画出硬件连接图,用汇编语言和C语言分别编写相应的程序。
答:
硬件电路图如下:
8051与8255的连接略,设8255的A,B,C和控制控口的地址为7F00H,7F01H,7F02H,7F03H。
8255的A口接8个开关,B口接8个发光二极管。
程序如下:
汇编程序
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVDPTR,#7F03H
MOVA,#90H
MOVX@DPTR,A
LOOP:
MOVDPTR,#7F00H
MOVXA,@DPTR
MOVDPTR,#7F01H
MOVX@DPTR,A
SJMPLOOP
SJMP$
END
C语言程序:
#include
#include
main()
{
unsignedchari;
XBYTE[0x7f03]=0x90;
while
(1)
{
i=XBYTE[0x7f00];
XBYTE[0x7f01]=i;
}
}
}
17.用汇编语言编写出定时扫描方式下矩阵键盘的处理程序。
答:
该程序放于定时器的中断服务程序中。
定时器每10ms中断一次,执行一次中断服务程序。
F1和F2标志位用片内RAM的50H和51H单元。
ACALLKS1
JNZLK1
MOV50H,#0;无键按下,F1的F0标志清0结束
MOV51H,#0
SJMPOUT
LK1:
CJNE50H,#1,OUT1;有键按下检查F1标志是否为1,不为1置1结束。
CJNE51H,#01,OUT;再检查F2标志是否为1,为1说明已处理按键则结束。
LK2:
MOVR2,#0FEH;扫描查询键码
MOVR4,#00H
LK4:
MOVDPTR,#7F00H
MOVA,R2
MOVX@DPTR,A
INCDPTR
INCDPTR
MOVXA,@DPTR
JBACC.0,LONE
MOVA,#00H
AJMPLKP
LONE:
JBACC.1,LTWO
MOVA,#08H
AJMPLKP
LTWO:
JBACC.2,LTHR
MOVA,#10H
AJMPLKP
LTHR:
JBACC.3,NEXT
MOVA,#18H
LKP:
ADDA,R4;求键码放累加大器A,
MOV51H,#1;F2标志置1,结束
SJMPOUT
NEXT:
INCR4
MOVA,R2
JNBACC.7,KEND
RLA
MOVR2,A
SJMPLK4
KEND:
SJMPOUT;扫描完结束
KS1:
MOVDPTR,#7F00H;检查有无按键
MOVA,#00H
MOVX@DPTR,A
INCDPTR
INCDPTR
MOVXA,@DPTR
CPLA
ANLA,#0FH
RET
OUT1:
MOV50H,#1
OUT:
18.用C语言编写出定时扫描方式下矩阵键盘的处理程序。
答:
该程序放于定时器的中断服务程序中。
定时器每10ms中断一次,执行一次中断服务程序。
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);//检测有无键按下,无返回0xff
else
{delay(200);//延时
if(checkkey()==0)return(0xff);//检测有无键按下,无返回0xff
else
{
scancode=0xfe;m=0x00;//列扫描码,行首码赋初值
for(i=0;i<8;i++)
{k=0x01;
XBYTE[0x7f00]=scancode;//送列扫描码
for(j=0;j<4;j++)
{if((XBYTE[0x7f02]&k)==0)//检测当前行是否有键按下
{codevalue=m+j;//按下,求编码
while(checkkey()!
=0);//等待键位释放
return(codevalue);//返回编码
m=m+8;//计算下一行的行首编码
}
elsek=k<<1;//行检测码左移一位
}
scancode=scancode<<1;//列扫描码左移一位,扫描下一列
}
}
}
}
19.试编制4⨯4的键盘扫描程序。
答:
设P0口低4位接行线,P2口低4位接列线。
有键按下,R2中放键代码0~F,有无键按下,R2中放无键代码FFH。
KEYSUB:
ACALLKS1;调用判断有无键按下子程序
JNZLK1;有键按下时,(A)≠0转消抖延时
AJMPNOKEY;无键按下返回
LK1:
ACALLTM6;调用10ms延时子程序
ACALLKS1;查有无键按下,若真有键按下
JNZLK2;键(A)≠0逐行扫描
NOKEY:
MOVR2,#0FFH;不是真有键按下,R2中放无键代码FFH
AJMPKEYOUT;返回
LK2:
MOVR3,#0FEH;初始行扫描字(0行)送入R3
MOVR4,#00H;初始行(0行)号送入R4
LK3:
MOVA,R3;行扫描字送至P0口
MOVP0,A
MOVA,P2;从P2口读入列状态
JBACC.0,LONE;查第0列无键按下,转查第1列
MOVA,#00H;第0列有键按下,列首键码#00H→A
AJMPLKP;转求键码
LONE:
JBACC.1,LTWO;查第1列无键按下,转查第2列
MOVA,#04H;第1列有键按下,列首键码#04H→A
AJMPLKP;转求键码
LTWO:
JBACC.2,LTHREE;查第2列无键按下,转查第3列
MOVA,#08H;第2列有键按下,列首键码#08H→A
AJMPLKP;转求键码
LTHREE:
JBACC.3,KNEXT;查第3列无键按下,转查下一行
MOVA,#0CH;第3列有键按下,列首键码#0CH→A
LKP:
ADDA,R4;求键码,键码=列首键码+行号
MOVR2,A;键码放入R2中
LK4:
ACALLKS1;等待键释放
JNZLK4;键未释放,等待
KEYOUT:
RET;键扫描结束,出口状态R2:
无键按下为FFH,有键按下为键码
KNEXT:
INCR4;准备扫描下一行,行号加1
MOVA,R3;取行扫描字送累加器A
JNBACC.3,NOKEY;判断4行扫描完否?
RLA;扫描字左移一位,变为下一行扫描字
MOVR3,A;扫描字送入R3中保存
AJMPLK3;转下一行扫描
KS1:
MOVA,#00H;全扫描字→A
MOVP0,A;全扫描字送往P0口
MOVA,P2;读入P2口行状态
CPLA;变正逻辑,以高电平表示有键按下
ANLA,#0FH;屏蔽高4位,只保留低4位列线值
RET;出口状态:
(A)≠0时有键按下
TM12ms:
MOVR7,#14H;延时10ms子程序
TM:
MOVR6,#0FFH
TM6:
DJNZR6,TM6
DJNZR7,TM
RET
20.根据图5.26,编制一个在两个数码管上显示1和2的显示程序。
答:
图见书
程序:
MOVP1,#11100001B;在第一个数码管显示1
MOVP1,#11010010B;在第二个数码管显示2
21.根据图5.27,用汇编语言或C语言编制一个在8个数码管上滚动显示1~8的程序。
答:
程序如下:
显示子程序DISPLAY见书,在字段码表最后放不显示的编码00H,显示缓冲区50H~57H;显示效果:
在第一个数码管上显示1后,第一个数码管不显示,然后在第二个数码管上显示2,依此类推,直到在第八个上显示8。
然后重复。
MOVR1,#50H
MOVR4,#08H
MOVA,#10H
LOOP:
MOV@R1,A;初始化为全部不显示。
INCR1
DJNZR4,LOOP
START:
MOVR2,#01H
MOVR4,#08H
MOVR1,#50H
LOOP2:
MOVA,R2
MOV@R1,A
MOVR5,#0FFH
LOOP1:
LCALLDISPLAY
DJNZR5,LOOP1
INCR1
INCR2
DJNZR4,LOOP2
SJMPSTART
END
22根据图5.34,用汇编语言或C语言编制程序,要求按键从左边入右边出。
答:
参考书上。