精华内容
下载资源
问答
  • 1作业题 8051微控制器中个中断源中断优先级中断优先级是如何控制的在出现同级中断申请时CPU按什么顺序响应按由高级到低级的顺序写出各个中断源各个中断源的入口地址是多少 答8051微控制器中个中断源...
  • 5.3.1 定时/计数器的结构和工作原理 ;...思考题及习题 180C51个中断源各中断标志是如何产生的又是如何复位的CPU响应各中断时其中断入口地址是多少 2某系统外部中断源123当某一中断源变低电平时便要求CPU
  • 8051 微控制器中个中断源中断优先级中断优先级是如何控制的在出 现同级中断申请时 CPU 按什么顺序响应 按由高级到低级的顺序写出各个中断源 各个中断源的入口地址是多少 答 8051 微控制器中个中断源两...
  • [STM32]中断的基本原理与程序解读 STM32F1xx官方资料: NVIC中断优先级管理 首先我们要先了解CM3(cortex-M3)内核的一些中断...每可屏蔽中断源可以由中断使能位所单独关闭,或者由由状态寄存器中的通用中断使能位一

    STM32F1xx官方资料:

    在这里插入图片描述

    NVIC中断优先级管理

    首先我们要先了解CM3(cortex-M3)内核的一些中断知识在这里插入图片描述

    那对于STM32F103系列的可屏蔽中断有哪些呢?可屏蔽中断又是什么意思呢?

    首先,下面就是从中文参考手册所截取下来的60个可屏蔽中断:
    在这里插入图片描述
    在这里插入图片描述
    现在我就来解释什么是可屏蔽中断:
    可屏蔽中断由有中断能力的外围设备所产生,包括处在定时模式的定时器溢出。每个可屏蔽中断源可以由中断使能位所单独关闭,或者由由状态寄存器中的通用中断使能位一齐关闭。

    对于这么多中断我们又是怎么去管理的呢?
    首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值,对于分组我们一般都是在系统初始化的时候就会将它分组好。
    分组配置是在寄存器SCB->AIRCR中配置:
    在这里插入图片描述
    这里我们能够看到AIRCR寄存器的8~10位是用来选择你的分组,例如如果你对AIRCR的8到10位配置为101,那么你就选择分组2,然后对于每一个中断都会对应有一个IP寄存器去控制。对于IP寄存器的4到7位就是去控制分配情况,去设置有多少个抢占优先级与响应优先级。如果我们选择了分组2,那么我们就有在IP[7:4]中两位是设置抢占优先级,两位是设置响应优先级。到这里我们知道了如何去设置优先级分组,之前我们提到了16级可编程中断优先级,因为在IP寄存器中我们有四个位去分配抢占优先级和响应优先级,所以我们可以得到2^4=16级可编程中断优先级。

    抢占优先级与响应优先级区别

    1.高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
    2.抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
    3.抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
    4.如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;

    由此可知在比较优先级的时候,我们先比较抢占优先级,如果抢占优先级相同时,我们才去比较响应优先级,也就是子优先级。
    举例
    假定设置中断优先级组为2,然后设置
    中断3(RTC中断)的抢占优先级为2,响应优先级为1。 中断6(外部中断0)的抢占优先级为3,响应优先级为0。中断7(外部中断1)的抢占优先级为2,响应优先级为0。
    那么这3个中断的优先级顺序为:中断7>中断3>中断6。

    下面让我们看看NVIC优先级管理在程序中是怎么实现的

    首先看NVIC优先级分组的函数
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    选择完了分组就要去具体配置抢占优先级,响应优先级和对某个中断进行使能。
    在这里插入图片描述
    在定义的NVIC_Type结构体当中定义了许多寄存器:
    IP[240]
    240个8位寄存器,每个中断使用一个寄存器来确定优先级。STM32F10x系列一共60个可屏蔽中断,使用IP[59]~IP[0]。每个IP寄存器的高4位用来设置抢占和响应优先级(根据分组),低4位没有用到。
    ISER[8]
    32位寄存器,每个位控制一个中断的使能。STM32F10x只有60个可屏蔽中断,所以只使用了其中的ISER[0]和ISER[1]。ISER[0]的bit0到bit31分别对应中断0到31。ISER[1]的bit0到27对应中断32到59;
    ICER[8]
    32位寄存器,每个位控制一个中断的失能。STM32F10x只有60个可屏蔽中断,所以只使用了其中的ICER[0]和ICER[1]。ICER[0]的bit0到bit31分别对应中断0到31。ICER[1]的bit0到27对应中断32到59;
    ISPR[8]
    是一个中断挂起控制寄存器组。每个位对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断,写 0 是无效的。
    ICPR[8]
    是一个中断解挂控制寄存器组。其作用与 ISPR 相反,对应位也和 ISER 是一样的。通过设置 1,可以将挂起的中断接挂,写 0 无效。
    IABR[8]
    是一个中断激活标志位寄存器组。对应位所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。
    在使用中需要调用的函数
    void NVIC_Init(NVIC_InitTypeDef NVIC_InitStruct)*
    其中 NVIC_InitTypeDef 是一个结构体,我们可以看看结构体的成员变量:
    typedef struct
    {
    uint8_t NVIC_IRQChannel;//定义初始化的是哪个中断
    uint8_t NVIC_IRQChannelPreemptionPriority;//定义这个中断的抢占优先级别
    uint8_t NVIC_IRQChannelSubPriority;//定义这个中断的响应优先级
    FunctionalState NVIC_IRQChannelCmd;//使能该中断
    } NVIC_InitTypeDef;

    举例:
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口 1 中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为 1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位 2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
    NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化 NVIC 寄存器

    总结

    1. 系统运行开始的时候设置中断分组。 确定组号,也就是确定抢占优先级和子优先级的
    分配位数。 调用函数为 NVIC_PriorityGroupConfig();
    2. 设置所用到的中断的中断优先级别。 对每个中断调用函数为 NVIC_Init();

    展开全文
  • 1.MCS51的中断系统个中断源?几中断优先级?中断优先级是如何控制的?在出现同级中断申请时,CPU按什么顺序响应(按由高级到低级的顺序写出各个中断源)?各个中断源的入口地址是多少?答:MCS51单片机5个中断源,2...

    1.MCS51的中断系统有几个中断源?几个中断优先级?中断优先级是如何控制的?在出现同级中断申请时,CPU按什么顺序响应(按由高级到低级的顺序写出各个中断源)?各个中断源的入口地址是多少?

    4c9028d9c892f7c504dd8384c7c30333.png

    答:MCS51单片机有5个中断源,2个中断优先级,中断优先级由特殊功能寄存器IP控制,在出现同级中断申请时,CPU按如下顺序响应各个中断源的请求:INT0、T0、INT1、T1、串口,各个中断源的入口地址分别是0003H、000BH、0013H、001BH、0023H。

    单片机是将微处理器、一定容量的 RAM 和ROM以及 I/O 口、定时器等电路集成在一块芯片上而构成的微型计算机。当CPU访问片外的存储器时,其低八位地址由 P0口提供,高八位地址由 P2口提供,8位数据由 P0口提供。在I/O口中,P0口在接LED时,必须提供上拉电阻,P3口具有第二功能。

    19、是非题:工作寄存器区不允许做普通的RAM单元来使用。F

    20、是非题:工作寄存器组是通过置位PSW中的RS0和RS1来切换的。T

    21、是非题:特殊功能寄存器可以当作普通的RAM单元来使用。F

    22、是非题:访问128个位地址用位寻址方式,访问低128字节单元用直接或间接寻址方式。T

    23、是非题:堆栈指针SP的内容可指向片内00H~7FH的任何RAM单元,系统复位后,SP初始化为00H。F

    24、数据指针DPTR是一个16位的 特殊功能寄存器 寄存器。

    25、是非题:DPTR只能当作一个16位的特殊功能寄存器来使用。F

    26、是非题:程序计数器PC是一个可以寻址的特殊功能寄存器。F

    28、当系统处于正常工作状态且振荡稳定后,在RST引脚上加一个 高 电平并维持 2 个机器周期,可将系统复位。

    29、是非题:单片机89C51复位后,其PC指针初始化为0000H,使单片机从该地址单元开始执行程序。T

    31、是非题:单片机系统上电后,其内部RAM的值是不确定的。T

    36、以下哪一条指令的写法是错误的(C)。

    A、MOV DPTR,#3F98H B、MOV R0,#0FEH C、MOV 50H,#0FC3DH D、INC R0

    37、以下哪一条指令的写法是错误的(D)。

    A、INC DPTR B、MOV R0,#0FEH C、DEC A D、PUSH A

    38、以下哪一条指令的写法是错误的(B)。

    A、MOVC A,@A+DPTR B、MOV R0,#FEH C、CPL A D、PUSH ACC

    39、是非题:在51系列单片机的指令系统中,其加法、减法、乘法和除法必须有累加器A的参与才能完成。T

    46、单片机89C51的5个中断源分别为 INT0 、INT1 、T0 、T1以及TXD/RXD 。

    47、单片机89C51的中断要用到4个特殊功能寄存器,它们是TCON、SCON、 IE 以及IP。

    48、在89C51中,外部中断由IT0(1)位来控制其两种触发方式,分别是 电平 触发方式和 边沿 触发方式。

    50、是非题:在89C51中,当产生中断响应时,所有中断请求标志位都由硬件自动清零。F

    51、中断处理过程分为3个阶段,即中断响应、中断处理以及中断返回。

    8a86fcfebac69ae1821dd26099cb855c.png

    52、简述51系列单片机中断响应的条件。

    ●有中断源发出中断请求;

    ●中断总允许位EA=1,即CPU开中断;

    ●申请中断的中断源的中断允许位为1,即中断没有屏蔽;

    ●无同级或更高级中断正在被服务;

    ●当前的指令周期已经结束;

    ●若现在指令为RETI或者是访问IE或IP指令,则该指令以及紧接着的另一条指令已执行完。

    53、是非题:在51系列单片机中,中断服务程序从矢量地址开始执行,一直到返回指令RETI为止。T

    56、是非题:在执行子程序调用或执行中断服务程序时都将产生压栈的动作。T

    65、是非题:在51系列单片机的指令中,既有带借位的减法指令,又有不带借位的减法指令。F

    69、单片机89C51具有并行 通信和串行 通信两种通信方式。

    79、单片机89C51中的串行通信共有4种方式,其中方式 0 是用作同步移位寄存器来扩展I/O口的。

    99、MCS-51 单片机的RS1,RS0=01 时,当前寄存器R0—R7 占用内部RAM(B)单元。

    A、 00H—07H B、 08H—0FH C、 10H—17H D、 18H—1FH

    101、MCS-51 单片机有片内RAM 容量( A )。

    A. 128B B、 4KB C、 8KB D、 256B

    104、在执行下列指令后,A=___60H___,R0=__45H____,(60H)=___45H___。

    MOV A,# 45H

    MOV R0,# 60H

    MOV @R0,A

    XCH A, R0

    106、设RAM 中(2456H)=66H,(2457H)=34H,ROM 中(2456H)=55H,(2457H)=64H。请分析下面程序执行后各寄存器的内容。 (A)=___64H___,(DPTR)=__2356H____。

    MOV A,#1

    MOV DPTR,#2456H

    MOVC A,@A+DPTR

    107、MCS-51 单片机的定时器/计数器工作方式0 是( C )。

    A、8 位计数器结构 B、16 位计数器结构 C、13 位计数器结构 D、2 个8 位计数器结构

    108、执行下列程序后,(A)=__35H____,(B)=__16H____。

    MOV A,#9FH

    MOV B,#36H

    ANL B,A

    SETB C

    ADDC A,B

    109、MCS-51 单片机的外部中断0 中断入口地址为( C )。

    A、 000BH B、 001BH C、0003H D、 0013H

    寻址方式

    寻址空间

    立即数寻址

    程序存储器ROM

    直接寻址

    片内RAM低128B、特殊功能寄存器

    寄存器寻址

    工作寄存器R0-R7、A、B、C、DPTR

    寄存器间接寻址

    片内RAM低128B、片外RAM

    变址寻址

    程序存储器(@A+PC,@A+DPTR)

    相对寻址

    程序存储器256B范围(PC+偏移量)

    位寻址

    片内RAM的20H-2FH字节地址、部分SFR

    1.MOV A,40H ;直接寻址 (40H)→A

    MOV R0,A ;寄存器寻址 (A)→R0

    MOV P1,#0F0H ;立即数寻址 0F0→P1

    MOV @R0,30H ;直接寻址 (30H) →(R0)

    MOV DPTR,#3848H ;立即数寻址 3848H→DPTR

    MOV 40H,38H ;直接寻址 (38H) →40H

    MOV R0,30H ;直接寻址 (30H) →R0

    MOV P0,R0 ;寄存器寻址 ( R0 )→P0

    MOV 18H,#30H ;立即数寻址 30H→18H

    MOV A,@R0 ;寄存器间接寻址 ((R0)) →A

    MOV P2,P1 ;直接寻址 (P1)→P2

    最后结果:(R0)=38H,(A)=40H,(P0)=38H,

    (P1)=(P2)=0F0H,(DPTR)=3848H,(18H)=30H,

    (30H)=38H,(38H)=40H,(40H)=40H,(48H)=38H

    2. MOV A,DATA ;直接寻址 2字节1周期

    MOV A,#DATA ;立即数寻址 2字节1周期

    MOV DATA1,DATA2 ;直接寻址 3字节2周期

    MOV 74H,#78H ;立即数寻址 3字节2周期

    2-1 MCS-51单片机内部包含哪些主要功能部件?它们的作用是什么?

    答:MCS-51单片机在一块芯片中集成了CPU、RAM、ROM、定时/计数器、多功能I/O口

    和中断控制等基本功能部件。

    单片机的核心部分是CPU,CPU是单片机的大脑和心脏。

    程序存储器用于存放编好的程序或表格常数。数据存储器用于存放中间运算结果、数据

    暂存和缓冲、标志位等。

    定时/计数器实质上是加法计数器,当它对具有固定时间间隔的内部机器周期进行计数时

    ,它是定时器;当它对外部事件进行计数时,它是计数器。

    I/O 接口的主要功能包括:缓冲与锁存数据、地址译码、信息格式转换、传递状态(外

    设状态)和发布命令等。

    中断控制可以解决 CPU 与外设之间速度匹配的问题,使单片机可以及时处理系统中许

    多随机的参数和信息,同时,它也提高了其处理故障与应变能力的能力。

    2-5 简述MCS-51单片机片内RAM区地址空间的分配特点。

    答:片内数据存储器分为工作寄存器区、位寻址区和数据缓冲器区等3个区域。 工作寄存器使用内部RAM中地址为00H~1FH的32个单元, 并分成4个工作寄存器组,每个组有8个工作寄存器,名称为R0~R7。 对于内部RAM 中地址为 20H~2FH 的 16 个单元,CPU 不仅具有字节寻址功能,而且还具有位寻址功能。这 16 个单元共 128 位,每一位都赋予 1 个位地址,位地址范围是00H~7FH。 30H~7FH是数据缓冲区,即用户RAM区,共80个单元。

    2-7 单片机复位后,各特殊功能寄存器中的初始化状态是什么?

    答: 特殊功能寄存器 初始状态 特殊功能寄存器 初始状态

    ACC 00H TMOD 00H

    PC 0000H TCON 00H

    PSW 00H TL0 00H

    SP 07H TH0 00H

    DPTR 0000H TL1 00H

    P0~P3 0FFH TH1 00H

    IP xx000000B B 00H

    IE 0x000000B SCON 00H

    PCON 0xxx0000B SBUF 不定

    2-8 MCS-51单片机的21个特殊功能寄存器中,哪些具有位寻址能力?

    答:MCS-51 单片机中的程序状态字寄存器(PSW),B 寄存器,累加器(ACC) ,端口 P0

    ~P3,控制寄存器中用于中断控制的中断优先级控制寄存器(IP)和中断允许控制寄存

    器(IE) ,用于设置定时/计数器和串行口工作方式的定时/计数器控制寄存器(TCON)

    、串行口控制寄存器(SCON)具有位寻址能力。

    2-15 什么时候需要复位操作?对复位信号有何要求?

    答:复位是单片机的初始化操作。单片机系统在上电启动运行时,都需要先复位。

    上电复位利用电容器的充电实现。在时钟电路工作后,在 RST 端连续给出 2 个机器周

    期的高电平就可完成复位操作。MCS-51 单片机的上电加按键复位电路当复位按键按下

    3-1 什么是寻址方式?MCS-51指令系统有哪些寻址方式?相应的寻址空间在何处?

    答:在指令系统中,操作数是一个重要的组成部分,它指定了参与运算的数据或数据所在的

    地址单元。如何找到参与运算的这个数据或数据所在的地址就称为寻址方式。

    MCS-51 指令系统的寻址方式主要有立即寻址、直接寻址、寄存器寻址、寄存器间接寻

    址、基址加变址寻址、相对寻址和位寻址等七种。

    对程序存储器只能采用立即寻址和基址加变址寻址方式;对特殊功能寄存器只能采用直

    接寻址方式,不能采用寄存器间接寻址,对 8032/8052 等单片机内部 RAM 的高 128 个

    字节(80H~FFH),只能采用寄存器间接寻址,不能使用直接寻址方式;对位操作指令

    只能对位寻址区操作;外部扩展的数据存储器只能用MOVX指令访问, 而内部RAM的

    低128个字节(00H~7FH)既能用直接寻址,也能用间接寻址。

    3-2 访问内部RAM单元可以采用哪些寻址方式?访问外部RAM单元可以采用哪些寻址方

    式?访问特殊功能寄存器(SFR)可以采用哪些寻址方式?

    答:对特殊功能寄存器只能采用直接寻址方式,单片机内部RAM的高128个字节 (80H~FFH

    ) ,只能采用寄存器间接寻址,外部扩展的数据存储器只能用MOVX指令访问,而内部

    RAM的低128个字节(00H~7FH)既能用直接寻址,也能用间接寻址。

    3-3 访问外部数据存储器和程序存储器可以用哪些指令来实现?举例说明。

    答:访问外部数据存储器可以用以下指令实现:

    MOVX A, @Ri ;((Ri))→A,寄存器Ri指向的片外RAM地址中的内容送到累加器A中

    MOVX @Ri, A ;A→((Ri)),累加器中内容送到寄存器Ri指向的片外RAM地址中

    MOVX A, @DPTR;((DPTR))→A,数据指针指向的片外RAM地址中的内容送到累加器A中

    MOVX @DPTR, A ; A→((DPTR)),累加器中内容送到数据指针指向的片外RAM地址中

    访问程序存储器可以用以下指令实现:

    MOVC A, @A+DPTR ;((A+DPTR))→A,表格地址单元中的内容送到累加器A中

    MOVC A, @A+PC ;PC+1→PC,((A+PC))→A,表格地址单元中的内容送到累加器A中

    3-4 试用下列3种寻址方式编程,将立即数0FH送入内部RAM的30H单元中。

    (1) 立即寻址方式;(2) 寄存器寻址方式;(3) 寄存器间接寻址方式

    答: (1)立即寻址方式: MOV 30H, #0FH

    (2)寄存器寻址方式: MOV R5, #0FH MOV 30H, R5

    (3)寄存器间接寻址方式:MOV @R1, #0FH MOV 30H, @R1

    3-6 加法和减法指令影响哪些标志位?怎么影响的?

    答:在带进位的加法运算中,会影响进位位Cy,最终要将A中的值和其后面的值以及进位

    位Cy中的值相加,最终结果存在A。

    在带进位减法指令中,要将累加器A的内容与第二操作数及进位标志相减,结果送回到

    累加器A中。在执行减法过程中,如果位7(D7)有借位,则进位标志Cy置“1”,否则

    清“0”;如果位3(D3)有借位,则辅助进位标志AC置“1”,否则清“0”;如位6有借位

    而位 7 没有借位,或位 7 有借位而位 6 没有借位,则溢出标志 OV 置“1”,否则清“0”。

    若要进行不带借位的减法操作,则必须先将Cy清“0”。

    3-8 试编写一段程序,将内部数据存储器30H、 3lH单元内容传送到外部数据存储器1000H、1001H单元中。

    答: MOV A, 30H

    MOV DPTR, #1000H

    MOV @DPTR, A

    MOV A, 31H

    MOV DPTR, #1000H

    MOV @DPTR, A

    3-9 试编写一段程序,将外部数据存储器40H单元中的内容传送到0l00H单元中。

    答: MOV DPTR, #0040H

    MOV A, @DPTR

    MOV 0100H, A

    6-2 MCS-51 单片机提供了几个中断源?有几级中断优先级别?各中断标志是如何产生的

    又如何清除这些中断标志?各中断源所对应的中断矢量地址是多少?

    答:MCS-51单片机提供了5个中断源,有2级中断优先级别。中断标志由特殊功能寄存器

    TCON和SCON的相应位锁存。

    中断标志的撤消分为:

    1)定时/计数器中断请求的撤消 中断请求被响应后,硬件会自动清TF0或TF1。

    2)外部中断请求的撤消

    (1)跳沿方式外部中断请求的撤消是自动撤消的。

    (2)电平方式外部中断请求的撤消,除了标志位清“0”之外,还需在中断响应后把中断

    请求信号引脚从低电平强制改变为高电平。

    3)串行口中断请求的撤消

    响应串行口的中断后,CPU无法知道是接收中断还是发送中断,还需测试这两个中断标

    志位的状态,以判定是接收操作还是发送操作,然后才能清除。所以串行口中断请求的

    撤消只能使用软件的方法。

    CLR TI ;清TI标志位

    CLR RI ;清RI标志位

    各中断源对应的中断矢量地址分别为:

    中断源 中断矢量

    外部中断0 0003H

    定时器T0中断 000BH

    外部中断1 0013H

    定时器T1中断 001BH

    串行口中断 0023H

    定时器中断T2(仅52系列有) 002BH

    6-4 试分析以下几种中断优先级的排列顺序(级别由高到低)是否可能?若可能,则应如何

    设置中断源的中断级别?否则,请简述不可能的理由。

    (1) 定时器T0中断,定时T1中断,外中断1NT0,外中断INT1,串行口中断;

    (2) 串行口中断,外中断1NT0,定时器T0中断,外中断INT1,定时器T1中断;

    (3) 外中断INT0、定时器T1中断,外中断INT1,定时器T0中断,串行口中断。

    (1)可以,将定时器T0中断,定时T1设置为高优先级中断,将外中断1NT0,外中断

    INT1,串行口中断

    (2)可以,将串行口中断设置为高优先级中断,将外中断 1NT0,定时器 T0 中断,外

    中断INT1,定时器T1中断设置为低优先级中断;

    (3)不行,因为 MCS-51 单片机有 2 级中断优先级别,同级中断还存在按次序决定的

    第二优先级结构,由高到低依次为外中断 1NT0、定时器 T0 中断、外中断 INT1、定时

    器T1中断、串行口中断。

    7-2 如果采用晶振的频率为 3MHz,定时/计数器工作方式 0、1、2 下,其最大的定时时间为多少?

    答:内部定时脉冲周期=机器周期=12/3Mhz=4us

    工作方式0:Tmax=8192*4us=32.768ms

    工作方式1:Tmax=65536*4us=262.144ms

    工作方式2:Tmax=256*4us=1.024ms

    7-10 定时/计数器测量某正单脉冲的宽度,采用何种方式可得到最大量程?若时钟频率为

    6MHz,求允许测量的最大脉冲宽度是多少?

    答:采用定时器工作方式1可得到最大量程,最大脉冲宽度:65536*12/6M=131.072ms

    【2—9】什么是堆栈?堆栈有哪些功能? 设计时,为什么还要对SP重新赋值?

    堆栈指针SP的作用是什么?

    【答】堆栈是在片内数据RAM区中,数据按照“先进后出”或“后进先出”原则进行管理的区域。堆栈功能有两个:保护断点和保护数据。在子程序调用和中断操作时这两个功能特别有用。在80C51单片机中,堆栈在子程序调用和中断时会把断点地址自动进栈和出栈。进栈和出栈的指令(PUSH、POP)操作可用于保护现场和恢复现场。由于子程序调用和中断都允许嵌套,并可以多级嵌套,而现场的保护也往往使用堆栈,所以一定要注意给堆栈以一定的深度,以免造成堆栈内容的破坏而引起程序执行的“跑飞”。

    堆栈指针SP在80C51中存放当前的堆栈栈顶所指存储单元地址的一个8位寄存器。80C51单片机的堆栈是向上生成的,即进栈时SP的内容是增加的;出栈时SP的内容是减少的。

    系统复位后。80C51的SP内容为07H。若不重新定义,则以07H为栈底,压栈的内容从08H单元开始存放。但工作寄存器R0~R7有4组,占有内部RAM地址为00H~1FH,位寻址区占有内部RAM地址为20H~2FH。若程序中使用了工作寄存器1~3组或位寻址区,则必须通过软件对SP的内容重新定义,使堆栈区设定在片内数据RAM区中的某一区域内(如30H),堆栈深度不能超过片内RAM空间。

    【2一13】程序存储器指令地址、堆栈地址和外接数据存储器地址各使用什么指针?为什么?

    【答】程序存储器指令地址使用程序计数器PC指针,PC中存放的是下一条将要从程序存储器中取出的指令的地址。程序计数器PC变化的轨迹决定程序的流程。PC最基本的工作方式是自动加1。在执行条件转移或无条件转移指令时,将转移的目的地址送入程序计数器,程序流向发生变化。在执行调用指令或响应中断时,将子程序的入口地址或者中断矢量地址送人PC,程序流向发生变化。 堆栈地址使用堆栈指针.SP。SP在80C51中存放当前的堆栈栈顶所指存储单元地址,是一个8位寄存器,对数据按照“先进后出”原则进行管理。外接数据存储器地址使用数据指针DPTR。DPTR是一个16位特殊功能寄存器,主要功能是作为片外数据存储器或I/0寻址用的地址寄存器,这时会产生RD或wR控制信号,用于单片机对外扩的数据存储器或I/0的控制。数据指针DPTR也可以作为访问程序存储器时的基址寄存器,此时是寻址程序存储器中的表格、常数等单元,而不是寻址指令。

    【2一19】80C51单片机的4个I/O口在使用上有哪些分工和特点?

    【答】4个I/O口的分工和特点如下:

    ① P0口是一个多功能的8位口,可按字节访问也可按位访问。

    l 用作I/0口。相当于一个真正的双向口:输出锁存,输入缓冲,但输入时须先将口置l;每根口线可以独立定义为输入或输出。

    l 用作地址/数据复用总线。作数据总线使用时,输入/输出8位数据D0~D7;作地址总 线用时,输出低8位地址AO~A7。

    ② P1口是一个8位口,可按字节访问也可按位访问,因此,P1口不仅可以8位一组进行 输入、输出操作,还可以逐位分别定义各口线为输入线或输出线。输入时有条件,即需要先输出1,将该口设为输入状态。一般作I/o口用。

    ③ P2口是一个多功能的8位口,可按字节访问也可按位访问。在单片机采用并行扩展方式时,P2口作为地址总线的高8位D8~D15。

    ④ P3口是一个多功能的8位口,可按字节访问,也按可位访问。可作为I/0口使用,为准双向口。既可以字节操作,也可以位操作;既可以8位口操作,也可以逐位定义口线为输入线或输出线。

    P3可替代输入、输出功能。

    替代输入功能:

    P3.0一一RXD,串行输入口。

    P3.2一一IN'I、0,外部中断O的请求。

    P3.3一一INTl,外部中断1的请求。

    P3.4一TO,定时器/计数器O外部计数脉冲输入。

    P3.5一一T1,定时器/计数器1外部计数脉冲输入。

    替代输出功能:

    P3.1一一TXD,串行输出口。

    P3.6一一wR,外部数据存储器写选通,输出,低电平有效。

    P3.7~RD,外部数据存储器读选通,输出,低电平有效。

    【3—4】简述80C51的指令寻址方式,并举例说明。

    【答】执行任何一条指令都需要使用操作数,寻址方式就是在指令中给出的寻找操作数或操作数所在地址的方法。

    80C5l系列单片机的指令系统中共有以下7种寻址方式。

    ①立即寻址。在指令中直接给出操作数。出现在指令中的操作数称为“立即数”,为了与直接寻址指令中的直接地址相区别,在立即数前面必须加上前缀“#”。

    例如:MOV DPTR,#1234H ;1234H为立即数,直接送DPTR

    ②直接寻址。在指令中直接给出操作数单元的地址。

    例如: MOV A,55H ;55H是操作数单元的地址,55H单元内的数据才是操作数,取出后送累加器A

    ③寄存器寻址。在指令中将指定寄存器的内容作为操作数。因此,指定了寄存器就能得

    到操作数。寄存器寻址方式中,用符号名称来表示寄存器。

    例如: INC R7 ;R7的内容为操作数,加1后再送回R7

    ④寄存器间接寻址。在指令中给出的寄存器内容是操作数的地址,从该地址中取出的才

    是操作数。可以看出,在寄存器寻址方式中,寄存器中存放的是操作数;而在寄存器间接寻址

    方式中,寄存器中存放的则是操作数的地址。

    寄存器间接寻址须以寄存器符号名称的形式表示。为了区别寄存器寻址和寄存器间接寻

    址,在寄存器间接寻址中,应在寄存器的名称前面加前缀“@”。

    例如: ORL A.@Ro; 当R0寄存器的内容是60H时,该指令功能是以RO寄存器的内容60H为地址,将60H地址单元的内容与累加器A中的数相“或”,其结果仍存放在A中。

    ⑤相对寻址。在指令中给出的操作数为程序转移的偏移量。相对寻址方式是为实现程序的相对转移而设立的,为相对转移指令所采用。

    在相对转移指令中,给出地址偏移量(在80C51系列单片机的指令系统中,以“rel”表示,为8位带符号数),把PC的当前值加上偏移量就构成了程序转移的目的地址。而PC的当前值是指执行完转移指令后的PC值,即转移指令的PC值加上转移指令的字节数。转移的目的地址可用如下公式表示:

    目的地址=(转移指令所在地址+转移指令字节数)+rel

    例如:SJMP 80H ;80H为程序转移的偏移量,即一128。当前PC值减去128后即为转移地址

    ⑥变址寻址。以DPTR或PC作基址寄存器,累加器A作变址寄存器,以两者内容相加形成的16位程序存储器地址作为操作数地址。又称“基址寄存器+变址寄存器间接寻址”。变址寻址方式只能对程序存储器进行寻址。

    例如: MOVC A,@A+DPTR ;功能是把DPTR和A的内容相加,所得到的程序存储器地址单元的内容送A

    ⑦位寻址。80C51系列单片机有位处理功能,可以对数据位进行操作,因此,就有相应的位寻址方式。位寻址的寻址范围:

    ●片内RAM中的位寻址区。

    ·可位寻址的特殊功能寄存器位。

    例如:MOV c,80H ;功能是把位寻址区的80H位(即P0.0)状态送累加位C

    【3—14】已知(30H)=40H,(40H)=10 H,(10H)=00H,(P1)=CAH,请写出执行以下程序段后有关单元的内容。

    【答】有关单元的内容如下:

    MOV R0,#30H ;(RO)=30H

    MOV A,@R0 ;(A)=40H

    MOV Rl,A ;(R1)=40H

    MOV B,@R1 ;(B)=1OH

    MOV @R1,P1 ;(40H)=CAH

    MOV A,@RO ;(A)=40H

    MOV 10H,#20H ;(10H)=20H

    MOV 30H,10H ;(30H)=20H

    执行以上程序段后,有关单元的内容分别为:(30H)=20H,(40H)=CAH,(10H)=20H,(P1)=CAH。

    【3-1】已知(A)=7AH,(RO)=30H,(30H)=A5 H,(PSW)=80H。请填写各条指令单独执行后的结果。

    【答】结果如下:

    (1) XCH A,R0 ;(A)=30H,(R0):7AH

    (2) XCH A,30H ;(A)=A5H,(30H)=7AH,(PSW)=81H

    (3) XCH A,@R0 ;(A)=R5H,(30H)=7AH,(PSW)=81H

    (4) XCHD A,@R0 ;(A)=75H,(30H)=AAH,(PSW)=81H

    (5) SWAP A ;(A)=A7H

    (6) ADD A,R0 ;(A)=AAH,(PSW)=04H

    (7) ADD A,30H ;(A)=1FH,(PSW)=81H

    (8) ADD A,#30H ;(A)=AAH,(PSW)=04H

    (9) ADDC A,30H ;(A)=20H,(PSW)=01H

    (10) SUBB A,30H ;(A)=D4H,(PSW)=84H

    (11) SUBB A,#30H ;(A)=49H,(PSW)=01H

    【3-15】已知(R1)=20 H,(20 H)=AAH,请写出执行完下列程序段后A的内容。

    【答】各指令的执行结果如下:

    MOV A,#55H ;(A)=55H

    ANL A,#0FFH ;(A)=55H

    ORL 20H,A ;(20H)=FFH

    XRL A,@R1 ;(A)=AAH

    CPL A ;(A)=55H

    执行完程序段后,A的内容为5 5 H。

    【3—17】已知两个十进制数分别在内部RAM中的40 H单元和50H单元开始存放(低位在前),其字节长度存放在内部RAM的30 H单元中。编程实现两个十进制数求和,求和结果存放在40 H开始的单元中。

    ORG 0000H

    SJMP MAIN

    ORG 0030H

    MAIN:

    MOV R0,#40H ;被加数首址.又作两个十进制数和的首址

    MOV R1,#50H ;加数首址

    MOV R2,30H ;字节长度

    CLR C

    PP: MOV A,@R1 ;取加数

    ADDC A,@R0 ;带进位加

    DA A ;二一十进制数调整

    MOV @R0,A ;存和

    INC R0 ;修正地址

    INC R1

    DJNZ R2,PP ;多字节循环加

    AJMP $

    END

    【4-17】根据8100 H单元中的值X,决定P1口引脚输出为:

    加上必要的伪指令,并对源程序加以注释。 .

    【答】程序如下:

    ORG 0000H

    SJMP BEGIN

    ORG 0030H

    BEGIN: MOV DPTR,#8100H

    MOVX A,@DPTR

    MOV R2,A

    JB ACC.7,SMALLER;有符号数<0

    SJMP UNSIGNED ;无符号数≥0

    SMALLER:DEC A ;X<0,输出-X(先减1,再取反)

    CPL A

    MOV P1,A

    SJMP OK

    UNSIGNED:CJNE A,#00H,BIGGER ;不等于0即大于0

    MOV P1,#80H ;X等于0,输出80H

    SJMP OK

    BIGGER: CLR C ;X大于0,输出A×2

    RLC A ;A×2

    MOV P1,A

    OK: SJMP $

    END

    例如:输入55 H,P1口引脚输出AAH;输入00 H,P1口引脚输出80 H;输入F1(一1 5的补码),P1口引脚输出0FH。

    【5-4】什么是单片机的中断优先级?中断优先级处理的原则是什么?

    【答】在一个单片机系统中往往允许有多个中断源,通常给每个中断源规定了优先级别,称为“优先权"或“中断优先级’’。

    当单片机同时接收到两个或多个不同优先级的中断请求时,先响应高优先级的中断。如果同时接收到的是几个同一优先级的中断请求,则由内部的硬件查询序列确定它们的优先服务次序,当服务结束后,再响应级别较低的中断源。

    在80C51单片机中有高、低两个中断优先级,通过中断优先级寄存器IP来设定。

    在80C51单片机中存在同一优先级内由内部硬件查询序列确定的第二个优先级结构。

    其排列如下:

    中断源 中断优先级

    外部中断0 最高

    定时器T0中断

    外部中断1

    定时器T1中断

    串行口中断

    定时器T2中断 最低

    【5—7】80C51单片机在什么情况下可响应中断?

    【答】中断响应是有条件的,即:

    ·中断源申请中断;

    ·该中断源已被允许中断,且CPU也已允许中断;

    ·没有同级或高优先级中断在执行中断服务程序。

    在接受中断申请时,如遇下列情况之一,硬件生成的长调用指令LCALL将被封锁:

    ①CPU正在执行同级或高一级的中断服务程序。因为当一个中断被响应时,其对应的中断优先级触发器被置1,封锁了同级和低级中断。

    ②查询中断请求的机器周期不是执行当前指令的最后一个周期。目的在于使当前指令执行完毕后,才能进行中断响应,以确保当前指令的完整执行。

    ③当前正在执行RETI指令或执行对IE、IP的读/写操作指令。80C51.中断系统的特性规定,在执行完这些指令之后,必须再继续执行一条指令,然后才能响应中断。

    【6-1】80C51单片机内部设有几个定时器/计数器?简述各种工作方式的特点。

    【答】80C51单片机内部设有2个16位定时器/计数器TO和T1。定时器/计数器有4种工作方式,其特点如下: .

    ①方式O是13位定时器/计数器。由THx高8位(作计数器)和TLx的低5位(32分频的定标器)构成,TLx的低5位溢出时,向THx进位;THx溢出时,硬件置位TFx(可用于软件查询),并可以申请定时器中断。

    ②方式1是16位定时器/计数器。TLx的低8位溢出时向THx进位,THx溢出时,硬

    件置位TFx(可用于软件查询),并可以申请定时器中断。

    ③方式2是定时常数自动重装载的8位定时器/计数器。TLx作为8位计数寄存器,

    THx作为8位计数常数寄存器。当TLx计数溢出时,一方面将TFx置位,并申请中断;另一方面将THx的内容自动重新装入TLx中,继续计数。由于重新装入不影响THx的内容,所以可以多次连续再装入。方式2对定时控制特别有用。 .

    ④方式3只适用于TO,T0被拆成两个独立的8位计数器TLO和TH0。TLO做8位计

    数器,它占用了T0的GATE、INTO、启动/停止控制位TRO、TO引脚(P3.4)以及计数溢出标志位TF0和TO的中断矢量(地址为000BH)等TH0只能做8位定时器用,因为此时的外部引脚T0已为定时器/计数器TLO所占用。这时它占用了定时器/计数器T1的启动/停止控制位TRl、计数溢出标志位TFl.及T1中断矢量(地址为001BH)。

    T0设为方式3后,定时器/计数器T1只可选方式O、1或2。由于此时计数溢出标志位TFI.及T1中断矢量(地址为001BH)已被TH0所占用,所以T1仅能作为波特率发生器或其他不用中断的地方。

    3.访问片内RAM低128字节使用哪些寻址方式?访问片内RAM高128字节使用什么寻址方式?访问SFR使用什么寻址方式?

    答: 访问片内RAM低128字节使用直接寻址,寄存器间接寻址,位寻址;访问片内RAM高128字节使用寄存器间接寻址;访问SFR使用直接寻址,位寻址。

    4.访问片外RAM使用什么寻址方式?

    答: 访问片外RAM使用寄存器间接寻址

    5.访问程序存储器使用什么寻址方式?指令跳转使用什么寻址方式?

    答: 访问程序存储器使用指令绝对寻址,指令相对寻址。指令跳转使用指令绝对寻址,指令相对寻址。

    6.分析下面指令是否正确,并说明理由。

    MOV R3,R7 错,两个操作数不能同时为工作寄存器

    MOV B,@R2 对

    DEC DPTR 错,不存在

    MOV 20H.8,F0 错,位传送指令必须用C

    PUSH DPTR

    CPL 36H 错,不存在

    MOV PC,#0800H 错,PC不能访问

    7.分析下面各组指令,区分它们的不同之处。

    MOV A,30H 与 MOV A,#30H

    前者表示:(30H)→A 后者表示:30H→A

    MOV A,R0 与 MOV A,@R0

    前者表示:(R0)→A 后者表示:((R0))→A

    MOV A,@R1 与 MOVX A,@R1

    前者表示:在片内数据存储器((R1))→A

    后者表示:在片外数据存储器((R1))→A

    MOVX A,@R0 与 MOVX A,@DPTR

    前者R0表示8位地址 后者DPTR表示16位地址

    MOVX A,@DPTR 与 MOVC A,@A+DPTR

    前者表示:((DPTR))→A 后者表示:((DPTR)+(A))→A

    8.在MCS-51单片机的片内RAM中,已知(30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H。请说明下面各是什么指令和寻址方式,以及每条指令执行后目的操作数的结果。

    MOV A,40H ;数据传送,直接寻址,(A)=48H

    MOV R0,A ;数据传送,寄存器寻址,(R0)=48H

    MOV P1,#0FH ;数据传送,立即数寻址,(P1)=0FH

    MOV @R0,30H ;数据传送,直接寻址,(48H)=38H

    MOV DPTR,#1234H ;数据传送,立即数寻址,(DPTR)=1234H

    MOV 40H,30H ;数据传送,直接寻址,(40H)=38H

    MOV R0,38H ;数据传送,直接寻址,(R0)=40H

    MOV P0,R0 ;数据传送,直接寻址,(P0)=40H

    MOV 28H,#30H ;数据传送,立即数寻址,(28H)=30H

    MOV A,@R0 ;数据传送,寄存器间接寻址,(A)=38H

    9.已知(A)=23H,(R1)=65H,(DPTR)=1FECH,片内RAM(65H)=70H, ROM(205CH)=64H。试分析下列各条指令执行后目标操作数的内容。

    MOV A,@R1 ;(A)=70H

    MOVX @DPTR,A ;(1FECH)=70H

    MOVC A,@A+DPTR ;(A)=64H

    XCHD A,@R1 ;(A)=65H

    10.已知(A)=76H,(R1)=76H,(B)=4,CY=1,片内RAM(76H)=0D0H,(80H)=6CH。试分析下列各条指令执行后目标操作数的内容和相应标志位的值。

    ADD A,@R1 ;(A)=46H,CY=1

    SUBB A,#75H ;(A)=0D0H,CY=1

    MUL AB ;(A)=40H,(B)=03H

    DIV AB ;(A)=15H,(B)=01H

    ANL 76H,#76H ;(76H)=50H

    ORL A,#0FH ;(A)=1FH

    XRL 80H,A ;(80H)=73H

    11.已知(A)=83H,(R0)=17H,(17H)=34H,试分析当执行完下面程序段后累加器A、R0、17H单元的内容。

    ANL A,#17H ;(A)=03H

    ORL 17H,A ;(17H)=37H

    XRL A,@R0 ;(A)=34H

    CPL A ;(A)=0CBH

    89b444d24e5e831e63a4e77e52b77800.png

    12.阅读下面程序段,说明该段程序的功能。

    MOV R0,#40H

    MOV R7,#10

    CLR A

    LOOP:

    MOV @R0,A

    INC A

    INC R0

    DJNZ R7,LOOP

    SJMP $

    答:把0,1,2,3……数列送到40H开始的10个单元中。

    13.阅读下面程序段,说明该段程序的功能。

    MOV R0,#40H

    MOV A,R0

    INC R0

    ADD A,@R0

    MOV 43H,A

    CLR A

    ADDC A,#0

    MOV 42H,A

    SJMP $

    答:40H加41H单元的数,结果送42H:43H

    14.阅读下面程序段,说明该段程序的功能。

    MOV A,30H

    MOV B,#5

    MUL AB

    ADD A,31H

    MOV 33H,A

    CLR A

    ADDC A,B

    MOV 32H,A

    SJMP $

    答:(30H)×5+(31H)→(32H:33H)

    22.编写程序,把片外RAM从2000H开始存放的16字节数据,传送到片内从30H开始的单元中。

    MOV DPTR,#2000H

    MOV R0,#30H

    MOV R1,#0

    NEXT:

    MOVX A,@DPTR

    MOV @R0,A

    INC DPTR

    INC R0

    INC R1

    CINE R1,#16H,NEXT

    展开全文
  • 单片机面试

    万次阅读 2017-06-23 00:57:29
    1.MCS51的中断系统个中断源?几中断优先级?中断优先级是如何控制的?在出现同级中断申请时,CPU按什么顺序响应(按由高级到低级的顺序写出各个中断源)?各个中断源的入口地址是多少? 答:MCS51单片机5...

    1.MCS51的中断系统有几个中断源?几个中断优先级?中断优先级是如何控制的?在出现同级中断申请时,CPU按什么顺序响应(按由高级到低级的顺序写出各个中断源)?各个中断源的入口地址是多少?

    答:MCS51单片机有5个中断源,2个中断优先级,中断优先级由特殊功能寄存器IP控制,在出现同级中断申请时,CPU按如下顺序响应各个中断源的请求:INT0、T0、INT1、T1、串口,各个中断源的入口地址分别是0003H、000BH、0013H、001BH、0023H。

    1、单片机是将微处理器、一定容量的 RAM 和ROM以及 I/O 口、定时器等电路集成在一块芯片上而构成的微型计算机。

    8、当CPU访问片外的存储器时,其低八位地址由 P0口提供,高八位地址由 P2口提供,8位数据由 P0口提供。

    9、在I/O口中,P0口在接LED时,必须提供上拉电阻,P3口具有第二功能。

    19、是非题:工作寄存器区不允许做普通的RAM单元来使用。F

    20、是非题:工作寄存器组是通过置位PSW中的RS0和RS1来切换的。T

    21、是非题:特殊功能寄存器可以当作普通的RAM单元来使用。F

    22、是非题:访问128个位地址用位寻址方式,访问低128字节单元用直接或间接寻址方式。T

    23、是非题:堆栈指针SP的内容可指向片内00H~7FH的任何RAM单元,系统复位后,SP初始化为00H。F

    24、数据指针DPTR是一个16位的 特殊功能寄存器 寄存器。

    25、是非题:DPTR只能当作一个16位的特殊功能寄存器来使用。F

    26、是非题:程序计数器PC是一个可以寻址的特殊功能寄存器。F

    28、当系统处于正常工作状态且振荡稳定后,在RST引脚上加一个 高 电平并维持 2 个机器周期,可将系统复位。

    29、是非题:单片机89C51复位后,其PC指针初始化为0000H,使单片机从该地址单元开始执行程序。T

    31、是非题:单片机系统上电后,其内部RAM的值是不确定的。T

    36、以下哪一条指令的写法是错误的(C)。

    A、MOV DPTR,#3F98H   B、MOV R0,#0FEH   C、MOV 50H,#0FC3DH   D、INC R0

    37、以下哪一条指令的写法是错误的(D)。

    A、INC DPTR     B、MOV R0,#0FEH     C、DEC   A     D、PUSH   A

    38、以下哪一条指令的写法是错误的(B)。

    A、MOVC A,@A+DPTR    B、MOV R0,#FEH     C、CPL   A     D、PUSH   ACC

    39、是非题:在51系列单片机的指令系统中,其加法、减法、乘法和除法必须有累加器A的参与才能完成。T

    46、单片机89C51的5个中断源分别为 INT0 、INT1 、T0 、T1以及TXD/RXD   。

    47、单片机89C51的中断要用到4个特殊功能寄存器,它们是TCON、SCON、 IE 以及IP。

    48、在89C51中,外部中断由IT0(1)位来控制其两种触发方式,分别是 电平 触发方式和  边沿 触发方式。

    50、是非题:在89C51中,当产生中断响应时,所有中断请求标志位都由硬件自动清零。F

    51、中断处理过程分为3个阶段,即中断响应、中断处理以及中断返回。

    52、简述51系列单片机中断响应的条件。

    ●有中断源发出中断请求;

    ●中断总允许位EA=1,即CPU开中断;

    ●申请中断的中断源的中断允许位为1,即中断没有屏蔽;

    ●无同级或更高级中断正在被服务;

    ●当前的指令周期已经结束;

    ●若现在指令为RETI或者是访问IE或IP指令,则该指令以及紧接着的另一条指令已执行完。

    53、是非题:在51系列单片机中,中断服务程序从矢量地址开始执行,一直到返回指令RETI为止。T

    56、是非题:在执行子程序调用或执行中断服务程序时都将产生压栈的动作。T

    65、是非题:在51系列单片机的指令中,既有带借位的减法指令,又有不带借位的减法指令。F

    69、单片机89C51具有并行 通信和串行 通信两种通信方式。

    79、单片机89C51中的串行通信共有4种方式,其中方式 0 是用作同步移位寄存器来扩展I/O口的。

    99、MCS-51 单片机的RS1,RS0=01 时,当前寄存器R0—R7 占用内部RAM(B)单元。
    A、 00H—07H   B、 08H—0FH    C、 10H—17H D、 18H—1FH

    101、MCS-51 单片机有片内RAM 容量(   A )。
       A. 128B B、 4KB   C、 8KB D、 256B

    104、在执行下列指令后,A=___60H___,R0=__45H____,(60H)=___45H___。
    MOV    A,# 45H

    MOV    R0,# 60H
    MOV    @R0,A
    XCH    A, R0

    106、设RAM 中(2456H)=66H,(2457H)=34H,ROM 中(2456H)=55H,(2457H)=64H。请分析下面程序执行后各寄存器的内容。 (A)=___64H___,(DPTR)=__2356H____。
    MOV A,#1
    MOV DPTR,#2456H
    MOVC A,@A+DPTR

    107、MCS-51 单片机的定时器/计数器工作方式0 是(    C )。
    A、8 位计数器结构 B、16 位计数器结构   C、13 位计数器结构 D、2 个8 位计数器结构
    108、执行下列程序后,(A)=__35H____,(B)=__16H____。
    MOV A,#9FH
    MOV B,#36H
    ANL    B,A
    SETB C
    ADDC A,B

    109、MCS-51 单片机的外部中断0 中断入口地址为(   C   )。
    A、 000BH B、 001BH C、0003H D、 0013H

    寻址方式

    寻址空间

    立即数寻址

    程序存储器ROM

    直接寻址

    片内RAM128B、特殊功能寄存器

    寄存器寻址

    工作寄存器R0-R7ABCDPTR

    寄存器间接寻址

    片内RAM128B、片外RAM

    变址寻址

    程序存储器(@A+PC,@A+DPTR

    相对寻址

    程序存储器256B范围(PC+偏移量)

    位寻址

    片内RAM20H-2FH字节地址、部分SFR

    1.MOV    A,40H  ;直接寻址   (40H)→A

    MOV   R0,A    ;寄存器寻址   (A)→R0

    MOV   P1,#0F0H  ;立即数寻址   0F0→P1

    MOV   @R0,30H  ;直接寻址 (30H) →(R0)

    MOV   DPTR,#3848H  ;立即数寻址   3848H→DPTR

    MOV   40H,38H    ;直接寻址 (38H) →40H

    MOV   R0,30H     ;直接寻址 (30H) →R0

    MOV   P0,R0      ;寄存器寻址   ( R0 )→P0

    MOV   18H,#30H  ;立即数寻址   30H→18H

    MOV   A,@R0    ;寄存器间接寻址 ((R0)) →A

    MOV   P2,P1     ;直接寻址 (P1)→P2

    最后结果:(R0)=38H,(A)=40H,(P0)=38H,

    P1)=(P2)=0F0H,(DPTR)=3848H,(18H)=30H,

    30H)=38H,(38H)=40H,(40H)=40H,(48H)=38H

    2. MOV A,DATA ;直接寻址 2字节1周期

    MOV A,#DATA ;立即数寻址 2字节1周期

    MOV DATA1,DATA2 ;直接寻址 3字节2周期

    MOV 74H,#78H ;立即数寻址 3字节2周期

    2-1  MCS-51单片机内部包含哪些主要功能部件?它们的作用是什么?

    答:MCS-51单片机在一块芯片中集成了CPURAMROM、定时/计数器、多功能I/O

    和中断控制等基本功能部件。

    单片机的核心部分是CPUCPU是单片机的大脑和心脏。

    程序存储器用于存放编好的程序或表格常数。数据存储器用于存放中间运算结果、数据

    暂存和缓冲、标志位等。

    定时/计数器实质上是加法计数器,当它对具有固定时间间隔的内部机器周期进行计数时

    ,它是定时器;当它对外部事件进行计数时,它是计数器。

    I/O 接口的主要功能包括:缓冲与锁存数据、地址译码、信息格式转换、传递状态(外

    设状态)和发布命令等。

    中断控制可以解决 CPU 与外设之间速度匹配的问题,使单片机可以及时处理系统中许

    多随机的参数和信息,同时,它也提高了其处理故障与应变能力的能力。

    2-5  简述MCS-51单片机片内RAM区地址空间的分配特点。

    答:片内数据存储器分为工作寄存器区、位寻址区和数据缓冲器区等3个区域。 工作寄存器使用内部RAM中地址为00H1FH32个单元, 并分成4个工作寄存器组,每个组有8个工作寄存器,名称为R0R7。 对于内部 RAM 中地址为 20H2FH 16 个单元,CPU 不仅具有字节寻址功能,而且还具有位寻址功能。这 16 个单元共 128 位,每一位都赋予 1 个位地址,位地址范围是00H7FH30H7FH是数据缓冲区,即用户RAM区,共80个单元。

    2-7  单片机复位后,各特殊功能寄存器中的初始化状态是什么?

    答: 特殊功能寄存器  初始状态  特殊功能寄存器  初始状态

         ACC  00H  TMOD  00H

         PC  0000H  TCON  00H

         PSW  00H  TL0  00H

         SP  07H  TH0  00H

         DPTR  0000H  TL1  00H

         P0~P3  0FFH  TH1  00H

         IP  xx000000B  B  00H

         IE  0x000000B  SCON  00H

         PCON  0xxx0000B  SBUF  不定

    2-8  MCS-51单片机的21个特殊功能寄存器中,哪些具有位寻址能力?

    答:MCS-51 单片机中的程序状态字寄存器(PSW),B 寄存器,累加器(ACC) ,端口 P0

    P3,控制寄存器中用于中断控制的中断优先级控制寄存器(IP)和中断允许控制寄存

    器(IE) ,用于设置定时/计数器和串行口工作方式的定时/计数器控制寄存器(TCON

    、串行口控制寄存器(SCON)具有位寻址能力。

    2-15  什么时候需要复位操作?对复位信号有何要求?

    答:复位是单片机的初始化操作。单片机系统在上电启动运行时,都需要先复位。

    上电复位利用电容器的充电实现。在时钟电路工作后,在 RST 端连续给出 2 个机器周

    期的高电平就可完成复位操作。MCS-51 单片机的上电加按键复位电路当复位按键按下

    3-1  什么是寻址方式?MCS-51指令系统有哪些寻址方式?相应的寻址空间在何处?

    答:在指令系统中,操作数是一个重要的组成部分,它指定了参与运算的数据或数据所在的

    地址单元。如何找到参与运算的这个数据或数据所在的地址就称为寻址方式。

    MCS-51 指令系统的寻址方式主要有立即寻址、直接寻址、寄存器寻址、寄存器间接寻

    址、基址加变址寻址、相对寻址和位寻址等七种。

    对程序存储器只能采用立即寻址和基址加变址寻址方式;对特殊功能寄存器只能采用直

    接寻址方式,不能采用寄存器间接寻址,对 8032/8052 等单片机内部 RAM 的高 128

    字节(80H~FFH),只能采用寄存器间接寻址,不能使用直接寻址方式;对位操作指令

    只能对位寻址区操作;外部扩展的数据存储器只能用MOVX指令访问, 而内部RAM

    128个字节(00H~7FH)既能用直接寻址,也能用间接寻址。

    3-2  访问内部RAM单元可以采用哪些寻址方式?访问外部RAM单元可以采用哪些寻址方

    式?访问特殊功能寄存器(SFR)可以采用哪些寻址方式?

    答:对特殊功能寄存器只能采用直接寻址方式,单片机内部RAM的高128个字节 (80H~FFH

    ,只能采用寄存器间接寻址,外部扩展的数据存储器只能用MOVX指令访问,而内部

    RAM的低128个字节(00H~7FH)既能用直接寻址,也能用间接寻址。

    3-3  访问外部数据存储器和程序存储器可以用哪些指令来实现?举例说明。

    答:访问外部数据存储器可以用以下指令实现:

    MOVX A, @Ri    ((Ri))A,寄存器Ri指向的片外RAM地址中的内容送到累加器A

    MOVX @Ri, A    A((Ri)),累加器中内容送到寄存器Ri指向的片外RAM地址中

    MOVX A, @DPTR;((DPTR))A,数据指针指向的片外RAM地址中的内容送到累加器A

    MOVX @DPTR, A   A((DPTR)),累加器中内容送到数据指针指向的片外RAM地址中

    访问程序存储器可以用以下指令实现:

    MOVC A, @A+DPTR   ((A+DPTR))A,表格地址单元中的内容送到累加器A

    MOVC A, @A+PC PC+1PC((A+PC))A,表格地址单元中的内容送到累加器A

    3-4  试用下列3种寻址方式编程,将立即数0FH送入内部RAM30H单元中。

    (1) 立即寻址方式;(2) 寄存器寻址方式;(3) 寄存器间接寻址方式

    答: 1)立即寻址方式:   MOV  30H, #0FH

    2)寄存器寻址方式: MOV  R5, #0FH    MOV 30H, R5

    3)寄存器间接寻址方式:MOV @R1, #0FH    MOV 30H, @R1

    3-6  加法和减法指令影响哪些标志位?怎么影响的?

    答:在带进位的加法运算中,会影响进位位Cy,最终要将A中的值和其后面的值以及进位

    Cy中的值相加,最终结果存在A

    在带进位减法指令中,要将累加器A的内容与第二操作数及进位标志相减,结果送回到

    累加器A中。在执行减法过程中,如果位7D7)有借位,则进位标志Cy置“1”,否则

    0”;如果位3D3)有借位,则辅助进位标志AC置“1”,否则清“0”;如位6有借位

    而位 7 没有借位,或位 7 有借位而位 6 没有借位,则溢出标志 OV 置“1”,否则清“0”。

    若要进行不带借位的减法操作,则必须先将Cy清“0”。

    3-8  试编写一段程序,将内部数据存储器30H3lH单元内容传送到外部数据存储器1000H1001H单元中。

    答: MOV A, 30H

    MOV DPTR, #1000H

    MOV @DPTR, A

    MOV A, 31H

    MOV DPTR, #1000H

    MOV @DPTR, A

    3-9  试编写一段程序,将外部数据存储器40H单元中的内容传送到0l00H单元中。

    答: MOV DPTR, #0040H

    MOV A, @DPTR

    MOV 0100H, A

    6-2  MCS-51 单片机提供了几个中断源?有几级中断优先级别?各中断标志是如何产生的

    又如何清除这些中断标志?各中断源所对应的中断矢量地址是多少?

    答:MCS-51单片机提供了5个中断源,有2级中断优先级别。中断标志由特殊功能寄存器

    TCONSCON的相应位锁存。  

    中断标志的撤消分为:

    1)定时/计数器中断请求的撤消 中断请求被响应后,硬件会自动清TF0TF1

    2)外部中断请求的撤消

    1)跳沿方式外部中断请求的撤消是自动撤消的。

    2)电平方式外部中断请求的撤消,除了标志位清“0”之外,还需在中断响应后把中断

    请求信号引脚从低电平强制改变为高电平。

    3)串行口中断请求的撤消

    响应串行口的中断后,CPU无法知道是接收中断还是发送中断,还需测试这两个中断标

    志位的状态,以判定是接收操作还是发送操作,然后才能清除。所以串行口中断请求的

    撤消只能使用软件的方法。

      CLR  TI  ;TI标志位

      CLR  RI  ;RI标志位

    各中断源对应的中断矢量地址分别为:

    中断源  中断矢量

    外部中断0  0003H

    定时器T0中断  000BH

    外部中断1  0013H

    定时器T1中断  001BH

    串行口中断  0023H

    定时器中断T2(仅52系列有) 002BH

    6-4 试分析以下几种中断优先级的排列顺序(级别由高到低)是否可能?若可能,则应如何

    设置中断源的中断级别?否则,请简述不可能的理由。

    (1) 定时器T0中断,定时T1中断,外中断1NT0,外中断INT1,串行口中断;

    (2) 串行口中断,外中断1NT0,定时器T0中断,外中断INT1,定时器T1中断;

    (3) 外中断INT0、定时器T1中断,外中断INT1,定时器T0中断,串行口中断。

    1)可以,将定时器T0中断,定时T1设置为高优先级中断,将外中断1NT0,外中断

    INT1,串行口中断

    2)可以,将串行口中断设置为高优先级中断,将外中断 1NT0,定时器 T0 中断,外

    中断INT1,定时器T1中断设置为低优先级中断;

    3)不行,因为 MCS-51 单片机有 2 级中断优先级别,同级中断还存在按次序决定的

    第二优先级结构,由高到低依次为外中断 1NT0、定时器 T0 中断、外中断 INT1、定时

    T1中断、串行口中断。

    7-2  如果采用晶振的频率为 3MHz,定时/计数器工作方式 012 下,其最大的定时时间为多少?

    答:内部定时脉冲周期=机器周期=12/3Mhz=4us

    工作方式0Tmax=8192*4us=32.768ms

    工作方式1Tmax=65536*4us=262.144ms

    工作方式2Tmax=256*4us=1.024ms

    7-10  定时/计数器测量某正单脉冲的宽度,采用何种方式可得到最大量程?若时钟频率为

    6MHz,求允许测量的最大脉冲宽度是多少?

    答:采用定时器工作方式1可得到最大量程,最大脉冲宽度:65536*12/6M=131.072ms

    2—9】什么是堆栈?堆栈有哪些功能? 设计时,为什么还要对SP重新赋值?

    堆栈指针SP的作用是什么?

     【答】堆栈是在片内数据RAM区中,数据按照“先进后出”或“后进先出”原则进行管理的区域。堆栈功能有两个:保护断点和保护数据。在子程序调用和中断操作时这两个功能特别有用。在80C51单片机中,堆栈在子程序调用和中断时会把断点地址自动进栈和出栈。进栈和出栈的指令(PUSH、POP)操作可用于保护现场和恢复现场。由于子程序调用和中断都允许嵌套,并可以多级嵌套,而现场的保护也往往使用堆栈,所以一定要注意给堆栈以一定的深度,以免造成堆栈内容的破坏而引起程序执行的“跑飞”。

        堆栈指针SP在80C51中存放当前的堆栈栈顶所指存储单元地址的一个8位寄存器。80C51单片机的堆栈是向上生成的,即进栈时SP的内容是增加的;出栈时SP的内容是减少的。

        系统复位后。80C51的SP内容为07H。若不重新定义,则以07H为栈底,压栈的内容从08H单元开始存放。但工作寄存器R0~R7有4组,占有内部RAM地址为00H~1FH,位寻址区占有内部RAM地址为20H~2FH。若程序中使用了工作寄存器1~3组或位寻址区,则必须通过软件对SP的内容重新定义,使堆栈区设定在片内数据RAM区中的某一区域内(如30H),堆栈深度不能超过片内RAM空间。

    2一13】程序存储器指令地址、堆栈地址和外接数据存储器地址各使用什么指针?为什么?

    【答】程序存储器指令地址使用程序计数器PC指针,PC中存放的是下一条将要从程序存储器中取出的指令的地址。程序计数器PC变化的轨迹决定程序的流程。PC最基本的工作方式是自动加1。在执行条件转移或无条件转移指令时,将转移的目的地址送入程序计数器,程序流向发生变化。在执行调用指令或响应中断时,将子程序的入口地址或者中断矢量地址送人PC,程序流向发生变化。    堆栈地址使用堆栈指针.SP。SP在80C51中存放当前的堆栈栈顶所指存储单元地址,是一个8位寄存器,对数据按照“先进后出”原则进行管理。外接数据存储器地址使用数据指针DPTR。DPTR是一个16位特殊功能寄存器,主要功能是作为片外数据存储器或I/0寻址用的地址寄存器,这时会产生RD或wR控制信号,用于单片机对外扩的数据存储器或I/0的控制。数据指针DPTR也可以作为访问程序存储器时的基址寄存器,此时是寻址程序存储器中的表格、常数等单元,而不是寻址指令。

    2一19】80C51单片机的4个I/O口在使用上有哪些分工和特点?

    【答】4个I/O口的分工和特点如下:

    ① P0口是一个多功能的8位口,可按字节访问也可按位访问。

    用作I/0口。相当于一个真正的双向口:输出锁存,输入缓冲,但输入时须先将口置l;每根口线可以独立定义为输入或输出。

    用作地址/数据复用总线。作数据总线使用时,输入/输出8位数据D0~D7;作地址总    线用时,输出低8位地址AO~A7。

     ② P1口是一个8位口,可按字节访问也可按位访问,因此,P1口不仅可以8位一组进行  输入、输出操作,还可以逐位分别定义各口线为输入线或输出线。输入时有条件,即需要先输出1,将该口设为输入状态。一般作I/o口用。

    ③ P2口是一个多功能的8位口,可按字节访问也可按位访问。在单片机采用并行扩展方式时,P2口作为地址总线的高8位D8~D15。

    ④ P3口是一个多功能的8位口,可按字节访问,也按可位访问。可作为I/0口使用,为准双向口。既可以字节操作,也可以位操作;既可以8位口操作,也可以逐位定义口线为输入线或输出线。

    P3可替代输入、输出功能。

    替代输入功能:

        P3.0一一RXD,串行输入口。

        P3.2一一IN'I、0,外部中断O的请求。

        P3.3一一INTl,外部中断1的请求。

        P3.4一TO,定时器/计数器O外部计数脉冲输入。

        P3.5一一T1,定时器/计数器1外部计数脉冲输入。

        替代输出功能:

        P3.1一一TXD,串行输出口。

        P3.6一一wR,外部数据存储器写选通,输出,低电平有效。

        P3.7~RD,外部数据存储器读选通,输出,低电平有效。

    3—4】简述80C51的指令寻址方式,并举例说明。

    【答】执行任何一条指令都需要使用操作数,寻址方式就是在指令中给出的寻找操作数或操作数所在地址的方法。

        80C5l系列单片机的指令系统中共有以下7种寻址方式。

        ①立即寻址。在指令中直接给出操作数。出现在指令中的操作数称为“立即数”,为了与直接寻址指令中的直接地址相区别,在立即数前面必须加上前缀“#”。

        例如:MOV DPTR,#1234H    ;1234H为立即数,直接送DPTR

        ②直接寻址。在指令中直接给出操作数单元的地址。

        例如:   MOV A,55H    ;55H是操作数单元的地址,55H单元内的数据才是操作数,取出后送累加器A

        ③寄存器寻址。在指令中将指定寄存器的内容作为操作数。因此,指定了寄存器就能得

    到操作数。寄存器寻址方式中,用符号名称来表示寄存器。

        例如:  INC R7    ;R7的内容为操作数,加1后再送回R7

        ④寄存器间接寻址。在指令中给出的寄存器内容是操作数的地址,从该地址中取出的才

    是操作数。可以看出,在寄存器寻址方式中,寄存器中存放的是操作数;而在寄存器间接寻址

    方式中,寄存器中存放的则是操作数的地址。

        寄存器间接寻址须以寄存器符号名称的形式表示。为了区别寄存器寻址和寄存器间接寻

    址,在寄存器间接寻址中,应在寄存器的名称前面加前缀“@”。

        例如: ORL  A.@Ro;  当R0寄存器的内容是60H时,该指令功能是以RO寄存器的内容60H为地址,将60H地址单元的内容与累加器A中的数相“或”,其结果仍存放在A中。

        ⑤相对寻址。在指令中给出的操作数为程序转移的偏移量。相对寻址方式是为实现程序的相对转移而设立的,为相对转移指令所采用。

        在相对转移指令中,给出地址偏移量(在80C51系列单片机的指令系统中,以“rel”表示,为8位带符号数),把PC的当前值加上偏移量就构成了程序转移的目的地址。而PC的当前值是指执行完转移指令后的PC值,即转移指令的PC值加上转移指令的字节数。转移的目的地址可用如下公式表示:

        目的地址=(转移指令所在地址+转移指令字节数)+rel

        例如:SJMP 80H    ;80H为程序转移的偏移量,即一128。当前PC值减去128后即为转移地址

        ⑥变址寻址。以DPTR或PC作基址寄存器,累加器A作变址寄存器,以两者内容相加形成的16位程序存储器地址作为操作数地址。又称“基址寄存器+变址寄存器间接寻址”。变址寻址方式只能对程序存储器进行寻址。

        例如: MOVC A,@A+DPTR    ;功能是把DPTR和A的内容相加,所得到的程序存储器地址单元的内容送A

        ⑦位寻址。80C51系列单片机有位处理功能,可以对数据位进行操作,因此,就有相应的位寻址方式。位寻址的寻址范围:

        ●片内RAM中的位寻址区。

        ·可位寻址的特殊功能寄存器位。

        例如:MOV c,80H    ;功能是把位寻址区的80H位(即P0.0)状态送累加位C

    3—14】已知(30H)=40H,(40H)=10 H,(10H)=00H,(P1)=CAH,请写出执行以下程序段后有关单元的内容。

     【答】有关单元的内容如下:

        MOV    R0,#30H    ;(RO)=30H

        MOV    A,@R0    ;(A)=40H

        MOV    Rl,A    ;(R1)=40H

        MOV    B,@R1    ;(B)=1OH

        MOV    @R1,P1    ;(40H)=CAH

        MOV    A,@RO    ;(A)=40H

        MOV    10H,#20H    ;(10H)=20H

        MOV    30H,10H    ;(30H)=20H

    执行以上程序段后,有关单元的内容分别为:(30H)=20H,(40H)=CAH,(10H)=20H,(P1)=CAH。

    3-1】已知(A)=7AH,(RO)=30H,(30H)=A5 H,(PSW)=80H。请填写各条指令单独执行后的结果。

    【答】结果如下:

    (1)  XCH  A,R0    ;(A)=30H,(R0):7AH

    (2)  XCH  A,30H    ;(A)=A5H,(30H)=7AH,(PSW)=81H

    (3)  XCH    A,@R0    ;(A)=R5H,(30H)=7AH,(PSW)=81H

    (4)  XCHD   A,@R0    ;(A)=75H,(30H)=AAH,(PSW)=81H

    (5)  SWAP  A    ;(A)=A7H

    (6)  ADD  A,R0    ;(A)=AAH,(PSW)=04H

    (7)  ADD  A,30H    ;(A)=1FH,(PSW)=81H

    (8)  ADD  A,#30H    ;(A)=AAH,(PSW)=04H

    (9)  ADDC  A,30H    ;(A)=20H,(PSW)=01H

    (10)  SUBB  A,30H    ;(A)=D4H,(PSW)=84H

    (11)  SUBB  A,#30H    ;(A)=49H,(PSW)=01H

    3-15】已知(R1)=20 H,(20 H)=AAH,请写出执行完下列程序段后A的内容。    

        【答】各指令的执行结果如下:

        MOV    A,#55H    ;(A)=55H

    ANL    A,#0FFH    ;(A)=55H

    ORL    20H,A    ;(20H)=FFH

    XRL    A,@R1    ;(A)=AAH

    CPL    A    ;(A)=55H

     执行完程序段后,A的内容为5 5 H。

    3—17】已知两个十进制数分别在内部RAM中的40 H单元和50H单元开始存放(低位在前),其字节长度存放在内部RAM的30 H单元中。编程实现两个十进制数求和,求和结果存放在40 H开始的单元中。

        ORG 0000H

        SJMP    MAIN

        ORG 0030H

        MAIN:

        MOV    R0,#40H    ;被加数首址.又作两个十进制数和的首址

        MOV    R1,#50H    ;加数首址

        MOV    R2,30H    ;字节长度

        CLR    C

        PP:  MOV    A,@R1    ;取加数

        ADDC    A,@R0    ;带进位加

        DA    A    ;二一十进制数调整

        MOV    @R0,A    ;存和    

        INC    R0    ;修正地址

        INC    R1

        DJNZ    R2,PP    ;多字节循环加

        AJMP    $

        END

    4-17】根据8100 H单元中的值X,决定P1口引脚输出为:

       

        加上必要的伪指令,并对源程序加以注释。    

    【答】程序如下:

        ORG 0000H

        SJMP    BEGIN

        ORG 0030H

        BEGIN:    MOV DPTR,#8100H

        MOVX    A,@DPTR

        MOV    R2,A

        JB    ACC.7,SMALLER;有符号数<0

        SJMP    UNSIGNED    ;无符号数≥0

        SMALLER:DEC    A    ;X<0,输出-X(先减1,再取反)

        CPL    A

        MOV    P1,A

        SJMP   OK

        UNSIGNED:CJNE    A,#00H,BIGGER    ;不等于0即大于0

        MOV P1,#80H    ;X等于0,输出80H

        SJMP    OK

        BIGGER:  CLR    C    ;X大于0,输出A×2

        RLC    A    ;A×2

        MOV    P1,A

        OK:    SJMP    $

            END

    例如:输入55 H,P1口引脚输出AAH;输入00 H,P1口引脚输出80 H;输入F1(一1 5的补码),P1口引脚输出0FH。

    5-4】什么是单片机的中断优先级?中断优先级处理的原则是什么?

    【答】在一个单片机系统中往往允许有多个中断源,通常给每个中断源规定了优先级别,称为“优先权"或“中断优先级’’。

        当单片机同时接收到两个或多个不同优先级的中断请求时,先响应高优先级的中断。如果同时接收到的是几个同一优先级的中断请求,则由内部的硬件查询序列确定它们的优先服务次序,当服务结束后,再响应级别较低的中断源。

        80C51单片机中有高、低两个中断优先级,通过中断优先级寄存器IP来设定。

        80C51单片机中存在同一优先级内由内部硬件查询序列确定的第二个优先级结构。

    其排列如下:

        中断源        中断优先级

        外部中断0        最高

        定时器T0中断      

    外部中断1

    定时器T1中断    

        串行口中断    

        定时器T2中断    最低

    5—7】80C51单片机在什么情况下可响应中断?

    【答】中断响应是有条件的,即:

    ·中断源申请中断;

    ·该中断源已被允许中断,且CPU也已允许中断;

    ·没有同级或高优先级中断在执行中断服务程序。

     在接受中断申请时,如遇下列情况之一,硬件生成的长调用指令LCALL将被封锁:

    ①CPU正在执行同级或高一级的中断服务程序。因为当一个中断被响应时,其对应的中断优先级触发器被置1,封锁了同级和低级中断。

    ②查询中断请求的机器周期不是执行当前指令的最后一个周期。目的在于使当前指令执行完毕后,才能进行中断响应,以确保当前指令的完整执行。

    ③当前正在执行RETI指令或执行对IE、IP的读/写操作指令。80C51.中断系统的特性规定,在执行完这些指令之后,必须再继续执行一条指令,然后才能响应中断。

    6-1】80C51单片机内部设有几个定时器/计数器?简述各种工作方式的特点。

    【答】80C51单片机内部设有2个16位定时器/计数器TO和T1。定时器/计数器有4种工作方式,其特点如下:    .

        ①方式O是13位定时器/计数器。由THx高8位(作计数器)和TLx的低5位(32分频的定标器)构成,TLx的低5位溢出时,向THx进位;THx溢出时,硬件置位TFx(可用于软件查询),并可以申请定时器中断。

        ②方式1是16位定时器/计数器。TLx的低8位溢出时向THx进位,THx溢出时,硬

    件置位TFx(可用于软件查询),并可以申请定时器中断。

        ③方式2是定时常数自动重装载的8位定时器/计数器。TLx作为8位计数寄存器,

    THx作为8位计数常数寄存器。当TLx计数溢出时,一方面将TFx置位,并申请中断;另一方面将THx的内容自动重新装入TLx中,继续计数。由于重新装入不影响THx的内容,所以可以多次连续再装入。方式2对定时控制特别有用。    .

        ④方式3只适用于TO,T0被拆成两个独立的8位计数器TLO和TH0。TLO做8位计

    数器,它占用了T0的GATE、INTO、启动/停止控制位TRO、TO引脚(P3.4)以及计数溢出标志位TF0和TO的中断矢量(地址为000BH)等TH0只能做8位定时器用,因为此时的外部引脚T0已为定时器/计数器TLO所占用。这时它占用了定时器/计数器T1的启动/停止控制位TRl、计数溢出标志位TFl.及T1中断矢量(地址为001BH)。

    T0设为方式3后,定时器/计数器T1只可选方式O、1或2。由于此时计数溢出标志位TFI.及T1中断矢量(地址为001BH)已被TH0所占用,所以T1仅能作为波特率发生器或其他不用中断的地方。

    3.访问片内RAM低128字节使用哪些寻址方式?访问片内RAM高128字节使用什么寻址方式?访问SFR使用什么寻址方式?

    访问片内RAM低128字节使用直接寻址,寄存器间接寻址,位寻址;访问片内RAM高128字节使用寄存器间接寻址;访问SFR使用直接寻址,位寻址。

    4.访问片外RAM使用什么寻址方式?

    访问片外RAM使用寄存器间接寻址

    5.访问程序存储器使用什么寻址方式?指令跳转使用什么寻址方式?

    访问程序存储器使用指令绝对寻址,指令相对寻址。指令跳转使用指令绝对寻址,指令相对寻址。

    6.分析下面指令是否正确,并说明理由。

    MOV R3,R7 错,两个操作数不能同时为工作寄存器

    MOV B,@R2 对

    DEC DPTR 错,不存在

    MOV 20H.8,F0 错,位传送指令必须用C

    PUSH DPTR

    CPL 36H 错,不存在

    MOV PC,#0800H  错,PC不能访问

    7.分析下面各组指令,区分它们的不同之处。

    MOV A,30H 与 MOV A,#30H

    前者表示:(30H)→A  后者表示:30H→A

    MOV A,R0 与 MOV A,@R0

    前者表示:(R0)→A  后者表示:((R0))→A

    MOV A,@R1 与 MOVX A,@R1

    前者表示:在片内数据存储器((R1))→A  

    后者表示:在片外数据存储器((R1))→A

    MOVX A,@R0 与 MOVX A,@DPTR

    前者R0表示8位地址  后者DPTR表示16位地址

    MOVX A,@DPTR 与 MOVC A,@A+DPTR 

    前者表示:((DPTR))→A  后者表示:((DPTR)+(A))→A

    8.在MCS-51单片机的片内RAM中,已知30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H。请说明下面各是什么指令和寻址方式,以及每条指令执行后目的操作数的结果。

    MOV A,40H ;数据传送,直接寻址,(A)=48H

    MOV R0,A ;数据传送,寄存器寻址,(R0)=48H

    MOV P1,#0FH ;数据传送,立即数寻址,(P1)=0FH

    MOV @R0,30H ;数据传送,直接寻址,(48H)=38H

    MOV DPTR,#1234H ;数据传送,立即数寻址,(DPTR)=1234H

    MOV 40H,30H ;数据传送,直接寻址,(40H)=38H

    MOV R0,38H ;数据传送,直接寻址,(R0)=40H

    MOV P0,R0 ;数据传送,直接寻址,(P0)=40H

    MOV 28H,#30H ;数据传送,立即数寻址,(28H)=30H

    MOV A,@R0  ;数据传送,寄存器间接寻址,(A)=38H

    9.已知A)=23H,(R1)=65H,(DPTR)=1FECH,片内RAM(65H)=70H, ROM(205CH)=64H。试分析下列各条指令执行后目标操作数的内容。

    MOV A,@R1 ;A)=70H

    MOVX @DPTR,A ;1FECH)=70H

    MOVC A,@A+DPTR ;A)=64H

    XCHD A,@R1  ;A)=65H

    10.已知(A)=76H,(R1)=76H,(B)=4,CY=1,片内RAM(76H)=0D0H,(80H)=6CH。试分析下列各条指令执行后目标操作数的内容和相应标志位的值。

    ADD A,@R1 ;A)=46H,CY=1

    SUBB A,#75H ;A)=0D0H,CY=1

    MUL AB ;A)=40H,(B=03H

    DIV AB ;A)=15H,(B=01H

    ANL 76H,#76H ;(76H=50H

    ORL A,#0FH ;A)=1FH

    XRL 80H,A  ;(80H=73H

    11.已知(A)=83H,(R0)=17H,(17H)=34H,试分析当执行完下面程序段后累加器A、R0、17H单元的内容。

    ANL A,#17H ;A)=03H

    ORL 17H,A ;17H=37H

    XRL A,@R0 ;A)=34H

    CPL A  ;A)=0CBH

    12.阅读下面程序段,说明该段程序的功能。

    MOV R0,#40H

    MOV R7,#10

    CLR A

    LOOP:

    MOV @R0,A

    INC A

    INC R0

    DJNZ R7,LOOP

    SJMP $ 

    :把0,1,2,3……数列送到40H开始的10个单元中。

    13.阅读下面程序段,说明该段程序的功能。

    MOV R0,#40H

    MOV A,R0

    INC R0

    ADD A,@R0

    MOV 43H,A

    CLR A

    ADDC A,#0

    MOV 42H,A

    SJMP $ 

    :40H加41H单元的数,结果送42H:43H

    14.阅读下面程序段,说明该段程序的功能。

    MOV A,30H

    MOV B,#5

    MUL AB

    ADD A,31H

    MOV 33H,A

    CLR A

    ADDC A,B

    MOV 32H,A

    SJMP $ 

    :30H)×5+(31H)→(32H:33H)

    22.编写程序,把片外RAM从2000H开始存放的16字节数据,传送到片内从30H开始的单元中。

    MOV DPTR,#2000H

    MOV R0,#30H

    MOV R1,#0

    NEXT:

    MOVX A,@DPTR

    MOV @R0,A

    INC DPTR

    INC R0

    INC R1

    CINE R1,#16H,NEXT

     

     

    展开全文
  • 0C51单片机一共有多少条指令?其寻址方式主要有几种? 答:有111条指令,寻址方式有7种(立即数寻址、直接寻址、寄存器寻址、寄存器间接寻址、基址变址寻址、相对寻址、位寻址) 2、80C51单片机有几个中断源?可分为...
  • 最近比较懒,因缺乏锻炼,加上之前上了2月的"长夜班",身体米其林化的趋势.为了阻止这种不良的发展.决定买二手自行车在家骑自行车锻炼锻炼. 但是很快发现光骑车没劲,于是出于好奇心里 做码表装上看看能骑多少...

    最近比较懒,因缺乏锻炼,加上之前上了2个月的"长夜班",身体有米其林化的趋势.为了阻止这种不良的发展.决定买个二手自行车在家骑自行车锻炼锻炼.

    但是很快发现光骑车没劲,于是出于好奇心里 做个码表装上看看能骑多少快,骑了多少路.

    废话不多说,先上实物图:
    在这里插入图片描述
    虽然样子有点丑,但是显示效果还是可以滴

    单片机用stc89c52,因为之前买了几片还没用掉,因为它只要3块多钱,因为我只要几个IO加上外部中断,定时器.
    显示用yleee的12232液晶,因为已经放了快2年了.3片只用掉一片,而且做完之后依然压箱底. 不用掉浪费.
    电源用白菜模块做单锂升压到5.2v来使用. 因为买了太多了,不用掉浪费.
    在这里插入图片描述
    电池暂时找了块yleee的太阳能移动电源中的大肚子锂聚合物电池. 当时肚子很大,电压很低.给它捅了一刀以后继续充电,身材恢复苗条,就是有点皱纹. 500ma放电能有3,400 mah容量.
    传感器用了大家都说好的干簧管,还是从中学劳技课的板子上拆下来的. 磁钢安装就尽显山寨本色了.
    在这里插入图片描述
    在这里插入图片描述
    既然画了PCB,就顺便加上了 1302, 18b20,万一没事干又想加上去了.
    在这里插入图片描述
    板子继续热转印,这次买了瓶新的三氯化铁,放在新买的电磁炉里水浴加热到80°,竟然还花了10几分钟. 期间还把三氯化铁滴到了锅子里,以后吃火锅能吃到正宗的化学锅底了. 恩.
    在这里插入图片描述
    这是之前的试做版本.

    话说制作期间,一天都没运动过,终于在第六天倒下了,去医院把我全新的医保卡上写上了历史性的一页,而配的药的纸壳,就成了这次的山寨码表暂时蜗居的地方.

    刚才完成基本功能,发现我的破车骑在20km/h已经很吃力了. 全力只能跑到30km/h. 看来也就这水平了.
    在这里插入图片描述
    为了看得清, 用了四倍字体大小. 很给力.
    在这里插入图片描述
    界面就改成这样了. 显示这些东西也够看了
    按第一个键保存总行程. 第三个键背光开关. 开机时摁住第一第二键 总行程清零.

    自行车山寨码表 参考源代码

    #include “12232.h”

    #define A0_0() LCD_A0 = 0
    #define A0_1() LCD_A0 = 1
    #define E1_0() LCD_E1 = 0
    #define E1_1() LCD_E1 = 1
    #define E2_0() LCD_E2 = 0
    #define E2_1() LCD_E2 = 1

    #define LCD_DISPLAYON 0xaf //af 开显示
    #define LCD_DISPLAYOFF 0xae //ae 关显示
    #define LCD_DRIVERON 0xa5 //a5 静态显示驱动
    #define LCD_DRIVEROFF 0xa4 //a4 正常驱动
    #define LCD_DUTY16 0xa8 //占空比1/16
    #define LCD_DUTY32 0xa9 //占空比1/32

    #define LCD_END 0xee
    /关闭“读-修改-写”模式,并把列地址指针
    恢复到打开“读-修改-写”模式前的位置。
    /

    #define LCD_RESET 0xe2
    /初始化。① 设置显示初始行为第一行;
    ②页地址设置为第三页。
    /

    #define LCD_RWMODE 0xe0
    /*“读-修改-写”模式 。执行该指令以后,
    每执行一次写数据,指令列地址自动加1;
    但执行读数据指令时列地址不会改变。
    这个状态一直持续到执行“END”指令。
    注意:在“读-修改-写”模式下,
    除列地址设置指令之外,其他指令照常执行。 */

    #define LCD_STARTLINE0 0xc0 //设置显示起始行 可以加0-31
    #define LCD_PAGE0 0xb8 //页地址设置 可以加0-3
    #define LCD_COLUMNADDR0 0x00 //列地址设置 可以加0-60

    #define LCD_ON() LCD_Command(LCD_DISPLAYON)
    #define LCD_OFF() LCD_Command(LCD_DISPLAYOFF)
    #define LCD_StaticON() LCD_Command(LCD_DRIVERON)
    #define LCD_StaticOFF() LCD_Command(LCD_DRIVEROFF)
    #define LCD_Select16() LCD_Command(LCD_DUTY16)
    #define LCD_Select32() LCD_Command(LCD_DUTY32)
    #define LCD_StartRW() LCD_Command(LCD_RWMODE)
    #define LCD_EndRW() LCD_Command(LCD_END)
    #define LCD_Reset() LCD_Command(LCD_RESET)
    #define LCD_SetStartLine(i) LCD_Command(LCD_STARTLINE0|i)
    #define LCD_SetPage(i) LCD_Command(LCD_PAGE0|i)
    #define LCD_SetColumn(i) LCD_Command(LCD_COLUMNADDR0|i)

    unsigned char code ascii[][6]={
    {0x00,0x00,0x00,0x00,0x00,0x00},/0 SPACE/
    {0x00,0x00,0x00,0x4f,0x00,0x00},/1 !/
    {0x00,0x00,0x00,0x07,0x00,0x07},/2 "/
    {0x00,0x14,0x7f,0x14,0x7f,0x14},/3 #/
    {0x00,0x24,0x2a,0x7f,0x2a,0x12},/4 $/
    {0x00,0x23,0x13,0x08,0x62,0x61},/5 %/
    {0x00,0x36,0x49,0x55,0x22,0x50},/6 &/
    {0x00,0x00,0x00,0x05,0x03,0x00},/7 '/
    {0x00,0x00,0x1c,0x22,0x41,0x00},/8 (/
    {0x00,0x00,0x41,0x22,0x1c,0x00},/9 )/
    {0x00,0x14,0x08,0x3e,0x08,0x14},/*10 **/
    {0x00,0x08,0x08,0x3e,0x08,0x08},/11 +/
    {0x00,0x00,0x00,0x28,0x18,0x00},/12 ,/
    {0x00,0x08,0x08,0x08,0x08,0x08},/13 -/
    {0x00,0x00,0x00,0x60,0x60,0x00},/14 ./
    {0x00,0x20,0x10,0x08,0x04,0x02},/15 //
    {0x00,0x3e,0x51,0x49,0x45,0x3e},/16 0/
    {0x00,0x00,0x42,0x7f,0x40,0x40},/17 1/
    {0x00,0x62,0x51,0x51,0x49,0x46},/18 2/
    {0x00,0x21,0x41,0x45,0x4b,0x31},/19 3/
    {0x00,0x18,0x14,0x12,0x7f,0x10},/20 4/
    {0x00,0x27,0x45,0x45,0x45,0x39},/21 5/
    {0x00,0x3c,0x4a,0x49,0x49,0x30},/22 6/
    {0x00,0x01,0x71,0x09,0x05,0x03},/23 7/
    {0x00,0x36,0x49,0x49,0x49,0x36},/24 8/
    {0x00,0x06,0x49,0x49,0x29,0x1e},/25 9/
    {0x00,0x00,0x36,0x36,0x00,0x00},/26 :/
    {0x00,0x00,0x56,0x36,0x00,0x00},/27 ;/
    {0x00,0x08,0x14,0x22,0x41,0x00},/28 </
    {0x00,0x14,0x14,0x14,0x14,0x14},/29 =/
    {0x00,0x00,0x41,0x22,0x14,0x08},/30 >/
    {0x00,0x02,0x01,0x51,0x09,0x06},/31 ?/
    {0x00,0x3e,0x59,0x55,0x79,0x3e},/32 @/
    {0x00,0x7e,0x21,0x21,0x21,0x7e},/33 A/
    {0x00,0x7f,0x49,0x49,0x49,0x36},/34 B/
    {0x00,0x3e,0x41,0x41,0x41,0x22},/35 C/
    {0x00,0x7f,0x41,0x41,0x22,0x1c},/36 D/
    {0x00,0x7f,0x49,0x49,0x49,0x49},/37 E/
    {0x00,0x7f,0x09,0x09,0x09,0x01},/38 F/
    {0x00,0x3e,0x41,0x49,0x49,0x7a},/39 G/
    {0x00,0x7f,0x08,0x08,0x08,0x7f},/40 H/
    {0x00,0x41,0x7f,0x41,0x00,0x00},/41 I/
    {0x00,0x20,0x40,0x41,0x3f,0x01},/42 J/
    {0x00,0x7f,0x08,0x14,0x22,0x41},/43 K/
    {0x00,0x7f,0x40,0x40,0x40,0x40},/44 L/
    {0x00,0x7f,0x02,0x0c,0x02,0x7f},/45 M/
    {0x00,0x7f,0x04,0x08,0x10,0x7f},/46 N/
    {0x00,0x3e,0x41,0x41,0x41,0x3e},/47 O/
    {0x00,0x7f,0x09,0x09,0x09,0x06},/48 P/
    {0x00,0x3E,0x41,0x51,0x21,0x5E},/49 Q/
    {0x00,0x7f,0x09,0x19,0x29,0x46},/50 R/
    {0x00,0x46,0x49,0x49,0x49,0x31},/51 S/
    {0x00,0x01,0x01,0x7f,0x01,0x01},/52 T/
    {0x00,0x3f,0x40,0x40,0x40,0x3f},/53 U/
    {0x00,0x1f,0x20,0x40,0x20,0x1f},/54 V/
    {0x00,0x3f,0x40,0x38,0x40,0x3f},/55 W/
    {0x00,0x63,0x14,0x08,0x14,0x63},/56 X/
    {0x00,0x07,0x08,0x70,0x08,0x07},/57 Y/
    {0x00,0x61,0x51,0x49,0x45,0x43},/58 Z/
    {0x00,0x00,0x7f,0x41,0x41,0x00},/59 [/
    {0x00,0x01,0x02,0x08,0x10,0x20},/*50 */
    {0x00,0x00,0x41,0x41,0x7f,0x00},/61 ]/
    {0x00,0x04,0x02,0x01,0x02,0x04},/62 ^/
    {0x00,0x40,0x40,0x40,0x40,0x40},/63 _/
    {0x00,0x00,0x01,0x02,0x04,0x00},/64 `/
    {0x00,0x20,0x54,0x54,0x54,0x7c},/65 a/
    {0x00,0x7f,0x48,0x44,0x44,0x38},/66 b/
    {0x00,0x38,0x44,0x44,0x44,0x20},/67 c/
    {0x00,0x38,0x44,0x44,0x48,0x7f},/68 d/
    {0x00,0x38,0x54,0x54,0x54,0x18},/69 e/
    {0x00,0x08,0x7e,0x09,0x01,0x02},/70 f/
    {0x00,0x0c,0x52,0x52,0x52,0x3e},/71 g/
    {0x00,0x7f,0x08,0x04,0x04,0x78},/72 h/
    {0x00,0x00,0x44,0x7d,0x40,0x00},/73 i/
    {0x00,0x40,0x40,0x44,0x3d,0x00},/74 j/
    {0x00,0x7f,0x10,0x28,0x44,0x00},/75 k/
    {0x00,0x00,0x41,0x7e,0x40,0x00},/76 l/
    {0x00,0x7c,0x04,0x18,0x04,0x78},/77 m/
    {0x00,0x7c,0x08,0x04,0x04,0x78},/78 n/
    {0x00,0x38,0x44,0x44,0x44,0x38},/79 o/
    {0x00,0x7c,0x14,0x14,0x14,0x08},/80 p/
    {0x00,0x08,0x14,0x14,0x14,0x7c},/81 q/
    {0x00,0x7c,0x08,0x04,0x04,0x08},/82 r/
    {0x00,0x48,0x54,0x54,0x54,0x20},/83 s/
    {0x00,0x04,0x3f,0x44,0x44,0x24},/84 t/
    {0x00,0x3c,0x40,0x40,0x20,0x7c},/85 u/
    {0x00,0x1c,0x20,0x40,0x20,0x1c},/86 v/
    {0x00,0x3c,0x40,0x30,0x40,0x3c},/87 w/
    {0x00,0x44,0x28,0x10,0x28,0x44},/88 x/
    {0x00,0x06,0x48,0x48,0x48,0x3e},/89 y/
    {0x00,0x44,0x64,0x54,0x4c,0x44},/80 z/
    {0x00,0x00,0x08,0x36,0x41,0x00},/91 {/
    {0x00,0x00,0x00,0x7e,0x00,0x00},/92 |/
    {0x00,0x00,0x41,0x36,0x08,0x00},/93 }/
    {0x00,0x04,0x08,0x04,0x08,0x04},/94 ~/
    {0x10,0x20,0x40,0x20,0x10,0x08},//95对号一半
    {0x04,0x02,0x00,0x00,0x00,0x00},//96对号一半

    };

    unsigned char target1,target2,target3,target4;

    /******************************************************************************************

    • 函数名称 :LCD_Command
    • 功能描述 :写命令
    • 参数 : 参数名称: 输入/输出? 类型 描述
    • 返回值 :
    • 作者 :
    • 创建日期 :2018-12-19
    • 全局变量 :
    • 全局静态变量:
    • 局部静态变量:
      *----------------------------------------修改历史------------------------------------------
    • 当前版本 : 修改人: 修改日期:
    • 修改说明 :
      /
      void LCD_Command(unsigned char nCommand)
      {
      A0_0();
      // asm(“nop”);
      // asm(“nop”);
      E1_1();
      E2_1();
      // asm(“nop”);
      // asm(“nop”);
      DATA=nCommand;
      // asm(“nop”);
      // asm(“nop”);
      E1_0();
      E2_0();
      }
      /
    • 函数名称 :LCD_SetRam
    • 功能描述 :送显示数据ndata,setMS为0主,1从
    • 参数 : 参数名称: 输入/输出? 类型 描述
    • 返回值 :
    • 作者 :
    • 创建日期 :2018-12-19
    • 全局变量 :
    • 全局静态变量:
    • 局部静态变量:
      *----------------------------------------修改历史------------------------------------------
    • 当前版本 : 修改人: 修改日期:
    • 修改说明 :
      /
      void LCD_SetRam(unsigned char ChipSelect,unsigned char ndata)
      {
      A0_1();
      // asm(“nop”);
      // asm(“nop”);
      if( ChipSelect )
      {
      E1_0();
      E2_1(); //选择左半屏
      }
      else
      {
      E1_1(); //选择右半屏
      E2_0();
      }
      // asm(“nop”);
      // asm(“nop”);
      DATA=ndata;
      // asm(“nop”);
      // asm(“nop”);
      E1_0();
      E2_0();
      }
      /
    • 函数名称 :LCD_Init
    • 功能描述 :
    • 参数 : 参数名称: 输入/输出? 类型 描述
    • 返回值 :
    • 作者 :
    • 创建日期 :2018-12-19
    • 全局变量 :
    • 全局静态变量:
    • 局部静态变量:
      *----------------------------------------修改历史------------------------------------------
    • 当前版本 : 修改人: 修改日期:
    • 修改说明 :
      ******************************************************************************************/
      void LCD_init(void)
      {
      LCD_OFF(); //关闭显示
      LCD_Command(LCD_RESET); //复位
      LCD_Command(0xa0); //列与段驱动反方向
      LCD_Command(LCD_DUTY32); //1/32
      LCD_Command(0xa4); //关闭静态显示 打开正常驱动
      LCD_EndRW(); //关闭自动列加1
      LCD_SetStartLine(0); //设置起始行
      LCD_SetColumn(0); //起始列
      LCD_SetPage(0); //起始页
      LCD_ON(); //开显示
      }

    /******************************************************************************************

    • 函数名称 :clrscr

    • 功能描述 :清屏

    • 参数 : 参数名称: 输入/输出? 类型 描述

    • 返回值 :

    • 作者 :

    • 创建日期 :2018-12-19

    • 全局变量 :

    • 全局静态变量:

    • 局部静态变量:
      *----------------------------------------修改历史------------------------------------------

    • 当前版本 : 修改人: 修改日期:

    • 修改说明 :
      /
      void clrscr(unsigned char hdata)
      {
      unsigned char i;
      unsigned char page;
      for(page=0;page<4;page++)
      {
      LCD_SetPage(page);
      for(i=0;i<61;i++)
      {
      LCD_SetColumn(i);
      LCD_SetRam(0,hdata);
      LCD_SetRam(1,hdata);
      }
      }
      }
      /

    • 函数名称 :drawword

    • 功能描述 ://layer 值为0,2;wenzi 码表中的几个字

    • 参数 : 参数名称: 输入/输出? 类型 描述

    • 返回值 :

    • 作者 :

    • 创建日期 :2018-12-19

    • 全局变量 :

    • 全局静态变量:

    • 局部静态变量:
      *----------------------------------------修改历史------------------------------------------

    • 当前版本 : 修改人: 修改日期:

    • 修改说明 :
      *****************************************************************************************/
      /

      void drawword(unsigned char liedizhi,unsigned char layer,unsigned char *buff)
      {
      unsigned char column,i;//layer 值为0,2;wenzi 码表中的几个字
      unsigned char cs;
      for(i=0;i<16;i++)
      {
      column=liedizhi+i;
      if(column>60)
      {
      cs=1;
      column-=61;
      }
      else
      cs=0;

      //LCD_SetStartLine(0);//设置起始行
      LCD_SetColumn(column);//设置起始列
      LCD_SetPage(layer);
      LCD_SetRam(cs,(buff+i));
      //LCD_SetStartLine(0);//设置起始行
      LCD_SetColumn(column);//设置起始列
      LCD_SetPage(layer+1);
      LCD_SetRam(cs,
      (buff+16+i));
      }
      }
      */

    void drawascii(unsigned char liedizhi,unsigned char layer,unsigned char *text)
    {
    unsigned char column,i;//layer 值为0,2;wenzi 码表中的几个字
    unsigned char cs;

    while(*text)
    {
    for(i=0;i<6;i++)
    {
    column=liedizhi+i;
    if(column>60)
    {
    cs=1;
    column-=61;
    }
    else cs=0;

    //LCD_SetStartLine(0);//设置起始行
    LCD_SetColumn(column);//设置起始列
    LCD_SetPage(layer);
    LCD_SetRam(cs,ascii[*text-32][i]);
    }
    text++;
    liedizhi+=6;
    }
    }

    void make_ascii_big(unsigned char c)
    {
    target1 = 0;
    target2 = 0;

    if((c&0x80) != 0)
    {
    target1 += 192;
    }
    if((c&0x40) != 0)
    {
    target1 += 48;
    }
    if((c&0x20) != 0)
    {
    target1 += 12;
    }
    if((c&0x10) != 0)
    {
    target1 += 3;
    }

    if((c&0x08) != 0)
    {
    target2 += 192;
    }
    if((c&0x04) != 0)
    {
    target2 += 48;
    }
    if((c&0x02) != 0)
    {
    target2 += 12;
    }
    if((c&0x01) != 0)
    {
    target2 += 3;
    }
    }

    void make_ascii_very_big(unsigned char c)
    {
    target1 = 0;
    target2 = 0;
    target3 = 0;
    target4 = 0;

    if((c&0x80) != 0)
    {
    target1 += 240;
    }
    if((c&0x40) != 0)
    {
    target1 += 15;
    }
    if((c&0x20) != 0)
    {
    target2 += 240;
    }
    if((c&0x10) != 0)
    {
    target2 += 15;
    }

    if((c&0x08) != 0)
    {
    target3 += 240;
    }
    if((c&0x04) != 0)
    {
    target3 += 15;
    }
    if((c&0x02) != 0)
    {
    target4 += 240;
    }
    if((c&0x01) != 0)
    {
    target4 += 15;
    }
    }

    void draw_big_ascii(unsigned char liedizhi,unsigned char layer,unsigned char *text)
    {
    unsigned char column,i;
    unsigned char cs;

    while(*text)
    {
    for(i=0;i<6;i++)
    {
    column=liedizhi+i+i;
    if(column>60)
    {
    cs=1;
    column-=61;
    }
    else cs=0;

    make_ascii_big(ascii[*text-32][i]);

    LCD_SetColumn(column);//设置起始列
    LCD_SetPage(layer);
    LCD_SetRam(cs,target2);

    LCD_SetColumn(column);//设置起始列LCD_SetPage(layer+1);
    LCD_SetRam(cs,target1);

    LCD_SetColumn(column+1);//设置起始列
    LCD_SetPage(layer);
    LCD_SetRam(cs,target2);

    LCD_SetColumn(column+1);//设置起始列
    LCD_SetPage(layer+1);
    LCD_SetRam(cs,target1);
    }
    text++;
    liedizhi+=12;
    }
    }

    void draw_very_big_ascii(unsigned char liedizhi,unsigned char *text)
    {
    unsigned char column,i,j;
    unsigned char cs;

    while(*text)
    {
    for(i=0;i<6;i++)
    {
    column=liedizhi+i+i+i+i;

    make_ascii_very_big(ascii[*text-32][i]);

    for(j=0;j<4;j++)
    {
    column=liedizhi+i+i+i+i;
    if(column+j>60)
    {
    cs=1;
    column-=61;
    }
    else cs=0;

    LCD_SetColumn(column+j);
    LCD_SetPage(0);
    LCD_SetRam(cs,target4);

    LCD_SetColumn(column+j);
    LCD_SetPage(1);
    LCD_SetRam(cs,target3);

    LCD_SetColumn(column+j);
    LCD_SetPage(2);
    LCD_SetRam(cs,target2);

    LCD_SetColumn(column+j);
    LCD_SetPage(3);
    LCD_SetRam(cs,target1);
    }
    }
    text++;
    liedizhi+=24;
    }
    }
    鉴于篇幅限制,只能写部分内容

    最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,
    如果需要 程序完整源代码和 设计文件,请在下方留言或者私信我,看到后会第一时间回复。

    谢谢!

    展开全文
  • 我们许多代码公开的操作系统,可供随时下载和阅读,看上去好像让实现一供自己把玩的微型操作系统变得容易很多,但事实往往不尽人意,因为这些代码动辄上万甚至几十几百万行,而且细节之间经常互相关联,要...
  • 我们许多代码公开的操作系统,可供随时下载和阅读,看上去好像让实现一供自己把玩的微型操作系统变得容易很多,但事实往往不尽人意,因为这些代码动辄上万甚至几十几百万行,而且细节之间经常互相关联,要...
  • 第一章 18051 单片机由哪几部分组成 8 位中央处理器 CPU 片内振荡电器及其时钟电路 4 个 8 位并行 I...28051 单片机有多少个特殊功能寄存器它们可以分为几组各完成什么主要功能 P7 1-3 表 答 8051 单片机内部有 21 个特
  • 6.23 sizeof返回的大小是以字节计算的,怎样才能判断数组中有多少个元素呢? 第7章 内存分配 基本的内存分配问题 7.1 为什么这段代码不行?char*answer;printf("Typesomething:\n");gets(answer);printf(...
  • DMA直接存储器访问

    千次阅读 2016-12-01 17:55:11
    3.在完成一外设中断触发信号后,DMA会主动发出清除信号给中断源,这样后续中断响应, 注:可以通过外设中断清除位,清除挂起的DMA触发。 4.DMA双环嵌套 1)内环,1脉冲传递多少字(burst_size)
  • 《你必须知道的495C语言问题》

    热门讨论 2010-03-20 16:41:18
    然后又使用一些内存分配技巧使namestr数组用起来好像元素,namelen记录了元素数。它是怎样工作的?这样是合法的和可移植的吗? 23  2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1却明确...
  • 然后又使用一些内存分配技巧使namestr数组用起来好像元素,namelen记录了元素数。它是怎样工作的?这样是合法的和可移植的吗? 23  2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1却明确...
  • 你必须知道的495C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    来好像元素。这样合法和可移植吗? . . . . . . . . . . . . 8 2.7 是否自动比较结构的方法? . . . . . . . . . . . . . . . . . . . . 8 2.8 如何向接受结构参数的函数传入常数值? . . . . . . . . . . ....
  • 然后又使用一些内存分配技巧使namestr数组用起来好像元素,namelen记录了元素数。它是怎样工作的?这样是合法的和可移植的吗? 2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1却明确说明不...
  • (3) 该机允许使用多少个可编址的通用寄存器,多少变址寄存器?(3分) (4) 设计该机的两种指令格式,标出各字段位数并给出操作编码。(3分) 三、(12分)假设在一个采用组织相联映像方式的Cache中,主存B0~...
  • 又发现了个关于51比较好玩的...对于频率我的第一想法就是一秒钟能有多少个波形,按百度上的说法是单位时间内完成周期性变化的次数,不管咋说,意思差不多。我最开始的想法是一个定时/计数器定时,然后用外部中断下降沿
  • 单片机基础答案李广弟外部中断的...其中atmega328p的转换精度为______,数值范围为________8051单片机有多少个中断请求?串口通信时波特率的含义为:,其单位为:使用arduino实现点亮led时,代码中出现的语句“d...
  • 答:80386响应中断后,接收由中断源提供的类型码并将其乘8,与IDTR寄存器中基地址相加,指出中断描述符的位置,读出中断描述符,依其中的段选择符及条件决定从两描述符表LDT或GDT中的一得到段描述符,形成中断...
  • 10.某中断系统中,每抽取一输入数据就要中断CPU一次,中断处理程序接收取样的数 据,并将其保存到主存缓冲区内。该中断处理需要X秒。另一方面,缓冲区内每存储 N 数据,主程序就将其取出进行处理,这种处理...
  • 频率计的基本原理是用一频率稳定度高的频率作为基准时钟,对比测 量其他信号的频率。通常情况下计算每秒内待测信号的脉冲数,此时我们称 闸门时间为1 秒。闸门时间也可以大于或小于一秒。闸门时间越长,得到的...
  • 一般来说同步反映了进程之间的协作性质,往往指进程共同完成一任务时在时间次序上的某种限制,进程相互之间各自的存在及作用,通过交换信息完成通信。如接力比赛中一组队员使用接力棒等。 进程互斥...
  • 2. 下面的数据项设置了多少个字节? (1)ASC_DATA DB ‘1234’ (2)HEX_DATA DW 1234H (3)DATA_1 DB 6 DUP(4 DUP(0FFH)) 3. 在8086中,逻辑地址、偏移地址、物理地址分别指的是什么?具体说明...
  • 与各中断源的中断级别相比较,CPU(或主程序)的级别最高。 三.填空题:(每空1分,共20分) 1.在一8位二进制的机器中,补码表示的整数范围是从 (小)到 (大)。这两数在机器字中的补码表示为 (小)到 (大)。数0...
  • 单片机期末考试题目及答案详解

    热门讨论 2009-06-23 10:30:30
    A.80单元 B.32单元 C.128单元 D.8单元 5.在相对寻址方式中,寻址的结果体现在 A.PC中 B.累加器A中 C.DPTR中 D.某个存储单元中 6.在寄存器间接寻址方式中,指定寄存器中存放的是 A.操作数 ...
  • previous up contents next C 语言常见问题集 原著:Steve Summit ... o 8.5 一指针变量分配多少内存? o 8.6 我有函数, 本该返回一字符串, 但当它返回调用者的时候, 返回串却是垃圾信息。 ...

空空如也

空空如也

1 2 3 4 5
收藏数 94
精华内容 37
关键字:

中断源有多少个