2-2 8051单片机内部包含哪些主要逻辑部件?各自的功能是什么?
答:8051单片机内部包含:
1、中央处理器CPU:它是单片机内部的核心部件,决定了单片机的主要功能特性,由运算器和控制器两大部分组成。
2、存储器:8051单片机在系统结构上采用了哈佛型,将程序和数据分别存放在两个存储器内,一个称为程序存储器,另一个为数据存储器。在物理结构上分程序存储器和数据存储器,有四个物理上相互独立的存储空间,即片内ROM和片外ROM,片内RAM和片外RAM。
3、定时器/计数器(T/C):8051单片机内有两个16位的定时器/计数器,每个T/C既可以设置成计数方式,也可以设置成定时方式,并以其定时计数结果对计算机进行控制。
4、并行I/O口:8051有四个8位并行I/O接口(P0~P3),以实现数据的并行输入输出。
5、串行口:8051单片机有一个全双工的串行口,可实现单片机和单片机或其他设备间的串行通信。
6、中断控制系统:8051共有5个中断源,非为高级和低级两个级别。它可以接收外部中断申请、定时器/计数器申请和串行口申请,常用于实时控制、故障自动处理、计算机与外设间传送数据及人机对话等。
2-3 8051单片机的存储器分哪几个空间?通过什么信号来区别不同空间的寻址?
答:有四个物理上相互独立的存储空间:片内ROM地址为0000H-0FFFH此时/EA=1;片外ROM地址为0000H-0FFFFH此时/EA=0。片内数据存储器地址为00H-0FFH;片外数据存储器地址为0000H-0FFFFH;区分片内片外数据存储器通过指令MOV与MOVX。
2-6 内部RAM低128单元划分为哪三个主要部分?各部分主要功能是什么?
答:分为三部分:工作寄存器去,位寻址区,毁州用户RAM区(堆栈、数据缓冲)。
工作寄存器区(00H-1FH):32个RAM单元共分四组,每组8个寄存单元(R0-R7)。寄存器常用于存放 *** 作数及中间结果等。位寻址区(20H-2FH):此部分16个单元的每一位都有一个8位表示的位地址,位寻址取得每一个单元既可作为一般RAM单元使用,进行字节 *** 作,也可以对单元中的每一位进行位 *** 作。用户RAM区:也是数据缓冲区,一般用于存放用户数据及作堆栈区使用。
3-1 MCS-51的寻址方式及特点
MCS-51的寻址方式有七种:
1.直接寻址:指令中直接给出 *** 作数所在的单元地址或位地址
2.立即寻址:在指令中紧跟在 *** 作码之后的字节是 *** 作数
3.寄存器寻址: *** 作数在指令中给出的寄存器内
4.寄存器间接寻址:指令中指定的寄存器内存的是 *** 作数的地址
5.变址寻址:指令中给出由基址加变址形纤竖蔽成的16位地址作为 *** 作数的地址
6.相对寻址:指令中给出相对偏移量,该相对偏移量与PC当前值求和得到转移地址
7.位寻址:指令中给出的位地址或位寄存器里存是所寻的位 *** 作数
3-2 MCS-51的指令按功能分类及各类的作用
MCS-51的指令按功能分5类:
1.数据传送指令:主要用于数据的传送与交换和栈 *** 作。 P69
2.算术运算指令:主要用纤改来作算术四则运算、增量、减量及二—十进制调整。 P76
3.逻辑运算指令:主要用来作“与”、“或”、“异或”、“清除” “求反”及“左右移位”等逻辑运算。P81
4.位 *** 作指令:主要用来作 “与”、“或”、 “清除”、“置位” “求反”等布尔 *** 作及“位传送” *** 作。 P83
5.控制转移指令:主要用于改变程序计数器PC的值, 以控制程序执行的走向,有转移、调用及返回 *** 作.P84
3-3 变址寻址和相对寻址中偏移量的异同点
变址寻址 :@A+DPTR ;基址:DPTR, 变址:A
@A+PC ;基址:PC当前值, 变址:A
变址:A 中为8位二进制无符号数偏移量(A)∈[0,255] 即[00H,0FFH]相对寻址: 相对偏移量为8位二进制带符号数的补码
rel ∈[-128,+127]
[rel]补码∈[00H,0FFH]
相同点:偏移量∈[00H,0FFH]
不同点:变址寻址 中偏移量为8位二进制无符号数相对寻址中偏移量为8位二进制带符号数的补码
3-4 指出下面每条指令的寻址方式:(源和目的 *** 作数分开写)
MOV A,#30H –寄存器、立即–30H 立即数
MOV C,30H –寄存器、位 –30H 位地址
MOVX A,@DPTR –寄存器、间接
jC LAB1 –相对
MOV 30H,@R1 –直接、间接 –30H 字节地址
MOV 30H,R5 –直接、寄存器 –30H 字节地址
MOVC A,@A+PC –寄存器、变址
sjmp LAB2 –相对
4-5在用JMP指令实现128分支的程序中,试用LJMP代替AJMP指令。修改后的程序有何特点?最多能实现多少分支?
答:AJMP指令表 128分支占128*2=256 字节MEMORY
LJMP指令表 可以实现256/3=85 个分支
特点:各分支可在64KB存储器中转移。
5-2什么叫I/O接口?I/O接口的作用是什么?
I/O接口是计算机和外设进行数据交换的桥梁。
I/O接口的作用:
锁存作用:防止由于CPU速度快,外设慢而产生的丢数现象
隔离作用:防止DB上的信息重叠
变换作用:在CPU与外设之间进行信息类型、电平、传送接收方式变换
联络作用:在CPU与外设之间进行联络,Ready Busy
5-3 I/O端口有哪两种编址方式?各有什么特点?
I/O端口编址方式:统一编址、独立编址
统一编址:I/O接口与内存储器采用一套地址,完全相存储器单元一样处理,使用访问存储器的指令。如:movx 类指令。
独立编址:采用一套与存储器不同的地址,利用/MREQ(存储器请求)和/IORQ(输入输出请求), CPU 有专门的I/O指令 如:IN, OUT 。
5-4 I/O数据有哪四种传送方式?
无条件传送方式
条件传送方式(查询方式)
中断方式
存储器直接存取(DMA)方式
5-6 结合图5-17说明DMA传送的工作过程
外设向DMAC发DMA申请
DMAC向CPU发BUSRQ
CPU发BUSAK响应
DMAC发存储器地址和读写信号
DMA控制结束,恢复CPU对总线控制
5-13 中断允许寄存器IE各位的定义是什么?请写出允许定时器/计数器T/C1溢出中断的指令。
IE.8:EA,中断允许触发器
IE.4:ES,串行口中断允许位
IE.3:ET1, 定时器/计数器1中断允许位
IE.2:EX1,外部中断1允许位
IE.1:ET0, 定时器/计数器0中断允许位
IE.0:EX0, 外部中断1允许位
允许定时器/计数器T/C1溢出中断的指令:
Setb ET1
Setb EA
Setb TR1
5-17 MCS-51的中断处理程序能否存储在64kB程序存储器的任何区域?若可以,则如何实现?
可以。
实现方法:在中断向量入口处,放一条长跳转指令,跳转到中断服务程序处。
是这样的a=3就是a指向3,然后笑拿a = 4就是a指向4,这是编译后的运行方式,和代码中的引用传递是有区别的。
区别在于,a值的改变不会影响到b的值,即使a和b是对象,b=c(c是另一个对象),a的碰升搭值也不变;但是b.d=c,那么a.d也会变成c。
你可以这样想:
值传递的变量就是指向值的指针;
而引用传递(类)就是指向一笑告组指针的指针。
实际赋值时都是指针等于指针。
您好:
你是在学习数据结构方面的知识信神吧。
首先呢,你学习栈,要了解栈的定义,明白它是怎么一回事,就是去理解他的思想。
最后才去用代码来体现出来。
栈是先进后出,其实是用代码控制的,
其实你要他先进先出也可以。
你只要明白他的原理就行。
代码,你可以理解为跟计算的一种对话的语言。
不用想的那么复杂。
就好比说话,你只要知道你要说什么就行(算法),而不用刻意明白要怎么说(语法)。
下面给我出我以前写的代码,关于栈的,顺序栈,其实还有链栈。
/* 数据结构-栈 *//* 异常的细节处理还没弄好*/
#include <iostream>
#include <stdlib.h>
#include <malloc.h>
#define len_chu_shi 50 //初始空间大小
#define len_zeng_jia 10 //额外增加空间大小
#define OK 0 //正确
#define OVER -2 //
#define ERROR -1 冲坦察 //
using namespace std
typedef int elem_type //元素类型
typedef int function_type //函数类型
typedef struct zhan
{
elem_type *top //栈顶
elem_type *base //栈底
int len //当前空间大小
}zhan //栈结构
function_type Init_zhan(zhan *exam)//初始化栈
function_type Get_top(zhan *exam,elem_type *e)//获取栈顶元素
function_type Add_top(zhan *exam,elem_type *e)//增加栈顶元素
function_type Delete_top(zhan *exam, elem_type *e)//删除栈顶元素
int main(int argc,char *argv[])
{
zhan 散茄*example = (zhan *)malloc(sizeof(zhan))
Init_zhan(example)
return OK
}
function_type Init_zhan(zhan *exam)
{
exam->base = (elem_type *)malloc(len_chu_shi*sizeof(elem_type))
if(!exam->base) //分配失败
exit(OVER)
exam->top = exam->base
exam->len = len_chu_shi
return OK
}//--end
function_type Get_top(zhan *exam,elem_type *e)
{
if(!exam->base)
exit(OVER)
*e = *(exam->top - 1) //不能用自减运算符,那样会改变栈顶指针的值
return OK
}//--end
function_type Add_top(zhan *exam,elem_type *e)
{
if(exam->len <= exam->top - exam->base) //我个人觉得,如果 已经"<",就已经数据溢出了,就应该报错
exam->base = (elem_type *)realloc(exam->base,(exam->len + len_zeng_jia)*sizeof(elem_type))
if(!exam->base) //分配失败
exit(OVER)
*(exam->top++) = *e //应该是先改变栈顶指针的内容,然后栈顶指针再自增
exam->len += len_zeng_jia
return OK
}//--end
function_type Delete_top(zhan *exam, elem_type *e)
{
if(!exam->base) //空栈
exit(OVER)
*e = *(--exam->top) //应该是栈顶指针先自减,然后获取栈顶指针的内容
return OK
}//--end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)