单片机原理及应用与C51程序设计(第三版)第8章作业

更新时间:2023-07-22 21:24:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

习 题

1. 什么是MCS-51单片机的最小系统?

答:所谓最小系统,是指一个真正可用的单片机的最小配置系统。对于单片机内部资源已能够满足系统需要的,可直接采用最小系统。

2. 简述半导体存储器的分类? 答:半导体存储器按读写工作方式可分为两种:只读存储器ROM(Read Only Memory)和随机读写存储器RAM(Random Access Memory)。只读存储器ROM 有MROM-掩膜型ROM, PROM-可编程ROM, EPROM-可擦除的PROM, E2PROM-电擦除的PROM, Flash Memory-快擦型存储器; 随机读写存储器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) 顺序排列编码。

2

10. 简述对矩阵键盘的扫描过程。 答:矩阵式键盘的工作过程可分为两步:第一步是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(8KB 8)芯片通过部分译码法扩展24KB程序存储器,画出硬件连接图,指明各芯片的地址空间范围。

答:使用2764(8K 8)芯片通过部分译码法扩展24KB程序存储器,须要3块。采用线译码,P2.5与第一片2764的CE相连,P2.6与第二片2764的CE相连,P2.7与第三片2764的CE相连,硬件连接如下:

3

第一片:

1100 0000 0000 0000~1101 1111 1111 1111;即C000H~DFFFH; 第二片:

1010 0000 0000 0000~1011 1111 1111 1111;即A000H~BFFFH; 第三片:

0110 0000 0000 0000~0111 1111 1111 1111;即6000H~7FFFH;

15. 使用6264(8KB 8)芯片通过全译码法扩展24KB数据存储器,画出硬件连接图,指明各芯片的地址空间范围。

答:使用6264(8K 8)芯片通过全译码法扩展24KB程序存储器,须要3块。采用138译码器译码,硬件连接如下:

地址空间如下: 第一片:

4

0000 0000 0000 0000~0001 1111 1111 1111;即0000H~1FFFH; 第二片:

0010 0000 0000 0000~0011 1111 1111 1111;即2000H~3FFFH; 第三片:

0100 0000 0000 0000~0101 1111 1111 1111;即3000H~5FFFH;

16. 试用一片74LS373扩展一个并行输入口,画出硬件连接图,指出相应的控制命令。

答:硬件电路图如下:74LS373的输入端为扩展的输入口,输出端接8051的数据总路线P0口,控制端接高电平,输出允许由片外数据存储器读信号RD和P2.0控制。当片外数据存储器读信号RD和P2.0同为低平时从74LS373中读入输入的数据。

输入数据的命令如下: MOV DPTR,#0FE00H MOVX A,@DPTR

17. 用8255A扩展并行I/O,实现把8个开关的状态通过8个二极管显示出来,画出硬件连接图,用汇编语言和C语言分别编写相应的程序。

答:硬件电路图如下:8051与8255的连接略,设8255的A,B,C和控制控口的地址为7F00H,7F01H,7F02H,7F03H。8255的A口接8个开关,B口接8个发光二极管。

5

程序如下: 汇编程序

ORG 0000H LJMP MAIN ORG 0100H

MAIN:MOV DPTR,#7F03H MOV A,#90H MOVX @DPTR,A LOOP:MOV DPTR,#7F00H MOVX A,@DPTR MOV DPTR,#7F01H MOVX @DPTR,A SJMP LOOP SJMP $ END C语言程序: #include <reg51.h> #include <absacc.h> main() {

unsigned char i;

XBYTE[0x7f03]=0x90; while(1) {

i=XBYTE[0x7f00]; XBYTE[0x7f01]=i;

6

} } }

18. 用汇编语言编写出定时扫描方式下矩阵键盘的处理程序。

该程序放于定时器的中断服务程序中。定时器每10ms中断一次,执行一次中断服务程序。F1和F2标志位用片内RAM的50H和51H单元。 ACALL KS1 JNZ LK1 MOV 50H,#0 ;无键按下,F1的F0标志清0结束 MOV 51H,#0 SJMP OUT

LK1: CJNE 50H,#1,OUT1 ;有键按下检查F1标志是否为1,不为1置1结束。 CJNE 51H,#01,OUT ;再检查F2标志是否为1,为1说明已处理按键则结束。 LK2: MOV R2,#0FEH ;扫描查询键码 MOV R4,#00H LK4: MOV DPTR,#7F00H MOV A,R2 MOVX @DPTR,A INC DPTR INC DPTR

MOVX A,@DPTR JB ACC.0,LONE MOV A,#00H AJMP LKP LONE: JB ACC.1,LTWO

MOV A,#08H

AJMP LKP LTWO:JB ACC.2,LTHR MOV A,#10H AJMP LKP LTHR: JB ACC.3,NEXT MOV A,#18H LKP: ADD A,R4 ;求键码放累加大器A, MOV 51H,#1 ;F2标志置1,结束 SJMP OUT

NEXT: INC R4 MOV A,R2 JNB ACC.7,KEND RL A MOV R2,A SJMP LK4

KEND:SJMP OUT ;扫描完结束 KS1: MOV DPTR,#7F00H ;检查有无按键 MOV A,#00H MOVX @DPTR,A INC DPTR INC DPTR

MOVX A,@DPTR CPL A ANL A,#0FH RET OUT1:MOV 50H,#1 OUT:

7

19. 用C语言编写出定时扫描方式下矩阵键盘的处理程序。

F1和F2标志已在主函数前定义。

//************检测有无键按下函数************

uchar checkkey() //检测有无键按下函数,有返回0xff,无返回0 {uchar i;

XBYTE[0x7f00]=0x00; i=XBYTE[0x7f02]; i=i&0x0f;

if (i= =0x0f) return(0); else return(0xff); }

//************键盘扫描函数************

uchar keyscan()//键盘扫描函数,如果有键按下,则返回该键的编码,如果无键按下,则返回0xff {uchar scancode; //定义列扫描码变量 uchar codevalue; //定义返回的编码变量 uchar m; //定义行首编码变量 uchar k; //定义行检测码 uchar i,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; //计算下一行的行首编码 }

else k=k<<1; //行检测码左移一位 }

scancode=scancode<<1; //列扫描码左移一位,扫描下一列 }

} } }

8

20. 根据图7.12,编制一个在两个数码管上显示1和2的显示程序。 答:程序:

MOV P1,#11100001B ;在第一个数码管显示1 MOV P1,#11010010B ;在第二个数码管显示2

21. 根据图8.27,用汇编语言编制一个在8个数码管上轮流显示1~8的程序。

答:程序如下:显示子程序DISPLAY见书,在字段码表最后放不显示的编码00H,显示缓冲区50H~57H;显示效果:在第一个数码管上显示1后,第一个数码管不显示,然后在第二个数码管上显示2,依此类推,直到在第八个上显示8。然后重复。

MOV R1,#50H MOV R4,#08H MOV A,#10H LOOP: MOV @R1,A ;初始化为全部不显示。

INC R1 DJNZ R4,LOOP START:

MOV R2,#01H MOV R4,#08H MOV R1,#50H LOOP2:

MOV A,R2 MOV @R1,A MOV R5,#0FFH LOOP1:

LCALL DISPLAY DJNZ R5,LOOP1 INC R1 INC R2

DJNZ R4,LOOP2

SJMP START END

22 根据图8.27,用C语言编制一个在8个数码管上轮流显示1~8的程序。

#include <reg51.h>

#include <absacc.h> #define uchar unsigned char

//定义绝对地址访问

#define uint unsigned int void delay(uint); void display(void); void main(void) {

uchar k,m,l;

XBYTE[0x7f03]=0x80;

//8255A初始化

//声明延时函数 //声明显示函数

//定义显示缓冲区

9

uchar disbuffer[8]={16,16,16,16,16,16,16,16};

while(1) {

for (k=0;k<8;k++) {

for (m=0;m<8;m++) {

if (m==k) disbuffer[k]=k; display(); display(); display(); display();

display(); display(); display();

}

for (l=0;l<8;l++) disbuffer[l]=16; display(); display(); display(); display(); display(); display();

display();

} } }

//************延时函数************ void delay(uint i)

{

uint j;

//设显示函数 //设显示函数 //设显示函数 //设显示函数

//设显示函数 //设显示函数

//设显示函数

//设显示函数 //设显示函数 //设显示函数 //设显示函数 //设显示函数 //设显示函数

//设显示函数

//延时函数

10

for (j=0;j<i;j++){} }

//***********显示函数*********** void display(void) {

//定义显示函数

uchar codevalue[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0~F的字段码表

uchar chocode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选码表 uchar i,p,temp; for (i=0;i<8;i++) {

temp=chocode[i]; //XBYTE[0x7f01]=temp; //p=disbuffer[i]; //temp=codevalue[p]; //XBYTE[0x7f00]=temp; //delay(20); //} }

取当前的位选码 送出位选码 取当前显示的字符 查得显示字符的字段码 送出字段码 延时1ms

本文来源:https://www.bwwdw.com/article/j5zm.html

Top